SatNOGS-COMMS  4.1.0
A COMMS subsystem for CubeSats
Loading...
Searching...
No Matches
telemetry.cpp
Go to the documentation of this file.
1/*
2 * SatNOGS-COMMS MCU software
3 *
4 * Copyright (C) 2023-2024, Libre Space Foundation <http://libre.space>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * SPDX-License-Identifier: GNU General Public License v3.0 or later
20 */
21#include "telemetry.hpp"
22#include "logger.hpp"
23
24namespace scl = satnogs::comms::lib;
25
26namespace satnogs::comms
27{
28
29void
30telemetry::serialize(etl::bit_stream_writer &writer, float x)
31{
32 static_assert(sizeof(x) == sizeof(uint32_t), "Unsupported float size");
33 uint32_t u;
34 std::memcpy(&u, &x, 4);
35 writer.write<uint32_t>(u, 32);
36}
37
38void
39telemetry::serialize(etl::bit_stream_writer &writer, double x)
40{
41 static_assert(sizeof(x) == sizeof(uint64_t), "Unsupported double size");
42 uint64_t u;
43 std::memcpy(&u, &x, 8);
44 writer.write<uint64_t>(u, 64);
45}
46
47void
49 const size_t num_of_logs)
50{
51 auto &l = logger::get_instance();
52 auto &arb = msg_arbiter::get_instance();
53 auto &tlc = telecommand::get_instance();
54
56
58 tm_header.apid =
59 static_cast<uint16_t>(telemetry::apid::RING_BUFFER_LOGS_RESP);
60 tm_header.count = tlc.get_frame_count();
61
62 size_t ring_buffer_size = l.get_ring_buffer_size();
63
64 for (size_t i = 0; i < etl::min(num_of_logs, ring_buffer_size); i++) {
65
66 etl::bit_stream_writer bit_stream_hdr(
67 m.data, telemetry::ccsds_tm_header::size, etl::endian::big);
68 etl::bit_stream_writer bit_stream_pld(
71
72 l.get_ring_buffer_log(data, i);
73
74 bit_stream_pld.write<uint8_t>((uint8_t)data.m_t_src, 8);
75 bit_stream_pld.write<uint64_t>(data.m_t_posix, 64);
76
77 memcpy(bit_stream_pld.begin() + sizeof(data.m_t_src) +
78 sizeof(data.m_t_posix),
79 data.m_log.c_str(), data.m_log.size());
80
81 bit_stream_pld.skip(8 * data.m_log.size());
82 bit_stream_pld.write<uint8_t>('\0', 8);
83
84 tm_header.length = bit_stream_pld.size_bytes() + 1;
85 tm_header.serialize(bit_stream_hdr);
86
88 arb.fwd(0, 0, m, m.iface, K_FOREVER);
89 }
90}
91
92void
94{
95 auto &ota = ota::get_instance();
96 ota::session session_info;
97 auto &arb = msg_arbiter::get_instance();
98 auto &tlc = telecommand::get_instance();
99
101 tm_header.apid = static_cast<uint16_t>(telemetry::apid::OTA_SESSION_INFO);
102 tm_header.count = tlc.get_frame_count();
103
104 for (uint32_t session_id = 0; session_id < CONFIG_OTA_MAX_SESSIONS;
105 session_id++) {
106 etl::bit_stream_writer bit_stream_hdr(
107 m.data, telemetry::ccsds_tm_header::size, etl::endian::big);
108 etl::bit_stream_writer bit_stream_pld(
111
112 ota.get_session_info(session_id, session_info);
113 bit_stream_pld.write<uint8_t>(session_id, 8);
114 bit_stream_pld.write<uint8_t>(
115 static_cast<uint8_t>(session_info.destination), 8);
116 bit_stream_pld.write<uint8_t>(static_cast<uint8_t>(session_info.slot), 8);
117 bit_stream_pld.write<bool>(session_info.active, 1);
118 bit_stream_pld.write<bool>(session_info.applied, 1);
119 bit_stream_pld.write<uint32_t>(session_info.total_size, 32);
120 bit_stream_pld.write<uint32_t>(session_info.ack, 32);
121 bit_stream_pld.write<uint8_t>(static_cast<uint8_t>(session_info.time_src),
122 8);
123 bit_stream_pld.write<uint8_t>(session_info.t.tm_sec, 8);
124 bit_stream_pld.write<uint8_t>(session_info.t.tm_min, 8);
125 bit_stream_pld.write<uint8_t>(session_info.t.tm_hour, 8);
126 bit_stream_pld.write<uint8_t>(session_info.t.tm_mday, 8);
127 bit_stream_pld.write<uint8_t>(session_info.t.tm_mon, 8);
128 bit_stream_pld.write<uint8_t>(session_info.t.tm_year, 16);
129 bit_stream_pld.write<uint8_t>(session_info.t.tm_wday, 8);
130 bit_stream_pld.write<uint8_t>(session_info.t.tm_yday, 8);
131 bit_stream_pld.write<int8_t>(session_info.t.tm_isdst, 8);
132 bit_stream_pld.write<uint8_t>(0U, 6);
133 for (uint8_t i = 0; i < 32; i++) {
134 bit_stream_pld.write<int8_t>(session_info.sha256[i], 8);
135 }
136 for (size_t i = 0; i < session_info.name.size(); ++i) {
137 bit_stream_pld.write<uint8_t>(static_cast<uint8_t>(session_info.name[i]),
138 8);
139 }
140 // Append the null termination byte for proper render at the MCS
141 bit_stream_pld.write<uint8_t>(0x0, 8);
142 tm_header.length = bit_stream_pld.size_bytes() + 1;
143 tm_header.serialize(bit_stream_hdr);
144
146 arb.fwd(0, 0, m, m.iface, K_FOREVER);
147 }
148}
149
150} // namespace satnogs::comms
etl::string< CONFIG_LOG_MAX_MSG_LEN > m_log
Definition logger.hpp:149
static logger & get_instance()
Singleton access to the logger subsystem.
Definition logger.hpp:102
uint8_t data[mtu]
Buffer to hold the data.
size_t len
Data size in bytes.
subsys iface
The interface from which the msg was received.
static constexpr size_t mtu
static msg_arbiter & get_instance()
Singleton access to a unique and global msg_arbiter instance.
etl::string< MAX_FILE_LEN > name
Definition ota.hpp:174
time::time_src time_src
Definition ota.hpp:172
static ota & get_instance()
Definition ota.hpp:51
bool get_session_info(uint8_t id, session &out) const
Definition ota.cpp:74
static telecommand & get_instance()
void serialize(etl::bit_stream_writer &writer) const
static void send_ring_buffer_logs_tlm(msg_arbiter::msg &m, const size_t num_of_logs)
Definition telemetry.cpp:48
static void send_all_ota_sessions_info_tlm(msg_arbiter::msg &m)
Definition telemetry.cpp:93
static void serialize(etl::bit_stream_writer &writer, float x)
Definition telemetry.cpp:30