изменил везде настройки CinC на настройки DPDI, что верно и что используется теперь в TDMA модеме

This commit is contained in:
Vladislav Ostapov 2025-04-01 17:18:34 +03:00
parent fe3b45dc9e
commit 1b6b8b5329
8 changed files with 198 additions and 127 deletions

@ -1 +1 @@
Subproject commit 1780093e8bee4de09d68e702c8d5ee759d8f4de0 Subproject commit 72bc52d7ae64cea480768efeb8a24e9cda21fda5

View File

@ -47,13 +47,6 @@
] ]
} }
] ]
},
{
"widget": "settings-container",
"childs": [
{"widget": "h3", "label": "Настройки позиционирования"},
{"widget": "number", "label": "Задержка до спутника, мс", "name": "rxTxSatDelay", "min": 0, "step": 1, "max": 600}
]
} }
], ],
"buclnb": [ "buclnb": [
@ -102,6 +95,26 @@
] ]
} }
], ],
"dpdi": [
{"widget": "h2", "label": "Настройки DPDI"},
{
"widget": "settings-container",
"childs": [
{
"widget": "select", "label": "Метод расчета задержки", "name": "dpdiIsPositional",
"values": [
{"label": "Позиционированием", "value": "true"},
{"label": "Окном задержки", "value": "false"}
]
},
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.dpdiIsPositional === true"},
{"widget": "number", "label": "Широта станции", "name": "dpdiPositionStationLatitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "number", "label": "Долгота станции", "name": "dpdiPositionStationLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "number", "label": "Подспутниковая точка", "name": "dpdiPositionSatelliteLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "number", "label": "Задержка до спутника, мс", "name": "dpdiDelay", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400}]
},
{"widget": "submit"}
],
"network": [ "network": [
{"widget": "h2", "label": "Настройки сети"}, {"widget": "h2", "label": "Настройки сети"},
{ {
@ -237,26 +250,26 @@
] ]
} }
], ],
"cinc": [ "dpdi": [
{"widget": "h2", "label": "Настройки режима CinC", "v_show": "paramRxtx.isCinC"}, {"widget": "h2", "label": "Настройки режима CinC", "v_show": "paramRxtx.isCinC"},
{ {
"widget": "settings-container", "v_show": "paramRxtx.isCinC", "widget": "settings-container", "v_show": "paramRxtx.isCinC",
"childs": [ "childs": [
{ {
"widget": "select", "label": "Метод расчета задержки", "name": "cincIsPositional", "widget": "select", "label": "Метод расчета задержки", "name": "dpdiIsPositional",
"values": [ "values": [
{"label": "Позиционированием", "value": "true"}, {"label": "Позиционированием", "value": "true"},
{"label": "Окном задержки", "value": "false"} {"label": "Окном задержки", "value": "false"}
] ]
}, },
{"widget": "number", "label": "Полоса поиска, КГц ±", "name": "cincSearchBandwidth", "min": 0, "step": 1, "max": 100}, {"widget": "number", "label": "Полоса поиска, КГц ±", "name": "dpdiSearchBandwidth", "min": 0, "step": 1, "max": 100},
{"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramCinc.cincIsPositional === true"}, {"widget": "h2", "label": "Настройки позиционирования", "v_show": "paramDpdi.dpdiIsPositional === true"},
{"widget": "number", "label": "Широта станции", "name": "cincPositionStationLatitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180}, {"widget": "number", "label": "Широта станции", "name": "dpdiPositionStationLatitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "number", "label": "Долгота станции", "name": "cincPositionStationLongitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180}, {"widget": "number", "label": "Долгота станции", "name": "dpdiPositionStationLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "number", "label": "Подспутниковая точка", "name": "cincPositionSatelliteLongitude", "v_show": "paramCinc.cincIsPositional === true", "min": -180, "step": 0.000001, "max": 180}, {"widget": "number", "label": "Подспутниковая точка", "name": "dpdiPositionSatelliteLongitude", "v_show": "paramDpdi.dpdiIsPositional === true", "min": -180, "step": 0.000001, "max": 180},
{"widget": "h2", "label": "Задержка до спутника", "v_show": "paramCinc.cincIsPositional === false"}, {"widget": "h2", "label": "Задержка до спутника", "v_show": "paramDpdi.dpdiIsPositional === false"},
{"widget": "number", "label": "от, мс", "name": "cincDelayMin", "v_show": "paramCinc.cincIsPositional === false", "min": 0, "step": 0.1, "max": 400}, {"widget": "number", "label": "от, мс", "name": "dpdiDelayMin", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400},
{"widget": "number", "label": "до, мс", "name": "cincDelayMax", "v_show": "paramCinc.cincIsPositional === false", "min": 0, "step": 0.1, "max": 400}] {"widget": "number", "label": "до, мс", "name": "dpdiDelayMax", "v_show": "paramDpdi.dpdiIsPositional === false", "min": 0, "step": 0.1, "max": 400}]
}, },
{"widget": "submit", "v_show": "paramRxtx.isCinC"} {"widget": "submit", "v_show": "paramRxtx.isCinC"}
], ],

View File

