@@ -68,13 +68,26 @@ 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+ }
7172
72- template <typename T>
73- struct FieldMapping {
74- size_t idx;
75- T NiclaSenseEnvSerial::*member;
73+ // Static lookup tables for CSV field parsing
74+ const NiclaSenseEnvSerial::FieldMapping<float > NiclaSenseEnvSerial::floatFieldMappings[] = {
75+ {IDX_TEMPERATURE, &NiclaSenseEnvSerial::_temperature},
76+ {IDX_HUMIDITY, &NiclaSenseEnvSerial::_humidity},
77+ {IDX_O3, &NiclaSenseEnvSerial::_o3},
78+ {IDX_NO2, &NiclaSenseEnvSerial::_no2},
79+ {IDX_IAQ, &NiclaSenseEnvSerial::_iaq},
80+ {IDX_REL_IAQ, &NiclaSenseEnvSerial::_relativeIaq},
81+ {IDX_CO2, &NiclaSenseEnvSerial::_co2},
82+ {IDX_TVOC, &NiclaSenseEnvSerial::_tvoc},
83+ {IDX_ETHANOL, &NiclaSenseEnvSerial::_ethanol},
84+ {IDX_ODOR_INTENSITY, &NiclaSenseEnvSerial::_odorIntensity},
85+ };
86+
87+ const NiclaSenseEnvSerial::FieldMapping<int > NiclaSenseEnvSerial::intFieldMappings[] = {
88+ {IDX_EPA_AQI, &NiclaSenseEnvSerial::_epaAqi},
89+ {IDX_FAST_AQI, &NiclaSenseEnvSerial::_fastAqi},
7690};
77- }
7891
7992NiclaSenseEnvSerial::NiclaSenseEnvSerial (HardwareSerial &serialPort) : _serial(&serialPort) {}
8093
@@ -173,31 +186,13 @@ void NiclaSenseEnvSerial::processCSVLine(String data) {
173186
174187 auto fields = splitFields (data);
175188
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) {
189+ for (const auto &mapping : floatFieldMappings) {
190190 if (fields[mapping.idx ].length ()) {
191191 setFloatField (this ->*mapping.member , fields[mapping.idx ]);
192192 }
193193 }
194194
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) {
195+ for (const auto &mapping : intFieldMappings) {
201196 if (fields[mapping.idx ].length ()) {
202197 setIntField (this ->*mapping.member , fields[mapping.idx ]);
203198 }
0 commit comments