Generate proper names for string fields depending on eg tariff_counter etc.

pull/1025/head
Fredrik Öhrström 2023-08-27 22:18:27 +02:00
rodzic 9084a0323f
commit 0b852fb420
9 zmienionych plików z 54 dodań i 30 usunięć

Wyświetl plik

@ -197,7 +197,20 @@ namespace
.set(DifVifKey("07FFA900")), .set(DifVifKey("07FFA900")),
Translate::Lookup() Translate::Lookup()
.add(Translate::Rule("ALARM_FLAGS", Translate::Type::BitToString) .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")) .set(DefaultMessage("OK"))
)); ));
@ -760,7 +773,7 @@ namespace
)); ));
addNumericFieldWithExtractor( addNumericFieldWithExtractor(
"input_{subunit_counter-2counter}", "digital_input_{subunit_counter-2counter}",
"Number of times input 1-2 counted a 1.", "Number of times input 1-2 counted a 1.",
DEFAULT_PRINT_PROPERTIES, DEFAULT_PRINT_PROPERTIES,
Quantity::Dimensionless, Quantity::Dimensionless,

Wyświetl plik

@ -114,7 +114,7 @@ namespace
uchar season_start_date_lo = content[1]; uchar season_start_date_lo = content[1];
uchar season_start_date_hi = content[0]; uchar season_start_date_hi = content[0];
string season_start_date = dateToString(season_start_date_lo, season_start_date_hi); 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 // Previous season total allocation
uchar prev_lo = content[4]; uchar prev_lo = content[4];
@ -126,7 +126,7 @@ namespace
uchar esb_date_lo = content[6]; uchar esb_date_lo = content[6];
uchar esb_date_hi = content[7]; uchar esb_date_hi = content[7];
string esb_date = dateToString(esb_date_lo, esb_date_hi); string esb_date = dateToString(esb_date_lo, esb_date_hi);
setStringValue("esb_date", esb_date); setStringValue("esb_date", esb_date, NULL);
// Current season allocation // Current season allocation
uchar curr_lo = content[8]; uchar curr_lo = content[8];
@ -138,7 +138,7 @@ namespace
uchar date_curr_lo = content[10]; uchar date_curr_lo = content[10];
uchar date_curr_hi = content[11]; uchar date_curr_hi = content[11];
string current_date = dateToString(date_curr_lo, date_curr_hi); 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 // Previous season average temperature
double temp_room_prev_avg_frac = content[12]; double temp_room_prev_avg_frac = content[12];

Wyświetl plik

@ -125,7 +125,7 @@ namespace
t->addSpecialExplanation(4+t->header_size, 2, KindOfData::CONTENT, Understanding::FULL, msg.c_str()); 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]); 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], msg = tostrprintf("*** %02X%02X%02X \"device_date\":\"%s\"", content[39-2], content[39-1], content[39],
device_date.c_str()); device_date.c_str());

Wyświetl plik

@ -105,7 +105,7 @@ namespace
leadingZeroString(month_prev) + "-" + leadingZeroString(month_prev) + "-" +
leadingZeroString(day_prev) + "T02:00:00Z"; 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 bytes = tostrprintf("%02x%02x", content[1], content[2]);
string info = "*** "+bytes+" previous_date = %s"; string info = "*** "+bytes+" previous_date = %s";
@ -147,7 +147,7 @@ namespace
leadingZeroString(month_curr) + "-" + leadingZeroString(month_curr) + "-" +
leadingZeroString(day_curr) + "T02:00:00Z"; 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]); bytes = tostrprintf("%02x%02x", content[5], content[6]);
info = "*** "+bytes+" current_date = %s"; info = "*** "+bytes+" current_date = %s";

Wyświetl plik

@ -77,7 +77,7 @@ namespace
if (type != 1) 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; return;
} }
@ -89,9 +89,9 @@ namespace
if (a & 0x40) info += "BACKFLOW "; if (a & 0x40) info += "BACKFLOW ";
if (info.size() > 0) info.pop_back(); 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. double battery_semesters = (b >> 3); // Half years.
setNumericValue("battery", Unit::Year, battery_semesters/2.0); setNumericValue("battery", Unit::Year, battery_semesters/2.0);

Wyświetl plik

