|
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 00090 static void help_print( int argc, const char* argv[] ); 00091 00092 bool checkExistUNetHost( const std::string& host, ost::tpport_t port ); 00093 00094 protected: 00095 00096 xmlNode* cnode; 00097 std::string s_field; 00098 std::string s_fvalue; 00099 00100 SMInterface* shm; 00101 void step(); 00102 00103 virtual void processingMessage( UniSetTypes::VoidMessage *msg ); 00104 void sysCommand( UniSetTypes::SystemMessage *msg ); 00105 void sensorInfo( UniSetTypes::SensorMessage*sm ); 00106 void timerInfo( UniSetTypes::TimerMessage *tm ); 00107 void askSensors( UniversalIO::UIOCommand cmd ); 00108 void waitSMReady(); 00109 void receiverEvent( UNetReceiver* r, UNetReceiver::Event ev ); 00110 00111 virtual bool activateObject(); 00112 00113 // действия при завершении работы 00114 virtual void sigterm( int signo ); 00115 00116 void initIterators(); 00117 void startReceivers(); 00118 00119 00120 enum Timer 00121 { 00122 tmStep 00123 }; 00124 00125 private: 00126 UNetExchange(); 00127 bool initPause; 00128 UniSetTypes::uniset_mutex mutex_start; 00129 00130 PassiveTimer ptHeartBeat; 00131 UniSetTypes::ObjectId sidHeartBeat; 00132 int maxHeartBeat; 00133 IOController::AIOStateList::iterator aitHeartBeat; 00134 UniSetTypes::ObjectId test_id; 00135 00136 int steptime; 00138 bool activated; 00139 int activateTimeout; 00140 00141 struct ReceiverInfo 00142 { 00143 ReceiverInfo():r1(0),r2(0), 00144 sidRespond(UniSetTypes::DefaultObjectId), 00145 respondInvert(false), 00146 sidLostPackets(UniSetTypes::DefaultObjectId) 00147 {} 00148 00149 ReceiverInfo(UNetReceiver* _r1, UNetReceiver* _r2 ): 00150 r1(_r1),r2(_r2), 00151 sidRespond(UniSetTypes::DefaultObjectId), 00152 respondInvert(false), 00153 sidLostPackets(UniSetTypes::DefaultObjectId) 00154 {} 00155 00156 UNetReceiver* r1; 00157 UNetReceiver* r2; 00159 void step( SMInterface* shm, const std::string& myname ); 00160 00161 inline void setRespondID( UniSetTypes::ObjectId id, bool invert=false ) 00162 { 00163 sidRespond = id; 00164 respondInvert = invert; 00165 } 00166 inline void setLostPacketsID( UniSetTypes::ObjectId id ){ sidLostPackets = id; } 00167 inline void initIterators( SMInterface* shm ) 00168 { 00169 shm->initAIterator(aitLostPackets); 00170 shm->initDIterator(ditRespond); 00171 } 00172 00173 // Сводная информация по двум каналам 00174 // сумма потерянных пакетов и наличие связи 00175 // хотя бы по одному каналу 00176 // ( реализацию см. ReceiverInfo::step() ) 00177 UniSetTypes::ObjectId sidRespond; 00178 IOController::DIOStateList::iterator ditRespond; 00179 bool respondInvert; 00180 UniSetTypes::ObjectId sidLostPackets; 00181 IOController::AIOStateList::iterator aitLostPackets; 00182 }; 00183 00184 typedef std::list<ReceiverInfo> ReceiverList; 00185 ReceiverList recvlist; 00186 00187 bool no_sender; 00188 UNetSender* sender; 00189 UNetSender* sender2; 00190 }; 00191 // ----------------------------------------------------------------------------- 00192 #endif // UNetExchange_H_ 00193 // -----------------------------------------------------------------------------
1.7.6.1