@ -1,6 +1,6 @@
{% from 'common/widgets.j2' import build_widget %} {% from 'common/widgets.j2' import build_widget %}
<div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete"> <div class="tabs-body-item" v-if="activeTab === 'setup' && settingFetchComplete">
{% for cat in ['rxtx', 'cinc', 'buclnb'] %} {% for cat in ['rxtx', 'dpdi', 'buclnb'] %}
{% if cat in params %} {% if cat in params %}
{% for w in params[cat] %}{{ build_widget(cat, w) | indent(12, true) }}{% endfor %} {% for w in params[cat] %}{{ build_widget(cat, w) | indent(12, true) }}{% endfor %}
{% endif %} {% endif %}

View File

@ -297,8 +297,8 @@ public:
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
} }
})); }));
#ifdef MODEM_IS_SCPC
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/cinc", this->auth, http::auth::User::EDIT_SETTINGS, [this](const auto& req, auto& rep) { s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/dpdi", this->auth, http::auth::User::EDIT_SETTINGS, [this](const auto& req, auto& rep) {
if (req.method != "POST") { if (req.method != "POST") {
http::server::stockReply(http::server::bad_request, rep); http::server::stockReply(http::server::bad_request, rep);
return; return;
@ -313,19 +313,19 @@ public:
boost::property_tree::ptree pt; boost::property_tree::ptree pt;
read_json(ss, pt); read_json(ss, pt);
api->setCincSettings(pt); api->setDpdiSettings(pt);
std::string result = R"({"status":"ok","settings":)"; std::string result = R"({"status":"ok","settings":)";
result += api->loadSettings(); result += api->loadSettings();
result += "}"; result += "}";
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
} catch (std::exception& e) { } catch (std::exception& e) {
BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/cinc): Can't set CinC settings: " << e.what(); BOOST_LOG_TRIVIAL(error) << "WebHandle(/api/set/dpdi): Can't set DPDI settings: " << e.what();
const std::string result = R"({"status": "error", "error": )" + api_driver::buildEscapedString(e.what()) + "}"; const std::string result = R"({"status": "error", "error": )" + api_driver::buildEscapedString(e.what()) + "}";
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
} }
})); }));
#endif
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/rxtx", this->auth, http::auth::User::EDIT_SETTINGS, [this](const auto& req, auto& rep) { s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/set/rxtx", this->auth, http::auth::User::EDIT_SETTINGS, [this](const auto& req, auto& rep) {
if (req.method != "POST") { if (req.method != "POST") {
http::server::stockReply(http::server::bad_request, rep); http::server::stockReply(http::server::bad_request, rep);

View File

@ -298,8 +298,8 @@ private:
demodulator_settings demod{}; demodulator_settings demod{};
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
ACM_parameters_serv_ acm{}; ACM_parameters_serv_ acm{};
DPDI_parmeters dpdi{};
#endif #endif
DPDI_parmeters dpdi{};
buc_lnb_settings bucLnb{}; buc_lnb_settings bucLnb{};
std::lock_guard lock(this->cpApiMutex); std::lock_guard lock(this->cpApiMutex);
@ -307,8 +307,8 @@ private:
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetDemodulatorSettings()", CP_GetDemodulatorSettings(sid, demod)); logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetDemodulatorSettings()", CP_GetDemodulatorSettings(sid, demod));
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetAcmParams()", CP_GetAcmParams(sid, &acm)); logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetAcmParams()", CP_GetAcmParams(sid, &acm));
logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetDpdiParams()", CP_GetDpdiParams(sid, &dpdi));
#endif #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)); logCpApiError("api_driver::TerminalApiDaemon::updateSettings()->CP_GetBUC_LNB_settings()", CP_GetBUC_LNB_settings(sid, bucLnb));
{ {
@ -317,8 +317,8 @@ private:
this->demodSettings = demod; this->demodSettings = demod;
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
this->acmSettings = acm; this->acmSettings = acm;
this->dpdiSettings = dpdi;
#endif #endif
this->dpdiSettings = dpdi;
this->bucLnbSettings = bucLnb; this->bucLnbSettings = bucLnb;
} }
} }
@ -544,8 +544,8 @@ private:
demodulator_settings demodSettings{}; demodulator_settings demodSettings{};
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
ACM_parameters_serv_ acmSettings{}; ACM_parameters_serv_ acmSettings{};
DPDI_parmeters dpdiSettings{};
#endif #endif
DPDI_parmeters dpdiSettings{};
buc_lnb_settings bucLnbSettings{}; buc_lnb_settings bucLnbSettings{};
std::shared_mutex networkSettingsMutex; std::shared_mutex networkSettingsMutex;
@ -611,27 +611,27 @@ public:
/** /**
* Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет. * Получение настроек, копирует текущие значения в структуры, переданные по указателю. Если передан пустой указатель, копирования не произойдет.
*/ */
void getSettings(
modulator_settings* mod, demodulator_settings* demod,
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
void getSettings(modulator_settings* mod, demodulator_settings* demod, ACM_parameters_serv_* acm, DPDI_parmeters* dpdi, buc_lnb_settings* bucLnb) { ACM_parameters_serv_* acm,
if (mod || demod || acm || dpdi || bucLnb) { #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); std::shared_lock lock(this->settingsMutex);
if (mod) { *mod = this->modSettings; } if (mod) { *mod = this->modSettings; }
if (demod) { *demod = this->demodSettings; } if (demod) { *demod = this->demodSettings; }
#ifdef MODEM_IS_SCPC
if (acm) { *acm = this->acmSettings; } if (acm) { *acm = this->acmSettings; }
#endif
if (dpdi) { *dpdi = this->dpdiSettings; } if (dpdi) { *dpdi = this->dpdiSettings; }
if (bucLnb) { *bucLnb = this->bucLnbSettings; } if (bucLnb) { *bucLnb = this->bucLnbSettings; }
} }
} }
#else
void getSettings(modulator_settings* mod, demodulator_settings* demod, buc_lnb_settings* bucLnb) {
if (mod || demod || bucLnb) {
std::shared_lock lock(this->settingsMutex);
if (mod) { *mod = this->modSettings; }
if (demod) { *demod = this->demodSettings; }
if (bucLnb) { *bucLnb = this->bucLnbSettings; }
}
}
#endif
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
bool getIsCinC() { bool getIsCinC() {
@ -699,21 +699,19 @@ public:
} }
#endif #endif
#ifdef MODEM_IS_SCPC void setSettingsDpdi(DPDI_parmeters& s, bool readback = true) {
void setSettingsCinc(DPDI_parmeters& s, bool readback = true) {
std::lock_guard lock(this->cpApiMutex); std::lock_guard lock(this->cpApiMutex);
logCpApiError("api_driver::TerminalApiDaemon::setSettingsCinc()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", "")); logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
logCpApiError("api_driver::TerminalApiDaemon::setSettingsCinc()->CP_SetDpdiParams()", CP_SetDpdiParams(sid, s)); logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDpdiParams()", CP_SetDpdiParams(sid, s));
if (readback) { if (readback) {
logCpApiError("api_driver::TerminalApiDaemon::setSettingsCinc()->CP_GetDpdiParams()", CP_GetDpdiParams(this->sid, &s)); logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_GetDpdiParams()", CP_GetDpdiParams(this->sid, &s));
{ {
std::lock_guard lock2{this->settingsMutex}; std::lock_guard lock2{this->settingsMutex};
this->dpdiSettings = s; this->dpdiSettings = s;
} }
} }
logCpApiError("api_driver::TerminalApiDaemon::setSettingsCinc()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", "")); logCpApiError("api_driver::TerminalApiDaemon::setSettingsDpdi()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
} }
#endif
void setSettingsBucLnb(buc_lnb_settings& bucLnb, bool readback = true) { void setSettingsBucLnb(buc_lnb_settings& bucLnb, bool readback = true) {
std::lock_guard lock(this->cpApiMutex); std::lock_guard lock(this->cpApiMutex);
@ -824,7 +822,7 @@ static void writeDouble(std::ostream& out, double value, int prec = 2) {
out << std::fixed << std::setprecision(prec) << value; out << std::fixed << std::setprecision(prec) << value;
} }
} }
#ifdef MODEM_IS_SCPC
double translateCoordinates(uint8_t deg, uint8_t min) { double translateCoordinates(uint8_t deg, uint8_t min) {
return static_cast<double>(deg) + static_cast<double>(min) / 60; return static_cast<double>(deg) + static_cast<double>(min) / 60;
} }
@ -835,7 +833,6 @@ std::tuple<uint8_t, uint8_t> translateCoordinates(double abs) {
auto min = static_cast<uint8_t>(min_double); auto min = static_cast<uint8_t>(min_double);
return std::make_tuple(deg, min); return std::make_tuple(deg, min);
} }
#endif
std::string api_driver::ApiDriver::loadTerminalState() const { std::string api_driver::ApiDriver::loadTerminalState() const {
@ -876,7 +873,7 @@ std::string api_driver::ApiDriver::loadTerminalState() const {
#else #else
{ {
modulator_settings modSet{}; modulator_settings modSet{};
daemon->getSettings(&modSet, nullptr, nullptr); daemon->getSettings(&modSet, nullptr, nullptr, nullptr);
result << ",\"tx.centerFreq\":"; writeDouble(result, modSet.central_freq_in_kGz); result << ",\"tx.centerFreq\":"; writeDouble(result, modSet.central_freq_in_kGz);
result << ",\"tx.symSpeed\":"; writeDouble(result, (static_cast<double>(modSet.baudrate) / 1000.0)); result << ",\"tx.symSpeed\":"; writeDouble(result, (static_cast<double>(modSet.baudrate) / 1000.0));
} }
@ -1018,12 +1015,12 @@ std::string api_driver::ApiDriver::loadSettings() const {
demodulator_settings demodSettings{}; demodulator_settings demodSettings{};
buc_lnb_settings bucLnb{}; buc_lnb_settings bucLnb{};
TerminalNetworkSettings network; TerminalNetworkSettings network;
DPDI_parmeters dpdiSettings{};
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
ACM_parameters_serv_ acmSettings{}; ACM_parameters_serv_ acmSettings{};
DPDI_parmeters dpdiSettings{};
daemon->getSettings(&modSettings, &demodSettings, &acmSettings, &dpdiSettings, &bucLnb); daemon->getSettings(&modSettings, &demodSettings, &acmSettings, &dpdiSettings, &bucLnb);
#else #else
daemon->getSettings(&modSettings, &demodSettings, &bucLnb); daemon->getSettings(&modSettings, &demodSettings, &dpdiSettings, &bucLnb);
#endif #endif
daemon->getNetworkSettings(network); daemon->getNetworkSettings(network);
@ -1060,16 +1057,23 @@ std::string api_driver::ApiDriver::loadSettings() const {
result << ",\"aupcMinAttenuation\":"; writeDouble(result, acmSettings.min_attenuation_aupc); result << ",\"aupcMinAttenuation\":"; writeDouble(result, acmSettings.min_attenuation_aupc);
result << ",\"aupcMaxAttenuation\":"; writeDouble(result, acmSettings.max_attenuation_aupc); result << ",\"aupcMaxAttenuation\":"; writeDouble(result, acmSettings.max_attenuation_aupc);
result << ",\"aupcRequiredSnr\":"; writeDouble(result, acmSettings.snr_threashold_aupc); result << ",\"aupcRequiredSnr\":"; writeDouble(result, acmSettings.snr_threashold_aupc);
result << ",\n\"cincIsPositional\":" << boolAsStr(!dpdiSettings.is_delay_window);
result << ",\"cincSearchBandwidth\":" << dpdiSettings.freq_offset; // полоса поиска в кГц
result << ",\"cincPositionStationLatitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.latitude_station_grad, dpdiSettings.latitude_station_minute), 6);
result << ",\"cincPositionStationLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_station_grad, dpdiSettings.longitude_station_minute), 6);
result << ",\"cincPositionSatelliteLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_sattelite_grad, dpdiSettings.longitude_sattelite_minute), 6);
result << ",\"cincDelayMin\":" << dpdiSettings.min_delay;
result << ",\"cincDelayMax\":" << dpdiSettings.max_delay;
#endif #endif
result << ",\n\"dpdiIsPositional\":" << boolAsStr(!dpdiSettings.is_delay_window);
#ifdef MODEM_IS_SCPC
result << ",\"dpdiSearchBandwidth\":" << dpdiSettings.freq_offset; // полоса поиска в кГц
#endif
result << ",\"dpdiPositionStationLatitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.latitude_station_grad, dpdiSettings.latitude_station_minute), 6);
result << ",\"dpdiPositionStationLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_station_grad, dpdiSettings.longitude_station_minute), 6);
result << ",\"dpdiPositionSatelliteLongitude\":"; writeDouble(result, translateCoordinates(dpdiSettings.longitude_sattelite_grad, dpdiSettings.longitude_sattelite_minute), 6);
#ifdef MODEM_IS_SCPC
result << ",\"dpdiDelayMin\":" << dpdiSettings.min_delay;
result << ",\"dpdiDelayMax\":" << dpdiSettings.max_delay;
#else
result << ",\"dpdiDelay\":" << dpdiSettings.max_delay;
#endif
#ifdef MODEM_IS_TDMA #ifdef MODEM_IS_TDMA
result << ",\n\"rxTxSatDelay\":" << static_cast<int>(demodSettings.delay_ms); result << ",\n\"rxTxSatDelay\":" << static_cast<int>(demodSettings.delay_ms);
#endif #endif
@ -1168,7 +1172,7 @@ void api_driver::ApiDriver::setRxTxSettings(boost::property_tree::ptree &pt) {
ACM_parameters_serv_ acm{}; ACM_parameters_serv_ acm{};
daemon->getSettings(&mod, &demod, &acm, nullptr, nullptr); daemon->getSettings(&mod, &demod, &acm, nullptr, nullptr);
#else #else
daemon->getSettings(&mod, &demod, nullptr); daemon->getSettings(&mod, &demod, nullptr, nullptr);
#endif #endif
// для модулятора // для модулятора
@ -1227,38 +1231,48 @@ void api_driver::ApiDriver::setRxTxSettings(boost::property_tree::ptree &pt) {
#endif #endif
} }
#ifdef MODEM_IS_SCPC void api_driver::ApiDriver::setDpdiSettings(boost::property_tree::ptree &pt) {
void api_driver::ApiDriver::setCincSettings(boost::property_tree::ptree &pt) {
DPDI_parmeters s{}; DPDI_parmeters s{};
#ifdef MODEM_IS_SCPC
this->daemon->getSettings(nullptr, nullptr, nullptr, &s, nullptr);
#else
this->daemon->getSettings(nullptr, nullptr, &s, nullptr);
#endif
s.is_delay_window = !pt.get<bool>("cincIsPositional"); s.is_delay_window = !pt.get<bool>("dpdiIsPositional");
s.freq_offset = pt.get<uint32_t>("cincSearchBandwidth"); #ifdef MODEM_IS_SCPC
s.freq_offset = pt.get<uint32_t>("dpdiSearchBandwidth");
#endif
auto ctmp = translateCoordinates(pt.get<double>("cincPositionStationLatitude")); auto ctmp = translateCoordinates(pt.get<double>("dpdiPositionStationLatitude"));
s.latitude_station_grad = std::get<0>(ctmp); s.latitude_station_grad = std::get<0>(ctmp);
s.latitude_station_minute = std::get<1>(ctmp); s.latitude_station_minute = std::get<1>(ctmp);
ctmp = translateCoordinates(pt.get<double>("cincPositionStationLongitude")); ctmp = translateCoordinates(pt.get<double>("dpdiPositionStationLongitude"));
s.longitude_station_grad = std::get<0>(ctmp); s.longitude_station_grad = std::get<0>(ctmp);
s.longitude_station_minute = std::get<1>(ctmp); s.longitude_station_minute = std::get<1>(ctmp);
ctmp = translateCoordinates(pt.get<double>("cincPositionSatelliteLongitude")); ctmp = translateCoordinates(pt.get<double>("dpdiPositionSatelliteLongitude"));
s.longitude_sattelite_grad = std::get<0>(ctmp); s.longitude_sattelite_grad = std::get<0>(ctmp);
s.longitude_sattelite_minute = std::get<1>(ctmp); s.longitude_sattelite_minute = std::get<1>(ctmp);
s.min_delay = pt.get<uint32_t>("cincDelayMin"); #ifdef MODEM_IS_SCPC
s.max_delay = pt.get<uint32_t>("cincDelayMax"); s.min_delay = pt.get<uint32_t>("dpdiDelayMin");
s.max_delay = pt.get<uint32_t>("dpdiDelayMax");
this->daemon->setSettingsCinc(s); #else
} s.min_delay = 0;
s.max_delay = pt.get<uint32_t>("dpdiDelay");
#endif #endif
this->daemon->setSettingsDpdi(s);
}
void api_driver::ApiDriver::setBucLnbSettings(boost::property_tree::ptree &pt) { void api_driver::ApiDriver::setBucLnbSettings(boost::property_tree::ptree &pt) {
buc_lnb_settings s{}; buc_lnb_settings s{};
#ifdef MODEM_IS_SCPC #ifdef MODEM_IS_SCPC
daemon->getSettings(nullptr, nullptr, nullptr, nullptr, &s); daemon->getSettings(nullptr, nullptr, nullptr, nullptr, &s);
#else #else
daemon->getSettings(nullptr, nullptr, &s); daemon->getSettings(nullptr, nullptr, nullptr, &s);
#endif #endif
auto tmp = pt.get<int>("bucPowering"); auto tmp = pt.get<int>("bucPowering");

View File

@ -48,12 +48,13 @@ namespace api_driver {
*/ */
void setRxTxSettings(boost::property_tree::ptree &pt); void setRxTxSettings(boost::property_tree::ptree &pt);
#ifdef MODEM_IS_SCPC
/** /**
* Установить настройки CinC, readback можно получить используя loadTerminalState. * Установить настройки DPDI, readback можно получить используя loadTerminalState.
* @note Для TDMA и SCPC модемов эти настройки доступны
*/ */
void setCincSettings(boost::property_tree::ptree &pt); void setDpdiSettings(boost::property_tree::ptree &pt);
#endif
/** /**
* Установить настройки BUC и LNB, readback можно получить используя loadTerminalState. * Установить настройки BUC и LNB, readback можно получить используя loadTerminalState.
*/ */

View File

@ -322,21 +322,21 @@
<div class="settings-set-container" v-show="paramRxtx.isCinC"> <div class="settings-set-container" v-show="paramRxtx.isCinC">
<label> <label>
<span>Метод расчета задержки</span> <span>Метод расчета задержки</span>
<select v-model="paramCinc.cincIsPositional"> <select v-model="paramDpdi.dpdiIsPositional">
<option :value="true">Позиционированием</option> <option :value="true">Позиционированием</option>
<option :value="false">Окном задержки</option> <option :value="false">Окном задержки</option>
</select> </select>
</label> </label>
<label><span>Полоса поиска, КГц ±</span><input type="number" v-model="paramCinc.cincSearchBandwidth" max="100" step="1"/></label> <label><span>Полоса поиска, КГц ±</span><input type="number" v-model="paramDpdi.dpdiSearchBandwidth" max="100" step="1"/></label>
<h2 v-show="paramCinc.cincIsPositional === true">Настройки позиционирования</h2> <h2 v-show="paramDpdi.dpdiIsPositional === true">Настройки позиционирования</h2>
<label v-show="paramCinc.cincIsPositional === true"><span>Широта станции</span><input type="number" v-model="paramCinc.cincPositionStationLatitude" min="-180" max="180" step="1e-06"/></label> <label v-show="paramDpdi.dpdiIsPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLatitude" min="-180" max="180" step="1e-06"/></label>
<label v-show="paramCinc.cincIsPositional === true"><span>Долгота станции</span><input type="number" v-model="paramCinc.cincPositionStationLongitude" min="-180" max="180" step="1e-06"/></label> <label v-show="paramDpdi.dpdiIsPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLongitude" min="-180" max="180" step="1e-06"/></label>
<label v-show="paramCinc.cincIsPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramCinc.cincPositionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label> <label v-show="paramDpdi.dpdiIsPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.dpdiPositionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
<h2 v-show="paramCinc.cincIsPositional === false">Задержка до спутника</h2> <h2 v-show="paramDpdi.dpdiIsPositional === false">Задержка до спутника</h2>
<label v-show="paramCinc.cincIsPositional === false"><span>от, мс</span><input type="number" v-model="paramCinc.cincDelayMin" max="400" step="0.1"/></label> <label v-show="paramDpdi.dpdiIsPositional === false"><span>от, мс</span><input type="number" v-model="paramDpdi.dpdiDelayMin" max="400" step="0.1"/></label>
<label v-show="paramCinc.cincIsPositional === false"><span>до, мс</span><input type="number" v-model="paramCinc.cincDelayMax" max="400" step="0.1"/></label> <label v-show="paramDpdi.dpdiIsPositional === false"><span>до, мс</span><input type="number" v-model="paramDpdi.dpdiDelayMax" max="400" step="0.1"/></label>
</div> </div>
<button class="action-button" @click="settingsSubmitCinc()" v-show="paramRxtx.isCinC">Сохранить <span class="submit-spinner" v-show="submitStatus.cinc"></span></button> <button class="action-button" @click="settingsSubmitDpdi()" v-show="paramRxtx.isCinC">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
<h2>Настройки питания и опорного генератора</h2> <h2>Настройки питания и опорного генератора</h2>
<div class="tabs-item-flex-container"> <div class="tabs-item-flex-container">
<div class="settings-set-container"> <div class="settings-set-container">
@ -573,7 +573,7 @@
// false - означает что статистика не отправляется, true - отправляется // false - означает что статистика не отправляется, true - отправляется
submitStatus: { submitStatus: {
rxtx: false, rxtx: false,
cinc: false, dpdi: false,
buclnb: false, buclnb: false,
tcpaccel: false, tcpaccel: false,
network: false, network: false,
@ -617,14 +617,14 @@
rxRolloff: 2, rxRolloff: 2,
rxGoldan: 0, rxGoldan: 0,
}, },
paramCinc: { paramDpdi: {
cincIsPositional: true, dpdiIsPositional: true,
cincSearchBandwidth: 0, dpdiSearchBandwidth: 0,
cincPositionStationLatitude: -180, dpdiPositionStationLatitude: -180,
cincPositionStationLongitude: -180, dpdiPositionStationLongitude: -180,
cincPositionSatelliteLongitude: -180, dpdiPositionSatelliteLongitude: -180,
cincDelayMin: 0, dpdiDelayMin: 0,
cincDelayMax: 0, dpdiDelayMax: 0,
}, },
paramBuclnb: { paramBuclnb: {
bucRefClk10M: false, bucRefClk10M: false,
@ -815,24 +815,24 @@
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) }) .catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
.finally(() => { this.submitStatus.rxtx = false }) .finally(() => { this.submitStatus.rxtx = false })
}, },
settingsSubmitCinc() { settingsSubmitDpdi() {
if (this.submitStatus.cinc) { return } if (this.submitStatus.dpdi) { return }
let query = { let query = {
"cincIsPositional": this.paramCinc.cincIsPositional, "dpdiIsPositional": this.paramDpdi.dpdiIsPositional,
"cincSearchBandwidth": this.paramCinc.cincSearchBandwidth, "dpdiSearchBandwidth": this.paramDpdi.dpdiSearchBandwidth,
"cincPositionStationLatitude": this.paramCinc.cincPositionStationLatitude, "dpdiPositionStationLatitude": this.paramDpdi.dpdiPositionStationLatitude,
"cincPositionStationLongitude": this.paramCinc.cincPositionStationLongitude, "dpdiPositionStationLongitude": this.paramDpdi.dpdiPositionStationLongitude,
"cincPositionSatelliteLongitude": this.paramCinc.cincPositionSatelliteLongitude, "dpdiPositionSatelliteLongitude": this.paramDpdi.dpdiPositionSatelliteLongitude,
"cincDelayMin": this.paramCinc.cincDelayMin, "dpdiDelayMin": this.paramDpdi.dpdiDelayMin,
"cincDelayMax": this.paramCinc.cincDelayMax, "dpdiDelayMax": this.paramDpdi.dpdiDelayMax,
} }
this.submitStatus.cinc = true this.submitStatus.dpdi = true
fetch('/api/set/cinc', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query), credentials: 'same-origin' }) fetch('/api/set/dpdi', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query), credentials: 'same-origin' })
.then(async (resp) => { let vals = await resp.json(); if (vals['status'] !== 'ok') { throw new Error(vals['error'] ? vals['error'] : "Server returns undefined error") } this.updateCincSettings(vals) }) .then(async (resp) => { let vals = await resp.json(); if (vals['status'] !== 'ok') { throw new Error(vals['error'] ? vals['error'] : "Server returns undefined error") } this.updateDpdiSettings(vals) })
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) }) .catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
.finally(() => { this.submitStatus.cinc = false }) .finally(() => { this.submitStatus.dpdi = false })
}, },
settingsSubmitBuclnb() { settingsSubmitBuclnb() {
if (this.submitStatus.buclnb) { return } if (this.submitStatus.buclnb) { return }
@ -920,15 +920,15 @@
this.paramRxtx.rxRolloff = vals["settings"]["rxRolloff"] this.paramRxtx.rxRolloff = vals["settings"]["rxRolloff"]
this.paramRxtx.rxGoldan = vals["settings"]["rxGoldan"] this.paramRxtx.rxGoldan = vals["settings"]["rxGoldan"]
}, },
updateCincSettings(vals) { updateDpdiSettings(vals) {
this.submitStatus.cinc = false this.submitStatus.dpdi = false
this.paramCinc.cincIsPositional = vals["settings"]["cincIsPositional"] this.paramDpdi.dpdiIsPositional = vals["settings"]["dpdiIsPositional"]
this.paramCinc.cincSearchBandwidth = vals["settings"]["cincSearchBandwidth"] this.paramDpdi.dpdiSearchBandwidth = vals["settings"]["dpdiSearchBandwidth"]
this.paramCinc.cincPositionStationLatitude = vals["settings"]["cincPositionStationLatitude"] this.paramDpdi.dpdiPositionStationLatitude = vals["settings"]["dpdiPositionStationLatitude"]
this.paramCinc.cincPositionStationLongitude = vals["settings"]["cincPositionStationLongitude"] this.paramDpdi.dpdiPositionStationLongitude = vals["settings"]["dpdiPositionStationLongitude"]
this.paramCinc.cincPositionSatelliteLongitude = vals["settings"]["cincPositionSatelliteLongitude"] this.paramDpdi.dpdiPositionSatelliteLongitude = vals["settings"]["dpdiPositionSatelliteLongitude"]
this.paramCinc.cincDelayMin = vals["settings"]["cincDelayMin"] this.paramDpdi.dpdiDelayMin = vals["settings"]["dpdiDelayMin"]
this.paramCinc.cincDelayMax = vals["settings"]["cincDelayMax"] this.paramDpdi.dpdiDelayMax = vals["settings"]["dpdiDelayMax"]
}, },
updateBuclnbSettings(vals) { updateBuclnbSettings(vals) {
this.submitStatus.buclnb = false this.submitStatus.buclnb = false
@ -1381,7 +1381,7 @@
let vals = await d.json() let vals = await d.json()
this.settingFetchComplete = true this.settingFetchComplete = true
this.updateRxtxSettings(vals) this.updateRxtxSettings(vals)
this.updateCincSettings(vals) this.updateDpdiSettings(vals)
this.updateBuclnbSettings(vals) this.updateBuclnbSettings(vals)
this.updateTcpaccelSettings(vals) this.updateTcpaccelSettings(vals)
this.updateNetworkSettings(vals) this.updateNetworkSettings(vals)

View File

@ -155,11 +155,23 @@
</label> </label>
</div> </div>
</div> </div>
<div class="settings-set-container">
<h3>Настройки позиционирования</h3>
<label><span>Задержка до спутника, мс</span><input type="number" v-model="paramRxtx.rxTxSatDelay" max="600" step="1"/></label>
</div>
<button class="action-button" @click="settingsSubmitRxtx()">Сохранить <span class="submit-spinner" v-show="submitStatus.rxtx"></span></button> <button class="action-button" @click="settingsSubmitRxtx()">Сохранить <span class="submit-spinner" v-show="submitStatus.rxtx"></span></button>
<h2>Настройки DPDI</h2>
<div class="settings-set-container">
<label>
<span>Метод расчета задержки</span>
<select v-model="paramDpdi.dpdiIsPositional">
<option :value="true">Позиционированием</option>
<option :value="false">Окном задержки</option>
</select>
</label>
<h2 v-show="paramDpdi.dpdiIsPositional === true">Настройки позиционирования</h2>
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Широта станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLatitude" min="-180" max="180" step="1e-06"/></label>
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Долгота станции</span><input type="number" v-model="paramDpdi.dpdiPositionStationLongitude" min="-180" max="180" step="1e-06"/></label>
<label v-show="paramDpdi.dpdiIsPositional === true"><span>Подспутниковая точка</span><input type="number" v-model="paramDpdi.dpdiPositionSatelliteLongitude" min="-180" max="180" step="1e-06"/></label>
<label v-show="paramDpdi.dpdiIsPositional === false"><span>Задержка до спутника, мс</span><input type="number" v-model="paramDpdi.dpdiDelay" max="400" step="0.1"/></label>
</div>
<button class="action-button" @click="settingsSubmitDpdi()">Сохранить <span class="submit-spinner" v-show="submitStatus.dpdi"></span></button>
<h2>Настройки питания и опорного генератора</h2> <h2>Настройки питания и опорного генератора</h2>
<div class="tabs-item-flex-container"> <div class="tabs-item-flex-container">
<div class="settings-set-container"> <div class="settings-set-container">
@ -285,6 +297,7 @@
submitStatus: { submitStatus: {
rxtx: false, rxtx: false,
buclnb: false, buclnb: false,
dpdi: false,
network: false, network: false,
firmwareUpload: false, firmwareUpload: false,
firmwareUpgrade: false, firmwareUpgrade: false,
@ -304,7 +317,6 @@
rxCentralFreq: 900000, rxCentralFreq: 900000,
rxBaudrate: 0, rxBaudrate: 0,
rxRolloff: 2, rxRolloff: 2,
rxTxSatDelay: 0,
}, },
paramBuclnb: { paramBuclnb: {
bucRefClk10M: false, bucRefClk10M: false,
@ -314,6 +326,13 @@
srvRefClk10M: false, srvRefClk10M: false,
bucLnbAutoStart: false, bucLnbAutoStart: false,
}, },
paramDpdi: {
dpdiIsPositional: true,
dpdiPositionStationLatitude: -180,
dpdiPositionStationLongitude: -180,
dpdiPositionSatelliteLongitude: -180,
dpdiDelay: 0,
},
paramNetwork: { paramNetwork: {
netManagementIp: null, netManagementIp: null,
netIsL2: false, netIsL2: false,
@ -445,7 +464,6 @@
"rxCentralFreq": this.paramRxtx.rxCentralFreq, "rxCentralFreq": this.paramRxtx.rxCentralFreq,
"rxBaudrate": this.paramRxtx.rxBaudrate, "rxBaudrate": this.paramRxtx.rxBaudrate,
"rxRolloff": this.paramRxtx.rxRolloff, "rxRolloff": this.paramRxtx.rxRolloff,
"rxTxSatDelay": this.paramRxtx.rxTxSatDelay,
} }
this.submitStatus.rxtx = true this.submitStatus.rxtx = true
@ -473,6 +491,23 @@
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) }) .catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
.finally(() => { this.submitStatus.buclnb = false }) .finally(() => { this.submitStatus.buclnb = false })
}, },
settingsSubmitDpdi() {
if (this.submitStatus.dpdi) { return }
let query = {
"dpdiIsPositional": this.paramDpdi.dpdiIsPositional,
"dpdiPositionStationLatitude": this.paramDpdi.dpdiPositionStationLatitude,
"dpdiPositionStationLongitude": this.paramDpdi.dpdiPositionStationLongitude,
"dpdiPositionSatelliteLongitude": this.paramDpdi.dpdiPositionSatelliteLongitude,
"dpdiDelay": this.paramDpdi.dpdiDelay,
}
this.submitStatus.dpdi = true
fetch('/api/set/dpdi', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(query), credentials: 'same-origin' })
.then(async (resp) => { let vals = await resp.json(); if (vals['status'] !== 'ok') { throw new Error(vals['error'] ? vals['error'] : "Server returns undefined error") } this.updateDpdiSettings(vals) })
.catch((reason) => { alert(`Ошибка при применении настроек: ${reason}`) })
.finally(() => { this.submitStatus.dpdi = false })
},
settingsSubmitNetwork() { settingsSubmitNetwork() {
if (this.submitStatus.network) { return } if (this.submitStatus.network) { return }
{ if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return } { if (!confirm("Применение этих настроек может сделать модем недоступным! Продолжить?")) return }
@ -504,7 +539,6 @@
this.paramRxtx.rxCentralFreq = vals["settings"]["rxCentralFreq"] this.paramRxtx.rxCentralFreq = vals["settings"]["rxCentralFreq"]
this.paramRxtx.rxBaudrate = vals["settings"]["rxBaudrate"] this.paramRxtx.rxBaudrate = vals["settings"]["rxBaudrate"]
this.paramRxtx.rxRolloff = vals["settings"]["rxRolloff"] this.paramRxtx.rxRolloff = vals["settings"]["rxRolloff"]
this.paramRxtx.rxTxSatDelay = vals["settings"]["rxTxSatDelay"]
}, },
updateBuclnbSettings(vals) { updateBuclnbSettings(vals) {
this.submitStatus.buclnb = false this.submitStatus.buclnb = false
@ -515,6 +549,14 @@
this.paramBuclnb.srvRefClk10M = vals["settings"]["srvRefClk10M"] this.paramBuclnb.srvRefClk10M = vals["settings"]["srvRefClk10M"]
this.paramBuclnb.bucLnbAutoStart = vals["settings"]["bucLnbAutoStart"] this.paramBuclnb.bucLnbAutoStart = vals["settings"]["bucLnbAutoStart"]
}, },
updateDpdiSettings(vals) {
this.submitStatus.dpdi = false
this.paramDpdi.dpdiIsPositional = vals["settings"]["dpdiIsPositional"]
this.paramDpdi.dpdiPositionStationLatitude = vals["settings"]["dpdiPositionStationLatitude"]
this.paramDpdi.dpdiPositionStationLongitude = vals["settings"]["dpdiPositionStationLongitude"]
this.paramDpdi.dpdiPositionSatelliteLongitude = vals["settings"]["dpdiPositionSatelliteLongitude"]
this.paramDpdi.dpdiDelay = vals["settings"]["dpdiDelay"]
},
updateNetworkSettings(vals) { updateNetworkSettings(vals) {
this.submitStatus.network = false this.submitStatus.network = false
this.paramNetwork.netManagementIp = vals["settings"]["netManagementIp"] this.paramNetwork.netManagementIp = vals["settings"]["netManagementIp"]
@ -688,6 +730,7 @@
this.settingFetchComplete = true this.settingFetchComplete = true
this.updateRxtxSettings(vals) this.updateRxtxSettings(vals)
this.updateBuclnbSettings(vals) this.updateBuclnbSettings(vals)
this.updateDpdiSettings(vals)
this.updateNetworkSettings(vals) this.updateNetworkSettings(vals)
if ('netServerName' in vals['settings']) { if ('netServerName' in vals['settings']) {