какая-то куча изменений (2). тут уже вырисовывается новая архитектура бекенда для cp api
This commit is contained in:
@@ -14,59 +14,15 @@
|
||||
|
||||
typedef boost::property_tree::ptree::path_type json_path;
|
||||
|
||||
static constexpr const char* DEFAULT_QOS_CLASSES = R"({"rt1":[],"rt2":[],"rt3":[],"cd":[]})";
|
||||
// пороговое значение сна
|
||||
static constexpr int64_t SLEEP_THRESHOLD = 10;
|
||||
|
||||
// static int calculateSubnetMask(const std::string& subnet_mask) {
|
||||
// int mask = 0;
|
||||
// std::istringstream iss(subnet_mask);
|
||||
// std::string octet;
|
||||
// while (std::getline(iss, octet, '.')) {
|
||||
// int octet_value = std::stoi(octet);
|
||||
// for (int i = 7; i >= 0; i--) {
|
||||
// if (octet_value & (1 << i)) {
|
||||
// mask++;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return mask;
|
||||
// }
|
||||
|
||||
/**
|
||||
* Преобразует строку вида `1.2.3.4/24` в пару строк вида `1.2.3.4` `255.255.255.0`
|
||||
*/
|
||||
// std::pair<std::string, std::string> splitIpAndMask(const std::string& input) {
|
||||
// auto pos = input.find('/');
|
||||
// if (pos == std::string::npos) {
|
||||
// // Обработка ошибки: нет символа '/'
|
||||
// throw std::runtime_error("address not contains mask");
|
||||
// }
|
||||
// std::string ip = input.substr(0, pos);
|
||||
// const unsigned int mask_int = std::stoul(input.substr(pos + 1));
|
||||
//
|
||||
// if (mask_int > 32) {
|
||||
// throw std::runtime_error("invalid mask");
|
||||
// }
|
||||
//
|
||||
// std::string mask_binary = std::string(mask_int, '1') + std::string(32 - mask_int, '0');
|
||||
// std::string mask_str;
|
||||
//
|
||||
// for (unsigned int i = 0; i < 4; ++i) {
|
||||
// std::string octet = mask_binary.substr(i * 8u, 8);
|
||||
// int octet_value = std::stoi(octet, nullptr, 2);
|
||||
// mask_str += std::to_string(octet_value) + (i < 3 ? "." : "");
|
||||
// }
|
||||
//
|
||||
// return std::make_pair(ip, mask_str);
|
||||
// }
|
||||
|
||||
static inline void rtrim(std::string &s) {
|
||||
s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
|
||||
return !std::isspace(ch);
|
||||
}).base(), s.end());
|
||||
}
|
||||
static const char* boolAsStr(bool value) {
|
||||
static inline const char* boolAsStr(bool value) {
|
||||
return value ? "true" : "false";
|
||||
}
|
||||
|
||||
@@ -262,546 +218,6 @@ private:
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Этот демон нужен для того, чтобы получать статистику из API, а так же корректно сохранять настройки
|
||||
*/
|
||||
class api_driver::TerminalApiDaemon {
|
||||
private:
|
||||
CP_Result lastCpError = OK;
|
||||
void logCpApiError(const char* desc, CP_Result err) {
|
||||
if (err != OK) {
|
||||
BOOST_LOG_TRIVIAL(error) << "CP API error in " << desc << ": " << err;
|
||||
this->lastCpError = err;
|
||||
}
|
||||
}
|
||||
|
||||
void updateState() {
|
||||
TerminalDeviceState s;
|
||||
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetModulatorState()", CP_GetModulatorState(sid, s.mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDemodulatorState()", CP_GetDemodulatorState(sid, s.demod));
|
||||
#ifdef MODEM_IS_TDMA
|
||||
std::string tmpDevState;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmpDevState));
|
||||
#endif
|
||||
{
|
||||
device_state ds{};
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDeviceState()", CP_GetDeviceState(sid, ds));
|
||||
s.adrv_temp = ds.adrv_temp;
|
||||
s.pl_temp = ds.pl_temp;
|
||||
s.zynq_temp = ds.zynq_temp;
|
||||
}
|
||||
#ifdef MODEM_IS_TDMA
|
||||
{
|
||||
progress_msg ds{};
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetUpdateStatus()", CP_GetUpdateStatus(sid, ds));
|
||||
s.otaStatus = ds.status;
|
||||
s.otaPercent = ds.dwl_percent;
|
||||
s.otaImage = ds.cur_image;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
bool isCinC = getIsCinC();
|
||||
if (isCinC) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetCinCState()", CP_GetCinCState(sid, s.cinc));
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
std::lock_guard lock2(this->stateMutex);
|
||||
this->state = s;
|
||||
#ifdef MODEM_IS_TDMA
|
||||
this->deviceInitState = tmpDevState;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void updateSettings() {
|
||||
modulator_settings mod{};
|
||||
// uint32_t modulatorModcod;
|
||||
// CP_GetModulatorParams(sid, "modcod", &modulatorModcod);
|
||||
demodulator_settings demod{};
|
||||
#ifdef MODEM_IS_SCPC
|
||||
ACM_parameters_serv_ acm{};
|
||||
#endif
|
||||
DPDI_parmeters dpdi{};
|
||||
buc_lnb_settings bucLnb{};
|
||||
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetModulatorSettings()", CP_GetModulatorSettings(sid, mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetDemodulatorSettings()", CP_GetDemodulatorSettings(sid, demod));
|
||||
#ifdef MODEM_IS_SCPC
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetAcmParams()", CP_GetAcmParams(sid, &acm));
|
||||
#endif
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetDpdiParams()", CP_GetDpdiParams(sid, &dpdi));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetBUC_LNB_settings()", CP_GetBUC_LNB_settings(sid, bucLnb));
|
||||
|
||||
{
|
||||
std::lock_guard lock2(this->settingsMutex);
|
||||
this->modSettings = mod;
|
||||
this->demodSettings = demod;
|
||||
#ifdef MODEM_IS_SCPC
|
||||
this->acmSettings = acm;
|
||||
#endif
|
||||
this->dpdiSettings = dpdi;
|
||||
this->bucLnbSettings = bucLnb;
|
||||
}
|
||||
}
|
||||
|
||||
void unsafeLoadNetworkSettings(TerminalNetworkSettings& s) {
|
||||
s.loadDefaults();
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
|
||||
// logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
|
||||
// s.managementIp += "/";
|
||||
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
|
||||
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
|
||||
if (nm == "tun") {
|
||||
s.isL2 = false;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
|
||||
} else {
|
||||
s.isL2 = true;
|
||||
}
|
||||
s.dataMtu = 1500;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(name_serv)", CP_GetNetwork(sid, "name_serv", &s.serverName));
|
||||
if (s.serverName.empty()) {
|
||||
s.serverName = TerminalNetworkSettings::DEFAULT_SERVER_NAME;
|
||||
}
|
||||
}
|
||||
void unsafStoreNetworkSettings(TerminalNetworkSettings& s) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(mode)", CP_SetNetwork(sid, "mode", s.isL2 ? "tap" : "tun"));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(addr)", CP_SetNetwork(sid, "addr", s.managementIp.c_str()));
|
||||
if (!s.isL2) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(addr_data)", CP_SetNetwork(sid, "addr_data", s.dataIp.c_str()));
|
||||
// TODO маска не устанавливается, потому что в API этого нет
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(mask)", CP_SetNetwork(sid, "mask", "255.255.255.0"));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(gateway)", CP_SetNetwork(sid, "gateway", s.managementGateway.c_str()));
|
||||
|
||||
// TODO MTU не устанавливается, потому что в API этого нет
|
||||
|
||||
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_SetNetwork(name_serv)", CP_SetNetwork(sid, "name_serv", s.serverName.c_str()));
|
||||
}
|
||||
|
||||
void updateNetworkSettings() {
|
||||
TerminalNetworkSettings s;
|
||||
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
unsafeLoadNetworkSettings(s);
|
||||
|
||||
{
|
||||
std::lock_guard lock2(this->networkSettingsMutex);
|
||||
this->networkSettings = s;
|
||||
}
|
||||
}
|
||||
|
||||
void updateQos() {
|
||||
bool tmp1; std::string tmp2;
|
||||
std::scoped_lock lock{this->cpApiMutex};
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateQos()->CP_GetQoSSettings()", CP_GetQoSSettings(this->sid, tmp2, tmp1));
|
||||
{
|
||||
std::lock_guard lock2(this->qosSettingsMutex);
|
||||
this->qosEnabled = tmp1;
|
||||
this->qosClassesJson = tmp2.empty() ? DEFAULT_QOS_CLASSES : tmp2;
|
||||
}
|
||||
}
|
||||
|
||||
void connectToApi() {
|
||||
{
|
||||
std::lock_guard _lock(this->stateMutex);
|
||||
this->deviceInitState = "Not connected to API";
|
||||
this->networkSettings.loadDefaults();
|
||||
}
|
||||
|
||||
unsigned int access{};
|
||||
for (int connectAttempt = 0;; connectAttempt++) {
|
||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Try to connect api (attempt " << connectAttempt << ")...";
|
||||
auto res = CP_Login("admin", "pass", &sid, &access);
|
||||
logCpApiError(R"(api_driver::TerminalApiDaemon::connectToApi()->CP_Login("admin", "pass"))", res);
|
||||
if (res != OK) {
|
||||
boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000)));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string tmp;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmp));
|
||||
{
|
||||
std::lock_guard _lock(this->stateMutex);
|
||||
this->deviceInitState = tmp;
|
||||
}
|
||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Success connect!";
|
||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): API status: " << tmp;
|
||||
|
||||
TerminalFirmwareVersion f;
|
||||
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));
|
||||
|
||||
{
|
||||
std::lock_guard _lock(this->firmwareMutex);
|
||||
this->firmware = f;
|
||||
}
|
||||
|
||||
this->lastCpError = OK;
|
||||
}
|
||||
|
||||
void run() {
|
||||
// это демон, который в бесконечном цикле опрашивает API
|
||||
this->connectToApi();
|
||||
|
||||
struct IntervalUpdate_t {
|
||||
int64_t lastUpdate;
|
||||
int64_t periodMs;
|
||||
|
||||
std::function<void()> callback;
|
||||
|
||||
bool checkNeedUpdate(int64_t now) const {
|
||||
if (periodMs < 0) return false;
|
||||
// тут нет смысла спать меньше чем на 20мс, поэтому можно разрешить чтение на некоторое время раньше
|
||||
return now - lastUpdate >= (periodMs - SLEEP_THRESHOLD);
|
||||
}
|
||||
|
||||
int64_t getNextUpdate(int64_t now) const {
|
||||
if (checkNeedUpdate(now)) {
|
||||
return 0;
|
||||
}
|
||||
auto next = now - lastUpdate;
|
||||
return next < 0 ? 0 : next;
|
||||
}
|
||||
};
|
||||
|
||||
IntervalUpdate_t updaters[] = {
|
||||
#ifdef MODEM_IS_SCPC
|
||||
// обновление логов
|
||||
{.lastUpdate = 0, .periodMs = -1, .callback = [this]() {
|
||||
try {
|
||||
{
|
||||
std::lock_guard _alock(this->cpApiMutex);
|
||||
std::lock_guard _slock(this->stateMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon->statsLogs.putItem()->CP_GetDebugMetrics()", CP_GetDebugMetrics(sid, state.debug));
|
||||
}
|
||||
this->statsLogs.putItem(state.debug);
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon->statsLogs.putItem(): success write statistics state to log!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon->statsLogs.putItem() failed to log: " << e.what();
|
||||
}
|
||||
}},
|
||||
#endif
|
||||
// обновление статистики
|
||||
{.lastUpdate = 0, .periodMs = CACHE_STATISTICS_UPDATE_MS, .callback = [this]() {
|
||||
try {
|
||||
this->updateState();
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateState(): success update!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState(): " << e.what();
|
||||
}
|
||||
}},
|
||||
// обновление кеша настроек
|
||||
{.lastUpdate = 0, .periodMs = CACHE_SETTINGS_UPDATE_MS, .callback = [this]() {
|
||||
try {
|
||||
this->updateSettings();
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateSettings(): success update!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateSettings(): " << e.what();
|
||||
}
|
||||
}},
|
||||
// обновление кеша настроек сети (делается отдельно)
|
||||
{.lastUpdate = 0, .periodMs = CACHE_SETTINGS_UPDATE_MS, .callback = [this]() {
|
||||
try {
|
||||
this->updateNetworkSettings();
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateNetworkSettings(): success update!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateNetworkSettings(): " << e.what();
|
||||
}
|
||||
}},
|
||||
// обновление кеша QoS
|
||||
{.lastUpdate = 0, .periodMs = CACHE_QOS_UPDATE_MS, .callback = [this]() {
|
||||
try {
|
||||
this->updateQos();
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateQos(): success update!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateQos(): " << e.what();
|
||||
}
|
||||
}}
|
||||
};
|
||||
|
||||
while (true) {
|
||||
if (this->lastCpError == ERROR || this->lastCpError == TIMEOUT) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::run(): close current daemon session caused error " << this->lastCpError;
|
||||
CP_Logout(this->sid);
|
||||
this->connectToApi();
|
||||
}
|
||||
#ifdef MODEM_IS_SCPC
|
||||
updaters[0].periodMs = this->statsLogs.logEn ? this->statsLogs.logPeriodMs.load() : -1;
|
||||
#endif
|
||||
int64_t sleepTime = 60000; // минута по-умолчанию
|
||||
auto now = TIME_NOW();
|
||||
for (auto& u: updaters) {
|
||||
if (u.checkNeedUpdate(now)) {
|
||||
auto targetTime = u.lastUpdate + u.periodMs;
|
||||
if (targetTime + SLEEP_THRESHOLD <= now && targetTime - SLEEP_THRESHOLD >= now) {
|
||||
u.lastUpdate = targetTime;
|
||||
} else {
|
||||
u.lastUpdate = now;
|
||||
}
|
||||
|
||||
u.callback();
|
||||
now = TIME_NOW();
|
||||
}
|
||||
if (u.periodMs >= 0) {
|
||||
sleepTime = std::min(sleepTime, u.getNextUpdate(now));
|
||||
}
|
||||
}
|
||||
|
||||
if (sleepTime > 0) {
|
||||
boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(sleepTime)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_mutex stateMutex;
|
||||
std::string deviceInitState;
|
||||
TerminalDeviceState state;
|
||||
|
||||
std::shared_mutex settingsMutex;
|
||||
modulator_settings modSettings{};
|
||||
demodulator_settings demodSettings{};
|
||||
#ifdef MODEM_IS_SCPC
|
||||
ACM_parameters_serv_ acmSettings{};
|
||||
#endif
|
||||
DPDI_parmeters dpdiSettings{};
|
||||
buc_lnb_settings bucLnbSettings{};
|
||||
|
||||
std::shared_mutex networkSettingsMutex;
|
||||
TerminalNetworkSettings networkSettings;
|
||||
|
||||
std::shared_mutex qosSettingsMutex;
|
||||
bool qosEnabled;
|
||||
std::string qosClassesJson;
|
||||
|
||||
std::shared_mutex firmwareMutex;
|
||||
TerminalFirmwareVersion firmware;
|
||||
|
||||
public:
|
||||
#ifdef MODEM_IS_SCPC
|
||||
StatisticsLogger statsLogs;
|
||||
#endif
|
||||
|
||||
std::mutex cpApiMutex;
|
||||
TSID sid;
|
||||
boost::thread daemon;
|
||||
|
||||
explicit TerminalApiDaemon(): deviceInitState("Not connected to API"), qosEnabled(false), sid(0), daemon([this]() { this->run(); }) {
|
||||
this->qosClassesJson = DEFAULT_QOS_CLASSES;
|
||||
}
|
||||
|
||||
std::string getDeviceInitState() {
|
||||
std::shared_lock lock(this->stateMutex);
|
||||
return this->deviceInitState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение статистики, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет.
|
||||
*/
|
||||
TerminalDeviceState getState() {
|
||||
TerminalDeviceState s;
|
||||
{
|
||||
std::shared_lock lock(this->stateMutex);
|
||||
s = this->state;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
/**
|
||||
* Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет.
|
||||
*/
|
||||
void getSettings(
|
||||
modulator_settings* mod, demodulator_settings* demod,
|
||||
#ifdef MODEM_IS_SCPC
|
||||
ACM_parameters_serv_* acm,
|
||||
#endif
|
||||
DPDI_parmeters* dpdi, buc_lnb_settings* bucLnb) {
|
||||
if (mod || demod ||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
acm ||
|
||||
#endif
|
||||
dpdi || bucLnb) {
|
||||
std::shared_lock lock(this->settingsMutex);
|
||||
if (mod) { *mod = this->modSettings; }
|
||||
if (demod) { *demod = this->demodSettings; }
|
||||
#ifdef MODEM_IS_SCPC
|
||||
if (acm) { *acm = this->acmSettings; }
|
||||
#endif
|
||||
if (dpdi) { *dpdi = this->dpdiSettings; }
|
||||
if (bucLnb) { *bucLnb = this->bucLnbSettings; }
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
bool getIsCinC() {
|
||||
std::shared_lock lock(this->settingsMutex);
|
||||
return modSettings.is_cinc;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool isTest() {
|
||||
std::shared_lock lock(this->settingsMutex);
|
||||
return modSettings.tx_is_on && (!modSettings.is_carrier
|
||||
#ifdef MODEM_IS_SCPC
|
||||
|| this->modSettings.is_test_data
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
void getNetworkSettings(TerminalNetworkSettings& dest) {
|
||||
std::shared_lock lock(this->networkSettingsMutex);
|
||||
dest = this->networkSettings;
|
||||
}
|
||||
|
||||
void getQosSettings(bool& isEnabled, std::string& json) {
|
||||
std::shared_lock lock(this->qosSettingsMutex);
|
||||
isEnabled = this->qosEnabled;
|
||||
json = this->qosClassesJson;
|
||||
}
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
void setSettingsRxTx(modulator_settings& mod, demodulator_settings& demod, ACM_parameters_serv_& acm, bool readback = true) {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetModulatorSettings()", CP_SetModulatorSettings(this->sid, mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDemodulatorSettings()", CP_SetDemodulatorSettings(this->sid, demod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetAcmParams()", CP_SetAcmParams(this->sid, acm));
|
||||
if (readback) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_GetModulatorSettings()", CP_GetModulatorSettings(this->sid, mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_GetDemodulatorSettings()", CP_GetDemodulatorSettings(this->sid, demod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_GetAcmParams()", CP_GetAcmParams(this->sid, &acm));
|
||||
{
|
||||
std::lock_guard lock2{this->settingsMutex};
|
||||
this->modSettings = mod;
|
||||
this->demodSettings = demod;
|
||||
this->acmSettings = acm;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
#else
|
||||
void setSettingsRxTx(modulator_settings& mod, demodulator_settings& demod, bool readback = true) {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetModulatorSettings()", CP_SetModulatorSettings(this->sid, mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDemodulatorSettings()", CP_SetDemodulatorSettings(this->sid, demod));
|
||||
if (readback) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_GetModulatorSettings()", CP_GetModulatorSettings(this->sid, mod));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_GetDemodulatorSettings()", CP_GetDemodulatorSettings(this->sid, demod));
|
||||
{
|
||||
std::lock_guard lock2{this->settingsMutex};
|
||||
this->modSettings = mod;
|
||||
this->demodSettings = demod;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsRxTx()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
#endif
|
||||
|
||||
void setSettingsDpdi(DPDI_parmeters& s, bool readback = true) {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDpdiParams()", CP_SetDpdiParams(sid, s));
|
||||
if (readback) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_GetDpdiParams()", CP_GetDpdiParams(this->sid, &s));
|
||||
{
|
||||
std::lock_guard lock2{this->settingsMutex};
|
||||
this->dpdiSettings = s;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
|
||||
void setSettingsBucLnb(buc_lnb_settings& bucLnb, bool readback = true) {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsBucLnb()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsBucLnb()->CP_SetBUC_LNB_settings()", CP_SetBUC_LNB_settings(this->sid, bucLnb));
|
||||
if (readback) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsBucLnb()->CP_GetBUC_LNB_settings()", CP_GetBUC_LNB_settings(this->sid, bucLnb));
|
||||
{
|
||||
std::lock_guard lock2{this->settingsMutex};
|
||||
this->bucLnbSettings = bucLnb;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setSettingsBucLnb()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
|
||||
void setQosSettings(bool enabled, const std::string& str, bool readback = true) {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setQosSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setQosSettings()->CP_SetQoSSettings()", CP_SetQoSSettings(this->sid, str, enabled));
|
||||
if (readback) {
|
||||
bool tmp1; std::string tmp2;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setQosSettings()->CP_GetQoSSettings()", CP_GetQoSSettings(this->sid, tmp2, tmp1));
|
||||
{
|
||||
std::lock_guard lock2(this->qosSettingsMutex);
|
||||
this->qosEnabled = tmp1;
|
||||
this->qosClassesJson = tmp2.empty() ? DEFAULT_QOS_CLASSES : tmp2;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setQosSettings()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
|
||||
void setNetworkSettings(TerminalNetworkSettings& s, bool readback = true) {
|
||||
// const auto mang = splitIpAndMask();
|
||||
// std::pair<std::string, std::string> data;
|
||||
// if (!s.isL2) {
|
||||
// data = splitIpAndMask(s.dataIp);
|
||||
// }
|
||||
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
unsafStoreNetworkSettings(s);
|
||||
|
||||
if (readback) {
|
||||
unsafeLoadNetworkSettings(s);
|
||||
{
|
||||
std::lock_guard lock2(this->networkSettingsMutex);
|
||||
this->networkSettings = s;
|
||||
}
|
||||
}
|
||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
|
||||
TerminalFirmwareVersion getFirmware() {
|
||||
std::shared_lock lock(this->firmwareMutex);
|
||||
return firmware;
|
||||
}
|
||||
|
||||
void resetPacketStatistics() {
|
||||
std::string tmp;
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::resetPacketStatistics()->CP_GetDmaDebug(reset_cnt_rx)", CP_GetDmaDebug(sid, "reset_cnt_rx", &tmp));
|
||||
}
|
||||
|
||||
void resetDefaultSettings() {
|
||||
std::lock_guard lock(this->cpApiMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon::resetDefaultSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::resetDefaultSettings()->CP_SetDmaDebug(default_params)", CP_SetDmaDebug(sid, "default_params", ""));
|
||||
logCpApiError("api_driver::TerminalApiDaemon::resetDefaultSettings()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
||||
}
|
||||
|
||||
~TerminalApiDaemon() {
|
||||
try {
|
||||
daemon.interrupt();
|
||||
daemon.try_join_for(boost::chrono::seconds(2));
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::~TerminalApiDaemon(): " << e.what();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
api_driver::ApiDriver::ApiDriver() = default;
|
||||
|
||||
@@ -1378,41 +794,4 @@ void api_driver::ApiDriver::setLoggingStatisticsSettings(boost::property_tree::p
|
||||
}
|
||||
#endif
|
||||
|
||||
std::string api_driver::ApiDriver::loadSysInfo() {
|
||||
std::stringstream result;
|
||||
struct sysinfo info{};
|
||||
sysinfo(&info);
|
||||
|
||||
// struct sysinfo {
|
||||
// long uptime; /* Seconds since boot */
|
||||
// unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
||||
// unsigned long totalram; /* Total usable main memory size */
|
||||
// unsigned long freeram; /* Available memory size */
|
||||
// unsigned long sharedram; /* Amount of shared memory */
|
||||
// unsigned long bufferram; /* Memory used by buffers */
|
||||
// unsigned long totalswap; /* Total swap space size */
|
||||
// unsigned long freeswap; /* Swap space still available */
|
||||
// unsigned short procs; /* Number of current processes */
|
||||
// unsigned long totalhigh; /* Total high memory size */
|
||||
// unsigned long freehigh; /* Available high memory size */
|
||||
// unsigned int mem_unit; /* Memory unit size in bytes */
|
||||
// };
|
||||
|
||||
const double f_load = 100.0 / ((1 << SI_LOAD_SHIFT) * get_nprocs());
|
||||
|
||||
result << "{\n\"uptime\":" << info.uptime;
|
||||
result << ",\"load1min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[0]), 2);
|
||||
result << ",\"load5min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[1]), 2);
|
||||
result << ",\"load15min\":"; writeDouble(result, f_load * static_cast<double>(info.loads[2]), 2);
|
||||
result << ",\"totalram\":" << ((info.totalram * info.mem_unit) >> 20); // Mb
|
||||
result << ",\"freeram\":" << ((info.freeram * info.mem_unit) >> 20); // Mb
|
||||
// result << ",\"sharedram\":" << ((info.sharedram * info.mem_unit) >> 20); // Mb
|
||||
// result << ",\"bufferram\":" << ((info.bufferram * info.mem_unit) >> 20); // Mb
|
||||
// result << ",\"totalswap\":" << info.totalswap * info.mem_unit;
|
||||
// result << ",\"freeswap\":" << info.freeswap * info.mem_unit;
|
||||
result << ",\"procs\":" << static_cast<long>(info.procs);
|
||||
result << "\n}";
|
||||
return result.str();
|
||||
}
|
||||
|
||||
api_driver::ApiDriver::~ApiDriver() = default;
|
||||
|
Reference in New Issue
Block a user