receiver.h

00001 // Copyright (C) 2008,2009,2010 by Philipp Münzel. All rights reserved.
00002 // Released under the terms of the license described in license.txt
00003 
00004 #ifndef RECEIVER_H
00005 #define RECEIVER_H
00006 
00007 #include "dllexport.h"
00008 
00009 #include <map>
00010 #include <boost/function.hpp>
00011 
00012 #include "canaerometadata.h"
00013 #include "datareference.h"
00014 #include "canaerobusconnector.h"
00015 #include "canaerodatamanager.h"
00016 
00017 namespace SCS {
00018 
00045 class DLL_PUBLIC Receiver : public CanAeroDataManager
00046 {
00047 public:
00048 
00055     Receiver(uint8_t required_software_revision,
00056              uint8_t own_node_id = 255,
00057              const std::string& host_addr = "239.40.41.42");
00058 
00059 
00066     Receiver(uint8_t required_software_revision,
00067              NetworkConnector<can_t>* connector,
00068              uint8_t own_node_id = 255);
00069 
00070 
00074     virtual ~Receiver();
00075 
00076 
00085     void requestData(can_Id_t can_id, TypelessDataReference* dataref);
00086 
00087 
00094     void requestData(can_Id_t can_id, int32_t* t);
00095 
00102     void requestData(can_Id_t can_id, float* t);
00103 
00110     void requestData(can_Id_t can_id, double* t);
00111 
00118     void requestData(can_Id_t can_id, bool* t);
00119 
00126     void requestData(can_Id_t can_id, char4* t);
00127 
00134     void requestData(can_Id_t can_id, std::string* t);
00135 
00142     void requestData(can_Id_t can_id, std::vector<float>* t);
00143 
00144 
00152     void requestData(can_Id_t can_id, boost::function<void (int32_t)> f, int32_t* t);
00153 
00161     void requestData(can_Id_t can_id, boost::function<void (float)> f, float* t);
00162 
00170     void requestData(can_Id_t can_id, boost::function<void (double)> f, double* t);
00171 
00179     void requestData(can_Id_t can_id, boost::function<void (bool)> f, bool* t);
00180 
00188     void requestData(can_Id_t can_id, boost::function<void (char4)> f, char4* t);
00189 
00197     void requestData(can_Id_t can_id, boost::function<void (const std::string&)> f, std::string* t);
00198 
00206     void requestData(can_Id_t can_id, boost::function<void (const std::vector<float>&)> f, std::vector<float>* t);
00207 
00208 
00215     void requestData(can_Id_t can_id, boost::function<void (int32_t)> f);
00216 
00223     void requestData(can_Id_t can_id, boost::function<void (float)> f);
00224 
00231     void requestData(can_Id_t can_id, boost::function<void (double)> f);
00232 
00239     void requestData(can_Id_t can_id, boost::function<void (bool)> f);
00240 
00247     void requestData(can_Id_t can_id, boost::function<void (char4)> f);
00248 
00255     void requestData(can_Id_t can_id, boost::function<void (const std::string&)> f);
00256 
00263     void requestData(can_Id_t can_id, boost::function<void (const std::vector<float>&)> f);
00264 
00265 
00272     void sendData(can_Id_t can_id, int32_t t);
00273 
00280     void sendData(can_Id_t can_id, float t);
00281 
00288     void sendData(can_Id_t can_id, double t);
00289 
00296     void sendData(can_Id_t can_id, bool t);
00297 
00304     void sendData(can_Id_t can_id, char4 t);
00305 
00312     void sendData(can_Id_t can_id, const std::string& t);
00313 
00320     void sendData(can_Id_t can_id, const std::vector<float>& t);
00321 
00322 
00329     void sendData(can_Id_t can_id);
00330 
00331 //    /**
00332 //      * Offer data to be requested by other participants on the bus.
00333 //      * @param can_id_29bit the CAN id in 29bit adress range which others have to request to get this data
00334 //      * @param t pointer where data should be read if someone requests it and is written if someone sends it
00335 //      */
00336 //    void offerData(uint32_t can_id_29bit, int32_t* t);
00337 
00338 //    void offerData(uint32_t can_id_29bit, boost::function<void(int32_t)> readfunc, boost::function<int32_t()> writefunc);
00339 
00340 
00353     void run(bool do_log_output = true);
00354 
00355 
00365     void requestModule(uint8_t node_id, uint16_t module, uint16_t mode = 1);
00366 
00367 
00374     TypelessDataReference* get(can_Id_t can_id);
00375 
00376 
00377 protected:
00378 
00385     virtual void handleSTS();
00386 
00393     virtual void handleMCS(uint16_t module, uint16_t mode);
00394 
00399     virtual uint32_t handleMIS();
00400 
00407     virtual bool handleDRS(uint32_t) ;
00408 
00409 
00410 private:
00415     void incomingData(const can_t&);
00416 
00420     void changeNodeId(uint8_t node_id);
00421 
00422 private:
00423     class ReceiverImpl;
00424     ReceiverImpl* m_pimpl;
00425     friend class CanAeroBusConnector;
00426 };
00427 
00428 }
00429 
00430 #endif // RECEIVER_H