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