diff --git a/src/driver_abbb23.cc b/src/driver_abbb23.cc
index 42605d8..c5f2819 100644
--- a/src/driver_abbb23.cc
+++ b/src/driver_abbb23.cc
@@ -157,7 +157,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA600")),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -170,7 +170,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA700")),
Translate::Lookup()
- .add(Translate::Rule("WARNING_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("WARNING_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -183,7 +183,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA800")),
Translate::Lookup()
- .add(Translate::Rule("INFORMATION_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("INFORMATION_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage(""))
));
@@ -196,7 +196,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA900")),
Translate::Lookup()
- .add(Translate::Rule("ALARM_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ALARM_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xfffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -209,7 +209,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("01FFAD00")),
Translate::Lookup()
- .add(Translate::Rule("UNKNOWN", Translate::Type::BitToString)
+ .add(Translate::Rule("UNKNOWN", Translate::MapType::BitToString)
.set(MaskBits(0xff))
.set(DefaultMessage("OK"))
));
@@ -739,7 +739,7 @@ namespace
.set(SubUnitNr(1),SubUnitNr(2))
.add(VIFCombinableRaw(0)),
Translate::Lookup()
- .add(Translate::Rule("OUTPUT", Translate::Type::BitToString)
+ .add(Translate::Rule("OUTPUT", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -753,7 +753,7 @@ namespace
.set(SubUnitNr(3),SubUnitNr(4))
.add(VIFCombinableRaw(0)),
Translate::Lookup()
- .add(Translate::Rule("INPUT", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -768,7 +768,7 @@ namespace
.set(SubUnitNr(3),SubUnitNr(4))
.add(VIFCombinableRaw(0)),
Translate::Lookup()
- .add(Translate::Rule("INPUT", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
diff --git a/src/driver_aventieshca.cc b/src/driver_aventieshca.cc
index ea63b7e..884319d 100644
--- a/src/driver_aventieshca.cc
+++ b/src/driver_aventieshca.cc
@@ -48,7 +48,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -75,7 +75,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"",
{
diff --git a/src/driver_aventieswm.cc b/src/driver_aventieswm.cc
index 4f2c8d8..6ed7d49 100644
--- a/src/driver_aventieswm.cc
+++ b/src/driver_aventieswm.cc
@@ -49,7 +49,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -100,7 +100,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"",
{
diff --git a/src/driver_c5isf.cc b/src/driver_c5isf.cc
index 54d175e..58807b7 100644
--- a/src/driver_c5isf.cc
+++ b/src/driver_c5isf.cc
@@ -101,7 +101,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::DecimalsToString,
+ Translate::MapType::DecimalsToString,
AlwaysTrigger, MaskBits(9999),
"OK",
{
diff --git a/src/driver_cma12w.cc b/src/driver_cma12w.cc
index 8c4288d..579f288 100644
--- a/src/driver_cma12w.cc
+++ b/src/driver_cma12w.cc
@@ -77,7 +77,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::DigitalInput),
Translate::Lookup()
- .add(Translate::Rule("BATTERY", Translate::Type::BitToString)
+ .add(Translate::Rule("BATTERY", Translate::MapType::BitToString)
.set(MaskBits(0xffff)))
);
}
diff --git a/src/driver_dme_07.cc b/src/driver_dme_07.cc
index f00fb41..2828ecc 100644
--- a/src/driver_dme_07.cc
+++ b/src/driver_dme_07.cc
@@ -47,7 +47,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_dynamic.cc b/src/driver_dynamic.cc
index 6061511..288c2fb 100644
--- a/src/driver_dynamic.cc
+++ b/src/driver_dynamic.cc
@@ -35,11 +35,16 @@ string get_translation(XMQDoc *doc, XMQNode *node, string name, string lang);
string check_calculate(const char *formula, DriverDynamic *dd);
Unit check_display_unit(const char *display_unit, DriverDynamic *dd);
+bool checked_set_difvifkey(const char *difvifkey_s, FieldMatcher *fm, DriverDynamic *dd);
void checked_set_measurement_type(const char *measurement_type_s, FieldMatcher *fm, DriverDynamic *dd);
void checked_set_vif_range(const char *vif_range_s, FieldMatcher *fm, DriverDynamic *dd);
void checked_set_storagenr_range(const char *storagenr_range_s, FieldMatcher *fm, DriverDynamic *dd);
void checked_set_tariffnr_range(const char *tariffnr_range_s, FieldMatcher *fm, DriverDynamic *dd);
void checked_set_subunitnr_range(const char *subunitnr_range_s, FieldMatcher *fm, DriverDynamic *dd);
+Translate::MapType checked_map_type(const char *map_type_s, DriverDynamic *dd);
+uint64_t checked_mask_bits(const char *mask_bits_s, DriverDynamic *dd);
+uint64_t checked_value(const char *value_s, DriverDynamic *dd);
+TestBit checked_test_type(const char *test_s, DriverDynamic *dd);
void checked_add_vif_combinable(const char *vif_range_s, FieldMatcher *fm, DriverDynamic *dd);
const char *line = "-------------------------------------------------------------------------------";
@@ -59,12 +64,12 @@ bool DriverDynamic::load(DriverInfo *di, const string &file_name, const char *co
if (!content)
{
- ok = xmqParseFile(doc, file.c_str(), NULL);
+ ok = xmqParseFile(doc, file.c_str(), NULL, 0);
}
else
{
file = "builtin";
- ok = xmqParseBuffer(doc, content, content+strlen(content), NULL);
+ ok = xmqParseBuffer(doc, content, content+strlen(content), NULL, 0);
}
if (!ok) {
@@ -283,6 +288,21 @@ XMQProceed DriverDynamic::add_field(XMQDoc *doc, XMQNode *field, DriverDynamic *
// Check if there were any matches at all, if not, then disable the matcher.
match.active = num_matches > 0;
+ // Now find all matchers.
+ Translate::Lookup lookup = Translate::Lookup();
+ /*
+ .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .set(MaskBits(0x000f))
+ .set(DefaultMessage("OK"))
+ .add(Translate::Map(0x01 ,"DRY", TestBit::Set))
+ .add(Translate::Map(0x02 ,"REVERSE", TestBit::Set))
+ .add(Translate::Map(0x04 ,"LEAK", TestBit::Set))
+ .add(Translate::Map(0x08 ,"BURST", TestBit::Set))
+ ));
+ */
+ dd->tmp_lookup_ = &lookup;
+ int num_lookups = xmqForeach(doc, field, "lookup", (XMQNodeCallback)add_lookup, dd);
+
if (is_numeric)
{
if (calculate == "")
@@ -326,12 +346,25 @@ XMQProceed DriverDynamic::add_field(XMQDoc *doc, XMQNode *field, DriverDynamic *
}
else
{
- dd->addStringFieldWithExtractor(
- name,
- info,
- properties,
- match
- );
+ if (num_lookups > 0)
+ {
+ dd->addStringFieldWithExtractorAndLookup(
+ name,
+ info,
+ properties,
+ match,
+ lookup
+ );
+ }
+ else
+ {
+ dd->addStringFieldWithExtractor(
+ name,
+ info,
+ properties,
+ match
+ );
+ }
}
return XMQ_CONTINUE;
}
@@ -340,6 +373,8 @@ XMQProceed DriverDynamic::add_match(XMQDoc *doc, XMQNode *match, DriverDynamic *
{
FieldMatcher *fm = dd->tmp_matcher_;
+ if (checked_set_difvifkey(xmqGetString(doc, match, "difvifkey"), fm, dd)) return XMQ_CONTINUE;
+
checked_set_measurement_type(xmqGetString(doc, match, "measurement_type"), fm, dd);
checked_set_vif_range(xmqGetString(doc, match, "vif_range"), fm, dd);
@@ -360,6 +395,61 @@ XMQProceed DriverDynamic::add_combinable(XMQDoc *doc, XMQNode *match, DriverDyna
return XMQ_CONTINUE;
}
+/**
+ add_map:
+ Add a mapping from a value (bits,index,decimal) to a string name.
+
+ map {
+ name = SURGE
+ info = 'Unexpected increase in pressure in relation to average pressure.'
+ value = 0x02
+ test = set
+ }
+*/
+XMQProceed DriverDynamic::add_map(XMQDoc *doc, XMQNode *map, DriverDynamic *dd)
+{
+ const char *name = xmqGetString(doc, map, "name");
+ uint64_t value = checked_value(xmqGetString(doc, map, "value"), dd);
+ TestBit test_type = checked_test_type(xmqGetString(doc, map, "test"), dd);
+
+ dd->tmp_rule_->add(Translate::Map(value, name, test_type));
+
+ return XMQ_CONTINUE;
+}
+
+/**
+ add_lookup:
+ Add a lookup from bits,index or decimal to a sequence of string tokens.
+ Or fallback to the name (ERROR_FLAGS_8) suffixed by the untranslateable bits.
+
+ lookup {
+ name = ERROR_FLAGS
+ map_type = BitToString
+ mask_bits = 0xffff
+ default_message = OK
+ map { } map {}
+ }
+*/
+XMQProceed DriverDynamic::add_lookup(XMQDoc *doc, XMQNode *lookup, DriverDynamic *dd)
+{
+ const char *name = xmqGetString(doc, lookup, "name");
+ Translate::MapType map_type = checked_map_type(xmqGetString(doc, lookup, "map_type"), dd);
+ uint64_t mask_bits = checked_mask_bits(xmqGetString(doc, lookup, "mask_bits"), dd);
+ const char *default_message = xmqGetString(doc, lookup, "default_message");
+
+ Translate::Rule rule = Translate::Rule(name, map_type);
+ dd->tmp_rule_ = &rule;
+
+ rule.set(MaskBits(mask_bits));
+ rule.set(DefaultMessage(default_message));
+
+ xmqForeach(doc, lookup, "map", (XMQNodeCallback)add_map, dd);
+
+ dd->tmp_lookup_->add(rule);
+
+ return XMQ_CONTINUE;
+}
+
string check_driver_name(const char *name, string file)
{
if (!name)
@@ -623,6 +713,31 @@ Unit check_display_unit(const char *display_unit_s, DriverDynamic *dd)
return u;
}
+bool checked_set_difvifkey(const char *difvifkey_s, FieldMatcher *fm, DriverDynamic *dd)
+{
+ if (!difvifkey_s) return false;
+
+ bool invalid_hex = false;
+ bool hex = isHexStringStrict(difvifkey_s, &invalid_hex);
+
+ if (!hex || invalid_hex)
+ {
+ warning("(driver) error in %s, bad divfikey: %s\n"
+ "%s\n"
+ "Should be all hex.\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ difvifkey_s,
+ line,
+ line);
+ throw 1;
+ }
+
+ fm->set(DifVifKey(difvifkey_s));
+
+ return true;
+}
+
void checked_set_measurement_type(const char *measurement_type_s, FieldMatcher *fm, DriverDynamic *dd)
{
if (!measurement_type_s)
@@ -757,3 +872,118 @@ void checked_add_vif_combinable(const char *vif_combinable_s, FieldMatcher *fm,
fm->add(vif_combinable);
}
+
+Translate::MapType checked_map_type(const char *map_type_s, DriverDynamic *dd)
+{
+ if (!map_type_s)
+ {
+ warning("(driver) error in %s, cannot find: driver/field/lookup/map_type\n"
+ "%s\n"
+ "Remember to add for example: lookup { map_type = BitToString ... }\n"
+ "Available map types:\n"
+ "BitToString\n"
+ "IndexToString\n"
+ "DecimalsToString\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ line,
+ line);
+ throw 1;
+ }
+
+ Translate::MapType map_type = toMapType(map_type_s);
+
+ if (map_type == Translate::MapType::Unknown)
+ {
+ warning("(driver) error in %s, bad map_type: %s\n"
+ "%s\n"
+ "Available map types:\n"
+ "BitToString\n"
+ "IndexToString\n"
+ "DecimalToString\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ map_type_s,
+ line,
+ line);
+ throw 1;
+ }
+
+ return map_type;
+}
+
+
+uint64_t checked_mask_bits(const char *mask_bits_s, DriverDynamic *dd)
+{
+ if (!mask_bits_s)
+ {
+ warning("(driver) error in %s, cannot find: driver/field/lookup/mask_bitse\n"
+ "%s\n"
+ "Remember to add for example: lookup { mask_bits = 0x00ff ... }\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ line,
+ line);
+ throw 1;
+ }
+
+ uint64_t mask = strtol(mask_bits_s, NULL, 16);
+
+ return mask;
+}
+
+uint64_t checked_value(const char *value_s, DriverDynamic *dd)
+{
+ if (!value_s)
+ {
+ warning("(driver) error in %s, cannot find: driver/field/lookup/map/value\n"
+ "%s\n"
+ "Remember to add for example: lookup { map { ... value = 0x01 ... }}\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ line,
+ line);
+ throw 1;
+ }
+
+ uint64_t value = strtol(value_s, NULL, 16);
+
+ return value;
+}
+
+TestBit checked_test_type(const char *test_s, DriverDynamic *dd)
+{
+ if (!test_s)
+ {
+ warning("(driver) error in %s, cannot find: driver/field/lookup/map/test\n"
+ "%s\n"
+ "Remember to add for example: lookup { map { test = Set } }\n"
+ "Available test types:\n"
+ "Set\n"
+ "NotSet\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ line,
+ line);
+ throw 1;
+ }
+
+ TestBit test_type = toTestBit(test_s);
+
+ if (test_type == TestBit::Unknown)
+ {
+ warning("(driver) error in %s, bad test: %s\n"
+ "%s\n"
+ "Available test types:\n"
+ "Set\n"
+ "NotSet\n"
+ "%s\n",
+ dd->fileName().c_str(),
+ test_s,
+ line,
+ line);
+ throw 1;
+ }
+
+ return test_type;
+}
diff --git a/src/driver_dynamic.h b/src/driver_dynamic.h
index b0a9c1e..fb923e0 100644
--- a/src/driver_dynamic.h
+++ b/src/driver_dynamic.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2023 Fredrik Öhrström (gpl-3.0-or-later)
+ Copyright (C) 2023-2024 Fredrik Öhrström (gpl-3.0-or-later)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -31,12 +31,17 @@ struct DriverDynamic : public virtual MeterCommonImplementation
static XMQProceed add_match(XMQDoc *doc, XMQNode *match, DriverDynamic *dd);
static XMQProceed add_combinable(XMQDoc *doc, XMQNode *match, DriverDynamic *dd);
+ static XMQProceed add_lookup(XMQDoc *doc, XMQNode *lookup, DriverDynamic *dd);
+ static XMQProceed add_map(XMQDoc *doc, XMQNode *map, DriverDynamic *dd);
+
const string &fileName() { return file_name_; }
private:
string file_name_;
FieldMatcher *tmp_matcher_;
+ Translate::Lookup *tmp_lookup_;
+ Translate::Rule *tmp_rule_;
};
#endif
diff --git a/src/driver_ei6500.cc b/src/driver_ei6500.cc
index 935d952..3b549f0 100644
--- a/src/driver_ei6500.cc
+++ b/src/driver_ei6500.cc
@@ -38,7 +38,7 @@ namespace
{
setMfctTPLStatusBits(
Translate::Lookup()
- .add(Translate::Rule("TPL_STS", Translate::Type::BitToString)
+ .add(Translate::Rule("TPL_STS", Translate::MapType::BitToString)
.set(MaskBits(0xe0))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x04 ,"RTC_INVALID", TestBit::Set))));
@@ -54,7 +54,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -208,7 +208,7 @@ namespace
{
{
"DUST",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x1f),
"",
{
@@ -228,7 +228,7 @@ namespace
{
{
"BATTERY_VOLTAGE",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x0f00),
"",
{
@@ -267,7 +267,7 @@ namespace
{
{
"OBSTACLE_DISTANCE",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x700000),
"",
{
@@ -297,7 +297,7 @@ namespace
{
{
"HEAD_STATUS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff8ff0e0),
"OK",
{
diff --git a/src/driver_elf.cc b/src/driver_elf.cc
index 7c1d70c..ea04a76 100644
--- a/src/driver_elf.cc
+++ b/src/driver_elf.cc
@@ -45,7 +45,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffffff),
"OK",
{
diff --git a/src/driver_em24.cc b/src/driver_em24.cc
index f62abf1..dbf0fb5 100644
--- a/src/driver_em24.cc
+++ b/src/driver_em24.cc
@@ -53,7 +53,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"OK",
{
@@ -80,7 +80,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"",
{
diff --git a/src/driver_engelmann-faw.cc b/src/driver_engelmann-faw.cc
index 0440410..67cc170 100644
--- a/src/driver_engelmann-faw.cc
+++ b/src/driver_engelmann-faw.cc
@@ -46,7 +46,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"OK",
{
diff --git a/src/driver_eurisii.cc b/src/driver_eurisii.cc
index 06e0282..c905af9 100644
--- a/src/driver_eurisii.cc
+++ b/src/driver_eurisii.cc
@@ -50,7 +50,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -78,7 +78,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_evo868.cc b/src/driver_evo868.cc
index b36d67a..8829e7b 100644
--- a/src/driver_evo868.cc
+++ b/src/driver_evo868.cc
@@ -49,7 +49,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_flowiq2200.cc b/src/driver_flowiq2200.cc
index 8b95b3c..a07d88f 100644
--- a/src/driver_flowiq2200.cc
+++ b/src/driver_flowiq2200.cc
@@ -51,7 +51,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffffff),
"OK",
{
@@ -216,7 +216,7 @@ namespace
{
{
"DRY",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x0070),
"",
{
@@ -243,7 +243,7 @@ namespace
{
{
"REVERSED",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x0380),
"",
{
@@ -270,7 +270,7 @@ namespace
{
{
"LEAKING",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x1c00),
"",
{
@@ -297,7 +297,7 @@ namespace
{
{
"BURSTING",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0xe000),
"",
{
diff --git a/src/driver_gransystems.cc b/src/driver_gransystems.cc
index 867a370..f868b86 100644
--- a/src/driver_gransystems.cc
+++ b/src/driver_gransystems.cc
@@ -70,7 +70,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger,
AutoMask,
"OK",
@@ -85,7 +85,7 @@ namespace
},
{
"ERROR_FLAGS_SINGLE_PHASE",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
TriggerBits(0x01020000),
AutoMask,
"OK",
@@ -99,7 +99,7 @@ namespace
},
{
"ERROR_FLAGS_THREE_PHASE",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
TriggerBits(0x01010000),
AutoMask,
"OK",
@@ -124,7 +124,7 @@ namespace
{
{
"INFO_FLAGS",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger,
AutoMask,
"",
diff --git a/src/driver_hcae2.cc b/src/driver_hcae2.cc
index 72936cf..3321291 100644
--- a/src/driver_hcae2.cc
+++ b/src/driver_hcae2.cc
@@ -49,7 +49,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_hydrocalm3.cc b/src/driver_hydrocalm3.cc
index 5f7ed89..bb35a5a 100644
--- a/src/driver_hydrocalm3.cc
+++ b/src/driver_hydrocalm3.cc
@@ -39,7 +39,7 @@ namespace
{
setMfctTPLStatusBits(
Translate::Lookup()
- .add(Translate::Rule("TPL_STS", Translate::Type::BitToString)
+ .add(Translate::Rule("TPL_STS", Translate::MapType::BitToString)
.set(MaskBits(0xe0))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x80 ,"SABOTAGE_ENCLOSURE", TestBit::Set))));
diff --git a/src/driver_iem3000.cc b/src/driver_iem3000.cc
index d520a07..5dd899c 100644
--- a/src/driver_iem3000.cc
+++ b/src/driver_iem3000.cc
@@ -53,7 +53,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::ErrorFlags),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::IndexToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::IndexToString)
.set(MaskBits(0xffffff))
.add(Translate::Map(0x000000, "CODE_101_EEPROM_ERROR", TestBit::Set))
.add(Translate::Map(0x000010, "CODE_102_NO_CALIBRATION_TABLE", TestBit::Set))
@@ -203,7 +203,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA600")),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -216,7 +216,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA700")),
Translate::Lookup()
- .add(Translate::Rule("WARNING_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("WARNING_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -229,7 +229,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA800")),
Translate::Lookup()
- .add(Translate::Rule("INFORMATION_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("INFORMATION_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffffffffffffffff))
.set(DefaultMessage(""))
));
@@ -242,7 +242,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("07FFA900")),
Translate::Lookup()
- .add(Translate::Rule("ALARM_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ALARM_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xfffffffffffffff))
.set(DefaultMessage("OK"))
));
@@ -255,7 +255,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("01FFAD00")),
Translate::Lookup()
- .add(Translate::Rule("UNKNOWN", Translate::Type::BitToString)
+ .add(Translate::Rule("UNKNOWN", Translate::MapType::BitToString)
.set(MaskBits(0xff))
.set(DefaultMessage("OK"))
));
@@ -1407,7 +1407,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::DigitalInput),
Translate::Lookup()
- .add(Translate::Rule("INPUT", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT", Translate::MapType::BitToString)
.set(MaskBits(0xffffff))
));
@@ -1419,7 +1419,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("02FF32")),
Translate::Lookup()
- .add(Translate::Rule("INPUT_STATUS", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT_STATUS", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -1431,7 +1431,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::DigitalOutput),
Translate::Lookup()
- .add(Translate::Rule("OUTPUT", Translate::Type::BitToString)
+ .add(Translate::Rule("OUTPUT", Translate::MapType::BitToString)
.set(MaskBits(0xffffff))
));
@@ -1443,7 +1443,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("03FF2D")),
Translate::Lookup()
- .add(Translate::Rule("OUTPUT_ASSOCIATION", Translate::Type::BitToString)
+ .add(Translate::Rule("OUTPUT_ASSOCIATION", Translate::MapType::BitToString)
.set(MaskBits(0xffffff))
));
@@ -1455,7 +1455,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("03FF30")),
Translate::Lookup()
- .add(Translate::Rule("INPUT_ASSOCIATION", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT_ASSOCIATION", Translate::MapType::BitToString)
.set(MaskBits(0xffffff))
));
@@ -1467,7 +1467,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey( "02FF36")),
Translate::Lookup()
- .add(Translate::Rule("OUTPUT_ASSOCIATION", Translate::Type::BitToString)
+ .add(Translate::Rule("OUTPUT_ASSOCIATION", Translate::MapType::BitToString)
.set(MaskBits(0xffff))
));
@@ -1479,7 +1479,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("02FF34")),
Translate::Lookup()
- .add(Translate::Rule("OVERLOAD_ALARM", Translate::Type::BitToString)
+ .add(Translate::Rule("OVERLOAD_ALARM", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -1500,7 +1500,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("02FF37")),
Translate::Lookup()
- .add(Translate::Rule("ACTIVATED_STATUS", Translate::Type::BitToString)
+ .add(Translate::Rule("ACTIVATED_STATUS", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -1512,7 +1512,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("02FF38")),
Translate::Lookup()
- .add(Translate::Rule("UNACK_STATUS", Translate::Type::BitToString)
+ .add(Translate::Rule("UNACK_STATUS", Translate::MapType::BitToString)
.set(MaskBits(0xff))
));
@@ -1643,7 +1643,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(DifVifKey("03FF23")),
Translate::Lookup()
- .add(Translate::Rule("POWER_SYS_CONFIG", Translate::Type::BitToString)
+ .add(Translate::Rule("POWER_SYS_CONFIG", Translate::MapType::BitToString)
.set(MaskBits(0xffffff))
));
diff --git a/src/driver_itron.cc b/src/driver_itron.cc
index 38cfc3b..46c308e 100644
--- a/src/driver_itron.cc
+++ b/src/driver_itron.cc
@@ -60,7 +60,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffff),
"OK",
{
@@ -102,7 +102,7 @@ namespace
{
{
"WOOTA",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffffff),
"",
{
@@ -122,7 +122,7 @@ namespace
{
{
"WOOTB",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"",
{
@@ -156,4 +156,3 @@ namespace
// telegram=|3A4497269820362300167AF60020A52F2F_04132E100000066D03260DE12B007413FEFEFEFE426C1F01047F1600060C027F9A2A0E79187103002300|
// {"enhanced_id": "002300037118", "id": "23362098", "media": "cold water", "meter": "itron", "meter_datetime": "2023-11-01 13:38:03", "name": "ColdWaterMeter", "status": "OK", "target_date": "2000-01-31", "timestamp": "1111-11-11T11:11:11Z", "total_m3": 4.142,"unknown_a": "WOOTA_C060016","unknown_b": "WOOTB_2A9A" }
// |ColdWaterMeter;23362098;4.142;null;1111-11-11 11:11.11
-
diff --git a/src/driver_kamheat.cc b/src/driver_kamheat.cc
index 8c77357..f991f90 100644
--- a/src/driver_kamheat.cc
+++ b/src/driver_kamheat.cc
@@ -74,7 +74,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffffff),
"OK",
{
diff --git a/src/driver_kampress.cc b/src/driver_kampress.cc
deleted file mode 100644
index d464ec3..0000000
--- a/src/driver_kampress.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- Copyright (C) 2022 Fredrik Öhrström (gpl-3.0-or-later)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-#include"meters_common_implementation.h"
-
-namespace
-{
- struct Driver : public virtual MeterCommonImplementation
- {
- Driver(MeterInfo &mi, DriverInfo &di);
- };
-
- static bool ok = registerDriver([](DriverInfo&di)
- {
- di.setName("kampress");
- di.setDefaultFields("name,id,status,pressure_bar,max_pressure_bar,min_pressure_bar,timestamp");
- di.setMeterType(MeterType::PressureSensor);
- di.addLinkMode(LinkMode::C1);
- di.addDetection(MANUFACTURER_KAM, 0x18, 0x01);
- di.setConstructor([](MeterInfo& mi, DriverInfo& di){ return shared_ptr(new Driver(mi, di)); });
- });
-
- Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
- {
- addStringFieldWithExtractorAndLookup(
- "status",
- "Status and error flags.",
- DEFAULT_PRINT_PROPERTIES | INCLUDE_TPL_STATUS,
- FieldMatcher::build()
- .set(VIFRange::ErrorFlags),
- {
- {
- {
- "ERROR_FLAGS",
- Translate::Type::BitToString,
- AlwaysTrigger, MaskBits(0xffff),
- "OK",
- {
- { 0x01, "DROP" }, // Unexpected drop in pressure in relation to average pressure.
- { 0x02, "SURGE" }, // Unexpected increase in pressure in relation to average pressure.
- { 0x04, "HIGH" }, // Average pressure has reached configurable limit. Default 15 bar
- { 0x08, "LOW" }, // Average pressure has reached configurable limit. Default 1.5 bar
- { 0x10, "TRANSIENT" }, // Pressure changes quickly over short timeperiods. Average is fluctuating.
- { 0x20, "COMM_ERROR" } // Cannot measure properly or bad internal communication.
- }
- },
- },
- });
-
- addNumericFieldWithExtractor(
- "pressure",
- "The measured pressure.",
- DEFAULT_PRINT_PROPERTIES,
- Quantity::Pressure,
- VifScaling::Auto,
- FieldMatcher::build()
- .set(MeasurementType::Instantaneous)
- .set(VIFRange::Pressure)
- );
-
- addNumericFieldWithExtractor(
- "max_pressure",
- "The maximum pressure measured during ?.",
- DEFAULT_PRINT_PROPERTIES,
- Quantity::Pressure,
- VifScaling::Auto,
- FieldMatcher::build()
- .set(MeasurementType::Maximum)
- .set(VIFRange::Pressure)
- );
-
- addNumericFieldWithExtractor(
- "min_pressure",
- "The minimum pressure measured during ?.",
- DEFAULT_PRINT_PROPERTIES,
- Quantity::Pressure,
- VifScaling::Auto,
- FieldMatcher::build()
- .set(MeasurementType::Minimum)
- .set(VIFRange::Pressure)
- );
-
- addNumericFieldWithExtractor(
- "alfa",
- "We do not know what this is.",
- DEFAULT_PRINT_PROPERTIES,
- Quantity::Dimensionless,
- VifScaling::None,
- FieldMatcher::build()
- .set(DifVifKey("05FF09"))
- );
-
- addNumericFieldWithExtractor(
- "beta",
- "We do not know what this is.",
- DEFAULT_PRINT_PROPERTIES,
- Quantity::Dimensionless,
- VifScaling::None,
- FieldMatcher::build()
- .set(DifVifKey("05FF0A"))
- );
- }
-}
-
-// Test: Pressing kampress 77000317 NOKEY
-// telegram=|32442D2C1703007701188D280080E39322DB8F78_22696600126967000269660005FF091954A33A05FF0A99BD823A02FD170800|
-// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"alfa_counter":0.001246,"beta_counter":0.000997,"timestamp":"1111-11-11T11:11:11Z"}
-// |Pressing;77000317;LOW;1.02;1.03;1.02;1111-11-11 11:11.11
-
-// telegram=|27442D2C1703007701188D280194E393226EC679DE735657_660067006600962B913A21B9423A0800|
-// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"alfa_counter":0.001108,"beta_counter":0.000743,"timestamp":"1111-11-11T11:11:11Z"}
-// |Pressing;77000317;LOW;1.02;1.03;1.02;1111-11-11 11:11.11
-
-// telegram=|27442D2C1703007701188D289554F295224ED579DE73188A_650066006600E80EA43A6B97A3BA0800|
-// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.02,"min_pressure_bar":1.01,"alfa_counter":0.001252,"beta_counter":-0.001248,"timestamp":"1111-11-11T11:11:11Z"}
-// |Pressing;77000317;LOW;1.02;1.02;1.01;1111-11-11 11:11.11
diff --git a/src/driver_lansendw.cc b/src/driver_lansendw.cc
index 29cf411..453ec9c 100644
--- a/src/driver_lansendw.cc
+++ b/src/driver_lansendw.cc
@@ -44,7 +44,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::DigitalInput),
Translate::Lookup()
- .add(Translate::Rule("INPUT_BITS", Translate::Type::IndexToString)
+ .add(Translate::Rule("INPUT_BITS", Translate::MapType::IndexToString)
.set(MaskBits(0xffff))
.add(Translate::Map(0x11 ,"CLOSED", TestBit::Set))
.add(Translate::Map(0x55 ,"OPEN", TestBit::Set))
@@ -58,7 +58,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::ErrorFlags),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xffff))
.set(DefaultMessage("OK"))
));
diff --git a/src/driver_lansenpu.cc b/src/driver_lansenpu.cc
index 9d7eb06..d51e536 100644
--- a/src/driver_lansenpu.cc
+++ b/src/driver_lansenpu.cc
@@ -39,7 +39,7 @@ namespace
{
setMfctTPLStatusBits(
Translate::Lookup()
- .add(Translate::Rule("TPL_STS", Translate::Type::BitToString)
+ .add(Translate::Rule("TPL_STS", Translate::MapType::BitToString)
.set(MaskBits(0xe0))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x40 ,"SABOTAGE_ENCLOSURE", TestBit::Set))));
diff --git a/src/driver_lansenrp.cc b/src/driver_lansenrp.cc
index 27e4543..296cf4f 100644
--- a/src/driver_lansenrp.cc
+++ b/src/driver_lansenrp.cc
@@ -40,7 +40,7 @@ namespace
{
setMfctTPLStatusBits(
Translate::Lookup()
- .add(Translate::Rule("TPL_STS", Translate::Type::BitToString)
+ .add(Translate::Rule("TPL_STS", Translate::MapType::BitToString)
.set(MaskBits(0xe0))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x04 ,"LOW_BATTERY", TestBit::Set))));
@@ -92,7 +92,7 @@ namespace
.set(VIFRange::Dimensionless)
.set(SubUnitNr(2)),
Translate::Lookup()
- .add(Translate::Rule("INPUT_BITS", Translate::Type::IndexToString)
+ .add(Translate::Rule("INPUT_BITS", Translate::MapType::IndexToString)
.set(MaskBits(0x01))
.add(Translate::Map(0x00, "NO", TestBit::Set))
.add(Translate::Map(0x01, "YES", TestBit::Set))
@@ -143,7 +143,7 @@ namespace
.set(VIFRange::Dimensionless)
.set(StorageNr(3)),
Translate::Lookup()
- .add(Translate::Rule("INPUT_BITS", Translate::Type::BitToString)
+ .add(Translate::Rule("INPUT_BITS", Translate::MapType::BitToString)
.set(MaskBits(0xffff))
.add(Translate::Map(0x01 ,"SU", TestBit::Set))
.add(Translate::Map(0x02 ,"MO", TestBit::Set))
diff --git a/src/driver_lansensm.cc b/src/driver_lansensm.cc
index dd7ad59..a47745e 100644
--- a/src/driver_lansensm.cc
+++ b/src/driver_lansensm.cc
@@ -49,7 +49,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_lansenth.cc b/src/driver_lansenth.cc
index a14e38f..035152a 100644
--- a/src/driver_lansenth.cc
+++ b/src/driver_lansenth.cc
@@ -39,7 +39,7 @@ namespace
addOptionalLibraryFields("on_time_h");
setMfctTPLStatusBits(
Translate::Lookup()
- .add(Translate::Rule("TPL_STS", Translate::Type::BitToString)
+ .add(Translate::Rule("TPL_STS", Translate::MapType::BitToString)
.set(MaskBits(0xe0))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x40 ,"SABOTAGE_ENCLOSURE", TestBit::Set))));
diff --git a/src/driver_lse_07_17.cc b/src/driver_lse_07_17.cc
index ae5c8d4..fc41cd6 100644
--- a/src/driver_lse_07_17.cc
+++ b/src/driver_lse_07_17.cc
@@ -105,7 +105,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_lse_08.cc b/src/driver_lse_08.cc
index d2515f6..2a65c20 100644
--- a/src/driver_lse_08.cc
+++ b/src/driver_lse_08.cc
@@ -51,7 +51,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"OK",
{
diff --git a/src/driver_microclima.cc b/src/driver_microclima.cc
index 070e00b..516bd89 100644
--- a/src/driver_microclima.cc
+++ b/src/driver_microclima.cc
@@ -52,7 +52,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_minomess.cc b/src/driver_minomess.cc
index 6a73d1c..c71cec7 100644
--- a/src/driver_minomess.cc
+++ b/src/driver_minomess.cc
@@ -130,7 +130,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_multical21.cc b/src/driver_multical21.cc
index cfee124..b175621 100644
--- a/src/driver_multical21.cc
+++ b/src/driver_multical21.cc
@@ -46,7 +46,7 @@ namespace
FieldMatcher::build()
.set(DifVifKey("02FF20")),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0x000f))
.set(DefaultMessage("OK"))
.add(Translate::Map(0x01 ,"DRY", TestBit::Set))
@@ -136,7 +136,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0x000f),
"",
{
@@ -159,7 +159,7 @@ namespace
{
{
"DRY",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x0070),
"",
{
@@ -186,7 +186,7 @@ namespace
{
{
"REVERSED",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x0380),
"",
{
@@ -213,7 +213,7 @@ namespace
{
{
"LEAKING",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0x1c00),
"",
{
@@ -240,7 +240,7 @@ namespace
{
{
"BURSTING",
- Translate::Type::IndexToString,
+ Translate::MapType::IndexToString,
AlwaysTrigger, MaskBits(0xe000),
"",
{
diff --git a/src/driver_munia.cc b/src/driver_munia.cc
index 4c06725..41d53ed 100644
--- a/src/driver_munia.cc
+++ b/src/driver_munia.cc
@@ -47,7 +47,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_nemo.cc b/src/driver_nemo.cc
index 30e68bc..5f301ab 100644
--- a/src/driver_nemo.cc
+++ b/src/driver_nemo.cc
@@ -174,7 +174,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::ErrorFlags),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0xff))
.set(DefaultMessage("OK"))
));
diff --git a/src/driver_qcaloric.cc b/src/driver_qcaloric.cc
index 6b7ebe0..d5f3cba 100644
--- a/src/driver_qcaloric.cc
+++ b/src/driver_qcaloric.cc
@@ -59,7 +59,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"OK",
{
diff --git a/src/driver_qheat.cc b/src/driver_qheat.cc
index aac01e4..ebfc005 100644
--- a/src/driver_qheat.cc
+++ b/src/driver_qheat.cc
@@ -54,7 +54,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_qsmoke.cc b/src/driver_qsmoke.cc
index 0f566be..4aef547 100644
--- a/src/driver_qsmoke.cc
+++ b/src/driver_qsmoke.cc
@@ -49,7 +49,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_qualcosonic.cc b/src/driver_qualcosonic.cc
index 4df6228..be8398d 100644
--- a/src/driver_qualcosonic.cc
+++ b/src/driver_qualcosonic.cc
@@ -53,7 +53,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffffff),
"OK",
{
diff --git a/src/driver_sensostar.cc b/src/driver_sensostar.cc
index 0b4b829..d7022e2 100644
--- a/src/driver_sensostar.cc
+++ b/src/driver_sensostar.cc
@@ -155,7 +155,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"OK",
{
diff --git a/src/driver_sharky.cc b/src/driver_sharky.cc
index a61ff5b..e65ec2a 100644
--- a/src/driver_sharky.cc
+++ b/src/driver_sharky.cc
@@ -51,7 +51,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::ErrorFlags),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0x0000))
.set(DefaultMessage("OK"))
));
diff --git a/src/driver_supercom587.cc b/src/driver_supercom587.cc
index dfa29ef..f3575dd 100644
--- a/src/driver_supercom587.cc
+++ b/src/driver_supercom587.cc
@@ -48,7 +48,7 @@ namespace
.set(MeasurementType::Instantaneous)
.set(VIFRange::ErrorFlags),
Translate::Lookup()
- .add(Translate::Rule("ERROR_FLAGS", Translate::Type::BitToString)
+ .add(Translate::Rule("ERROR_FLAGS", Translate::MapType::BitToString)
.set(MaskBits(0x000f))
.set(DefaultMessage("OK"))
));
diff --git a/src/driver_ultraheat.cc b/src/driver_ultraheat.cc
index 676efc6..6dbdcdb 100644
--- a/src/driver_ultraheat.cc
+++ b/src/driver_ultraheat.cc
@@ -114,7 +114,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_ultrimis.cc b/src/driver_ultrimis.cc
index 9c84821..0f9d53a 100644
--- a/src/driver_ultrimis.cc
+++ b/src/driver_ultrimis.cc
@@ -68,7 +68,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffffff),
"OK",
{
diff --git a/src/driver_unismart.cc b/src/driver_unismart.cc
index f378ded..0848585 100644
--- a/src/driver_unismart.cc
+++ b/src/driver_unismart.cc
@@ -49,7 +49,7 @@ namespace
{
{
"STATUS_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -68,7 +68,7 @@ namespace
{
{
"OTHER_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xff),
"",
{
diff --git a/src/driver_waterstarm.cc b/src/driver_waterstarm.cc
index 51a5971..5948e14 100644
--- a/src/driver_waterstarm.cc
+++ b/src/driver_waterstarm.cc
@@ -52,7 +52,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
@@ -114,7 +114,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/driver_watertech.cc b/src/driver_watertech.cc
index e5b4039..b1f45d5 100644
--- a/src/driver_watertech.cc
+++ b/src/driver_watertech.cc
@@ -48,7 +48,7 @@ namespace
{
{
"ERROR_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger, MaskBits(0xffff),
"OK",
{
diff --git a/src/generated_database.cc b/src/generated_database.cc
index 1faf253..43a1040 100644
--- a/src/generated_database.cc
+++ b/src/generated_database.cc
@@ -15,12 +15,14 @@
along with this program. If not, see .
*/
-// Generated 2024-02-12_01:46
+// Generated 2024-04-04_20:51
BuiltinDriver builtins_[] =
{
{ "elster", "driver{name=elster meter_type=GasMeter default_fields=name,id,total_m3,timestamp detect{mvt=ELS,81,03}use=actuality_duration_s field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}}", false },
{ "iperl", "driver{name=iperl meter_type=WaterMeter default_fields=name,id,total_m3,max_flow_m3h,timestamp detect{mvt=SEN,68,06 mvt=SEN,68,07 mvt=SEN,7c,07}field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}field{name=max_flow quantity=Flow match{measurement_type=Instantaneous vif_range=VolumeFlow}about{en='The maximum flow recorded during previous period.'}}}", false },
+ { "kampress", "driver{name=kampress default_fields=name,id,status,pressure_bar,max_pressure_bar,min_pressure_bar,timestamp meter_type=PressureSensor detect{mvt=KAM,01,18}field{name=status quantity=Text info=status_and_error_flags match{measurement_type=Instantaneous vif_range=ErrorFlags}lookup{name=ERROR_FLAGS map_type=BitToString mask_bits=0xffff default_message=OK map{name=DROP info='Unexpected drop in pressure in relation to average pressure.'value=0x01 test=Set}map{name=SURGE info='Unexpected increase in pressure in relation to average pressure.'value=0x02 test=Set}map{name=HIGH info='Average pressure has reached configurable limit. Default 15 bar.'value=0x04 test=Set}map{name=LOW info='Average pressure has reached configurable limit. Default 1.5 bar.'value=0x08 test=Set}map{name=TRANSIENT info='Pressure changes quickly over short timeperiods. Average is fluctuating.'value=0x10 test=Set}map{name=COMM_ERROR info='Cannot measure properly or bad internal communication.'value=0x20 test=Set}}}field{name=pressure quantity=Pressure info='The measured pressure.'match{measurement_type=Instantaneous vif_range=Pressure}}field{name=max_pressure quantity=Pressure info='The maximum pressure measured during ?'match{measurement_type=Maximum vif_range=Pressure}}field{name=min_pressure quantity=Pressure info='The minimum pressure measured during ?'match{measurement_type=Minimum vif_range=Pressure}}field{name=alfa info='We do not know what this is.'quantity=Dimensionless vif_scaling=None match{difvifkey=05FF09}}field{name=beta info='We do not know what this is.'quantity=Dimensionless vif_scaling=None match{difvifkey=05FF0A}}}", false },
+ { "werhlemodwm", "driver{name=werhlemodwm meter_type=WaterMeter default_fields=name,id,total_m3,timestamp detect{mvt=WZG,03,16}use=meter_datetime use=target_date use=target_m3 use=total_m3 use=fabrication_no field{name=next_target quantity=PointInTime display_unit=date match{measurement_type=Instantaneous vif_range=Date add_combinable=FutureValue storage_nr=1}}}", false },
};
MapToDriver builtins_mvts_[] =
@@ -29,4 +31,6 @@ MapToDriver builtins_mvts_[] =
{ { MANUFACTURER_SEN,0x68,0x06 }, "iperl" },
{ { MANUFACTURER_SEN,0x68,0x07 }, "iperl" },
{ { MANUFACTURER_SEN,0x7c,0x07 }, "iperl" },
+ { { MANUFACTURER_KAM,0x01,0x18 }, "kampress" },
+ { { MANUFACTURER_WZG,0x03,0x16 }, "werhlemodwm" },
};
diff --git a/src/meters.cc b/src/meters.cc
index a48f6bc..d2efca5 100644
--- a/src/meters.cc
+++ b/src/meters.cc
@@ -207,6 +207,7 @@ string loadDriver(const string &file, const char *content)
{
DriverInfo di;
+ debug("(meter) loading %s\n", file.c_str());
bool ok = DriverDynamic::load(&di, file, content);
if (!ok)
{
@@ -217,8 +218,15 @@ string loadDriver(const string &file, const char *content)
DriverInfo *old = lookupDriver(di.name().str());
if (old != NULL)
{
+ debug("(meter) overriding %s\n", di.name().str().c_str());
if (old->getDynamicFileName() != "")
{
+ if (di.getDynamicFileName() == old->getDynamicFileName())
+ {
+ // Loading same file again, happens when using analyze. This is fine.
+ return di.name().str();
+ }
+ // New file source registering the same driver name, nono.
error("Newly loaded driver file %s tries to register the same name %s as driver file %s has already taken!\n",
file.c_str(), di.name().str().c_str(), old->getDynamicFileName().c_str());
}
diff --git a/src/testinternals.cc b/src/testinternals.cc
index 07089cc..4279ad1 100644
--- a/src/testinternals.cc
+++ b/src/testinternals.cc
@@ -1383,13 +1383,13 @@ void test_translate()
{
Translate::Lookup lookup1 =
Translate::Lookup()
- .add(Translate::Rule("ACCESS_BITS", Translate::Type::BitToString)
+ .add(Translate::Rule("ACCESS_BITS", Translate::MapType::BitToString)
.set(MaskBits(0xf0))
.add(Translate::Map(0x10, "NO_ACCESS", TestBit::Set))
.add(Translate::Map(0x20, "ALL_ACCESS", TestBit::Set))
.add(Translate::Map(0x40, "TEMP_ACCESS", TestBit::Set))
)
- .add(Translate::Rule("ACCESSOR_TYPE", Translate::Type::IndexToString)
+ .add(Translate::Rule("ACCESSOR_TYPE", Translate::MapType::IndexToString)
.set(MaskBits(0x0f))
.add(Translate::Map(0x00, "ACCESSOR_RED", TestBit::Set))
.add(Translate::Map(0x07, "ACCESSOR_GREEN", TestBit::Set))
@@ -1401,7 +1401,7 @@ void test_translate()
{
{
"FLOW_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger,
MaskBits(0x3f),
"OOOK",
@@ -1420,7 +1420,7 @@ void test_translate()
{
{
"NO_FLAGS",
- Translate::Type::BitToString,
+ Translate::MapType::BitToString,
AlwaysTrigger,
MaskBits(0x03),
"OK",
diff --git a/src/translatebits.cc b/src/translatebits.cc
index 8a7ec9f..c0aad1e 100644
--- a/src/translatebits.cc
+++ b/src/translatebits.cc
@@ -19,6 +19,7 @@
#include"util.h"
#include
+#include
using namespace Translate;
using namespace std;
@@ -210,15 +211,15 @@ void handleRule(Rule& rule, string &s, uint64_t bits)
{
switch (rule.type)
{
- case Type::BitToString:
+ case MapType::BitToString:
handleBitToString(rule, s, bits);
break;
- case Type::IndexToString:
+ case MapType::IndexToString:
handleIndexToString(rule, s, bits);
break;
- case Type::DecimalsToString:
+ case MapType::DecimalsToString:
handleDecimalsToString(rule, s, bits);
break;
@@ -259,11 +260,19 @@ string Lookup::str()
return x;
}
+Translate::MapType toMapType(const char *s)
+{
+ if (!strcmp(s, "BitToString")) return Translate::MapType::BitToString;
+ if (!strcmp(s, "IndexToString")) return Translate::MapType::IndexToString;
+ if (!strcmp(s, "DecimalsToString")) return Translate::MapType::DecimalsToString;
+ return Translate::MapType::Unknown;
+}
+
Lookup NoLookup = {};
Map m = { 123, "howdy" };
vector