32#include <etl/bit_stream.h>
40 uint32_t float_bits = reader.read<uint32_t>(32).value();
41 std::memcpy(&x, &float_bits,
sizeof(float_bits));
47 uint64_t double_bits = reader.read<uint64_t>(64).value();
48 std::memcpy(&x, &double_bits,
sizeof(double_bits));
54 etl::bit_stream_reader bit_stream(etl::span(b, len), etl::endian::big);
75 etl::bit_stream_reader &bit_stream)
77 uint32_t num_of_logs = bit_stream.read<uint32_t>(32).value();
83telecommand::parse_tlm_req(msg_arbiter::msg &m,
84 etl::bit_stream_reader &bit_stream)
132 etl::bit_stream_reader &reader, packet_id
id)
136 telecommand::prefixed_string path;
137 path.deserialize(reader);
142 telecommand::prefixed_string path;
143 path.deserialize(reader);
144 size_t offset = reader.read<
size_t>(32).value();
145 size_t len = reader.read<
size_t>(32).value();
147 len = CONFIG_MAX_MTU;
153 telecommand::prefixed_string path;
154 path.deserialize(reader);
172 parser<telecommand::packet_id::TEST_TX_SIMPLE> req;
173 req.deserialize(bit_stream);
177 {req.nframes, req.delay_us, req.len});
181 {req.nframes, req.delay_us, req.len});
194 parser() : iface(0), nframes(0), delay_us(0), len(0) {}
199 iface = reader.read<uint32_t>(1).value();
200 nframes = reader.read<uint32_t>(32).value();
201 delay_us = reader.read<uint32_t>(32).value();
202 len = reader.read<uint32_t>(32).value();
224 yes = reader.read<uint8_t>(1).value();
234 parser<telecommand::packet_id::FPGA_ENABLE> req;
235 req.deserialize(bit_stream);
237 if (req.enable_fpga) {
247 parser() : enable_fpga(false) {}
252 enable_fpga = reader.read<uint8_t>(1).value();
263 parser<telecommand::packet_id::SET_FLASH_MONITOR_DELAY_SEC> req;
264 req.deserialize(bit_stream);
267 if (req.flash_mon_delay_sec == 0) {
270 mem_mon.start(etl::clamp(req.flash_mon_delay_sec, 1U, 21600U));
276 uint32_t flash_mon_delay_sec;
277 parser() : flash_mon_delay_sec(0) {}
282 flash_mon_delay_sec = reader.read<uint32_t>(32).value();
291 parser<telecommand::packet_id::STORAGE_ENABLE> req;
292 req.deserialize(bit_stream);
300 parser() : enable_storage(false) {}
305 enable_storage = reader.read<uint8_t>(1).value();
315 parser<telecommand::packet_id::STORAGE_DIRECTION> req;
316 req.deserialize(bit_stream);
351 parser<telecommand::packet_id::STOP_WDT_UPDATE> req;
352 req.deserialize(bit_stream);
353 if (req.stop_wdt_update) {
354 k_msleep(CONFIG_WATCHDOG_PERIOD_SYS + 1000);
360 bool stop_wdt_update;
361 parser() : stop_wdt_update(false) {}
366 stop_wdt_update = reader.read<uint8_t>(1).value();
376 parser<telecommand::packet_id::FREQ_SET> req;
377 req.deserialize(bit_stream);
402 : direction(
lib::rf_frontend::dir::RX),
414 freq = reader.read<uint32_t>(32).value();
424 parser<telecommand::packet_id::TX_INHIBIT> req;
425 req.deserialize(bit_stream);
449 enable = reader.read<uint8_t>(1).value();
460 parser<telecommand::packet_id::SET_TX_GS_TURNAROUND_TIME> req;
461 req.deserialize(bit_stream);
487 time_ms = reader.read<uint32_t>(32).value();
528 parser<telecommand::packet_id::RESET_OTA_SESSION> req;
529 req.deserialize(bit_stream);
542 idx = reader.read<uint32_t>(32).value();
552 parser<telecommand::packet_id::SET_RADIO_ENABLE> req;
553 req.deserialize(bit_stream);
558 radio_ctrl.enable(req.iface, req.enable);
575 enable = reader.read<uint8_t>(1).value();
585 parser<telecommand::packet_id::TX_GAIN> req;
586 req.deserialize(bit_stream);
620 parser<telecommand::packet_id::IO_WDT_PERIOD> req;
621 req.deserialize(bit_stream);
623 wdg.set_period(req.period_mins);
628 uint32_t period_mins;
629 parser() : period_mins(0) {}
634 period_mins = reader.read<uint32_t>(32).value();
644 parser<telecommand::packet_id::SET_RX_GAIN_MODE> req;
645 req.deserialize(bit_stream);
667 : iface(
lib::
radio::interface::UHF),
668 gain0_mode(
lib::rf_frontend::gain_mode::AUTO),
669 gain1_mode(
lib::rf_frontend::gain_mode::AUTO)
678 reader.read<uint8_t>(1).value());
680 reader.read<uint8_t>(1).value());
690 parser<telecommand::packet_id::EMMC_TEST> req;
691 req.deserialize(bit_stream);
704 nbytes = reader.read<uint32_t>(32).value();
714 parser<telecommand::packet_id::RESET_RADIO_STATS> req;
715 req.deserialize(bit_stream);
737 parser<telecommand::packet_id::SET_RFFE_PARAMS> req;
738 req.deserialize(bit_stream);
768 req.gain0_calib_intrcpt);
778 uint32_t rx_range_min;
779 uint32_t rx_range_max;
780 uint32_t tx_range_min;
781 uint32_t tx_range_max;
782 float agc0_range_min;
783 float agc0_range_max;
784 float gain0_range_min;
785 float gain0_range_max;
786 float agc0_calib_slope;
787 float agc0_calib_intrcpt;
788 float gain0_calib_slope;
789 float gain0_calib_intrcpt;
792 : iface(
lib::
radio::interface::UHF),
797 agc0_range_min(0.0f),
798 agc0_range_max(0.0f),
799 gain0_range_min(0.0f),
800 gain0_range_max(0.0f),
801 agc0_calib_slope(0.0f),
802 agc0_calib_intrcpt(0.0f),
803 gain0_calib_slope(0.0f),
804 gain0_calib_intrcpt(0.0f)
812 rx_range_min = reader.read<uint32_t>(32).value();
813 rx_range_max = reader.read<uint32_t>(32).value();
814 tx_range_min = reader.read<uint32_t>(32).value();
815 tx_range_max = reader.read<uint32_t>(32).value();
833 parser<telecommand::packet_id::SET_RTC> req;
834 req.deserialize(bit_stream);
838 struct tm t = {.tm_sec = req.secs,
842 .tm_mon = req.month - 1,
843 .tm_year = req.year - 1900};
865 secs = reader.read<uint8_t>(8).value();
866 mins = reader.read<uint8_t>(8).value();
867 hour = reader.read<uint8_t>(8).value();
868 day = reader.read<uint8_t>(8).value();
869 month = reader.read<uint8_t>(8).value();
870 year = reader.read<uint16_t>(16).value();
880 parser<telecommand::packet_id::SET_PLL_CLK_SRC> req;
881 req.deserialize(bit_stream);
886 radio.set_clk_src(req.src);
907 parser<telecommand::packet_id::SET_FILTER> req;
908 req.deserialize(bit_stream);
927 : iface(
lib::
radio::interface::UHF),
928 filter(
lib::rf_frontend::filter::WIDE)
1031 parser<telecommand::packet_id::STORAGE_WRITE> data_length;
1032 data_length.deserialize(bit_stream);
1034 path.
length +
sizeof(data_length.data_length);
1037 data_length.data_length);
1043 parser() : data_length(0) {}
1049 data_length = reader.read<uint32_t>(32).value();
1063 parser<telecommand::packet_id::STORAGE_WRITE_OFFSET> off_len;
1064 off_len.deserialize(bit_stream);
1066 path.
length +
sizeof(off_len.offset) +
1067 sizeof(off_len.data_length);
1070 off_len.data_length, off_len.offset);
1082 offset = reader.read<uint32_t>(32).value();
1083 data_length = reader.read<uint32_t>(32).value();
1109 parser<telecommand::packet_id::SET_AGC0_CONF> req;
1110 req.deserialize(bit_stream);
1112 switch (req.iface) {
1144 parser<telecommand::packet_id::SET_AGC1_CONF> req;
1145 req.deserialize(bit_stream);
1147 switch (req.iface) {
1170 static_cast<at86rf215_agc_avgs_t
>(reader.read<uint8_t>(2).value());
1171 cnf.
input = reader.read<uint8_t>(1).value();
1172 cnf.
tgt =
static_cast<at86rf215_agc_tgt_t
>(reader.read<uint8_t>(3).value());
1182 parser<telecommand::packet_id::SET_GAIN0_CONF> req;
1183 req.deserialize(bit_stream);
1185 switch (req.iface) {
1218 parser<telecommand::packet_id::SET_GAIN1_CONF> req;
1219 req.deserialize(bit_stream);
1221 switch (req.iface) {
1254 parser<telecommand::packet_id::SET_MODULATION> req;
1255 req.deserialize(bit_stream);
1280 : iface(
lib::
radio::interface::UHF),
1281 direction(
lib::rf_frontend::dir::RX),
1282 modulation(
lib::
radio::modulation::FSK)
1303 parser<telecommand::packet_id::SET_TX_FSK_CONF> req;
1304 req.deserialize(bit_stream);
1307 switch (req.iface) {
1330 static_cast<at86rf215_fsk_srate_t
>(reader.read<uint8_t>(3).value());
1342 parser<telecommand::packet_id::SET_RX_FSK_CONF> req;
1343 req.deserialize(bit_stream);
1346 switch (req.iface) {
1369 static_cast<at86rf215_fsk_srate_t
>(reader.read<uint8_t>(3).value());
1383 parser<telecommand::packet_id::DISK_RAW_WRITE> tlc;
1384 tlc.deserialize(bit_stream);
1390 if (sent < tlc.data_length) {
1397 uint32_t starting_sector;
1398 uint32_t data_length;
1399 const uint8_t *buffer;
1401 parser() : starting_sector(0), data_length(0) {}
1406 starting_sector = reader.read<uint32_t>(32).value();
1407 data_length = reader.read<uint32_t>(32).value();
1409 buffer =
reinterpret_cast<const uint8_t *
>(
1411 sizeof(starting_sector) +
sizeof(data_length));
1423 parser<telecommand::packet_id::DISK_RAW_READ> tlc;
1424 tlc.deserialize(bit_stream);
1432 uint32_t starting_sector;
1434 parser() : starting_sector(0), sectors(0) {}
1439 starting_sector = reader.read<uint32_t>(32).value();
1440 sectors = reader.read<uint32_t>(32).value();
1453 parser<telecommand::packet_id::DISK_SECTORS_ERASE> tlc;
1454 tlc.deserialize(bit_stream);
1462 uint32_t starting_sector;
1464 parser() : starting_sector(0), sectors(0) {}
1469 starting_sector = reader.read<uint32_t>(32).value();
1470 sectors = reader.read<uint32_t>(32).value();
1481 parser<telecommand::packet_id::SET_THERMAL_MONITOR_PARAMS> req;
1482 req.deserialize(bit_stream);
1485 req.uhf_shutdown_temperature);
1488 req.sband_shutdown_temperature);
1490 req.sband_enable_temperature);
1492 req.pcb_shutdown_temperature);
1500 float uhf_shutdown_temperature;
1501 float uhf_enable_temperature;
1502 float sband_shutdown_temperature;
1503 float sband_enable_temperature;
1504 float pcb_shutdown_temperature;
1505 float pcb_enable_temperature;
1506 float min_valid_temperature;
1507 float max_valid_temperature;
1509 : uhf_shutdown_temperature(0.0f),
1510 uhf_enable_temperature(0.0f),
1511 sband_shutdown_temperature(0.0f),
1512 sband_enable_temperature(0.0f),
1513 pcb_shutdown_temperature(0.0f),
1514 pcb_enable_temperature(0.0f),
1515 min_valid_temperature(0.0f),
1516 max_valid_temperature(0.0f)
1541 parser<telecommand::packet_id::FPGA_SET_BOOT_MODE> tlc;
1542 tlc.deserialize(bit_stream);
1552 parser() : m_boot_mode(
lib::fpga::boot_mode::QSPI) {}
1568 parser<telecommand::packet_id::OTA_REQUEST> req;
1569 req.deserialize(bit_stream);
1585 start.
dst =
static_cast<ota::subsys>(reader.read<uint8_t>(8).value());
1586 for (uint8_t i = 0; i < 32; i++) {
1587 start.
sha256[i] = reader.read<uint8_t>(8).value();
1589 start.
size = reader.read<uint32_t>(32).value();
1590 start.
slot = reader.read<uint8_t>(8).value();
1594 path.
value.cbegin() +
1605 parser<telecommand::packet_id::OTA_DATA> req;
1606 req.deserialize(bit_stream);
1621 data.
session = reader.read<uint8_t>(8).value();
1622 data.
seq = reader.read<uint32_t>(32).value();
1623 data.
len = reader.read<uint32_t>(32).value();
1625 data.
data =
reinterpret_cast<const uint8_t *
>(
1636 parser<telecommand::packet_id::OTA_FINISH> req;
1637 req.deserialize(bit_stream);
1652 fin.
session = reader.read<uint8_t>(8).value();
1653 fin.
method = reader.read<uint8_t>(8).value();
1654 fin.
delay_secs = reader.read<uint32_t>(32).value();
1665 parser<telecommand::packet_id::SET_RADIO_DUTY_CYCLE> req;
1666 req.deserialize(bit_stream);
1669 switch (req.iface) {
1694 on_secs = reader.read<uint32_t>(32).value();
1695 off_secs = reader.read<uint32_t>(32).value();
1705 parser<telecommand::packet_id::SET_TX_WAIT_MS> req;
1706 req.deserialize(bit_stream);
1709 switch (req.iface) {
1731 time_ms = reader.read<uint32_t>(32).value();
1747 etl::bit_stream_reader bit_stream(etl::span(req.
data, req.
len),
1762 return parse_tlm_req(resp, bit_stream);
1880 return parse_storage_tlm(resp, bit_stream,
1884 return parse_storage_tlm(resp, bit_stream,
1888 return parse_storage_tlm(resp, bit_stream,
1892 return parse_ring_buffer_logs(resp, bit_stream);
static error_handler & get_instance()
Singleton access to the error_handler subsystem.
void reset_stats(scl::radio::interface iface)
static io_wdg & get_instance()
Singleton access to the io_wdg subsystem.
static io & get_instance()
comms::lib::radio & radio()
Returns a reference to the radio subsystem.
comms::lib::fpga & fpga()
Returns a reference to the FPGA subsystem.
static board & get_instance()
Gets a reference to the single instance of the Board interface class.
@ CRITICAL
Failure causing mission degradation or significant damage.
void set_boot_mode(boot_mode mode)
modulation
Supported modulation schemes.
interface
Radio interface identifier.
clk_src
PLL Reference Clock identifier.
static logger & get_instance()
Singleton access to the logger subsystem.
static memory_monitor & get_instance()
uint8_t data[mtu]
Buffer to hold the data.
size_t len
Data size in bytes.
etl::string< MAX_FILE_LEN > name
void recv(const data_tlc &tlc, response_tlm &tlm)
void finalize(const fin_tlc &tlc, response_tlm &tlm, int wdgid)
void reset_session(uint32_t id)
subsys
Destination target for a firmware file.
static ota & get_instance()
void start(const start_tlc &req, response_tlm &tlm)
static constexpr size_t MAX_FILE_LEN
The maximum supported filename length.
void confirm_image()
Sets the running firmware as confirmed.
static settings & get_instance()
Get a singleton access to the settings subsystem.
@ THERMAL_UHF_SHUTDOWN_TEMP
@ THERMAL_SBAND_ENABLE_TEMP
@ SBAND_GAIN0_CALIB_SLOPE
@ SBAND_AGC0_CALIB_INTRCPT
@ THERMAL_PCB_SHUTDOWN_TEMP
@ THERMAL_SBAND_SHUTDOWN_TEMP
@ THERMAL_UHF_ENABLE_TEMP
@ SBAND_TRX_TURNAROUND_MS
@ SBAND_GAIN0_CALIB_INTRCPT
@ UHF_GAIN0_CALIB_INTRCPT
@ THERMAL_PCB_ENABLE_TEMP
void rmdir(const etl::istring &path)
Removes a directory and all its contents.
void mkdir(const etl::istring &path)
Creates a directory at the specified path.
size_t write_raw(const uint8_t *b, size_t start_sector, size_t len)
Writes raw bytes on the eMMC.
static storage & get_instance()
size_t write(const etl::istring &path, const uint8_t *b, size_t len)
Writes data to a file.
void erase_sectors(size_t start_sector, size_t sectors)
Erase a specific number of sectors.
void enable(bool en)
Enable or disable the storage subsystem.
void rm(const etl::istring &path)
Removes a file from the filesystem.
void set_dir(lib::emmc::dir d)
Set the direction of the eMMC.
static constexpr size_t size
void deserialize(etl::bit_stream_reader &reader)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream, int wdgid)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
static bool exec(msg_arbiter::msg &m, etl::bit_stream_reader &bit_stream)
void deserialize(etl::bit_stream_reader &reader)
etl::string< CONFIG_STORAGE_MAX_PATH_LEN > value
static void deserialize(etl::bit_stream_reader &reader, float &x)
telecommand(telecommand const &)=delete
bool decode_ccsds_xtce(msg_arbiter::msg &m, int wdgid)
bool ccsds_frame_valid(const uint8_t *b, size_t len)
@ SET_THERMAL_MONITOR_PARAMS
@ SET_FLASH_MONITOR_DELAY_SEC
@ SET_TX_GS_TURNAROUND_TIME
static void send_ring_buffer_logs_tlm(msg_arbiter::msg &m, const size_t num_of_logs)
static void send_all_ota_sessions_info_tlm(msg_arbiter::msg &m)
static void tlm(msg_arbiter::msg &m, Args &&...args)
static test & get_instance()
Time and position information.
void set(const struct tm &t)
Sets the RTC time.
static time & get_instance()
static constexpr uint32_t MAX_TRX_MS
at86rf215_fsk_srate_t baudrate