From 0b852fb420a931984b231eb363a1826091299761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Sun, 27 Aug 2023 22:18:27 +0200 Subject: [PATCH] Generate proper names for string fields depending on eg tariff_counter etc. --- src/driver_abbb23.cc | 17 +++++++++++++-- src/driver_apatoreitn.cc | 6 +++--- src/driver_bfw240radio.cc | 2 +- src/driver_fhkvdataiii.cc | 4 ++-- src/driver_gwfwater.cc | 6 +++--- src/driver_izar.cc | 8 +++---- src/meters.cc | 34 +++++++++++++++++++----------- src/meters.h | 3 ++- src/meters_common_implementation.h | 4 ++-- 9 files changed, 54 insertions(+), 30 deletions(-) diff --git a/src/driver_abbb23.cc b/src/driver_abbb23.cc index 5f3936d..725ab8c 100644 --- a/src/driver_abbb23.cc +++ b/src/driver_abbb23.cc @@ -197,7 +197,20 @@ namespace .set(DifVifKey("07FFA900")), Translate::Lookup() .add(Translate::Rule("ALARM_FLAGS", Translate::Type::BitToString) - .set(MaskBits(0xffffffffffffffff)) + .set(MaskBits(0xfffffffffffffff)) + .set(DefaultMessage("OK")) + )); + + addStringFieldWithExtractorAndLookup( + "unknown_vif_FFAD", + "Unknown byte.", + DEFAULT_PRINT_PROPERTIES, + FieldMatcher::build() + .set(MeasurementType::Instantaneous) + .set(DifVifKey("01FFAD00")), + Translate::Lookup() + .add(Translate::Rule("UNKNOWN", Translate::Type::BitToString) + .set(MaskBits(0xff)) .set(DefaultMessage("OK")) )); @@ -760,7 +773,7 @@ namespace )); addNumericFieldWithExtractor( - "input_{subunit_counter-2counter}", + "digital_input_{subunit_counter-2counter}", "Number of times input 1-2 counted a 1.", DEFAULT_PRINT_PROPERTIES, Quantity::Dimensionless, diff --git a/src/driver_apatoreitn.cc b/src/driver_apatoreitn.cc index e90cbe8..5ec31e9 100644 --- a/src/driver_apatoreitn.cc +++ b/src/driver_apatoreitn.cc @@ -114,7 +114,7 @@ namespace uchar season_start_date_lo = content[1]; uchar season_start_date_hi = content[0]; string season_start_date = dateToString(season_start_date_lo, season_start_date_hi); - setStringValue("season_start_date", season_start_date); + setStringValue("season_start_date", season_start_date, NULL); // Previous season total allocation uchar prev_lo = content[4]; @@ -126,7 +126,7 @@ namespace uchar esb_date_lo = content[6]; uchar esb_date_hi = content[7]; string esb_date = dateToString(esb_date_lo, esb_date_hi); - setStringValue("esb_date", esb_date); + setStringValue("esb_date", esb_date, NULL); // Current season allocation uchar curr_lo = content[8]; @@ -138,7 +138,7 @@ namespace uchar date_curr_lo = content[10]; uchar date_curr_hi = content[11]; string current_date = dateToString(date_curr_lo, date_curr_hi); - setStringValue("current_date", current_date); + setStringValue("current_date", current_date, NULL); // Previous season average temperature double temp_room_prev_avg_frac = content[12]; diff --git a/src/driver_bfw240radio.cc b/src/driver_bfw240radio.cc index df0376d..8a03a44 100644 --- a/src/driver_bfw240radio.cc +++ b/src/driver_bfw240radio.cc @@ -125,7 +125,7 @@ namespace t->addSpecialExplanation(4+t->header_size, 2, KindOfData::CONTENT, Understanding::FULL, msg.c_str()); string device_date = tostrprintf("20%02x-%02x-%02x", content[39], content[39-1], content[39-2]); - setStringValue("device_date", device_date); + setStringValue("device_date", device_date, NULL); msg = tostrprintf("*** %02X%02X%02X \"device_date\":\"%s\"", content[39-2], content[39-1], content[39], device_date.c_str()); diff --git a/src/driver_fhkvdataiii.cc b/src/driver_fhkvdataiii.cc index c669f69..b265287 100644 --- a/src/driver_fhkvdataiii.cc +++ b/src/driver_fhkvdataiii.cc @@ -105,7 +105,7 @@ namespace leadingZeroString(month_prev) + "-" + leadingZeroString(day_prev) + "T02:00:00Z"; - setStringValue("previous_date", previous_date); + setStringValue("previous_date", previous_date, NULL); string bytes = tostrprintf("%02x%02x", content[1], content[2]); string info = "*** "+bytes+" previous_date = %s"; @@ -147,7 +147,7 @@ namespace leadingZeroString(month_curr) + "-" + leadingZeroString(day_curr) + "T02:00:00Z"; - setStringValue("current_date", current_date); + setStringValue("current_date", current_date, NULL); bytes = tostrprintf("%02x%02x", content[5], content[6]); info = "*** "+bytes+" current_date = %s"; diff --git a/src/driver_gwfwater.cc b/src/driver_gwfwater.cc index 40a7235..dc11df1 100644 --- a/src/driver_gwfwater.cc +++ b/src/driver_gwfwater.cc @@ -77,7 +77,7 @@ namespace if (type != 1) { - setStringValue("mfct_status", tostrprintf("UKNOWN_MFCT_STATUS=%02x%02x%02x", type, a, b)); + setStringValue("mfct_status", tostrprintf("UKNOWN_MFCT_STATUS=%02x%02x%02x", type, a, b), NULL); return; } @@ -89,9 +89,9 @@ namespace if (a & 0x40) info += "BACKFLOW "; if (info.size() > 0) info.pop_back(); - setStringValue("mfct_status", info); + setStringValue("mfct_status", info, NULL); - setStringValue("power_mode", (b & 0x01) ? "SAVING" : "NORMAL"); + setStringValue("power_mode", (b & 0x01) ? "SAVING" : "NORMAL", NULL); double battery_semesters = (b >> 3); // Half years. setNumericValue("battery", Unit::Year, battery_semesters/2.0); diff --git a/src/driver_izar.cc b/src/driver_izar.cc index 9709270..fd00a1f 100644 --- a/src/driver_izar.cc +++ b/src/driver_izar.cc @@ -214,11 +214,11 @@ namespace // get the manufacture year uint8_t yy = atoi(digits.substr(0, 2).c_str()); int manufacture_year = yy > 70 ? (1900 + yy) : (2000 + yy); // Maybe to adjust in 2070, if this code stills lives :D - setStringValue("manufacture_year", tostrprintf("%d", manufacture_year)); + setStringValue("manufacture_year", tostrprintf("%d", manufacture_year), NULL); // get the serial number uint32_t serial_number = atoi(digits.substr(2, digits.size()).c_str()); - setStringValue("serial_number", tostrprintf("%06d", serial_number)); + setStringValue("serial_number", tostrprintf("%06d", serial_number), NULL); // get letters uchar supplier_code = '@' + (((origin[9] & 0x0F) << 1) | (origin[8] >> 7)); @@ -226,7 +226,7 @@ namespace uchar diameter = '@' + (((origin[8] & 0x03) << 3) | (origin[7] >> 5)); // build the prefix string prefix = tostrprintf("%c%02d%c%c", supplier_code, yy, meter_type, diameter); - setStringValue("prefix", prefix); + setStringValue("prefix", prefix, NULL); } // get the remaining battery life (in year) and transmission period (in seconds) @@ -252,7 +252,7 @@ namespace uint8_t h0_month = decoded_content[10] & 0xF; uint8_t h0_day = decoded_content[9] & 0x1F; - setStringValue("last_month_measure_date", tostrprintf("%d-%02d-%02d", h0_year, h0_month%99, h0_day%99)); + setStringValue("last_month_measure_date", tostrprintf("%d-%02d-%02d", h0_year, h0_month%99, h0_day%99), NULL); // read the alarms: IzarAlarms alarms {}; diff --git a/src/meters.cc b/src/meters.cc index 42e9a20..ddd0d2a 100644 --- a/src/meters.cc +++ b/src/meters.cc @@ -1352,13 +1352,23 @@ double MeterCommonImplementation::getNumericValue(string vname, Unit to) return convert(nf.value, nf.unit, to); } -void MeterCommonImplementation::setStringValue(FieldInfo *fi, string v) +void MeterCommonImplementation::setStringValue(FieldInfo *fi, string v, DVEntry *dve) { - string field_name_no_unit = fi->vname(); - string_values_[field_name_no_unit] = StringField(v, fi); + string field_name_no_unit; + + if (dve == NULL) + { + string field_name_no_unit = fi->vname(); + string_values_[field_name_no_unit] = StringField(v, fi); + } + else + { + field_name_no_unit = fi->generateFieldNameNoUnit(dve); + string_values_[field_name_no_unit] = StringField(v, fi); + } } -void MeterCommonImplementation::setStringValue(string vname, string v) +void MeterCommonImplementation::setStringValue(string vname, string v, DVEntry *dve) { FieldInfo *fi = findFieldInfo(vname, Quantity::Text); @@ -1367,7 +1377,7 @@ void MeterCommonImplementation::setStringValue(string vname, string v) warning("(meter) cannot set string value %s for non-existant field \"%s\"\n", v.c_str(), vname.c_str()); return; } - setStringValue(fi, v); + setStringValue(fi, v, dve); } string MeterCommonImplementation::getStringValue(FieldInfo *fi) @@ -2290,7 +2300,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) if (print_properties_.hasINCLUDETPLSTATUS()) { string status = add_tpl_status("OK", m, t); - m->setStringValue(this, status); + m->setStringValue(this, status, dve); return true; } } @@ -2310,7 +2320,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) if (print_properties_.hasINCLUDETPLSTATUS()) { string status = add_tpl_status("OK", m, t); - m->setStringValue(this, status); + m->setStringValue(this, status, dve); return true; } return false; @@ -2324,7 +2334,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) if (print_properties_.hasINCLUDETPLSTATUS()) { string status = add_tpl_status("OK", m, t); - m->setStringValue(this, status); + m->setStringValue(this, status, dve); return true; } return false; @@ -2356,7 +2366,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) if (found) { - m->setStringValue(this, translated_bits); + m->setStringValue(this, translated_bits, dve); t->addMoreExplanation(dve->offset, renderJsonText(m, dve)); } } @@ -2375,7 +2385,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) { extracted_device_date_time = strdatetime(&datetime); } - m->setStringValue(this, extracted_device_date_time); + m->setStringValue(this, extracted_device_date_time, dve); t->addMoreExplanation(dve->offset, renderJsonText(m, dve)); found = true; } @@ -2384,7 +2394,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) struct tm date; dve->extractDate(&date); string extracted_device_date = strdate(&date); - m->setStringValue(this, extracted_device_date); + m->setStringValue(this, extracted_device_date, dve); t->addMoreExplanation(dve->offset, renderJsonText(m, dve)); found = true; } @@ -2402,7 +2412,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve) { string extracted_id; dve->extractReadableString(&extracted_id); - m->setStringValue(this, extracted_id); + m->setStringValue(this, extracted_id, dve); t->addMoreExplanation(dve->offset, renderJsonText(m, dve)); found = true; } diff --git a/src/meters.h b/src/meters.h index 37a57cf..0e94f97 100644 --- a/src/meters.h +++ b/src/meters.h @@ -388,7 +388,8 @@ struct Meter virtual void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v) = 0; virtual double getNumericValue(string vname, Unit u) = 0; virtual double getNumericValue(FieldInfo *fi, Unit u) = 0; - virtual void setStringValue(FieldInfo *fi, std::string v) = 0; + virtual void setStringValue(FieldInfo *fi, std::string v, DVEntry *dve) = 0; + virtual void setStringValue(string vname, std::string v, DVEntry *dve = NULL) = 0; virtual std::string getStringValue(FieldInfo *fi) = 0; virtual std::string decodeTPLStatusByte(uchar sts) = 0; diff --git a/src/meters_common_implementation.h b/src/meters_common_implementation.h index f96dabb..cf32d12 100644 --- a/src/meters_common_implementation.h +++ b/src/meters_common_implementation.h @@ -188,8 +188,8 @@ protected: void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v); double getNumericValue(string vname, Unit u); double getNumericValue(FieldInfo *fi, Unit u); - void setStringValue(string vname, std::string v); - void setStringValue(FieldInfo *fi, std::string v); + void setStringValue(string vname, std::string v, DVEntry *dve = NULL); + void setStringValue(FieldInfo *fi, std::string v, DVEntry *dve); std::string getStringValue(FieldInfo *fi); // Check if the meter has received a value for this field.