mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-07-30 00:47:17 +02:00
Handle pm correction algorithm from ag server config
This commit is contained in:
@ -22,6 +22,18 @@ const char *LED_BAR_MODE_NAMES[] = {
|
|||||||
[LedBarModeCO2] = "co2",
|
[LedBarModeCO2] = "co2",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char *PM_CORRECTION_ALGORITHM_NAMES[] = {
|
||||||
|
[Unknown] = "-", // This is only to pass "non-trivial designated initializers" error
|
||||||
|
[None] = "none",
|
||||||
|
[EPA_2021] = "epa_2021",
|
||||||
|
[SLR_PMS5003_20220802] = "slr_PMS5003_20220802",
|
||||||
|
[SLR_PMS5003_20220803] = "slr_PMS5003_20220803",
|
||||||
|
[SLR_PMS5003_20220824] = "slr_PMS5003_20220824",
|
||||||
|
[SLR_PMS5003_20231030] = "slr_PMS5003_20231030",
|
||||||
|
[SLR_PMS5003_20231218] = "slr_PMS5003_20231218",
|
||||||
|
[SLR_PMS5003_20240104] = "slr_PMS5003_20240104",
|
||||||
|
};
|
||||||
|
|
||||||
#define JSON_PROP_NAME(name) jprop_##name
|
#define JSON_PROP_NAME(name) jprop_##name
|
||||||
#define JSON_PROP_DEF(name) const char *JSON_PROP_NAME(name) = #name
|
#define JSON_PROP_DEF(name) const char *JSON_PROP_NAME(name) = #name
|
||||||
|
|
||||||
@ -87,6 +99,96 @@ String Configuration::getLedBarModeName(LedBarMode mode) {
|
|||||||
return String("unknown");
|
return String("unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PMCorrectionAlgorithm Configuration::matchPmAlgorithm(String algorithm) {
|
||||||
|
// Loop through all algorithm names in the PM_CORRECTION_ALGORITHM_NAMES array
|
||||||
|
// If the input string matches an algorithm name, return the corresponding enum value
|
||||||
|
// Else return Unknown
|
||||||
|
for (int idx = 0;
|
||||||
|
idx < sizeof(PM_CORRECTION_ALGORITHM_NAMES) / sizeof(PM_CORRECTION_ALGORITHM_NAMES[0]);
|
||||||
|
idx++) {
|
||||||
|
if (algorithm == PM_CORRECTION_ALGORITHM_NAMES[idx]) {
|
||||||
|
return (PMCorrectionAlgorithm)idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Configuration::parsePmCorrection(JSONVar &json) {
|
||||||
|
if (!json.hasOwnProperty("corrections")) {
|
||||||
|
// TODO: need to response message?
|
||||||
|
Serial.println("corrections not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONVar corrections = json["corrections"];
|
||||||
|
if (!corrections.hasOwnProperty("pm02")) {
|
||||||
|
Serial.println("pm02 not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONVar pm02 = corrections["pm02"];
|
||||||
|
if (!pm02.hasOwnProperty("correctionAlgorithm")) {
|
||||||
|
Serial.println("correctionAlgorithm not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check algorithm
|
||||||
|
const char *algorithm = (const char *)pm02["correctionAlgorithm"];
|
||||||
|
PMCorrectionAlgorithm algo = matchPmAlgorithm(algorithm);
|
||||||
|
if (algo == Unknown) {
|
||||||
|
Serial.println("Unknown algorithm");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Serial.printf("Correction algorithm: %s\n", algorithm);
|
||||||
|
|
||||||
|
// If algo is None or EPA_2021, no need to check slr
|
||||||
|
// But first check if pmCorrection different from algo
|
||||||
|
if (algo == None || algo == EPA_2021) {
|
||||||
|
if (pmCorrection.algorithm != algo) {
|
||||||
|
pmCorrection.algorithm = algo;
|
||||||
|
pmCorrection.changed = true;
|
||||||
|
Serial.println("PM2.5 correction updated");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if pm02 has slr object
|
||||||
|
if (!pm02.hasOwnProperty("slr")) {
|
||||||
|
Serial.println("slr not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONVar slr = pm02["slr"];
|
||||||
|
|
||||||
|
// Validate required slr properties exist
|
||||||
|
if (!slr.hasOwnProperty("intercept") || !slr.hasOwnProperty("scalingFactor") ||
|
||||||
|
!slr.hasOwnProperty("useEpa2021")) {
|
||||||
|
Serial.println("Missing required slr properties");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare with current pmCorrection
|
||||||
|
if (pmCorrection.algorithm == algo && pmCorrection.intercept == (double)slr["intercept"] &&
|
||||||
|
pmCorrection.scalingFactor == (double)slr["scalingFactor"] &&
|
||||||
|
pmCorrection.useEPA == (bool)slr["useEpa2021"]) {
|
||||||
|
return false; // No changes needed
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update pmCorrection with new values
|
||||||
|
pmCorrection.algorithm = algo;
|
||||||
|
pmCorrection.intercept = (double)slr["intercept"];
|
||||||
|
pmCorrection.scalingFactor = (double)slr["scalingFactor"];
|
||||||
|
pmCorrection.useEPA = (bool)slr["useEpa2021"];
|
||||||
|
pmCorrection.changed = true;
|
||||||
|
|
||||||
|
// Correction values were updated
|
||||||
|
Serial.println("PM2.5 correction updated");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Save configure to device storage (EEPROM)
|
* @brief Save configure to device storage (EEPROM)
|
||||||
*
|
*
|
||||||
@ -171,6 +273,13 @@ void Configuration::defaultConfig(void) {
|
|||||||
jconfig[jprop_offlineMode] = jprop_offlineMode_default;
|
jconfig[jprop_offlineMode] = jprop_offlineMode_default;
|
||||||
jconfig[jprop_monitorDisplayCompensatedValues] = jprop_monitorDisplayCompensatedValues_default;
|
jconfig[jprop_monitorDisplayCompensatedValues] = jprop_monitorDisplayCompensatedValues_default;
|
||||||
|
|
||||||
|
// PM2.5 correction
|
||||||
|
pmCorrection.algorithm = None;
|
||||||
|
pmCorrection.changed = false;
|
||||||
|
pmCorrection.intercept = -1;
|
||||||
|
pmCorrection.scalingFactor = -1;
|
||||||
|
pmCorrection.useEPA = false;
|
||||||
|
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -667,6 +776,11 @@ bool Configuration::parse(String data, bool isLocal) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Corrections
|
||||||
|
if (parsePmCorrection(root)) {
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
udpated = true;
|
udpated = true;
|
||||||
saveConfig();
|
saveConfig();
|
||||||
|
@ -5,8 +5,18 @@
|
|||||||
#include "Main/PrintLog.h"
|
#include "Main/PrintLog.h"
|
||||||
#include "AirGradient.h"
|
#include "AirGradient.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include "Libraries/Arduino_JSON/src/Arduino_JSON.h"
|
||||||
|
|
||||||
class Configuration : public PrintLog {
|
class Configuration : public PrintLog {
|
||||||
|
public:
|
||||||
|
struct PMCorrection {
|
||||||
|
PMCorrectionAlgorithm algorithm;
|
||||||
|
int intercept;
|
||||||
|
int scalingFactor;
|
||||||
|
bool useEPA; // EPA 2021
|
||||||
|
bool changed;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool co2CalibrationRequested;
|
bool co2CalibrationRequested;
|
||||||
bool ledBarTestRequested;
|
bool ledBarTestRequested;
|
||||||
@ -19,10 +29,13 @@ private:
|
|||||||
String otaNewFirmwareVersion;
|
String otaNewFirmwareVersion;
|
||||||
bool _offlineMode = false;
|
bool _offlineMode = false;
|
||||||
bool _ledBarModeChanged = false;
|
bool _ledBarModeChanged = false;
|
||||||
|
PMCorrection pmCorrection;
|
||||||
|
|
||||||
AirGradient* ag;
|
AirGradient* ag;
|
||||||
|
|
||||||
String getLedBarModeName(LedBarMode mode);
|
String getLedBarModeName(LedBarMode mode);
|
||||||
|
PMCorrectionAlgorithm matchPmAlgorithm(String algorithm);
|
||||||
|
bool parsePmCorrection(JSONVar &json);
|
||||||
void saveConfig(void);
|
void saveConfig(void);
|
||||||
void loadConfig(void);
|
void loadConfig(void);
|
||||||
void defaultConfig(void);
|
void defaultConfig(void);
|
||||||
|
@ -94,6 +94,18 @@ enum ConfigurationControl {
|
|||||||
ConfigurationControlBoth
|
ConfigurationControlBoth
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum PMCorrectionAlgorithm {
|
||||||
|
Unknown, // Unknown algorithm
|
||||||
|
None, // No PM correction
|
||||||
|
EPA_2021,
|
||||||
|
SLR_PMS5003_20220802,
|
||||||
|
SLR_PMS5003_20220803,
|
||||||
|
SLR_PMS5003_20220824,
|
||||||
|
SLR_PMS5003_20231030,
|
||||||
|
SLR_PMS5003_20231218,
|
||||||
|
SLR_PMS5003_20240104,
|
||||||
|
};
|
||||||
|
|
||||||
enum AgFirmwareMode {
|
enum AgFirmwareMode {
|
||||||
FW_MODE_I_9PSL, /** ONE_INDOOR */
|
FW_MODE_I_9PSL, /** ONE_INDOOR */
|
||||||
FW_MODE_O_1PST, /** PMS5003T, S8 and SGP41 */
|
FW_MODE_O_1PST, /** PMS5003T, S8 and SGP41 */
|
||||||
|
Reference in New Issue
Block a user