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")),
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,

Wyświetl plik

@ -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];

Wyświetl plik

@ -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());

Wyświetl plik

@ -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";

Wyświetl plik

@ -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);

Wyświetl plik

@ -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 {};

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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.