SatNOGS-COMMS
4.1.0
A COMMS subsystem for CubeSats
Toggle main menu visibility
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
24
namespace
scl
=
satnogs::comms::lib
;
25
26
namespace
satnogs::comms
27
{
28
29
void
30
telemetry::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
38
void
39
telemetry::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
47
void
48
telemetry::send_ring_buffer_logs_tlm
(
msg_arbiter::msg
&m,
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
55
logger::ring_buf_msg
data;
56
57
telemetry::ccsds_tm_header
tm_header;
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(
69
m.
data
+
telemetry::ccsds_tm_header::size
,
70
msg_arbiter::mtu
-
telemetry::ccsds_tm_header::size
, etl::endian::big);
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
87
m.
len
=
telemetry::ccsds_tm_header::size
+ tm_header.
length
;
88
arb.fwd(0, 0, m, m.
iface
, K_FOREVER);
89
}
90
}
91
92
void
93
telemetry::send_all_ota_sessions_info_tlm
(
msg_arbiter::msg
&m)
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
100
telemetry::ccsds_tm_header
tm_header;
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(
109
m.
data
+
telemetry::ccsds_tm_header::size
,
110
msg_arbiter::mtu
-
telemetry::ccsds_tm_header::size
, etl::endian::big);
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
145
m.
len
=
telemetry::ccsds_tm_header::size
+ tm_header.
length
;
146
arb.fwd(0, 0, m, m.
iface
, K_FOREVER);
147
}
148
}
149
150
}
// namespace satnogs::comms
satnogs::comms::logger::ring_buf_msg
Definition
logger.hpp:145
satnogs::comms::logger::ring_buf_msg::m_t_posix
uint64_t m_t_posix
Definition
logger.hpp:148
satnogs::comms::logger::ring_buf_msg::m_log
etl::string< CONFIG_LOG_MAX_MSG_LEN > m_log
Definition
logger.hpp:149
satnogs::comms::logger::ring_buf_msg::m_t_src
time::time_src m_t_src
Definition
logger.hpp:147
satnogs::comms::logger::get_instance
static logger & get_instance()
Singleton access to the logger subsystem.
Definition
logger.hpp:102
satnogs::comms::msg_arbiter::msg
Definition
msg_arbiter.hpp:118
satnogs::comms::msg_arbiter::msg::data
uint8_t data[mtu]
Buffer to hold the data.
Definition
msg_arbiter.hpp:120
satnogs::comms::msg_arbiter::msg::len
size_t len
Data size in bytes.
Definition
msg_arbiter.hpp:122
satnogs::comms::msg_arbiter::msg::iface
subsys iface
The interface from which the msg was received.
Definition
msg_arbiter.hpp:121
satnogs::comms::msg_arbiter::mtu
static constexpr size_t mtu
Definition
msg_arbiter.hpp:74
satnogs::comms::msg_arbiter::get_instance
static msg_arbiter & get_instance()
Singleton access to a unique and global msg_arbiter instance.
Definition
msg_arbiter.hpp:90
satnogs::comms::ota::session
Definition
ota.hpp:142
satnogs::comms::ota::session::name
etl::string< MAX_FILE_LEN > name
Definition
ota.hpp:174
satnogs::comms::ota::session::applied
bool applied
Definition
ota.hpp:169
satnogs::comms::ota::session::active
bool active
Definition
ota.hpp:168
satnogs::comms::ota::session::sha256
uint8_t sha256[32]
Definition
ota.hpp:175
satnogs::comms::ota::session::t
struct tm t
Definition
ota.hpp:173
satnogs::comms::ota::session::ack
uint32_t ack
Definition
ota.hpp:171
satnogs::comms::ota::session::destination
subsys destination
Definition
ota.hpp:166
satnogs::comms::ota::session::total_size
uint32_t total_size
Definition
ota.hpp:170
satnogs::comms::ota::session::time_src
time::time_src time_src
Definition
ota.hpp:172
satnogs::comms::ota::session::slot
uint8_t slot
Definition
ota.hpp:167
satnogs::comms::ota
Definition
ota.hpp:38
satnogs::comms::ota::get_instance
static ota & get_instance()
Definition
ota.hpp:51
satnogs::comms::ota::get_session_info
bool get_session_info(uint8_t id, session &out) const
Definition
ota.cpp:74
satnogs::comms::telecommand::get_instance
static telecommand & get_instance()
Definition
telecommand.hpp:37
satnogs::comms::telemetry::ccsds_tm_header
Definition
telemetry.hpp:252
satnogs::comms::telemetry::ccsds_tm_header::length
uint16_t length
Definition
telemetry.hpp:261
satnogs::comms::telemetry::ccsds_tm_header::size
static constexpr size_t size
Definition
telemetry.hpp:254
satnogs::comms::telemetry::ccsds_tm_header::serialize
void serialize(etl::bit_stream_writer &writer) const
Definition
telemetry.hpp:275
satnogs::comms::telemetry::ccsds_tm_header::apid
uint16_t apid
Definition
telemetry.hpp:258
satnogs::comms::telemetry::ccsds_tm_header::count
uint16_t count
Definition
telemetry.hpp:260
satnogs::comms::telemetry::send_ring_buffer_logs_tlm
static void send_ring_buffer_logs_tlm(msg_arbiter::msg &m, const size_t num_of_logs)
Definition
telemetry.cpp:48
satnogs::comms::telemetry::apid::OTA_SESSION_INFO
@ OTA_SESSION_INFO
Definition
telemetry.hpp:82
satnogs::comms::telemetry::apid::RING_BUFFER_LOGS_RESP
@ RING_BUFFER_LOGS_RESP
Definition
telemetry.hpp:79
satnogs::comms::telemetry::send_all_ota_sessions_info_tlm
static void send_all_ota_sessions_info_tlm(msg_arbiter::msg &m)
Definition
telemetry.cpp:93
satnogs::comms::telemetry::serialize
static void serialize(etl::bit_stream_writer &writer, float x)
Definition
telemetry.cpp:30
logger.hpp
satnogs::comms::lib
Definition
ad8318.hpp:30
satnogs::comms
Definition
bsp.cpp:28
telemetry.hpp
src
telemetry.cpp
Generated by
1.17.0