UniSet  2.2.1
RRDServer.h
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 // -----------------------------------------------------------------------------