aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2019-11-26 16:19:49 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2019-11-28 16:11:48 +0100
commit1fa52a04542ed648b5a2a15b2f3d252f33202a33 (patch)
tree6cf276244f3defbc4995bf90db2919a9ddefcf1f
parent3fb5cd5d762006c3bc20ffc7acd86f8a74156f9b (diff)
Change signature of decoders
This commit changes the signature of decoders. It is now necessary to specify the version of the signals so that the low-can-generator generates the associated wrapper and not need to modify the decoder already developed. Bug-AGL : SPEC-2780 Bug-AGL: SPEC-2976 Change-Id: I044b1a3a6bacb9fc59bd6d3f77a1dbc437a3aa86 Signed-off-by: Arthur Guyader <arthur.guyader@iot.bzh> Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r--examples/OBD2/signals.json1
-rw-r--r--examples/agl-vcar/signals.json1
-rw-r--r--examples/basic/signals.json1
-rw-r--r--examples/engine/signals.json1
-rw-r--r--examples/hvac/signals.json1
-rw-r--r--examples/j1939/j1939_parse.json1
-rw-r--r--examples/tests/signal.json1
-rw-r--r--examples/toyota/auris/signals.json1
-rw-r--r--low-can-binding/can/can-decoder.cpp89
-rw-r--r--low-can-binding/can/can-decoder.hpp12
-rw-r--r--low-can-binding/can/signals.hpp6
11 files changed, 62 insertions, 53 deletions
diff --git a/examples/OBD2/signals.json b/examples/OBD2/signals.json
index 89276298..4940cee9 100644
--- a/examples/OBD2/signals.json
+++ b/examples/OBD2/signals.json
@@ -1,4 +1,5 @@
{ "name": "example",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/agl-vcar/signals.json b/examples/agl-vcar/signals.json
index ecf635ca..9fecd922 100644
--- a/examples/agl-vcar/signals.json
+++ b/examples/agl-vcar/signals.json
@@ -1,4 +1,5 @@
{ "name": "AGL Virtual Car",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/basic/signals.json b/examples/basic/signals.json
index dc2e346c..c41cdf38 100644
--- a/examples/basic/signals.json
+++ b/examples/basic/signals.json
@@ -1,4 +1,5 @@
{ "name": "example",
+ "version": "1.0",
"extra_sources": [
"handlers.cpp"
],
diff --git a/examples/engine/signals.json b/examples/engine/signals.json
index a64fa138..c8c4609b 100644
--- a/examples/engine/signals.json
+++ b/examples/engine/signals.json
@@ -1,4 +1,5 @@
{ "name": "example",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/hvac/signals.json b/examples/hvac/signals.json
index dbe4cf7d..0795cf60 100644
--- a/examples/hvac/signals.json
+++ b/examples/hvac/signals.json
@@ -1,4 +1,5 @@
{ "name": "example",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/j1939/j1939_parse.json b/examples/j1939/j1939_parse.json
index a5f8bcbc..3896acba 100644
--- a/examples/j1939/j1939_parse.json
+++ b/examples/j1939/j1939_parse.json
@@ -1,5 +1,6 @@
{ "name": "Virtual J1939",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/tests/signal.json b/examples/tests/signal.json
index a4de3584..1e706461 100644
--- a/examples/tests/signal.json
+++ b/examples/tests/signal.json
@@ -1,4 +1,5 @@
{ "name": "AGL Virtual Car",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/examples/toyota/auris/signals.json b/examples/toyota/auris/signals.json
index 5b726660..fd03a825 100644
--- a/examples/toyota/auris/signals.json
+++ b/examples/toyota/auris/signals.json
@@ -1,4 +1,5 @@
{ "name": "example",
+ "version": "2.0",
"extra_sources": [],
"initializers": [],
"loopers": [],
diff --git a/low-can-binding/can/can-decoder.cpp b/low-can-binding/can/can-decoder.cpp
index 3c811be6..7d6ae2a1 100644
--- a/low-can-binding/can/can-decoder.cpp
+++ b/low-can-binding/can/can-decoder.cpp
@@ -27,7 +27,7 @@
/// value.
///
/// @param[in] signal - The signal to be parsed from the data.
-/// @param[in] message - can_message_t to parse
+/// @param[in] message - message_t to parse
///
/// @return Returns the raw value of the signal parsed as a bitfield from the given byte
/// array.
@@ -94,7 +94,7 @@ float decoder_t::parse_signal_bitfield(signal_t& signal, std::shared_ptr<message
/// used directly in the signal_t.decoder field.
///
/// @param[in] signal - The details of the signal that contains the state mapping.
-/// @param[in] value - The numerical value that will be wrapped in a DynamicField.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output argument that will be set to false if the value should
/// not be sent for any reason.
///
@@ -102,10 +102,19 @@ float decoder_t::parse_signal_bitfield(signal_t& signal, std::shared_ptr<message
/// its numeric value. The 'send' argument will not be modified as this decoder
/// always succeeds.
///
-openxc_DynamicField decoder_t::decode_noop(signal_t& signal, float value, bool* send)
+openxc_DynamicField decoder_t::decode_noop(signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
+ float value = decoder_t::parse_signal_bitfield(signal, message);
+ AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value);
openxc_DynamicField decoded_value = build_DynamicField(value);
+ // Don't send if they is no changes
+ if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send )
+ {
+ *send = false;
+ }
+ signal.set_last_value(value);
+
return decoded_value;
}
/// @brief Coerces a numerical value to a boolean.
@@ -114,7 +123,7 @@ openxc_DynamicField decoder_t::decode_noop(signal_t& signal, float value, bool*
/// used directly in the signal_t.decoder field.
///
/// @param[in] signal - The details of the signal that contains the state mapping.
-/// @param[in] value - The numerical value that will be converted to a boolean.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output argument that will be set to false if the value should
/// not be sent for any reason.
///
@@ -122,10 +131,20 @@ openxc_DynamicField decoder_t::decode_noop(signal_t& signal, float value, bool*
/// is 0.0, otherwise true. The 'send' argument will not be modified as this
/// decoder always succeeds.
///
-openxc_DynamicField decoder_t::decode_boolean(signal_t& signal, float value, bool* send)
+openxc_DynamicField decoder_t::decode_boolean(signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
+ float value = decoder_t::parse_signal_bitfield(signal, message);
+ AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value);
openxc_DynamicField decoded_value = build_DynamicField(value == 0.0 ? false : true);
+ // Don't send if they is no changes
+ if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send )
+ {
+ *send = false;
+ }
+ signal.set_last_value(value);
+
+
return decoded_value;
}
/// @brief Update the metadata for a signal and the newly received value.
@@ -136,17 +155,19 @@ openxc_DynamicField decoder_t::decode_boolean(signal_t& signal, float value, boo
/// This function always flips 'send' to false.
///
/// @param[in] signal - The details of the signal that contains the state mapping.
-/// @param[in] value - The numerical value that will be converted to a boolean.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - This output argument will always be set to false, so the caller will
/// know not to publish this value to the pipeline.
///
/// @return Return value is undefined.
///
-openxc_DynamicField decoder_t::decode_ignore(signal_t& signal, float value, bool* send)
+openxc_DynamicField decoder_t::decode_ignore(signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
+ float value = decoder_t::parse_signal_bitfield(signal, message);
if(send)
*send = false;
+ signal.set_last_value(value);
openxc_DynamicField decoded_value;
return decoded_value;
@@ -159,7 +180,7 @@ openxc_DynamicField decoder_t::decode_ignore(signal_t& signal, float value, bool
/// used directly in the signal_t.decoder field.
///
/// @param[in] signal - The details of the signal that contains the state mapping.
-/// @param[in] value - The numerical value that should map to a state.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output argument that will be set to false if the value should
/// not be sent for any reason.
///
@@ -167,8 +188,10 @@ openxc_DynamicField decoder_t::decode_ignore(signal_t& signal, float value, bool
/// the signal. If an equivalent isn't found, send is sent to false and the
/// return value is undefined.
///
-openxc_DynamicField decoder_t::decode_state(signal_t& signal, float value, bool* send)
+openxc_DynamicField decoder_t::decode_state(signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
+ float value = decoder_t::parse_signal_bitfield(signal, message);
+ AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value);
const std::string signal_state = signal.get_states((uint8_t)value);
openxc_DynamicField decoded_value = build_DynamicField(signal_state);
if(signal_state.size() <= 0)
@@ -176,6 +199,15 @@ openxc_DynamicField decoder_t::decode_state(signal_t& signal, float value, bool*
*send = false;
AFB_ERROR("No state found with index: %d", (int)value);
}
+
+ // Don't send if they is no changes
+ if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send )
+ {
+ *send = false;
+ }
+ signal.set_last_value(value);
+
+
return decoded_value;
}
@@ -187,7 +219,7 @@ openxc_DynamicField decoder_t::decode_state(signal_t& signal, float value, bool*
/// will be passed to the decoder before publishing.
///
/// @param[in] signal - The details of the signal to decode and forward.
-/// @param[in] message - The received CAN message that should contain this signal.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output parameter that will be flipped to false if the value could
/// not be decoded.
///
@@ -196,22 +228,13 @@ openxc_DynamicField decoder_t::decode_state(signal_t& signal, float value, bool*
///
openxc_DynamicField decoder_t::translate_signal(signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
- float value = decoder_t::parse_signal_bitfield(signal, message);
- AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value);
// Must call the decoders every time, regardless of if we are going to
// decide to send the signal or not.
openxc_DynamicField decoded_value = decoder_t::decode_signal(signal,
- value, send);
+ message, send);
signal.set_received(true);
-
- // Don't send if they is no changes
- if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send )
- {
- *send = false;
- }
- signal.set_last_value(value);
signal.set_timestamp(message->get_timestamp());
signal.get_message()->set_last_value(message);
return decoded_value;
@@ -224,41 +247,23 @@ openxc_DynamicField decoder_t::translate_signal(signal_t& signal, std::shared_pt
/// will be passed to the decoder before returning.
///
/// @param[in] signal - The details of the signal to decode and forward.
-/// @param[in] value - The numerical value that will be converted to a boolean.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output parameter that will be flipped to false if the value could
/// not be decoded.
///
/// @return The decoder returns an openxc_DynamicField, which may contain a number,
/// string or boolean. If 'send' is false, the return value is undefined.
///
-openxc_DynamicField decoder_t::decode_signal( signal_t& signal, float value, bool* send)
+openxc_DynamicField decoder_t::decode_signal( signal_t& signal, std::shared_ptr<message_t> message, bool* send)
{
signal_decoder decoder = signal.get_decoder() == nullptr ?
decode_noop : signal.get_decoder();
+
openxc_DynamicField decoded_value = decoder(signal,
- value, send);
+ message, send);
return decoded_value;
}
-/// @brief Decode a transformed, human readable value from an raw CAN signal
-/// already parsed from a CAN message.
-///
-/// This is the same as decode_signal but you must parse the bitfield value of the signal from the CAN
-/// message yourself. This is useful if you need that raw value for something
-/// else.
-///
-/// @param[in] signal - The details of the signal to decode and forward.
-/// @param[in] message - Raw CAN message to decode
-/// @param[out] send - An output parameter that will be flipped to false if the value could
-/// not be decoded.
-///
-openxc_DynamicField decoder_t::decode_signal( signal_t& signal, std::shared_ptr<message_t> message, bool* send)
-{
- float value = parse_signal_bitfield(signal, message);
- return decode_signal(signal, value, send);
-}
-
-
///
/// @brief Decode the payload of an OBD-II PID.
///
diff --git a/low-can-binding/can/can-decoder.hpp b/low-can-binding/can/can-decoder.hpp
index ac9eb5d9..78de8ee1 100644
--- a/low-can-binding/can/can-decoder.hpp
+++ b/low-can-binding/can/can-decoder.hpp
@@ -26,16 +26,14 @@ class decoder_t
public:
static float parse_signal_bitfield(signal_t& signal, std::shared_ptr<message_t> message);
- static openxc_DynamicField decode_state(signal_t& signal, float value, bool* send);
- static openxc_DynamicField decode_boolean(signal_t& signal, float value, bool* send);
- static openxc_DynamicField decode_ignore(signal_t& signal, float value, bool* send);
- static openxc_DynamicField decode_noop(signal_t& signal, float value, bool* send);
+ static openxc_DynamicField decode_state(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+ static openxc_DynamicField decode_boolean(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+ static openxc_DynamicField decode_ignore(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+ static openxc_DynamicField decode_noop(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
static openxc_DynamicField translate_signal(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
static openxc_DynamicField decode_signal(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
- static openxc_DynamicField decode_signal(signal_t& signal, float value, bool* send);
-
static float decode_obd2_response(const DiagnosticResponse* response, float parsed_payload);
-};
+}; \ No newline at end of file
diff --git a/low-can-binding/can/signals.hpp b/low-can-binding/can/signals.hpp
index e723100e..2fcc27ed 100644
--- a/low-can-binding/can/signals.hpp
+++ b/low-can-binding/can/signals.hpp
@@ -38,15 +38,13 @@ class signal_t;
/// string or boolean.
///
/// @param[in] signal - The CAN signal that we are decoding.
-/// @param[in] signalCount - The length of the signals array.
-/// @param[in] value - The CAN signal parsed from the message as a raw floating point
-/// value.
+/// @param[in] message - The message with data to decode.
/// @param[out] send - An output parameter. If decoding fails or CAN signal is
/// not sending, this should be flipped to false.
///
/// @return a decoded value in an openxc_DynamicField struct.
///
-typedef openxc_DynamicField (*signal_decoder)(signal_t& signal, float value, bool* send);
+typedef openxc_DynamicField (*signal_decoder)(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
///
/// @brief: The type signature for a CAN signal encoder.