60static_assert(
sizeof(std::uint32_t) == 4,
"Expected 32-bit uint32_t");
61static_assert(
sizeof(float) == 4,
"Expected 32-bit float");
70 dst[i] =
static_cast<std::uint8_t
>(v >> shift);
81 return (hz == 0) ? 1000u
82 :
static_cast<std::uint16_t
>((1000u + hz - 1u) / hz);
149 template <std::
size_t M>
152 std::uint16_t sendFrequencyHz)
199 template <std::
size_t N>
200 Telemetry(
const std::array<SendableSensorData*, N>& streams,
201 Stream& rfdSerialConnection)
202 : streams(streams.data()),
204 rfdSerialConnection(rfdSerialConnection),
205 nextEmptyPacketIndex(0),
212 bool tick(std::uint32_t currentTimeMs);
216 void preparePacket(std::uint32_t timestamp);
219 void setPacketToZero();
228 const std::size_t streamCount;
231 Stream& rfdSerialConnection;
234 std::uint32_t packetCounter = 0;
235 std::size_t nextEmptyPacketIndex;
236 std::array<std::uint8_t, TelemetryFmt::kPacketCapacity> packet;
Buffers sensor samples and forwards them to an IDataSaver at a controlled rate.
bool tick(std::uint32_t currentTimeMs)
Call every loop to send due telemetry streams.
Telemetry(const std::array< SendableSensorData *, N > &streams, Stream &rfdSerialConnection)
Construct from std::array (convenient and compile-time sized). The std::array must outlive the Teleme...
std::uint16_t hz_to_period_ms(std::uint16_t hz)
Convert frequency (Hz) to period (ms), using integer math.
constexpr std::size_t kStartByteIndex
constexpr unsigned kBitsPerByte
constexpr std::size_t kPacketCapacity
constexpr std::uint8_t kStartByteValue
constexpr std::size_t kPacketCounterIndex
constexpr std::uint8_t kAllOnesByte
void write_u32_be(std::uint8_t *dst, std::uint32_t v)
Write a 32-bit value in big-endian order to dst[0..3].
constexpr std::size_t kSyncZeros
constexpr std::size_t kEndMarkerBytes
constexpr std::size_t kBytesIn32Bit
constexpr std::size_t kHeaderBytes
constexpr std::uint8_t kEndByteValue
constexpr std::size_t kTimestampIndex
constexpr std::size_t kU32Bytes
Declares one telemetry "stream" to include in packets.
std::uint32_t lastSentTimestamp
void markWasSent(std::uint32_t now)
Update internal state after sending.
const std::size_t multiSDHLength
bool isMulti() const
Convenience: true if configured as a multi SDH stream.
bool isSingle() const
Convenience: true if configured as a single SDH stream.
bool shouldBeSent(std::uint32_t now) const
Return true if enough time has elapsed such that this stream wants to be sent again.
std::uint8_t multiSDHDataLabel
SendableSensorData(const std::array< SensorDataHandler *, M > &sdhList, std::uint8_t label, std::uint16_t sendFrequencyHz)
Create a multi SDH stream from a std::array.
SensorDataHandler *const * multiSDH
SendableSensorData(SensorDataHandler *sdh, std::uint16_t sendFrequencyHz)
Create a single SDH stream.
SensorDataHandler * singleSDH