|
UniSet
1.7.0
|
00001 #ifndef UNetExchange_H_ 00002 #define UNetExchange_H_ 00003 // ----------------------------------------------------------------------------- 00004 #include <ostream> 00005 #include <string> 00006 #include <queue> 00007 #include <cc++/socket.h> 00008 #include "UniSetObject_LT.h" 00009 #include "Trigger.h" 00010 #include "Mutex.h" 00011 #include "SMInterface.h" 00012 #include "SharedMemory.h" 00013 #include "ThreadCreator.h" 00014 #include "UNetReceiver.h" 00015 #include "UNetSender.h" 00016 // ----------------------------------------------------------------------------- 00077 // ----------------------------------------------------------------------------- 00078 class UNetExchange: 00079 public UniSetObject_LT 00080 { 00081 public: 00082 UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="unet" ); 00083 virtual ~UNetExchange(); 00084 00086 static UNetExchange* init_unetexchange( int argc, const char* argv[], 00087 UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="unet" ); 00088 00089 virtual UNetReceiver* create_receiver( const std::string& h, const ost::tpport_t p, SMInterface* shm ); 00090 virtual UNetSender* create_sender( const std::string& h, const ost::tpport_t p, SMInterface* shm, 00091 const std::string& s_field="", const std::string& s_fvalue="", SharedMemory* ic=0 ); 00092 00094 static void help_print( int argc, const char* argv[] ); 00095 00096 bool checkExistUNetHost( const std::string& host, ost::tpport_t port ); 00097 00098 std::list<UNetReceiver*> get_receivers(); 00099 00101 void setIgnore(UniSetTypes::ObjectId id = UniSetTypes::DefaultObjectId, bool set = true); 00102 00103 protected: 00104 UNetExchange(); 00105 00106 xmlNode* cnode; 00107 std::string s_field; 00108 std::string s_fvalue; 00109 00110 SMInterface* shm; 00111 void step(); 00112 00113 00114 virtual void processingMessage( UniSetTypes::VoidMessage *msg ); 00115 void sysCommand( UniSetTypes::SystemMessage *msg ); 00116 void sensorInfo( UniSetTypes::SensorMessage*sm ); 00117 void timerInfo( UniSetTypes::TimerMessage *tm ); 00118 void askSensors( UniversalIO::UIOCommand cmd ); 00119 void waitSMReady(); 00120 void receiverEvent( UNetReceiver* r, UNetReceiver::Event ev ); 00121 00122 virtual bool activateObject(); 00123 00124 // действия при завершении работы 00125 virtual void sigterm( int signo ); 00126 00127 void initIterators(); 00128 void startReceivers(); 00129 00130 00131 enum Timer 00132 { 00133 tmStep 00134 }; 00135 00136 private: 00137 bool initPause; 00138 UniSetTypes::uniset_mutex mutex_start; 00139 00140 PassiveTimer ptHeartBeat; 00141 UniSetTypes::ObjectId sidHeartBeat; 00142 int maxHeartBeat; 00143 IOController::AIOStateList::iterator aitHeartBeat; 00144 UniSetTypes::ObjectId test_id; 00145 00146 int steptime; 00148 bool activated; 00149 int activateTimeout; 00150 00151 struct ReceiverInfo 00152 { 00153 ReceiverInfo():r1(0),r2(0), 00154 sidRespond(UniSetTypes::DefaultObjectId), 00155 respondInvert(false), 00156 sidLostPackets(UniSetTypes::DefaultObjectId) 00157 {} 00158 00159 ReceiverInfo(UNetReceiver* _r1, UNetReceiver* _r2 ): 00160 r1(_r1),r2(_r2), 00161 sidRespond(UniSetTypes::DefaultObjectId), 00162 respondInvert(false), 00163 sidLostPackets(UniSetTypes::DefaultObjectId) 00164 {} 00165 00166 UNetReceiver* r1; 00167 UNetReceiver* r2; 00169 void step( SMInterface* shm, const std::string& myname ); 00170 00171 inline void setRespondID( UniSetTypes::ObjectId id, bool invert=false ) 00172 { 00173 sidRespond = id; 00174 respondInvert = invert; 00175 } 00176 inline void setLostPacketsID( UniSetTypes::ObjectId id ){ sidLostPackets = id; } 00177 inline void initIterators( SMInterface* shm ) 00178 { 00179 shm->initAIterator(aitLostPackets); 00180 shm->initDIterator(ditRespond); 00181 } 00182 00183 // Сводная информация по двум каналам 00184 // сумма потерянных пакетов и наличие связи 00185 // хотя бы по одному каналу 00186 // ( реализацию см. ReceiverInfo::step() ) 00187 UniSetTypes::ObjectId sidRespond; 00188 IOController::DIOStateList::iterator ditRespond; 00189 bool respondInvert; 00190 UniSetTypes::ObjectId sidLostPackets; 00191 IOController::AIOStateList::iterator aitLostPackets; 00192 }; 00193 00194 typedef std::list<ReceiverInfo> ReceiverList; 00195 ReceiverList recvlist; 00196 00197 bool no_sender; 00198 UNetSender* sender; 00199 UNetSender* sender2; 00200 }; 00201 // ----------------------------------------------------------------------------- 00202 #endif // UNetExchange_H_ 00203 // -----------------------------------------------------------------------------
1.7.6.1