исправления методов-заглушек, часть 1

This commit is contained in:
Vladislav Ostapov 2025-06-03 18:32:28 +03:00
parent f30e1adb49
commit 55fc322c13
6 changed files with 199 additions and 68 deletions

View File

@ -6,6 +6,11 @@
// минимальный порог для сна в цикле событий демона
static constexpr int64_t SLEEP_THRESHOLD = 10;
int64_t api_driver::TimeNow() {
return std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
}
namespace api_driver {
/**
* Обертка для объектов, доступных для обновления
@ -196,37 +201,26 @@ void api_driver::TerminalApiDaemon::getDeviceState(obj::TerminalDeviceState &des
dest = stateDev;
}
void api_driver::TerminalApiDaemon::getSettingsRxTx(obj::TerminalRxTxSettings &dest) {
}
void api_driver::TerminalApiDaemon::getNetworkSettings(obj::TerminalNetworkSettings &dest) {
}
void api_driver::TerminalApiDaemon::getQosSettings(bool &isEnabled, std::string &json) {
}
void api_driver::TerminalApiDaemon::setSettingsRxTx(obj::TerminalRxTxSettings &s, bool readback) {
}
void api_driver::TerminalApiDaemon::setSettingsDpdi(DPDI_parmeters &s, bool readback) {
}
void api_driver::TerminalApiDaemon::setSettingsBucLnb(buc_lnb_settings &bucLnb, bool readback) {
}
void api_driver::TerminalApiDaemon::setQosSettings(bool enabled, const std::string &str, bool readback) {
}
void api_driver::TerminalApiDaemon::setNetworkSettings(obj::TerminalNetworkSettings &s, bool readback) {
}
api_driver::obj::TerminalFirmwareVersion api_driver::TerminalApiDaemon::getFirmware() {
obj::TerminalFirmwareVersion res;
{
std::shared_lock _olock(firmwareMutex);
res = firmware;
}
return res;
}
void api_driver::TerminalApiDaemon::resetPacketStatistics() {
std::lock_guard lock(this->cpApiMutex);
cp.getDmaDebug("reset_cnt_rx");
}
void api_driver::TerminalApiDaemon::resetDefaultSettings() {
std::lock_guard lock(this->cpApiMutex);
cp.setDmaDebug("begin_save_config", "");
cp.setDmaDebug("default_params", "");
cp.setDmaDebug("save_config", "");
}
api_driver::TerminalApiDaemon::~TerminalApiDaemon() {

View File

@ -50,26 +50,19 @@ namespace api_driver {
// /**
// * Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет.
// * Установка настроек просто копирует настройки и устанавливает их текущими
// */
void getSettingsRxTx(obj::TerminalRxTxSettings &dest);
obj::TerminalRxTxSettings getSettingsRxTx() const;
void setSettingsRxTx(obj::TerminalRxTxSettings &s);
#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE
void getNetworkSettings(obj::TerminalNetworkSettings &dest);
void setNetworkSettings(obj::TerminalNetworkSettings &s, bool readback = true);
obj::TerminalNetworkSettings getNetworkSettings() const;
void setNetworkSettings(obj::TerminalNetworkSettings &s);
#endif
#ifdef API_OBJECT_QOS_SETTINGS_ENABLE
void getQosSettings(bool &isEnabled, std::string &json);
void setQosSettings(bool enabled, const std::string &str, bool readback = true);
#endif
void setSettingsRxTx(obj::TerminalRxTxSettings &s, bool readback = true);
#ifdef API_OBJECT_DPDI_SETTINGS_ENABLE
void setSettingsDpdi(DPDI_parmeters &s, bool readback = true);
#endif
#ifdef API_OBJECT_BUCLNB_SETTINGS_ENABLE
void setSettingsBucLnb(buc_lnb_settings &bucLnb, bool readback = true);
obj::TerminalQosSettings getQosSettings() const;
void setQosSettings(bool enabled, const std::string &str);
#endif
obj::TerminalFirmwareVersion getFirmware();

View File

@ -1,10 +1,119 @@
#include "proxy.h"
#include "sstream"
//#define CPAPI_PROXY_CALL(proxy, func, ...) do { auto _res = func(proxy.sid, __VA_ARGS__); if (_res != OK) { BOOST_LOG_TRIVIAL(error) << "CP API error in " #func "(" #__VA_ARGS__ "): " << _res; } } while (0)
// void foo() {
// api_driver::proxy::CpProxy proxy;
// std::string tmp;
// CPAPI_PROXY_CALL(proxy, CP_GetDmaDebug, "fuck", &tmp);
// }
#define CPAPI_PROXY_CALL_HELPER(callfrom, func, funcArgs, throwArgs) do { lastCpError = func funcArgs; if (lastCpError != OK) { \
std::stringstream err; err << callfrom ": CP Api error " #func "("; err << throwArgs; err << "): " << lastCpError;\
throw std::runtime_error(err.str());\
} } while (0)
api_driver::proxy::CpProxy::CpProxy() = default;
api_driver::proxy::CpProxy::CpProxy(TSID s): sid(s) {}
void api_driver::proxy::CpProxy::connect() {
unsigned int access{};
CPAPI_PROXY_CALL_HELPER("CpProxy::connect", CP_Login, ("admin", "pass", &sid, &access), R"("admin", "pass", &sid, &access)");
}
void api_driver::proxy::CpProxy::disconnect() {
if (sid != 0) {
lastCpError = CP_Logout(sid);
sid = 0;
}
}
std::string api_driver::proxy::CpProxy::getDmaDebug(const std::string &arg) {
std::string result;
CPAPI_PROXY_CALL_HELPER("CpProxy::getDmaDebug", CP_GetDmaDebug, (sid, arg.c_str(), &result), arg);
return result;
}
void api_driver::proxy::CpProxy::setDmaDebug(const std::string &arg, const std::string &value) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setDmaDebug", CP_SetDmaDebug, (sid, arg.c_str(), value), arg << ", \"" << value << "\"");
}
std::string api_driver::proxy::CpProxy::getNetwork(const std::string &param) {
std::string result;
CPAPI_PROXY_CALL_HELPER("CpProxy::getNetwork", CP_GetNetwork, (sid, param.c_str(), &result), param);
return result;
}
void api_driver::proxy::CpProxy::setNetwork(const std::string &param, const std::string &value) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setNetwork", CP_SetNetwork, (sid, param.c_str(), value.c_str()), param << ", \"" << value << "\"");
}
void api_driver::proxy::CpProxy::getModState(modulator_state &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getModState", CP_GetModulatorState, (sid, dest), "");
}
void api_driver::proxy::CpProxy::getModSettings(modulator_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getModSettings", CP_GetModulatorSettings, (sid, dest), "");
}
void api_driver::proxy::CpProxy::setModSettings(modulator_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setModSettings", CP_SetModulatorSettings, (sid, dest), "struct {...}");
}
void api_driver::proxy::CpProxy::getDemodState(demodulator_state &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getDemodState", CP_GetDemodulatorState, (sid, dest), "");
}
void api_driver::proxy::CpProxy::getDemodSettings(demodulator_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getDemodSettings", CP_GetDemodulatorSettings, (sid, dest), "");
}
void api_driver::proxy::CpProxy::setDemodSettings(demodulator_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setDemodSettings", CP_SetDemodulatorSettings, (sid, dest), "struct {...}");
}
void api_driver::proxy::CpProxy::getAcmSettings(ACM_parameters_serv_ &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getAcmSettings", CP_GetAcmParams, (sid, &dest), "");
}
void api_driver::proxy::CpProxy::setAcmSettings(ACM_parameters_serv_ &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setAcmSettings", CP_GetAcmParams, (sid, &dest), "struct {...}");
}
void api_driver::proxy::CpProxy::getDeviceState(device_state &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getDeviceState", CP_GetDeviceState, (sid, dest), "");
}
std::tuple<std::string, bool> api_driver::proxy::CpProxy::getQosSettings() {
std::string rules;
bool en;
CPAPI_PROXY_CALL_HELPER("CpProxy::getQosSettings", CP_GetQoSSettings, (sid, rules, en), "");
return {rules, en};
}
void api_driver::proxy::CpProxy::setQosSettings(const std::string &rules, bool enable) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setQosSettings", CP_SetQoSSettings, (sid, rules, enable), "`" << rules << "`, " << (enable ? "true" : "false"));
}
void api_driver::proxy::CpProxy::getDpdiSettings(DPDI_parmeters &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getDpdiSettings", CP_GetDpdiParams, (sid, &dest), "");
}
void api_driver::proxy::CpProxy::setDpdiSettings(DPDI_parmeters &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setDpdiSettings", CP_SetDpdiParams, (sid, dest), "struct {...}");
}
void api_driver::proxy::CpProxy::getBuclnbSettings(buc_lnb_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getBuclnbSettings", CP_GetBUC_LNB_settings, (sid, dest), "");
}
void api_driver::proxy::CpProxy::setBuclnbSettings(buc_lnb_settings &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::setBuclnbSettings", CP_SetBUC_LNB_settings, (sid, dest), "struct {...}");
}
void api_driver::proxy::CpProxy::getCincState(CinC_state &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getCincState", CP_GetCinCState, (sid, dest), "");
}
void api_driver::proxy::CpProxy::getDebugMetrics(debug_metrics &dest) {
CPAPI_PROXY_CALL_HELPER("CpProxy::getDebugMetrics", CP_GetDebugMetrics, (sid, dest), "");
}
api_driver::proxy::CpProxy::~CpProxy() {
disconnect();
}

