1#include "../../Inc/Utils/Telemetry.h"
2#include "../../Inc/Utils/MessageFormat.h"
3#include "../../Inc/Utils/Common.h"
6#define MAX_TELEMETRY_SIGNALS 100
24 uint32_t expected_rate_ms,
25 float custom_min,
float custom_max) {
33 strncpy(sig->
name, name,
sizeof(sig->
name) - 1);
34 sig->
name[
sizeof(sig->
name) - 1] =
'\0';
42 if (custom_min != custom_max) {
60 if (signal == NULL || !signal->
enabled) {
70 switch (signal->
type) {
83 if (value < min_limit || value > max_limit) {
85 value, unit->
symbol, min_limit, max_limit);
112 uint32_t now = HAL_GetTick();
118 uint32_t time_since_update = now - sig->
last_update;
121 if (time_since_update > stale_threshold) {
124 "Signal stale: %s (last update %dms ago, expected every %dms)",
143 "Signal:%s;Unit:%s;Category:%s;Type:%d;Rate:%d;Min:%.2f;Max:%.2f;Decimals:%d;AbsMin:%.2f;AbsMax:%.2f",
172 default:
return "Other";
185 default:
return "UNKNOWN";
191 if (signal == NULL || !signal->
enabled ||
200 char hex_data[17] = {0};
201 for (
int i = 0; i < dlc && i < 8; i++) {
202 sprintf(&hex_data[i*2],
"%02X", data[i]);
206 sendMessage(
"CAN", msg_type,
"ID:0x%03X;DLC:%d;Data:%s", can_id, dlc, hex_data);
const char * getTypeName(TelemetryType type)
static bool telemetry_initialized
void sendTelemetryValue(TelemetrySignal *signal, float value)
void handleTelemetryConfigRequest(void)
static TelemetrySignal signals[MAX_TELEMETRY_SIGNALS]
void sendCANTelemetryData(TelemetrySignal *signal, uint32_t can_id, uint8_t *data, uint8_t dlc)
const char * getCategoryName(UnitCategory category)
static uint16_t num_signals
void checkTelemetryHealth(void)
TelemetrySignal * registerTelemetrySignal(const char *name, TelemetryType type, UnitId unit_id, uint32_t expected_rate_ms, float custom_min, float custom_max)
#define MAX_TELEMETRY_SIGNALS
bool validateUnitValue(UnitId unit_id, float value)
const UnitDefinition * getUnitDefinition(UnitId unit_id)
@ UNIT_CATEGORY_FREQUENCY
@ UNIT_CATEGORY_TEMPERATURE
uint32_t expected_rate_ms
float default_warning_min
float default_warning_max