mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-29 13:12:04 +00:00
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:
@@ -529,37 +529,46 @@ bool EnvironmentTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPac
|
|||||||
|
|
||||||
bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m)
|
bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = false;
|
||||||
bool hasSensor = 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->time = getTime();
|
||||||
m->which_variant = meshtastic_Telemetry_environment_metrics_tag;
|
m->which_variant = meshtastic_Telemetry_environment_metrics_tag;
|
||||||
m->variant.environment_metrics = meshtastic_EnvironmentMetrics_init_zero;
|
m->variant.environment_metrics = meshtastic_EnvironmentMetrics_init_zero;
|
||||||
|
|
||||||
for (TelemetrySensor *sensor : sensors) {
|
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;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef T1000X_SENSOR_EN
|
#ifndef T1000X_SENSOR_EN
|
||||||
if (ina219Sensor.hasSensor()) {
|
if (ina219Sensor.hasSensor()) {
|
||||||
valid = valid && ina219Sensor.getMetrics(m);
|
get_metrics = ina219Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
if (ina260Sensor.hasSensor()) {
|
if (ina260Sensor.hasSensor()) {
|
||||||
valid = valid && ina260Sensor.getMetrics(m);
|
get_metrics = ina260Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
if (ina3221Sensor.hasSensor()) {
|
if (ina3221Sensor.hasSensor()) {
|
||||||
valid = valid && ina3221Sensor.getMetrics(m);
|
get_metrics = ina3221Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
if (max17048Sensor.hasSensor()) {
|
if (max17048Sensor.hasSensor()) {
|
||||||
valid = valid && max17048Sensor.getMetrics(m);
|
get_metrics = max17048Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAS_RAKPROT
|
#ifdef HAS_RAKPROT
|
||||||
valid = valid && rak9154Sensor.getMetrics(m);
|
get_metrics = rak9154Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
#endif
|
#endif
|
||||||
return valid && hasSensor;
|
return valid && hasSensor;
|
||||||
|
|||||||
@@ -168,18 +168,21 @@ bool HealthTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &
|
|||||||
|
|
||||||
bool HealthTelemetryModule::getHealthTelemetry(meshtastic_Telemetry *m)
|
bool HealthTelemetryModule::getHealthTelemetry(meshtastic_Telemetry *m)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = false;
|
||||||
bool hasSensor = false;
|
bool hasSensor = false;
|
||||||
|
bool get_metrics;
|
||||||
m->time = getTime();
|
m->time = getTime();
|
||||||
m->which_variant = meshtastic_Telemetry_health_metrics_tag;
|
m->which_variant = meshtastic_Telemetry_health_metrics_tag;
|
||||||
m->variant.health_metrics = meshtastic_HealthMetrics_init_zero;
|
m->variant.health_metrics = meshtastic_HealthMetrics_init_zero;
|
||||||
|
|
||||||
if (max30102Sensor.hasSensor()) {
|
if (max30102Sensor.hasSensor()) {
|
||||||
valid = valid && max30102Sensor.getMetrics(m);
|
get_metrics = max30102Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics; // avoid short-circuit evaluation rules
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
if (mlx90614Sensor.hasSensor()) {
|
if (mlx90614Sensor.hasSensor()) {
|
||||||
valid = valid && mlx90614Sensor.getMetrics(m);
|
get_metrics = mlx90614Sensor.getMetrics(m);
|
||||||
|
valid = valid || get_metrics;
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user