View File

@ -132,7 +132,11 @@ void api_driver::obj::StatisticsLogger::setSettings(const nlohmann::json& data)
}
void api_driver::obj::StatisticsLogger::updateCallback(proxy::CpProxy &cp) {
if (!logEn) return;
debug_metrics dm{};
cp.getDebugMetrics(dm);
putItem(dm);
}
void api_driver::obj::StatisticsLogger::putItem(const debug_metrics &item) {
@ -214,6 +218,11 @@ void api_driver::obj::TerminalNetworkSettings::updateCallback(proxy::CpProxy &cp
}
void api_driver::obj::TerminalNetworkSettings::updateFromJson(nlohmann::json &data) {
managementIp = data.value("managementIp", managementIp);
isL2 = data.value("isL2", isL2);
dataIp = data.value("dataIp", dataIp);
dataMtu = data.value("dataMtu", dataMtu);
serverName = data.value("serverName", serverName);
}
void api_driver::obj::TerminalNetworkSettings::store(proxy::CpProxy& cp) {
@ -546,6 +555,14 @@ void api_driver::obj::TerminalRxTxSettings::updateCallback(proxy::CpProxy &cp) {
#endif
}
void api_driver::obj::TerminalRxTxSettings::storeMainSettings(proxy::CpProxy &cp) {
cp.setModSettings(mod);
cp.setDemodSettings(dem);
#ifdef API_STRUCT_ACM_ENABLE
cp.setAcmSettings(acm);
#endif
}
struct ModcodDef_t {const char* modulation; const char* speed;};
const static ModcodDef_t ModcodDefs[] = {
@ -674,11 +691,11 @@ void api_driver::obj::TerminalRxTxSettings::updateMainSettings(const nlohmann::j
}
#ifdef API_OBJECT_DPDI_SETTINGS_ENABLE
double translateCoordinates(uint8_t deg, uint8_t min) {
static double translateCoordinates(uint8_t deg, uint8_t min) {
return static_cast<double>(deg) + static_cast<double>(min) / 60;
}
std::tuple<uint8_t, uint8_t> translateCoordinates(double abs) {
static std::tuple<uint8_t, uint8_t> translateCoordinates(double abs) {
auto deg = static_cast<uint8_t>(abs);
double min_double = (abs - deg) * 60;
auto min = static_cast<uint8_t>(min_double);

View File

@ -44,7 +44,7 @@ std::tuple<uint8_t, uint8_t> translateCoordinates(double abs) {
}
std::string api_driver::ApiDriver::loadTerminalState() const {
nlohmann::json api_driver::ApiDriver::loadTerminalState() const {
if (daemon == nullptr) {
return R"({"error": "api daemon not started!"})";
}
@ -56,7 +56,7 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
auto res = state.asJson();
res["device"] = devState.asJson();
return res.dump();
return res;
}
@ -64,38 +64,57 @@ void api_driver::ApiDriver::resetPacketStatistics() const {
this->daemon->resetPacketStatistics();
}
std::string api_driver::ApiDriver::loadSettings() const {
nlohmann::json api_driver::ApiDriver::loadSettings() const {
if (daemon == nullptr) {
return R"({"error": "api daemon not started!"})";
}
// TODO сделать получение настроек
return "{}";
nlohmann::json res = daemon->getSettingsRxTx().asJson();
#ifdef API_OBJECT_QOS_SETTINGS_ENABLE
res.update(daemon->getQosSettings().asJson());
#endif
#ifdef API_OBJECT_NETWORK_SETTINGS_ENABLE
res.update(daemon->getNetworkSettings().asJson());
#endif
return res;
}
std::string api_driver::ApiDriver::loadFirmwareVersion() const {
nlohmann::json api_driver::ApiDriver::loadFirmwareVersion() const {
if (daemon == nullptr) {
return R"({"error": "api daemon not started!"})";
}
std::stringstream result;
auto firmware = daemon->getFirmware();
result << "{\n\"fw.version\":" << buildEscapedString(firmware.version);
result << ",\"fw.modemId\":" << buildEscapedString(firmware.modemId);
result << ",\"fw.modemSn\":" << buildEscapedString(firmware.modemSn);
result << ",\"fw.macMang\":" << buildEscapedString(firmware.macMang);
result << ",\"fw.macData\":" << buildEscapedString(firmware.macData);
result << "\n}";
return result.str();
return daemon->getFirmware().asJson();
}
void api_driver::ApiDriver::setRxTxSettings(const nlohmann::json& data) {
// TODO
auto rxtx = daemon->getSettingsRxTx();
rxtx.updateMainSettings(data);
std::lock_guard _lapi(this->daemon->cpApiMutex);
this->daemon->cp.setDmaDebug("begin_save_config", "");
rxtx.storeMainSettings(this->daemon->cp);
this->daemon->cp.setDmaDebug("save_config", "");
rxtx.updateCallback(this->daemon->cp);
{
daemon->setSettingsRxTx(rxtx);
}
}
#ifdef API_OBJECT_DPDI_SETTINGS_ENABLE
void api_driver::ApiDriver::setDpdiSettings(const nlohmann::json& data) {
// TODO
auto rxtx = daemon->getSettingsRxTx();
rxtx.updateDpdiSettings(data);
std::lock_guard _lapi(this->daemon->cpApiMutex);
this->daemon->cp.setDmaDebug("begin_save_config", "");
rxtx.storeMainSettings(this->daemon->cp);
this->daemon->cp.setDmaDebug("save_config", "");
rxtx.updateCallback(this->daemon->cp);
{
daemon->setSettingsRxTx(rxtx);
}
}
#endif
void api_driver::ApiDriver::setBucLnbSettings(const nlohmann::json& data) {
// TODO

View File

@ -30,18 +30,17 @@ namespace api_driver {
/**
* Запросить общее состояние терминала
* @return {"txState":false,"rxState":false,"rx.sym_sync_lock":false,"rx.freq_search_lock":false,"rx.afc_lock":false,"rx.pkt_sync":false}
*/
std::string loadTerminalState() const;
nlohmann::json loadTerminalState() const;
/**
* Сбросить статистику пакетов
*/
void resetPacketStatistics() const;
std::string loadSettings() const;
nlohmann::json loadSettings() const;
std::string loadFirmwareVersion() const;
nlohmann::json loadFirmwareVersion() const;
/**
* Установить настройки RX/TX, readback можно получить используя loadTerminalState