Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00029
00030 #ifndef DRIVER_SVH_SVH_RECEIVE_THREAD_H_INCLUDED
00031 #define DRIVER_SVH_SVH_RECEIVE_THREAD_H_INCLUDED
00032
00033 #include <icl_core/TimeSpan.h>
00034 #include <icl_core_thread/PeriodicThread.h>
00035 #include <icl_comm_serial/Serial.h>
00036 #include <icl_comm/ByteOrderConversion.h>
00037
00038 #include <driver_svh/Logging.h>
00039 #include <driver_svh/SVHSerialPacket.h>
00040
00041 #include <boost/function.hpp>
00042 #include <boost/shared_ptr.hpp>
00043
00044 using icl_core::TimeSpan;
00045 using icl_core::thread::PeriodicThread;
00046 using icl_comm::serial::Serial;
00047
00048 namespace driver_svh {
00049
00051 typedef boost::function<void (const SVHSerialPacket& packet, unsigned int packet_count)> ReceivedPacketCallback;
00052
00056 class SVHReceiveThread : public PeriodicThread
00057 {
00058 public:
00066 SVHReceiveThread(const TimeSpan& period, boost::shared_ptr<Serial> device,
00067 ReceivedPacketCallback const & received_callback);
00068
00070 virtual ~SVHReceiveThread() {}
00071
00073 virtual void run();
00074
00076 unsigned int receivedPacketCount() { return m_packets_received; }
00077
00081 void resetReceivedPackageCount() { m_packets_received = 0; }
00082
00083 private:
00084
00086 boost::shared_ptr<Serial> m_serial_device;
00087
00089 enum
00090 {
00091 eRS_HEADER1,
00092 eRS_HEADER2,
00093 eRS_INDEX,
00094 eRS_ADDRESS,
00095 eRS_LENGTH,
00096 eRS_DATA,
00097 eRS_CHECKSUM,
00098 eRS_COMPLETE
00099 } typedef tState;
00100
00102 tState m_received_state;
00103
00105 uint16_t m_length;
00106
00108 std::vector<uint8_t> m_data;
00109
00111 icl_comm::ArrayBuilder m_ab;
00112
00114 unsigned int m_packets_received;
00115
00117 bool receiveData();
00118
00120 ReceivedPacketCallback m_received_callback;
00121
00122 };
00123
00124 }
00125
00126 #endif