@ -214,11 +214,11 @@ namespace
// get the manufacture year // get the manufacture year
uint8_t yy = atoi(digits.substr(0, 2).c_str()); 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 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 // get the serial number
uint32_t serial_number = atoi(digits.substr(2, digits.size()).c_str()); 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 // get letters
uchar supplier_code = '@' + (((origin[9] & 0x0F) << 1) | (origin[8] >> 7)); uchar supplier_code = '@' + (((origin[9] & 0x0F) << 1) | (origin[8] >> 7));
@ -226,7 +226,7 @@ namespace
uchar diameter = '@' + (((origin[8] & 0x03) << 3) | (origin[7] >> 5)); uchar diameter = '@' + (((origin[8] & 0x03) << 3) | (origin[7] >> 5));
// build the prefix // build the prefix
string prefix = tostrprintf("%c%02d%c%c", supplier_code, yy, meter_type, diameter); 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) // 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_month = decoded_content[10] & 0xF;
uint8_t h0_day = decoded_content[9] & 0x1F; 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: // read the alarms:
IzarAlarms alarms {}; IzarAlarms alarms {};

Wyświetl plik

@ -1352,13 +1352,23 @@ double MeterCommonImplementation::getNumericValue(string vname, Unit to)
return convert(nf.value, nf.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 field_name_no_unit;
string_values_[field_name_no_unit] = StringField(v, fi);
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); 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()); warning("(meter) cannot set string value %s for non-existant field \"%s\"\n", v.c_str(), vname.c_str());
return; return;
} }
setStringValue(fi, v); setStringValue(fi, v, dve);
} }
string MeterCommonImplementation::getStringValue(FieldInfo *fi) string MeterCommonImplementation::getStringValue(FieldInfo *fi)
@ -2290,7 +2300,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
if (print_properties_.hasINCLUDETPLSTATUS()) if (print_properties_.hasINCLUDETPLSTATUS())
{ {
string status = add_tpl_status("OK", m, t); string status = add_tpl_status("OK", m, t);
m->setStringValue(this, status); m->setStringValue(this, status, dve);
return true; return true;
} }
} }
@ -2310,7 +2320,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
if (print_properties_.hasINCLUDETPLSTATUS()) if (print_properties_.hasINCLUDETPLSTATUS())
{ {
string status = add_tpl_status("OK", m, t); string status = add_tpl_status("OK", m, t);
m->setStringValue(this, status); m->setStringValue(this, status, dve);
return true; return true;
} }
return false; return false;
@ -2324,7 +2334,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
if (print_properties_.hasINCLUDETPLSTATUS()) if (print_properties_.hasINCLUDETPLSTATUS())
{ {
string status = add_tpl_status("OK", m, t); string status = add_tpl_status("OK", m, t);
m->setStringValue(this, status); m->setStringValue(this, status, dve);
return true; return true;
} }
return false; return false;
@ -2356,7 +2366,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
if (found) if (found)
{ {
m->setStringValue(this, translated_bits); m->setStringValue(this, translated_bits, dve);
t->addMoreExplanation(dve->offset, renderJsonText(m, 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); 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)); t->addMoreExplanation(dve->offset, renderJsonText(m, dve));
found = true; found = true;
} }
@ -2384,7 +2394,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
struct tm date; struct tm date;
dve->extractDate(&date); dve->extractDate(&date);
string extracted_device_date = strdate(&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)); t->addMoreExplanation(dve->offset, renderJsonText(m, dve));
found = true; found = true;
} }
@ -2402,7 +2412,7 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
{ {
string extracted_id; string extracted_id;
dve->extractReadableString(&extracted_id); dve->extractReadableString(&extracted_id);
m->setStringValue(this, extracted_id); m->setStringValue(this, extracted_id, dve);
t->addMoreExplanation(dve->offset, renderJsonText(m, dve)); t->addMoreExplanation(dve->offset, renderJsonText(m, dve));
found = true; found = true;
} }

Wyświetl plik

@ -388,7 +388,8 @@ struct Meter
virtual void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v) = 0; virtual void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v) = 0;
virtual double getNumericValue(string vname, Unit u) = 0; virtual double getNumericValue(string vname, Unit u) = 0;
virtual double getNumericValue(FieldInfo *fi, 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 getStringValue(FieldInfo *fi) = 0;
virtual std::string decodeTPLStatusByte(uchar sts) = 0; virtual std::string decodeTPLStatusByte(uchar sts) = 0;

Wyświetl plik

@ -188,8 +188,8 @@ protected:
void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v); void setNumericValue(FieldInfo *fi, DVEntry *dve, Unit u, double v);
double getNumericValue(string vname, Unit u); double getNumericValue(string vname, Unit u);
double getNumericValue(FieldInfo *fi, Unit u); double getNumericValue(FieldInfo *fi, Unit u);
void setStringValue(string vname, std::string v); void setStringValue(string vname, std::string v, DVEntry *dve = NULL);
void setStringValue(FieldInfo *fi, std::string v); void setStringValue(FieldInfo *fi, std::string v, DVEntry *dve);
std::string getStringValue(FieldInfo *fi); std::string getStringValue(FieldInfo *fi);
// Check if the meter has received a value for this field. // Check if the meter has received a value for this field.