kopia lustrzana https://github.com/weetmuts/wmbusmeters
Generate proper names for string fields depending on eg tariff_counter etc.
rodzic
9084a0323f
commit
0b852fb420
|
@ -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,
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Ładowanie…
Reference in New Issue