#include "openxc-utils.hpp"
-#include "../configuration.hpp"
+#include "../binding/application.hpp"
///
/// @brief Build a specific VehicleMessage containing a DiagnosticResponse.
/// and put into the DiagnosticResponse of the VehicleMessage.
/// @param[in] parsed_value - raw parsed value of the payload from CAN message
///
-/// @return a vehicle message including simple message that will be convert into
+/// @return a vehicle message including simple message that will be convert into
/// a JSON object before being pushed to the subscribers
///
-openxc_VehicleMessage build_VehicleMessage(active_diagnostic_request_t* request, const DiagnosticResponse& response, float parsed_value)
+const openxc_VehicleMessage build_VehicleMessage(active_diagnostic_request_t* request, const DiagnosticResponse& response, float parsed_value)
{
openxc_VehicleMessage message;
+ application_t& app = application_t::instance();
message.has_type = true;
message.type = openxc_VehicleMessage_Type::openxc_VehicleMessage_Type_DIAGNOSTIC;
message.has_diagnostic_response = true;
message.diagnostic_response.has_bus = true;
- message.diagnostic_response.bus = configuration_t::instance().get_diagnostic_manager().get_can_bus_dev()->get_address();
+ message.diagnostic_response.bus = app.get_can_bus_manager().get_can_device_index(
+ app.get_diagnostic_manager().get_bus_name());
message.diagnostic_response.has_message_id = true;
if(request->get_id() != OBD2_FUNCTIONAL_BROADCAST_ID)
return message;
}
+///
+/// @brief Build a specific VehicleMessage containing a SimpleMessage with associated timestamp
+///
+/// @param[in] message - simple message to include into openxc_VehicleMessage
+/// @param[in] timestamp - timestamp from ioctl when reading the socket
+///
+/// @return a vehicle message including simple message that will be convert into
+/// a JSON object before being pushed to the subscribers
+///
+const openxc_VehicleMessage build_VehicleMessage(const openxc_SimpleMessage& message, uint64_t timestamp)
+{
+ openxc_VehicleMessage v;
+
+ v.has_type = true,
+ v.type = openxc_VehicleMessage_Type::openxc_VehicleMessage_Type_SIMPLE;
+ v.has_simple_message = true;
+ v.simple_message = message;
+ v.has_timestamp = true;
+ v.timestamp = timestamp;
+
+ return v;
+}
///
/// @brief Build a specific VehicleMessage containing a SimpleMessage.
///
/// @param[in] message - simple message to include into openxc_VehicleMessage
///
-/// @return a vehicle message including simple message that will be convert into
+/// @return a vehicle message including simple message that will be convert into
/// a JSON object before being pushed to the subscribers
///
-openxc_VehicleMessage build_VehicleMessage(const openxc_SimpleMessage& message)
+const openxc_VehicleMessage build_VehicleMessage(const openxc_SimpleMessage& message)
{
openxc_VehicleMessage v;
-
+
v.has_type = true,
v.type = openxc_VehicleMessage_Type::openxc_VehicleMessage_Type_SIMPLE;
v.has_simple_message = true;
v.simple_message = message;
v.has_timestamp = true;
- v.timestamp = system_time_ms();
+ v.timestamp = system_time_us();
return v;
}
/// @brief Build an openxc_SimpleMessage associating a name to an openxc_DynamicField
///
/// @param[in] name - const string reference name to assign to the created SimpleMessage
-/// this will set has_name member to true and assign name to the name member. Maximum size for name is
+/// this will set has_name member to true and assign name to the name member. Maximum size for name is
/// set to 100 char.
/// @param[in] value - const reference with DynamicField to assign to SimpleMessage
/// value.
///
/// @return an openxc_SimpleMessage struct initialized with name and value provided.
///
-openxc_SimpleMessage build_SimpleMessage(const std::string& name, const openxc_DynamicField& value)
+const openxc_SimpleMessage build_SimpleMessage(const std::string& name, const openxc_DynamicField& value)
{
openxc_SimpleMessage s;
///
/// @return openxc_DynamicField initialized with a string value.
///
-openxc_DynamicField build_DynamicField(const std::string& value)
+const openxc_DynamicField build_DynamicField(const char* value)
{
openxc_DynamicField d;
d.has_type = true;
d.type = openxc_DynamicField_Type_STRING;
-
+
+ d.has_string_value = true;
+ d.has_numeric_value = false;
+ d.has_boolean_value = false;
+ ::strncpy(d.string_value, value, 100);
+
+ return d;
+}
+
+///
+/// @brief Build an openxc_DynamicField with a string value
+///
+/// @param[in] value - const string reference value to assign to builded
+/// openxc_DynamicField.
+///
+/// @return openxc_DynamicField initialized with a string value.
+///
+const openxc_DynamicField build_DynamicField(const std::string& value)
+{
+ openxc_DynamicField d;
+ d.has_type = true;
+ d.type = openxc_DynamicField_Type_STRING;
+
d.has_string_value = true;
d.has_numeric_value = false;
d.has_boolean_value = false;
::strncpy(d.string_value, value.c_str(), 100);
-
+
return d;
}
///
/// @return openxc_DynamicField initialized with a double value.
///
-openxc_DynamicField build_DynamicField(double value)
+const openxc_DynamicField build_DynamicField(double value)
{
openxc_DynamicField d;
d.has_type = true;
d.type = openxc_DynamicField_Type_NUM;
-
+
d.has_string_value = false;
d.has_numeric_value = true;
d.has_boolean_value = false;
d.numeric_value = value;
-
+
return d;
}
///
/// @return openxc_DynamicField initialized with a boolean value.
///
-openxc_DynamicField build_DynamicField(bool value)
+const openxc_DynamicField build_DynamicField(bool value)
{
openxc_DynamicField d;
d.has_type = true;
d.type = openxc_DynamicField_Type_BOOL;
-
+
d.has_string_value = false;
d.has_numeric_value = false;
d.has_boolean_value = true;
d.boolean_value = value;
-
+
return d;
}
+int get_bool_from_DynamicField(const openxc_VehicleMessage& v_msg, bool* ret)
+{
+ if(v_msg.has_simple_message && v_msg.simple_message.has_value && v_msg.simple_message.value.has_boolean_value)
+ {
+ *ret = v_msg.simple_message.value.boolean_value;
+ return 0;
+ }
+
+ return -1;
+}
+
+double get_numerical_from_DynamicField(const openxc_VehicleMessage& v_msg)
+{
+ return (v_msg.has_simple_message && v_msg.simple_message.has_value && v_msg.simple_message.value.has_numeric_value) ?
+ v_msg.simple_message.value.numeric_value : -1.0;
+}
+
+const std::string get_string_from_DynamicField(const openxc_VehicleMessage& v_msg)
+{
+return (v_msg.has_simple_message && v_msg.simple_message.has_value && v_msg.simple_message.value.has_string_value) ?
+ v_msg.simple_message.value.string_value : "";
+}
+
///
/// @brief Extract the simple message value from an openxc_VehicleMessage
/// and return it. If there isn't SimpleMessage in the VehicleMessage then
///
/// @return A simpleMessage from the provided VehicleMessage.
///
-openxc_SimpleMessage get_simple_message(const openxc_VehicleMessage& v_msg)
+const openxc_SimpleMessage get_simple_message(const openxc_VehicleMessage& v_msg)
{
if (v_msg.has_simple_message)
return v_msg.simple_message;
-
+
openxc_SimpleMessage s_msg = { false, "", false, build_DynamicField(false), false, build_DynamicField(false)};
return s_msg;
}
///
/// @brief Make a JSON object from a SimpleMessage
///
-/// @param[in] s_msg - const reference to an openxc_SimpleMessage
+/// @param[in] s_msg - const reference to an openxc_SimpleMessage
/// struct to convert into a json object.
/// @param[out] json - pointer with the DynamicField converted into json object
-///
+///
/// @return True if SimpleMessage has been transformed into json object
/// and false if not. In such case, a json object is returned { "error": "error msg"}
///
}
json_object_object_add(json, "error", json_object_new_string("openxc_SimpleMessage doesn't have name'"));
return false;
-}
\ No newline at end of file
+}