INTRODUCTION Overview Download and Install Documentation Publications REPOSITORY Libraries DEVELOPER Dev Guide Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
serialhandler.h00001 /* 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 |