#ifndef STRUCTS_H #define STRUCTS_H #include "api-driver/stricts-enable.h" #include "proxy.h" #include #include #include #include #include #include #include "common/nlohmann/json.hpp" namespace api_driver::obj { #ifdef API_OBJECT_DEBUG_METRICS_ENABLE class StatisticsLogger { public: StatisticsLogger(); static constexpr const char* LOG_FILENAME = "/tmp/weblog-statistics.csv"; int64_t timeStart; bool logEn = false; std::atomic logPeriodMs = 1000; std::atomic maxAgeMs = 10000; /** * * @return {"en": bool, "logPeriodMs": int, "maxAgeMs": int} */ std::string getSettings(); void setSettings(boost::property_tree::ptree &pt); void updateCallback(proxy::CpProxy& cp); /** * Записать значение в "базу данных". Метку при этом вставлять не нужно, она будет вставлена автоматически. * @param item */ void putItem(const debug_metrics& item); // void collectExpiredItems(); // void resetLogs() { // std::lock_guard _lock(mutex); // logs.clear(); // } ~StatisticsLogger(); private: // std::pmr::deque logs; std::fstream logFile{}; std::shared_mutex mutex; }; #endif #if defined(MODEM_IS_SCPC) static constexpr const char* DEFAULT_SERVER_NAME = "RSCM-101"; #elif defined(MODEM_IS_TDMA) static constexpr const char* DEFAULT_SERVER_NAME = "TDMA Abonent"; #elif defined(MODEM_IS_SHPC) static constexpr const char* DEFAULT_SERVER_NAME = "SHPS Terminal"; #else #error "Selected modem type not supported!" #endif #ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE class TerminalNetworkSettings { public: std::string managementIp, managementGateway, dataIp, serverName; bool isL2 = true; unsigned int dataMtu = 1500; TerminalNetworkSettings(); TerminalNetworkSettings(const TerminalNetworkSettings& src); TerminalNetworkSettings& operator= (const TerminalNetworkSettings& src); void loadDefaults(); void updateCallback(proxy::CpProxy& cp); void updateFromPt(boost::property_tree::ptree &pt); void store(proxy::CpProxy& cp); std::string asJson(); ~TerminalNetworkSettings(); }; #endif #ifdef API_OBJECT_QOS_SETTINGS_ENABLE class TerminalQosSettings { public: static constexpr const char* DEFAULT_QOS_CLASSES = R"({"rt1":[],"rt2":[],"rt3":[],"cd":[]})"; std::string qosSettingsJson; bool qosEnabled = false; TerminalQosSettings(); TerminalQosSettings(const TerminalQosSettings& src); TerminalQosSettings& operator= (const TerminalQosSettings& src); void loadDefaults(); void updateCallback(proxy::CpProxy& cp); void updateFromPt(boost::property_tree::ptree &pt); void store(proxy::CpProxy& cp); std::string asJson(); ~TerminalQosSettings(); }; #endif class TerminalFirmwareVersion { public: std::string version, modemId, modemSn, macMang, macData; TerminalFirmwareVersion(); TerminalFirmwareVersion(const TerminalFirmwareVersion& src); ~TerminalFirmwareVersion(); // logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(version)", CP_GetNetwork(sid, "version", &f.version)); // logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(chip_id)", CP_GetNetwork(sid, "chip_id", &f.modemId)); // rtrim(f.modemId); // logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(serial)", CP_GetNetwork(sid, "serial", &f.modemSn)); // logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(mac_eth0)", CP_GetNetwork(sid, "mac_eth0", &f.macMang)); // logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(mac_eth1)", CP_GetNetwork(sid, "mac_eth1", &f.macData)); void load(proxy::CpProxy& cp); std::string asJson(); TerminalFirmwareVersion& operator= (const TerminalFirmwareVersion& src); }; /** * Обертка состояния терминала, тут состояние девайса, модулятора/демодулятора, состояние автоматического обновления. */ class TerminalState { public: std::string fInitState{}; bool fIsTest = false; // daemon->isTest() bool fTxState = false; #ifdef MODEM_IS_SCPC bool fIsCinC = false; #endif bool fRxState; bool fRxSymSyncLock; bool fRxFreqSearchLock; bool fRxAfcLock; bool fRxPktSync; float fRxSnr; float fRxRssi; uint16_t fRxModcod; bool fRxFrameSizeNormal; bool fRxIsPilots; double fRxSymError; double fRxFreqErr; double fRxFreqErrAcc; double fRxInputSignalLevel; double fRxPllError; double fRxSpeedOnRxKbit; double fRxSpeedOnIifKbit; uint32_t fRxPacketsOk; uint32_t fRxPacketsBad; uint32_t fRxPacketsDummy; uint16_t fTxModcod; double fTxSpeedOnTxKbit; double fTxSpeedOnIifKbit; #ifdef MODEM_IS_SCPC float fTxSnr; bool fTxFrameSizeNormal; bool fTxIsPilots; double fCincOcc; bool fCincCorrelator; uint32_t fCincCorrelatorFails; int32_t fCincFreqErr; int32_t fCincFreqErrAcc; float fCincChannelDelay; #endif #ifdef MODEM_IS_TDMA double fTxCenterFreq; double fTxSymSpeed; #endif TerminalState(); /** * Обновление основной части статистики, то есть RX/TX и sysinfo */ void updateCallback(proxy::CpProxy& cp); nlohmann::json asJson(); ~TerminalState(); }; class TerminalDeviceState { public: time_t fOsUptime{}; double fOsLoad1{}; double fOsLoad5{}; double fOsLoad15{}; unsigned int fOsTotalram{}; unsigned int fOsFreeram{}; unsigned int fOsProcs{}; double fTempAdrv{}; double fTempZynq{}; double fTempFpga{}; #ifdef MODEM_IS_TDMA DOWNLOAD_STATUS fUpgradeStatus{}; unsigned int fUpgradePercent{}; std::string fUpgradeImage; #endif TerminalDeviceState(); TerminalDeviceState(const TerminalDeviceState& src); TerminalDeviceState& operator= (const TerminalDeviceState& src); void updateCallback(proxy::CpProxy& cp); nlohmann::json asJson() const; ~TerminalDeviceState(); }; class TerminalRxTxSettings { public: // TODO описать все параметры для всех терминалов void updateCallback(proxy::CpProxy& cp); void updateFromPt(boost::property_tree::ptree &pt); void store(proxy::CpProxy& cp); std::string asJson(); ~TerminalRxTxSettings(); }; } #endif //STRUCTS_H