Add one-shot mode config flag to SEN5X

This commit is contained in:
oscgonfer 2025-08-26 19:00:43 +02:00
parent 7d1deaf4ce
commit c321312e10
2 changed files with 36 additions and 20 deletions

View File

@ -238,6 +238,11 @@ bool SEN5XSensor::idle()
vocValid = false; vocValid = false;
} }
if (!oneShotMode) {
LOG_INFO("SEN5X: Not stopping measurement, continuous mode!");
return true;
}
if (!sendCommand(SEN5X_STOP_MEASUREMENT)) { if (!sendCommand(SEN5X_STOP_MEASUREMENT)) {
LOG_ERROR("SEN5X: Error stoping measurement"); LOG_ERROR("SEN5X: Error stoping measurement");
return false; return false;
@ -336,6 +341,7 @@ bool SEN5XSensor::loadState()
} else { } else {
lastCleaning = sen5xstate.last_cleaning_time; lastCleaning = sen5xstate.last_cleaning_time;
lastCleaningValid = sen5xstate.last_cleaning_valid; lastCleaningValid = sen5xstate.last_cleaning_valid;
oneShotMode = sen5xstate.one_shot_mode;
// Unpack state // Unpack state
vocState[7] = (uint8_t)(sen5xstate.voc_state >> 56); vocState[7] = (uint8_t)(sen5xstate.voc_state >> 56);
vocState[6] = (uint8_t)(sen5xstate.voc_state >> 48); vocState[6] = (uint8_t)(sen5xstate.voc_state >> 48);
@ -370,6 +376,7 @@ bool SEN5XSensor::saveState()
sen5xstate.last_cleaning_time = lastCleaning; sen5xstate.last_cleaning_time = lastCleaning;
sen5xstate.last_cleaning_valid = lastCleaningValid; sen5xstate.last_cleaning_valid = lastCleaningValid;
sen5xstate.one_shot_mode = oneShotMode;
// Unpack state (12 bytes in two parts) // Unpack state (12 bytes in two parts)
sen5xstate.voc_state = ((uint64_t) vocState[7] << 56) | sen5xstate.voc_state = ((uint64_t) vocState[7] << 56) |
@ -869,32 +876,41 @@ bool SEN5XSensor::getMetrics(meshtastic_Telemetry *measurement)
return true; return true;
} }
void SEN5XSensor::setMode(bool setOneShot) {
oneShotMode = setOneShot;
}
AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPacket &mp, meshtastic_AdminMessage *request, AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPacket &mp, meshtastic_AdminMessage *request,
meshtastic_AdminMessage *response) meshtastic_AdminMessage *response)
{ {
AdminMessageHandleResult result; AdminMessageHandleResult result;
result = AdminMessageHandleResult::NOT_HANDLED; 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 switch (request->which_payload_variant) {
// // if (request->sensor_config.sen5x_config.has_set_temperature) { case meshtastic_AdminMessage_sensor_config_tag:
// // this->setTemperature(request->sensor_config.sen5x_config.set_temperature); if (!request->sensor_config.has_sen5x_config) {
// // } result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
// // result = AdminMessageHandleResult::HANDLED; // TODO - Add admin command to set temperature offset
// result = AdminMessageHandleResult::NOT_HANDLED; // Check for temperature offset
// break; // if (request->sensor_config.sen5x_config.has_set_temperature) {
// this->setTemperature(request->sensor_config.sen5x_config.set_temperature);
// }
// default: // Check for one-shot/continuous mode request
// result = AdminMessageHandleResult::NOT_HANDLED; 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; return result;
} }

View File

@ -74,9 +74,9 @@ class SEN5XSensor : public TelemetrySensor
enum SEN5XState { SEN5X_OFF, SEN5X_IDLE, SEN5X_MEASUREMENT, SEN5X_MEASUREMENT_2, SEN5X_CLEANING, SEN5X_NOT_DETECTED }; enum SEN5XState { SEN5X_OFF, SEN5X_IDLE, SEN5X_MEASUREMENT, SEN5X_MEASUREMENT_2, SEN5X_CLEANING, SEN5X_NOT_DETECTED };
SEN5XState state = SEN5X_OFF; SEN5XState state = SEN5X_OFF;
// TODO - Remove // Flag to work on one-shot (read and sleep), or continuous mode
bool continousMode = false; bool oneShotMode = true;
bool forcedContinousMode = false; void setMode(bool setOneShot);
bool sendCommand(uint16_t wichCommand); bool sendCommand(uint16_t wichCommand);
bool sendCommand(uint16_t wichCommand, uint8_t* buffer, uint8_t byteNumber=0); bool sendCommand(uint16_t wichCommand, uint8_t* buffer, uint8_t byteNumber=0);