00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CANBUS_HPP
00029 #define CANBUS_HPP
00030
00031 #include "CANBusInterface.hpp"
00032 #include "CANControllerInterface.hpp"
00033 #include "CANMessage.hpp"
00034
00035 #include <list>
00036 #include <algorithm>
00037 #include <rtt/os/rtstreams.hpp>
00038
00039 namespace RTT
00040 {
00041 namespace CAN
00042 {
00043 using std::list;
00044 using std::find;
00045
00051 class CANBus: public CANBusInterface
00052 {
00053
00054 public:
00062 CANBus() :
00063 controller(0)
00064 {
00065 }
00066
00067 void setController(CANControllerInterface* contr)
00068 {
00069 controller = contr;
00070 }
00071
00072 virtual bool addDevice(CANDeviceInterface* dev)
00073 {
00074 if (devices.size() < MAX_DEVICES)
00075 devices.push_back(dev);
00076 else
00077 return false;
00078 return true;
00079 }
00080
00081 virtual bool addListener(CANListenerInterface* dev)
00082 {
00083 if (listeners.size() < MAX_DEVICES)
00084 listeners.push_back(dev);
00085 else
00086 return false;
00087 return true;
00088 }
00089
00090 virtual void removeDevice(CANDeviceInterface* dev)
00091 {
00092 list<CANDeviceInterface*>::iterator itl;
00093 itl = find(devices.begin(), devices.end(), dev);
00094 if (itl != devices.end())
00095 devices.erase(itl);
00096 }
00097
00098 virtual void removeListener(CANListenerInterface* dev)
00099 {
00100 list<CANListenerInterface*>::iterator itl;
00101 itl = find(listeners.begin(), listeners.end(), dev);
00102 if (itl != listeners.end())
00103 listeners.erase(itl);
00104 }
00105
00106 virtual void write(const CANMessage *msg)
00107 {
00108
00109
00110 list<CANListenerInterface*>::iterator itl = listeners.begin();
00111 while (itl != listeners.end())
00112 {
00113 list<CANListenerInterface*>::iterator next = (++itl)--;
00114 (*itl)->process(msg);
00115 itl = next;
00116 }
00117
00118 if (controller == 0)
00119 return;
00120 if (msg->origin != controller)
00121 {
00122
00123 controller->process(msg);
00124 }
00125 else
00126 {
00127
00128 list<CANDeviceInterface*>::iterator itd = devices.begin();
00129 while (itd != devices.end())
00130 {
00131 list<CANDeviceInterface*>::iterator _next = (++itd)--;
00132 (*itd)->process(msg);
00133 itd = _next;
00134
00135 }
00136 }
00137 }
00138
00139 CANControllerInterface* getController()
00140 {
00141 return controller;
00142 }
00143
00144 static const unsigned int MAX_DEVICES = 127;
00145 protected:
00146 list<CANDeviceInterface*> devices;
00147 list<CANListenerInterface*> listeners;
00148
00149 CANControllerInterface* controller;
00150 };
00151
00152 }
00153 }
00154
00155 #endif