Skip to content

Commit f274bb8

Browse files
committed
Move lookup tables out of function
1 parent bd1b8c1 commit f274bb8

File tree

2 files changed

+29
-25
lines changed

2 files changed

+29
-25
lines changed

src/NiclaSenseEnvSerial.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,26 @@ constexpr size_t IDX_REL_IAQ = 27;
6868
constexpr size_t IDX_ETHANOL = 28;
6969
constexpr size_t IDX_ODOR_INTENSITY = 47;
7070
constexpr 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

7992
NiclaSenseEnvSerial::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
}

src/NiclaSenseEnvSerial.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ class NiclaSenseEnvSerial {
144144
*/
145145
void setIntField(int &field, const String &value);
146146

147+
template <typename T>
148+
struct FieldMapping {
149+
size_t idx;
150+
T NiclaSenseEnvSerial::*member;
151+
};
152+
153+
static const FieldMapping<float> floatFieldMappings[];
154+
static const FieldMapping<int> intFieldMappings[];
155+
147156
HardwareSerial *_serial = nullptr;
148157
char _delimiter = ',';
149158
bool _hasNewData = false;

0 commit comments

Comments
 (0)