|
UniSet
2.2.1
|
00001 #ifndef _RRDServer_H_ 00002 #define _RRDServer_H_ 00003 // ----------------------------------------------------------------------------- 00004 #include <unordered_map> 00005 #include <list> 00006 #include <memory> 00007 #include "UObject_SK.h" 00008 #include "SMInterface.h" 00009 #include "SharedMemory.h" 00010 #include "extensions/Extensions.h" 00011 // ----------------------------------------------------------------------------- 00065 class RRDServer: 00066 public UObject_SK 00067 { 00068 public: 00069 RRDServer( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmID, const std::shared_ptr<SharedMemory>& ic = nullptr, 00070 const std::string& prefix = "rrd" ); 00071 virtual ~RRDServer(); 00072 00074 static std::shared_ptr<RRDServer> init_rrdstorage( int argc, const char* const* argv, 00075 UniSetTypes::ObjectId shmID, const std::shared_ptr<SharedMemory>& ic = nullptr, 00076 const std::string& prefix = "rrd" ); 00077 00079 static void help_print( int argc, const char* const* argv ); 00080 00081 inline std::shared_ptr<LogAgregator> getLogAggregator() 00082 { 00083 return loga; 00084 } 00085 inline std::shared_ptr<DebugStream> log() 00086 { 00087 return mylog; 00088 } 00089 00090 const size_t RRD_MAX_DSNAME_LEN = 19; 00092 protected: 00093 RRDServer(); 00094 00095 virtual void askSensors( UniversalIO::UIOCommand cmd ) override; 00096 virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override; 00097 virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override; 00098 virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override; 00099 00100 void initRRD( xmlNode* cnode, int tmID ); 00101 virtual void step() override; 00102 00103 std::shared_ptr<SMInterface> shm; 00104 00105 struct DSInfo 00106 { 00107 UniSetTypes::ObjectId sid; 00108 std::string dsname; 00109 long value; 00110 00111 DSInfo( UniSetTypes::ObjectId id, const std::string& dsname, long defval ): 00112 sid(id), dsname(dsname), value(defval) {} 00113 }; 00114 00115 // Т.к. RRD требует чтобы данные записывались именно в том порядке в котором они были добавлены 00116 // при инициализации и при этом, нам нужен быстрый доступ в обработчике sensorInfo. 00117 // То создаём list<> для последовательного прохода по элементам в нужном порядке 00118 // и unordered_map<> для быстрого доступа к элементам в sensorInfo 00119 // При этом используем shared_ptr чтобы элементы указывали на один и тот же DSInfo 00120 typedef std::unordered_map<UniSetTypes::ObjectId, std::shared_ptr<DSInfo>> DSMap; 00121 typedef std::list<std::shared_ptr<DSInfo>> DSList; 00122 00123 struct RRDInfo 00124 { 00125 std::string filename; 00126 long tid; 00127 long sec; 00128 DSMap dsmap; 00129 DSList dslist; 00130 00131 RRDInfo( const std::string& fname, long tmID, long sec, const DSList& lst ); 00132 }; 00133 00134 typedef std::list<RRDInfo> RRDList; 00135 00136 RRDList rrdlist; 00137 00138 private: 00139 00140 std::string prefix; 00141 }; 00142 // ----------------------------------------------------------------------------- 00143 #endif // _RRDServer_H_ 00144 // -----------------------------------------------------------------------------
1.7.6.1