Avoid short-circuit evaluation issues in Telemetry (#9467)

* Make sensors in telemetry non-definitory

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
oscgonfer
2026-01-29 00:18:42 +01:00
committed by GitHub
parent 4fd0a8276b
commit d7d6fe7f0f
2 changed files with 22 additions and 10 deletions

View File

@@ -529,37 +529,46 @@ bool EnvironmentTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPac
bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m)
{
bool valid = true;
bool valid = false;
bool hasSensor = false;
// getMetrics() doesn't always get evaluated because of
// short-circuit evaluation rules in c++
bool get_metrics;
m->time = getTime();
m->which_variant = meshtastic_Telemetry_environment_metrics_tag;
m->variant.environment_metrics = meshtastic_EnvironmentMetrics_init_zero;
for (TelemetrySensor *sensor : sensors) {
valid = valid && sensor->getMetrics(m);
get_metrics = sensor->getMetrics(m); // avoid short-circuit evaluation rules
valid = valid || get_metrics;
hasSensor = true;
}
#ifndef T1000X_SENSOR_EN
if (ina219Sensor.hasSensor()) {
valid = valid && ina219Sensor.getMetrics(m);
get_metrics = ina219Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
}
if (ina260Sensor.hasSensor()) {
valid = valid && ina260Sensor.getMetrics(m);
get_metrics = ina260Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
}
if (ina3221Sensor.hasSensor()) {
valid = valid && ina3221Sensor.getMetrics(m);
get_metrics = ina3221Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
}
if (max17048Sensor.hasSensor()) {
valid = valid && max17048Sensor.getMetrics(m);
get_metrics = max17048Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
}
#endif
#ifdef HAS_RAKPROT
valid = valid && rak9154Sensor.getMetrics(m);
get_metrics = rak9154Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
#endif
return valid && hasSensor;

View File

@@ -168,18 +168,21 @@ bool HealthTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &
bool HealthTelemetryModule::getHealthTelemetry(meshtastic_Telemetry *m)
{
bool valid = true;
bool valid = false;
bool hasSensor = false;
bool get_metrics;
m->time = getTime();
m->which_variant = meshtastic_Telemetry_health_metrics_tag;
m->variant.health_metrics = meshtastic_HealthMetrics_init_zero;
if (max30102Sensor.hasSensor()) {
valid = valid && max30102Sensor.getMetrics(m);
get_metrics = max30102Sensor.getMetrics(m);
valid = valid || get_metrics; // avoid short-circuit evaluation rules
hasSensor = true;
}
if (mlx90614Sensor.hasSensor()) {
valid = valid && mlx90614Sensor.getMetrics(m);
get_metrics = mlx90614Sensor.getMetrics(m);
valid = valid || get_metrics;
hasSensor = true;
}