@@ -68,6 +68,12 @@ constexpr size_t IDX_REL_IAQ = 27;
6868constexpr size_t IDX_ETHANOL = 28 ;
6969constexpr size_t IDX_ODOR_INTENSITY = 47 ;
7070constexpr size_t IDX_SULFUR_ODOR = 48 ;
71+
72+ template <typename T>
73+ struct FieldMapping {
74+ size_t idx;
75+ T NiclaSenseEnvSerial::*member;
76+ };
7177}
7278
7379NiclaSenseEnvSerial::NiclaSenseEnvSerial (HardwareSerial &serialPort) : _serial(&serialPort) {}
@@ -167,42 +173,36 @@ void NiclaSenseEnvSerial::processCSVLine(String data) {
167173
168174 auto fields = splitFields (data);
169175
170- if (fields[IDX_TEMPERATURE].length ()) {
171- setFloatField (_temperature, fields[IDX_TEMPERATURE]);
172- }
173- if (fields[IDX_HUMIDITY].length ()) {
174- setFloatField (_humidity, fields[IDX_HUMIDITY]);
175- }
176- if (fields[IDX_EPA_AQI].length ()) {
177- setIntField (_epaAqi, fields[IDX_EPA_AQI]);
178- }
179- if (fields[IDX_FAST_AQI].length ()) {
180- setIntField (_fastAqi, fields[IDX_FAST_AQI]);
181- }
182- if (fields[IDX_O3].length ()) {
183- setFloatField (_o3, fields[IDX_O3]);
184- }
185- if (fields[IDX_NO2].length ()) {
186- setFloatField (_no2, fields[IDX_NO2]);
187- }
188- if (fields[IDX_IAQ].length ()) {
189- setFloatField (_iaq, fields[IDX_IAQ]);
190- }
191- if (fields[IDX_REL_IAQ].length ()) {
192- setFloatField (_relativeIaq, fields[IDX_REL_IAQ]);
193- }
194- if (fields[IDX_CO2].length ()) {
195- setFloatField (_co2, fields[IDX_CO2]);
196- }
197- if (fields[IDX_TVOC].length ()) {
198- setFloatField (_tvoc, fields[IDX_TVOC]);
199- }
200- if (fields[IDX_ETHANOL].length ()) {
201- setFloatField (_ethanol, fields[IDX_ETHANOL]);
176+ static const FieldMapping<float > floatFields[] = {
177+ {IDX_TEMPERATURE, &NiclaSenseEnvSerial::_temperature},
178+ {IDX_HUMIDITY, &NiclaSenseEnvSerial::_humidity},
179+ {IDX_O3, &NiclaSenseEnvSerial::_o3},
180+ {IDX_NO2, &NiclaSenseEnvSerial::_no2},
181+ {IDX_IAQ, &NiclaSenseEnvSerial::_iaq},
182+ {IDX_REL_IAQ, &NiclaSenseEnvSerial::_relativeIaq},
183+ {IDX_CO2, &NiclaSenseEnvSerial::_co2},
184+ {IDX_TVOC, &NiclaSenseEnvSerial::_tvoc},
185+ {IDX_ETHANOL, &NiclaSenseEnvSerial::_ethanol},
186+ {IDX_ODOR_INTENSITY, &NiclaSenseEnvSerial::_odorIntensity},
187+ };
188+
189+ for (const auto &mapping : floatFields) {
190+ if (fields[mapping.idx ].length ()) {
191+ setFloatField (this ->*mapping.member , fields[mapping.idx ]);
192+ }
202193 }
203- if (fields[IDX_ODOR_INTENSITY].length ()) {
204- setFloatField (_odorIntensity, fields[IDX_ODOR_INTENSITY]);
194+
195+ static const FieldMapping<int > intFields[] = {
196+ {IDX_EPA_AQI, &NiclaSenseEnvSerial::_epaAqi},
197+ {IDX_FAST_AQI, &NiclaSenseEnvSerial::_fastAqi},
198+ };
199+
200+ for (const auto &mapping : intFields) {
201+ if (fields[mapping.idx ].length ()) {
202+ setIntField (this ->*mapping.member , fields[mapping.idx ]);
203+ }
205204 }
205+
206206 if (fields[IDX_SULFUR_ODOR].length ()) {
207207 int odorFlag = static_cast <int >(fields[IDX_SULFUR_ODOR].toInt ());
208208 _sulfurOdor = odorFlag != 0 ;
0 commit comments