Include sender error counters in batch payload
This commit is contained in:
12
src/main.cpp
12
src/main.cpp
@@ -441,6 +441,10 @@ static bool send_inflight_batch(uint32_t ts_for_display) {
|
|||||||
input.dt_s = dt_s > 0 ? static_cast<uint8_t>(dt_s) : 1;
|
input.dt_s = dt_s > 0 ? static_cast<uint8_t>(dt_s) : 1;
|
||||||
input.n = g_inflight_count;
|
input.n = g_inflight_count;
|
||||||
input.battery_mV = battery_mv_from_voltage(g_inflight_samples[g_inflight_count - 1].battery_voltage_v);
|
input.battery_mV = battery_mv_from_voltage(g_inflight_samples[g_inflight_count - 1].battery_voltage_v);
|
||||||
|
input.err_m = g_sender_faults.meter_read_fail > 255 ? 255 : static_cast<uint8_t>(g_sender_faults.meter_read_fail);
|
||||||
|
input.err_d = g_sender_faults.decode_fail > 255 ? 255 : static_cast<uint8_t>(g_sender_faults.decode_fail);
|
||||||
|
input.err_tx = g_sender_faults.lora_tx_fail > 255 ? 255 : static_cast<uint8_t>(g_sender_faults.lora_tx_fail);
|
||||||
|
input.err_last = static_cast<uint8_t>(g_sender_last_error);
|
||||||
for (uint8_t i = 0; i < g_inflight_count; ++i) {
|
for (uint8_t i = 0; i < g_inflight_count; ++i) {
|
||||||
input.energy_wh[i] = kwh_to_wh_from_float(g_inflight_samples[i].energy_total_kwh);
|
input.energy_wh[i] = kwh_to_wh_from_float(g_inflight_samples[i].energy_total_kwh);
|
||||||
if (!float_to_i16_w(g_inflight_samples[i].phase_power_w[0], input.p1_w[i]) ||
|
if (!float_to_i16_w(g_inflight_samples[i].phase_power_w[0], input.p1_w[i]) ||
|
||||||
@@ -889,10 +893,10 @@ static void receiver_loop() {
|
|||||||
data.link_valid = true;
|
data.link_valid = true;
|
||||||
data.link_rssi_dbm = pkt.rssi_dbm;
|
data.link_rssi_dbm = pkt.rssi_dbm;
|
||||||
data.link_snr_db = pkt.snr_db;
|
data.link_snr_db = pkt.snr_db;
|
||||||
data.err_meter_read = 0;
|
data.err_meter_read = batch.err_m;
|
||||||
data.err_decode = 0;
|
data.err_decode = batch.err_d;
|
||||||
data.err_lora_tx = 0;
|
data.err_lora_tx = batch.err_tx;
|
||||||
data.last_error = FaultType::None;
|
data.last_error = static_cast<FaultType>(batch.err_last);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sender_idx >= 0) {
|
if (sender_idx >= 0) {
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ bool encode_batch(const BatchInput &in, uint8_t *out, size_t out_cap, size_t *ou
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
if (!ensure_capacity(16, out_cap, pos)) {
|
if (!ensure_capacity(20, out_cap, pos)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
write_u16_le(&out[pos], kMagic);
|
write_u16_le(&out[pos], kMagic);
|
||||||
@@ -125,6 +125,10 @@ bool encode_batch(const BatchInput &in, uint8_t *out, size_t out_cap, size_t *ou
|
|||||||
out[pos++] = in.n;
|
out[pos++] = in.n;
|
||||||
write_u16_le(&out[pos], in.battery_mV);
|
write_u16_le(&out[pos], in.battery_mV);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
|
out[pos++] = in.err_m;
|
||||||
|
out[pos++] = in.err_d;
|
||||||
|
out[pos++] = in.err_tx;
|
||||||
|
out[pos++] = in.err_last;
|
||||||
|
|
||||||
if (!ensure_capacity(4, out_cap, pos)) {
|
if (!ensure_capacity(4, out_cap, pos)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -179,7 +183,7 @@ bool decode_batch(const uint8_t *buf, size_t len, BatchInput *out) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
if (len < 16) {
|
if (len < 20) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
uint16_t magic = read_u16_le(&buf[pos]);
|
uint16_t magic = read_u16_le(&buf[pos]);
|
||||||
@@ -199,6 +203,10 @@ bool decode_batch(const uint8_t *buf, size_t len, BatchInput *out) {
|
|||||||
out->n = buf[pos++];
|
out->n = buf[pos++];
|
||||||
out->battery_mV = read_u16_le(&buf[pos]);
|
out->battery_mV = read_u16_le(&buf[pos]);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
|
out->err_m = buf[pos++];
|
||||||
|
out->err_d = buf[pos++];
|
||||||
|
out->err_tx = buf[pos++];
|
||||||
|
out->err_last = buf[pos++];
|
||||||
|
|
||||||
if (out->n == 0 || out->n > kMaxSamples || out->dt_s == 0) {
|
if (out->n == 0 || out->n > kMaxSamples || out->dt_s == 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -271,6 +279,10 @@ bool payload_codec_self_test() {
|
|||||||
in.dt_s = 1;
|
in.dt_s = 1;
|
||||||
in.n = 5;
|
in.n = 5;
|
||||||
in.battery_mV = 3750;
|
in.battery_mV = 3750;
|
||||||
|
in.err_m = 2;
|
||||||
|
in.err_d = 1;
|
||||||
|
in.err_tx = 3;
|
||||||
|
in.err_last = 2;
|
||||||
in.energy_wh[0] = 100000;
|
in.energy_wh[0] = 100000;
|
||||||
in.energy_wh[1] = 100001;
|
in.energy_wh[1] = 100001;
|
||||||
in.energy_wh[2] = 100050;
|
in.energy_wh[2] = 100050;
|
||||||
@@ -306,7 +318,8 @@ bool payload_codec_self_test() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (out.sender_id != in.sender_id || out.batch_id != in.batch_id || out.t_last != in.t_last ||
|
if (out.sender_id != in.sender_id || out.batch_id != in.batch_id || out.t_last != in.t_last ||
|
||||||
out.dt_s != in.dt_s || out.n != in.n || out.battery_mV != in.battery_mV) {
|
out.dt_s != in.dt_s || out.n != in.n || out.battery_mV != in.battery_mV ||
|
||||||
|
out.err_m != in.err_m || out.err_d != in.err_d || out.err_tx != in.err_tx || out.err_last != in.err_last) {
|
||||||
Serial.println("payload_codec_self_test: header mismatch");
|
Serial.println("payload_codec_self_test: header mismatch");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ struct BatchInput {
|
|||||||
uint8_t dt_s;
|
uint8_t dt_s;
|
||||||
uint8_t n;
|
uint8_t n;
|
||||||
uint16_t battery_mV;
|
uint16_t battery_mV;
|
||||||
|
uint8_t err_m;
|
||||||
|
uint8_t err_d;
|
||||||
|
uint8_t err_tx;
|
||||||
|
uint8_t err_last;
|
||||||
uint32_t energy_wh[30];
|
uint32_t energy_wh[30];
|
||||||
int16_t p1_w[30];
|
int16_t p1_w[30];
|
||||||
int16_t p2_w[30];
|
int16_t p2_w[30];
|
||||||
|
|||||||
Reference in New Issue
Block a user