From c321312e10e7e096ac2f31da076066660c3bfda1 Mon Sep 17 00:00:00 2001 From: oscgonfer Date: Tue, 26 Aug 2025 19:00:43 +0200 Subject: [PATCH] Add one-shot mode config flag to SEN5X --- src/modules/Telemetry/Sensor/SEN5XSensor.cpp | 50 +++++++++++++------- src/modules/Telemetry/Sensor/SEN5XSensor.h | 6 +-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/modules/Telemetry/Sensor/SEN5XSensor.cpp b/src/modules/Telemetry/Sensor/SEN5XSensor.cpp index 77af272fe..f3096d82f 100644 --- a/src/modules/Telemetry/Sensor/SEN5XSensor.cpp +++ b/src/modules/Telemetry/Sensor/SEN5XSensor.cpp @@ -238,6 +238,11 @@ bool SEN5XSensor::idle() vocValid = false; } + if (!oneShotMode) { + LOG_INFO("SEN5X: Not stopping measurement, continuous mode!"); + return true; + } + if (!sendCommand(SEN5X_STOP_MEASUREMENT)) { LOG_ERROR("SEN5X: Error stoping measurement"); return false; @@ -336,6 +341,7 @@ bool SEN5XSensor::loadState() } else { lastCleaning = sen5xstate.last_cleaning_time; lastCleaningValid = sen5xstate.last_cleaning_valid; + oneShotMode = sen5xstate.one_shot_mode; // Unpack state vocState[7] = (uint8_t)(sen5xstate.voc_state >> 56); vocState[6] = (uint8_t)(sen5xstate.voc_state >> 48); @@ -370,6 +376,7 @@ bool SEN5XSensor::saveState() sen5xstate.last_cleaning_time = lastCleaning; sen5xstate.last_cleaning_valid = lastCleaningValid; + sen5xstate.one_shot_mode = oneShotMode; // Unpack state (12 bytes in two parts) sen5xstate.voc_state = ((uint64_t) vocState[7] << 56) | @@ -869,32 +876,41 @@ bool SEN5XSensor::getMetrics(meshtastic_Telemetry *measurement) return true; } +void SEN5XSensor::setMode(bool setOneShot) { + oneShotMode = setOneShot; +} + AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPacket &mp, meshtastic_AdminMessage *request, meshtastic_AdminMessage *response) { AdminMessageHandleResult result; result = AdminMessageHandleResult::NOT_HANDLED; - // TODO - Add admin command to set temperature offset - // switch (request->which_payload_variant) { - // case meshtastic_AdminMessage_sensor_config_tag: - // if (!request->sensor_config.has_sen5x_config) { - // result = AdminMessageHandleResult::NOT_HANDLED; - // break; - // } - // // Check for temperature offset - // // if (request->sensor_config.sen5x_config.has_set_temperature) { - // // this->setTemperature(request->sensor_config.sen5x_config.set_temperature); - // // } + switch (request->which_payload_variant) { + case meshtastic_AdminMessage_sensor_config_tag: + if (!request->sensor_config.has_sen5x_config) { + result = AdminMessageHandleResult::NOT_HANDLED; + break; + } - // // result = AdminMessageHandleResult::HANDLED; - // result = AdminMessageHandleResult::NOT_HANDLED; - // break; + // TODO - Add admin command to set temperature offset + // Check for temperature offset + // if (request->sensor_config.sen5x_config.has_set_temperature) { + // this->setTemperature(request->sensor_config.sen5x_config.set_temperature); + // } - // default: - // result = AdminMessageHandleResult::NOT_HANDLED; - // } + // Check for one-shot/continuous mode request + if (request->sensor_config.sen5x_config.has_set_one_shot_mode) { + this->setMode(request->sensor_config.sen5x_config.set_one_shot_mode); + } + + result = AdminMessageHandleResult::HANDLED; + break; + + default: + result = AdminMessageHandleResult::NOT_HANDLED; + } return result; } diff --git a/src/modules/Telemetry/Sensor/SEN5XSensor.h b/src/modules/Telemetry/Sensor/SEN5XSensor.h index e1101ea2e..e89470a51 100644 --- a/src/modules/Telemetry/Sensor/SEN5XSensor.h +++ b/src/modules/Telemetry/Sensor/SEN5XSensor.h @@ -74,9 +74,9 @@ class SEN5XSensor : public TelemetrySensor enum SEN5XState { SEN5X_OFF, SEN5X_IDLE, SEN5X_MEASUREMENT, SEN5X_MEASUREMENT_2, SEN5X_CLEANING, SEN5X_NOT_DETECTED }; SEN5XState state = SEN5X_OFF; - // TODO - Remove - bool continousMode = false; - bool forcedContinousMode = false; + // Flag to work on one-shot (read and sleep), or continuous mode + bool oneShotMode = true; + void setMode(bool setOneShot); bool sendCommand(uint16_t wichCommand); bool sendCommand(uint16_t wichCommand, uint8_t* buffer, uint8_t byteNumber=0);