UniSet  2.0.0
UNetUDP/UNetExchange.h
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 // -----------------------------------------------------------------------------