UniSet  2.0.0
ModbusSlave/MBTCPMultiSlave.h
00001 // -----------------------------------------------------------------------------
00002 #ifndef _MBTCPMultiSlave_H_
00003 #define _MBTCPMultiSlave_H_
00004 // -----------------------------------------------------------------------------
00005 #include <map>
00006 #include "MBSlave.h"
00007 #include "modbus/ModbusTCPServer.h"
00008 // -----------------------------------------------------------------------------
00018 // -----------------------------------------------------------------------------
00020 class MBTCPMultiSlave:
00021     public MBSlave
00022 {
00023     public:
00024         MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="mbs" );
00025         virtual ~MBTCPMultiSlave();
00026 
00028         static MBTCPMultiSlave* init_mbslave( int argc, const char* const* argv,
00029                                             UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
00030                                             const std::string& prefix="mbs" );
00031 
00033         static void help_print( int argc, const char* const* argv );
00034 
00035     protected:
00036         virtual void execute_tcp() override;
00037         virtual void initIterators() override;
00038         virtual bool deactivateObject() override;
00039         virtual void sigterm( int signo ) override;
00040 
00041         timeout_t sessTimeout;  
00042         timeout_t waitTimeout;
00043         ModbusTCPServer::Sessions sess; 
00044         unsigned int sessMaxNum;
00045 
00046         struct ClientInfo
00047         {
00048             ClientInfo():iaddr(""),respond_s(UniSetTypes::DefaultObjectId),invert(false),
00049               askCount(0),askcount_s(UniSetTypes::DefaultObjectId){ ptTimeout.setTiming(0); }
00050 
00051             std::string iaddr;
00052 
00053             UniSetTypes::ObjectId respond_s;
00054             IOController::IOStateList::iterator respond_it;
00055             bool invert;
00056             PassiveTimer ptTimeout;
00057             timeout_t tout;
00058 
00059             long askCount;
00060             UniSetTypes::ObjectId askcount_s;
00061             IOController::IOStateList::iterator askcount_it;
00062 
00063             inline void initIterators( SMInterface* shm )
00064             {
00065                 shm->initIterator( respond_it );
00066                 shm->initIterator( askcount_it );
00067             }
00068         };
00069 
00070         typedef std::map<const std::string,ClientInfo> ClientsMap;
00071         ClientsMap cmap;
00072 
00073 
00074         UniSetTypes::ObjectId sesscount_id;
00075         IOController::IOStateList::iterator sesscount_it;
00076 };
00077 // -----------------------------------------------------------------------------
00078 #endif // _MBTCPMultiSlave_H_
00079 // -----------------------------------------------------------------------------