INTRODUCTION
Overview
Download and Install
Documentation
Publications

REPOSITORY
Libraries

DEVELOPER
Dev Guide
Dashboard

PEOPLE
Contributors
Users

SourceForge.net Logo
Project
Download
Mailing lists

 

         

serialhandler.h

00001 /*
00002  * GearBox Project: Peer-Reviewed Open-Source Libraries for Robotics
00003  *               http://gearbox.sf.net/
00004  * Copyright (c) 2004-2008 Alex Brooks
00005  *
00006  * This distribution is licensed to you under the terms described in
00007  * the LICENSE file included in this distribution.
00008  *
00009  */
00010 
00011 #ifndef SICK_ACFR_SERIALHANDLER_H
00012 #define SICK_ACFR_SERIALHANDLER_H
00013 
00014 #include <gbxsickacfr/messages.h>
00015 #include <gbxserialacfr/serial.h>
00016 #include <gbxsickacfr/gbxiceutilacfr/thread.h>
00017 #include <gbxsickacfr/gbxiceutilacfr/buffer.h>
00018 #include <gbxsickacfr/gbxserialdeviceacfr/serialdevicehandler.h>
00019 
00020 namespace gbxsickacfr {
00021 
00022 class ResponseParser : public gbxserialdeviceacfr::IResponseParser 
00023 {
00024 public:
00025     bool parseBuffer( const std::vector<char>         &buffer,
00026                       gbxserialdeviceacfr::IResponsePtr &response,
00027                       int                             &numBytesParsed )
00028         {
00029             LmsResponse *lmsResponse;
00030             int gotResponse = parseBufferForResponses( (const uChar*)&(buffer[0]),
00031                                                        buffer.size(),
00032                                                        lmsResponse,
00033                                                        numBytesParsed );
00034             if ( gotResponse )
00035             {
00036                 response = lmsResponse;
00037             }
00038             return gotResponse;
00039         }
00040 
00041 };
00042 
00043 // LmsResponse plus a timeStamp
00044 class TimedLmsResponse {
00045 public:
00046     TimedLmsResponse() {}
00047     TimedLmsResponse( int s, int us, const LmsResponse &r )
00048         : timeStampSec(s), timeStampUsec(us), response(r) {}
00049 
00050     int timeStampSec;
00051     int timeStampUsec;
00052     LmsResponse response;
00053 };
00054 
00055 //
00056 // @brief Handles the serial port.
00057 //
00058 // Read in this separate loop so we can hopefully grab the messages
00059 // as soon as they arrive, without relying on having Driver::read()
00060 // called by an external thread which may be doing other stuff.
00061 // This will hopefully give us more accurate timestamps.
00062 //
00063 // @author Alex Brooks
00064 //
00065 class SerialHandler
00066 {
00067 
00068 public: 
00069 
00070     SerialHandler( const std::string &dev,
00071                    gbxutilacfr::Tracer       &tracer,
00072                    gbxutilacfr::Status       &status );
00073     ~SerialHandler();
00074 
00075     void send( const std::vector<uChar> &telegram )
00076         { serialDeviceHandler_->send( (const char*)&(telegram[0]), telegram.size() ); }
00077 
00078     void setBaudRate( int baudRate )
00079         { serialDeviceHandler_->setBaudRate( baudRate ); }
00080 
00081     // waits up to maxWaitMs for a Response
00082     // return codes same as gbxiceutilacfr::Buffer
00083     int getNextResponse( TimedLmsResponse &timedResponse, int maxWaitMs )
00084         { 
00085             gbxserialdeviceacfr::TimedResponse genericTimedResponse;
00086             int ret = serialDeviceHandler_->responseBuffer().getAndPopNext( genericTimedResponse, maxWaitMs );
00087             if ( ret == 0 )
00088             {
00089                 timedResponse.timeStampSec = genericTimedResponse.timeStampSec;
00090                 timedResponse.timeStampUsec = genericTimedResponse.timeStampUsec;
00091 
00092                 // This cast is safe becuase the response had to have been generated by ResponseParser
00093                 LmsResponse *lmsResponse = (LmsResponse*) &(*(genericTimedResponse.response));
00094 
00095                 timedResponse.response = *lmsResponse;
00096             }
00097             return ret;
00098         }
00099 
00100 private: 
00101 
00102     ResponseParser                            responseParser_;
00103     gbxserialacfr::Serial                     serialPort_;
00104     gbxserialdeviceacfr::SerialDeviceHandler *serialDeviceHandler_;
00105     // Keep a smart pointer to the SerialDeviceHandler as a thread, for stop/start purposes
00106     gbxiceutilacfr::ThreadPtr                 serialDeviceHandlerThreadPtr_;
00107 };
00108 
00109 }
00110 
00111 #endif
 

Generated for GearBox by  doxygen 1.4.5