UniSet  2.0.0
include/UniExchange.h
00001 // -----------------------------------------------------------------------------
00002 #ifndef UniExchange_H_
00003 #define UniExchange_H_
00004 // -----------------------------------------------------------------------------
00005 #include <list>
00006 #include "UniXML.h"
00007 #include "IOController.h"
00008 #include "SMInterface.h"
00009 #include "SharedMemory.h"
00010 #include "PassiveTimer.h"
00011 // -----------------------------------------------------------------------------
00034 // -----------------------------------------------------------------------------
00035 class UniExchange:
00036     public IOController
00037 {
00038     public:
00039         UniExchange( UniSetTypes::ObjectId id, UniSetTypes::ObjectId shmID,
00040                         SharedMemory* ic=0, const std::string& prefix="unet" );
00041         virtual ~UniExchange();
00042 
00043         void execute();
00044 
00045         static UniExchange* init_exchange( int argc, const char* const* argv,
00046                                     UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
00047                                     const std::string& prefix="unet" );
00048 
00050         static void help_print( int argc, const char** argv );
00051 
00052         virtual IOController_i::ShortMapSeq* getSensors() override;
00053 
00054     protected:
00055 
00056         virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override;
00057         virtual void askSensors( UniversalIO::UIOCommand cmd );
00058         virtual void sigterm( int signo ) override;
00059 
00060         xmlNode* cnode;
00061         std::string s_field;
00062         std::string s_fvalue;
00063         SMInterface* shm;
00064 
00065         struct SInfo
00066         {
00067             // т.к. содержится rwmutex с запрещённым конструктором копирования
00068             // приходится здесь тоже объявлять разрешенными только операции "перемещения"
00069             SInfo( const SInfo& r ) = delete;
00070             SInfo& operator=(const SInfo& r) = delete;
00071             SInfo( SInfo&& r ) = default;
00072             SInfo& operator=(SInfo&& r) = default;
00073 
00074             SInfo():
00075                 val(0),
00076                 id(UniSetTypes::DefaultObjectId),
00077                 type(UniversalIO::UnknownIOType)
00078             {}
00079 
00080             IOController::IOStateList::iterator ioit;
00081             long val;
00082             long id;
00083             UniversalIO::IOType type;
00084             UniSetTypes::uniset_rwmutex val_lock;
00085         };
00086 
00087         typedef std::vector<SInfo> SList;
00088 
00089         struct NetNodeInfo
00090         {
00091             // т.к. содержится SList в котором rwmutex с запрещённым конструктором копирования
00092             // приходится здесь тоже объявлять разрешенными только операции "перемещения"
00093             NetNodeInfo( const NetNodeInfo& r ) = delete;
00094             NetNodeInfo& operator=(const NetNodeInfo& r) = delete;
00095             NetNodeInfo( NetNodeInfo&& r ) = default;
00096             NetNodeInfo& operator=(NetNodeInfo&& r) = default;
00097 
00098             NetNodeInfo();
00099 
00100             CORBA::Object_var oref;
00101             IOController_i_var shm;
00102             UniSetTypes::ObjectId id;
00103             UniSetTypes::ObjectId node;
00104             UniSetTypes::ObjectId sidConnection; 
00105             IOController::IOStateList::iterator conn_it;
00106             SList smap;
00107 
00108             void update(IOController_i::ShortMapSeq_var& map, SMInterface* shm );
00109         };
00110 
00111         typedef std::list<NetNodeInfo> NetNodeList;
00112         NetNodeList nlst;
00113 
00114         void readConfiguration();
00115         bool readItem( const std::shared_ptr<UniXML>& xml, UniXML::iterator& it, xmlNode* sec );
00116         bool initItem( UniXML::iterator& it );
00117         void updateLocalData();
00118         void initIterators();
00119 
00120         int polltime;
00121         PassiveTimer ptUpdate;
00122         bool init_ok;
00123 
00124         SList mymap;
00125         size_t maxIndex;
00126         int smReadyTimeout;
00127 
00128     private:
00129 };
00130 // -----------------------------------------------------------------------------
00131 #endif // UniExchange_H_