242 lines
7.2 KiB
C++

#ifndef STRUCTS_H
#define STRUCTS_H
#include "api-driver/stricts-enable.h"
#include "proxy.h"
#include <atomic>
#include <fstream>
#include <shared_mutex>
#include <string>
#include <boost/log/trivial.hpp>
#include <boost/property_tree/ptree_fwd.hpp>
#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<int> logPeriodMs = 1000;
std::atomic<int> 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<LogItem> 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