193 template <
typename... Types>
198 template <
typename T>
242 template <const auto Key, const auto &Map>
243 static constexpr auto
246 using MapType = std::remove_reference_t<
decltype(Map)>;
247 static_assert(std::is_same_v<
typename MapType::key_type,
decltype(Key)>,
248 "Key type and map key type do not match");
250 "Map values must be a basic_param_info<...> specialization.");
251 return std::get<Map[Key].default_value.index()>(Map[Key].default_value);
261 static constexpr auto
264 return std::get<m_settings_map[P].default_value.index()>(
265 m_settings_map[P].default_value);
278 const auto Key,
const auto &Map,
auto &RuntimeMap,
typename T,
279 typename = std::enable_if_t<!std::is_same_v<
decltype(Key),
param>,
void>>
283 using MapType = std::remove_reference_t<
decltype(Map)>;
284 static_assert(std::is_same_v<
typename MapType::key_type,
decltype(Key)>,
285 "Key type and map key type do not match");
287 "Map values must be a basic_param_info<...> specialization.");
290 RuntimeMap.at(Key) = x;
300 const auto Key,
typename T,
301 typename = std::enable_if_t<std::is_same_v<
decltype(Key),
param>,
void>>
305 static_assert(std::holds_alternative<T>(m_settings_map[Key].default_value),
306 "Parameter value type and specified type do not match");
309 m_runtime_settings_map.at(Key) = x;
319 template <const auto Key, const auto &Map, auto &RuntimeMap>
323 using MapType = std::remove_reference_t<
decltype(Map)>;
324 static_assert(std::is_same_v<
typename MapType::key_type,
decltype(Key)>,
325 "Key type and map key type do not match");
327 "Map values must be a basic_param_info<...> specialization.");
352 return std::get<std::decay_t<
decltype(d)>>(m_runtime_settings_map.at(P));
364 template <const auto Key, const auto &Map, const auto &RuntimeMap>
370 return std::get<std::decay_t<
decltype(d)>>(RuntimeMap.at(Key));
385 template <const auto Key, const auto &Map, auto &RuntimeMap>
391 using value_t = std::decay_t<
decltype(d)>;
393 if constexpr (std::is_same_v<value_t, bool>) {
395 if (read(Map[Key].path, raw) >= 0 &&
405 if (read(Map[Key].path, val) >= 0)
406 RuntimeMap.at(Key) = val;
429 using value_t = std::decay_t<
decltype(d)>;
430 if constexpr (std::is_same_v<value_t, bool>) {
432 if (read(m_settings_map[P].path, raw) >= 0 &&
434 m_runtime_settings_map.at(P) = (raw ==
TRUE_MAGIC);
442 if (read(m_settings_map[P].path, val) >= 0)
443 m_runtime_settings_map.at(P) = val;
468 using value_t = std::decay_t<
decltype(d)>;
469 auto val = std::get<value_t>(m_runtime_settings_map.at(P));
471 if constexpr (std::is_same_v<value_t, bool>) {
474 write(m_settings_map[P].path, val);
492 template <const auto Key, const auto &Map, auto &RuntimeMap>
496 using MapType = std::remove_reference_t<
decltype(Map)>;
497 static_assert(std::is_same_v<
typename MapType::key_type,
decltype(Key)>,
498 "Key type and map key type do not match");
500 "Map values must be a basic_param_info<...> specialization.");
504 using value_t = std::decay_t<
decltype(d)>;
505 auto val = std::get<value_t>(RuntimeMap.at(Key));
506 if constexpr (std::is_same_v<value_t, bool>) {
509 write(Map[Key].path, val);
530 template <const auto &Map, auto &RuntimeMap>
534 load_sequence<Map, RuntimeMap>(std::make_index_sequence<Map.size()>{});
543 template <const auto &Map, auto &RuntimeMap>
547 reset_sequence<Map, RuntimeMap>(std::make_index_sequence<Map.size()>{});
557 template <const auto &Map, auto &RuntimeMap>
561 save_sequence<Map, RuntimeMap>(std::make_index_sequence<Map.size()>{});
568 mutable struct k_mutex m_mtx;
597 static_cast<uint32_t
>(CONFIG_UHF_TX_FREQ_HZ)}),
601 static_cast<uint32_t
>(CONFIG_UHF_RX_FREQ_HZ),
605 "/lfs1/sband-tx-freq",
606 static_cast<uint32_t
>(CONFIG_SBAND_TX_FREQ_HZ),
610 "/lfs1/sband-rx-freq",
611 static_cast<uint32_t
>(CONFIG_SBAND_RX_FREQ_HZ),
615 static_cast<bool>(CONFIG_UHF_TX_ENABLE)}),
618 static_cast<bool>(CONFIG_SBAND_TX_ENABLE)}),
623 static_cast<float>(CONFIG_UHF_TX_GAIN_DB10) / 10.0f,
628 "/lfs1/sband-tx-gain",
629 static_cast<float>(CONFIG_SBAND_TX_GAIN_DB10) / 10.0f,
633 "/lfs1/io-wdg-period-min",
634 static_cast<uint32_t
>(CONFIG_IO_WDG_PERIOD_MINS),
639 "/lfs1/sband-rx-range-min",
640 static_cast<uint32_t
>(CONFIG_SBAND_RX_RANGE_MIN_HZ),
645 "/lfs1/sband-rx-range-max",
646 static_cast<uint32_t
>(CONFIG_SBAND_RX_RANGE_MAX_HZ),
651 "/lfs1/sband-tx-range-min",
652 static_cast<uint32_t
>(CONFIG_SBAND_TX_RANGE_MIN_HZ),
657 "/lfs1/sband-tx-range-max",
658 static_cast<uint32_t
>(CONFIG_SBAND_TX_RANGE_MAX_HZ),
663 "/lfs1/sband-agc0-range-min",
664 static_cast<float>(CONFIG_SBAND_AGC0_RANGE_MIN_DB10) / 10.0f,
669 "/lfs1/sband-agc0-range-max",
670 static_cast<float>(CONFIG_SBAND_AGC0_RANGE_MAX_DB10) / 10.0f,
675 "/lfs1/sband-gain0-range-min",
676 static_cast<float>(CONFIG_SBAND_GAIN0_RANGE_MIN_DB10) / 10.0f,
681 "/lfs1/sband-gain0-range-max",
682 static_cast<float>(CONFIG_SBAND_GAIN0_RANGE_MAX_DB10) / 10.0f,
688 "/lfs1/sband-agc0-calib-slope",
689 static_cast<float>(CONFIG_SBAND_AGC0_CALIB_SLOPE_M100000) /
695 "/lfs1/sband-agc0-calib-intrcpt",
696 static_cast<float>(CONFIG_SBAND_AGC0_CALIB_INTRCPT_M100000) /
702 "/lfs1/sband-gain0-calib-slope",
703 static_cast<float>(CONFIG_SBAND_GAIN0_CALIB_SLOPE_M100000) /
709 "/lfs1/sband-gain0-calib-intrcpt",
710 static_cast<float>(CONFIG_SBAND_GAIN0_CALIB_INTRCPT_M100000) /
716 "/lfs1/uhf-rx-range-min",
717 static_cast<uint32_t
>(CONFIG_UHF_RX_RANGE_MIN_HZ),
721 "/lfs1/uhf-rx-range-max",
722 static_cast<uint32_t
>(CONFIG_UHF_RX_RANGE_MAX_HZ),
726 "/lfs1/uhf-tx-range-min",
727 static_cast<uint32_t
>(CONFIG_UHF_TX_RANGE_MIN_HZ),
731 "/lfs1/uhf-tx-range-max",
732 static_cast<uint32_t
>(CONFIG_UHF_TX_RANGE_MAX_HZ),
737 "/lfs1/uhf-agc0-range-min",
738 static_cast<float>(CONFIG_UHF_AGC0_RANGE_MIN_DB10) / 10.0f,
743 "/lfs1/uhf-agc0-range-max",
744 static_cast<float>(CONFIG_UHF_AGC0_RANGE_MAX_DB10) / 10.0f,
749 "/lfs1/uhf-gain0-range-min",
750 static_cast<float>(CONFIG_UHF_GAIN0_RANGE_MIN_DB10) / 10.0f,
755 "/lfs1/uhf-gain0-range-max",
756 static_cast<float>(CONFIG_UHF_GAIN0_RANGE_MAX_DB10) / 10.0f,
761 "/lfs1/uhf-agc0-calib-slope",
762 static_cast<float>(CONFIG_UHF_AGC0_CALIB_SLOPE_M100000) /
768 "/lfs1/uhf-agc0-calib-intrcpt",
769 static_cast<float>(CONFIG_UHF_AGC0_CALIB_INTRCPT_M100000) /
775 "/lfs1/uhf-gain0-calib-slope",
776 static_cast<float>(CONFIG_UHF_GAIN0_CALIB_SLOPE_M100000) /
782 "/lfs1/uhf-gain0-calib-intrcpt",
783 static_cast<float>(CONFIG_UHF_GAIN0_CALIB_INTRCPT_M100000) /
791 CONFIG_UHF_FILTER)}),
795 "/lfs1/sband-filter",
801 static_cast<bool>(CONFIG_UHF_ENABLE)}),
806 CONFIG_UHF_GAIN0_MODE)}),
810 CONFIG_UHF_GAIN1_MODE)}),
814 static_cast<float>(CONFIG_UHF_GAIN0_TGT_DB10) /
819 static_cast<float>(CONFIG_UHF_GAIN0_GAIN_DB10) /
824 agc1{.tgt =
static_cast<at86rf215_agc_tgt_t
>(
825 CONFIG_UHF_GAIN1_TGT),
826 .avg =
static_cast<at86rf215_agc_avgs_t
>(
827 CONFIG_UHF_GAIN1_AVGS),
828 .input = CONFIG_UHF_GAIN1_INPUT}}),
831 static_cast<float>(CONFIG_UHF_GAIN1_GAIN)}),
836 CONFIG_UHF_TX_MODULATION)}),
841 fsk{.baudrate =
static_cast<at86rf215_fsk_srate_t
>(
842 CONFIG_UHF_FSK_TX_BAUDRATE),
843 .mod_idx = CONFIG_UHF_FSK_TX_MOD_IDX_M1000 / 1000.0f,
845 CONFIG_UHF_FSK_TX_SHAPING_BT_M1000 / 1000.0f}}),
849 CONFIG_UHF_RX_MODULATION)}),
854 fsk{.baudrate =
static_cast<at86rf215_fsk_srate_t
>(
855 CONFIG_UHF_FSK_RX_BAUDRATE),
856 .mod_idx = CONFIG_UHF_FSK_RX_MOD_IDX_M1000 / 1000.0f,
861 static_cast<bool>(CONFIG_SBAND_ENABLE)}),
865 CONFIG_SBAND_GAIN0_MODE)}),
869 CONFIG_SBAND_GAIN1_MODE)}),
873 static_cast<float>(CONFIG_SBAND_GAIN0_TGT_DB10) /
878 static_cast<float>(CONFIG_SBAND_GAIN0_GAIN_DB10) /
883 agc1{.tgt =
static_cast<at86rf215_agc_tgt_t
>(
884 CONFIG_SBAND_GAIN1_TGT),
885 .avg =
static_cast<at86rf215_agc_avgs_t
>(
886 CONFIG_SBAND_GAIN1_AVGS),
887 .input = CONFIG_SBAND_GAIN1_INPUT}}),
891 static_cast<float>(CONFIG_SBAND_GAIN1_GAIN)}),
895 CONFIG_SBAND_TX_MODULATION)}),
899 "/lfs1/sband-fsk-tx",
900 fsk{.baudrate =
static_cast<at86rf215_fsk_srate_t
>(
901 CONFIG_SBAND_FSK_TX_BAUDRATE),
902 .mod_idx = CONFIG_SBAND_FSK_TX_MOD_IDX_M1000 / 1000.0f,
904 CONFIG_SBAND_FSK_TX_SHAPING_BT_M1000 / 1000.0f}}),
908 CONFIG_SBAND_RX_MODULATION)}),
912 "/lfs1/sband-fsk-rx",
913 fsk{.baudrate =
static_cast<at86rf215_fsk_srate_t
>(
914 CONFIG_SBAND_FSK_RX_BAUDRATE),
915 .mod_idx = CONFIG_SBAND_FSK_RX_MOD_IDX_M1000 / 1000.0f,
920 static_cast<float>(CONFIG_THERMAL_UHF_SHUTDOWN_TEMP)}),
924 static_cast<float>(CONFIG_THERMAL_UHF_ENABLE_TEMP)}),
926 param_info{
"/lfs1/thermal-sband-shutdown-temp",
928 CONFIG_THERMAL_SBAND_SHUTDOWN_TEMP)}),
932 static_cast<float>(CONFIG_THERMAL_SBAND_ENABLE_TEMP)}),
936 static_cast<float>(CONFIG_THERMAL_PCB_SHUTDOWN_TEMP)}),
940 static_cast<float>(CONFIG_THERMAL_PCB_ENABLE_TEMP)}),
944 static_cast<float>(CONFIG_THERMAL_MIN_VALID_TEMP)}),
948 static_cast<float>(CONFIG_THERMAL_MAX_VALID_TEMP)}),
952 static_cast<uint32_t
>(CONFIG_UHF_TRX_TURNAROUND_MS)}),
955 static_cast<uint32_t
>(
956 CONFIG_SBAND_TRX_TURNAROUND_MS)}),
960 static_cast<uint32_t
>(CONFIG_UHF_RX_ON_SECS)}),
964 static_cast<uint32_t
>(CONFIG_UHF_RX_OFF_SECS)}),
968 static_cast<uint32_t
>(CONFIG_SBAND_RX_ON_SECS)}),
972 static_cast<uint32_t
>(CONFIG_SBAND_RX_OFF_SECS)}),
977 static_cast<uint32_t
>(CONFIG_UHF_TX_WAIT_MS)}),
982 static_cast<uint32_t
>(CONFIG_SBAND_TX_WAIT_MS)}),
987 CONFIG_FPGA_BOOT_MODE)})};
990 m_runtime_settings_map;
992 template <
typename T>
994 read(
const char *fname, T &x)
997 struct fs_file_t file;
1000 fs_file_t_init(&file);
1001 ret = fs_open(&file, fname, FS_O_READ);
1006 ret = fs_read(&file, &val,
sizeof(val));
1012 ret = fs_close(&file);
1020 template <
typename T>
1022 write(
const char *fname,
const T &x)
1024 struct fs_file_t file;
1027 fs_file_t_init(&file);
1028 ret = fs_open(&file, fname, FS_O_CREATE | FS_O_RDWR);
1029 if (ret && ret != -ENOENT) {
1033 ret = fs_write(&file, &x,
sizeof(x));
1038 return fs_close(&file);
1049 template <
const auto &Map,
auto &RuntimeMap,
const auto... KeySeq>
1051 reset_sequence(std::index_sequence<KeySeq...>)
1053 constexpr auto keys = Map.keys();
1062 template <
const auto... KeySeq>
1064 reset_sequence(std::index_sequence<KeySeq...>)
1066 constexpr auto keys = m_settings_map.keys();
1075 template <
const auto... KeySeq>
1077 load_sequence(std::index_sequence<KeySeq...>)
1079 constexpr auto keys = m_settings_map.keys();
1091 template <
const auto &Map,
auto &RuntimeMap,
const auto... KeySeq>
1093 load_sequence(std::index_sequence<KeySeq...>)
1095 constexpr auto keys = Map.keys();
1104 template <
const auto... KeySeq>
1106 save_sequence(std::index_sequence<KeySeq...>)
1108 constexpr auto keys = m_settings_map.keys();
1119 template <
const auto &Map,
auto &RuntimeMap,
const auto... KeySeq>
1121 save_sequence(std::index_sequence<KeySeq...>)
1123 constexpr auto keys = Map.keys();