|
UniSet
2.0.0
|
00001 #ifndef UNetExchange_H_ 00002 #define UNetExchange_H_ 00003 // ----------------------------------------------------------------------------- 00004 #include <ostream> 00005 #include <string> 00006 #include <queue> 00007 #include <deque> 00008 #include <cc++/socket.h> 00009 #include "UniSetObject_LT.h" 00010 #include "Trigger.h" 00011 #include "Mutex.h" 00012 #include "SMInterface.h" 00013 #include "SharedMemory.h" 00014 #include "ThreadCreator.h" 00015 #include "UNetReceiver.h" 00016 #include "UNetSender.h" 00017 // ----------------------------------------------------------------------------- 00078 // ----------------------------------------------------------------------------- 00079 class UNetExchange: 00080 public UniSetObject_LT 00081 { 00082 public: 00083 UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="unet" ); 00084 virtual ~UNetExchange(); 00085 00087 static UNetExchange* init_unetexchange( int argc, const char* argv[], 00088 UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="unet" ); 00089 00091 static void help_print( int argc, const char* argv[] ); 00092 00093 bool checkExistUNetHost( const std::string& host, ost::tpport_t port ); 00094 00095 protected: 00096 00097 xmlNode* cnode; 00098 std::string s_field; 00099 std::string s_fvalue; 00100 00101 SMInterface* shm; 00102 void step(); 00103 00104 void sysCommand( const UniSetTypes::SystemMessage *msg ) override; 00105 void sensorInfo( const UniSetTypes::SensorMessage*sm ) override; 00106 void timerInfo( const UniSetTypes::TimerMessage *tm ) override; 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 enum Timer 00120 { 00121 tmStep 00122 }; 00123 00124 private: 00125 UNetExchange(); 00126 bool initPause; 00127 UniSetTypes::uniset_rwmutex mutex_start; 00128 00129 PassiveTimer ptHeartBeat; 00130 UniSetTypes::ObjectId sidHeartBeat; 00131 int maxHeartBeat; 00132 IOController::IOStateList::iterator itHeartBeat; 00133 UniSetTypes::ObjectId test_id; 00134 00135 int steptime; 00137 std::atomic_bool activated; 00138 int activateTimeout; 00139 00140 struct ReceiverInfo 00141 { 00142 ReceiverInfo():r1(0),r2(0), 00143 sidRespond(UniSetTypes::DefaultObjectId), 00144 respondInvert(false), 00145 sidLostPackets(UniSetTypes::DefaultObjectId) 00146 {} 00147 00148 ReceiverInfo(UNetReceiver* _r1, UNetReceiver* _r2 ): 00149 r1(_r1),r2(_r2), 00150 sidRespond(UniSetTypes::DefaultObjectId), 00151 respondInvert(false), 00152 sidLostPackets(UniSetTypes::DefaultObjectId) 00153 {} 00154 00155 UNetReceiver* r1; 00156 UNetReceiver* r2; 00158 void step( SMInterface* shm, const std::string& myname ); 00159 00160 inline void setRespondID( UniSetTypes::ObjectId id, bool invert=false ) 00161 { 00162 sidRespond = id; 00163 respondInvert = invert; 00164 } 00165 inline void setLostPacketsID( UniSetTypes::ObjectId id ){ sidLostPackets = id; } 00166 inline void initIterators( SMInterface* shm ) 00167 { 00168 shm->initIterator(itLostPackets); 00169 shm->initIterator(itRespond); 00170 } 00171 00172 // Сводная информация по двум каналам 00173 // сумма потерянных пакетов и наличие связи 00174 // хотя бы по одному каналу 00175 // ( реализацию см. ReceiverInfo::step() ) 00176 UniSetTypes::ObjectId sidRespond; 00177 IOController::IOStateList::iterator itRespond; 00178 bool respondInvert; 00179 UniSetTypes::ObjectId sidLostPackets; 00180 IOController::IOStateList::iterator itLostPackets; 00181 }; 00182 00183 typedef std::deque<ReceiverInfo> ReceiverList; 00184 ReceiverList recvlist; 00185 00186 bool no_sender; 00187 UNetSender* sender; 00188 UNetSender* sender2; 00189 }; 00190 // ----------------------------------------------------------------------------- 00191 #endif // UNetExchange_H_ 00192 // -----------------------------------------------------------------------------
1.7.6.1