#include "application.hpp" #include "../can/can-decoder.hpp" #include "../can/can-encoder.hpp" #include "can/canread.h" using openxc::can::read::publishNumericalMessage; void handleSteeringWheelMessage(CanMessage* message, CanSignal* signals, int signalCount, Pipeline* pipeline) { publishNumericalMessage("latitude", 42.0, pipeline); } openxc_DynamicField handleInverted(CanSignal* signal, CanSignal* signals, int signalCount, float value, bool* send) { return openxc::payload::wrapNumber(value * -1); } void initializeMyStuff() { } void initializeOtherStuff() { } void myLooper() { // this function will be called once, each time through the main loop, after // all CAN message processing has been completed } // >>>>> handlers.cpp >>>>> #include "can/canread.h" using openxc::can::read::publishNumericalMessage; void handleSteeringWheelMessage(CanMessage* message, CanSignal* signals, int signalCount, Pipeline* pipeline) { publishNumericalMessage("latitude", 42.0, pipeline); } openxc_DynamicField handleInverted(CanSignal* signal, CanSignal* signals, int signalCount, float value, bool* send) { return openxc::payload::wrapNumber(value * -1); } void initializeMyStuff() { } void initializeOtherStuff() { } void myLooper() { // this function will be called once, each time through the main loop, after // all CAN message processing has been completed } // <<<<< handlers.cpp <<<<< application_t::application_t() : can_bus_manager_{utils::config_parser_t{"/etc/dev-mapping.conf"}} , message_set_{ {std::make_shared(message_set_t{0,"example", { // beginning message_definition_ vector {std::make_shared(message_definition_t{"hs",0x128,"ECM_z_5D2",8,0,true,frequency_clock_t(5.00000f),true, { // beginning signals vector {std::make_shared (signal_t{ "engine_speed",// generic_name 12,// bit_position 8,// bit_size 1.00000f,// factor 0.00000f,// offset 0,// min_value 0,// max_value frequency_clock_t(15.0000f),// frequency true,// send_same false,// force_send_changed { },// states false,// writable nullptr,// decoder nullptr,// encoder false,// received std::make_pair(false, 0),// multiplex false,// is_big_endian static_cast(0),// signed -1,// bit_sign_position ""// unit })}, {std::make_shared (signal_t{ "GearshiftPosition",// generic_name 41,// bit_position 3,// bit_size 1.00000f,// factor 0.00000f,// offset 0,// min_value 0,// max_value frequency_clock_t(0.00000f),// frequency true,// send_same false,// force_send_changed { {1,"FIRST"}, {4,"FOURTH"}, {6,"NEUTRAL"}, {5,"REVERSE"}, {2,"SECOND"}, {3,"THIRD"} },// states false,// writable decoder_t::decode_state,// decoder nullptr,// encoder false,// received std::make_pair(false, 0),// multiplex false,// is_big_endian static_cast(0),// signed -1,// bit_sign_position ""// unit })}, {std::make_shared (signal_t{ "SteeringWheelAngle",// generic_name 52,// bit_position 12,// bit_size 0.153920f,// factor 0.00000f,// offset 0,// min_value 0,// max_value frequency_clock_t(0.00000f),// frequency true,// send_same false,// force_send_changed { },// states false,// writable decoder_t::v1_to_v2_gnedSteeringWheelAngle,// decoder nullptr,// encoder false,// received std::make_pair(false, 0),// multiplex false,// is_big_endian static_cast(0),// signed -1,// bit_sign_position ""// unit })}, {std::make_shared (signal_t{ "steering_wheel_angle_error",// generic_name 44,// bit_position 12,// bit_size 1.00000f,// factor 0.00000f,// offset 0,// min_value 0,// max_value frequency_clock_t(0.00000f),// frequency true,// send_same false,// force_send_changed { },// states false,// writable decoder_t::v1_to_v2_der,// decoder nullptr,// encoder false,// received std::make_pair(false, 0),// multiplex false,// is_big_endian static_cast(0),// signed -1,// bit_sign_position ""// unit })}, {std::make_shared (signal_t{ "steering_angle_sign",// generic_name 52,// bit_position 12,// bit_size 1.00000f,// factor 0.00000f,// offset 0,// min_value 0,// max_value frequency_clock_t(0.00000f),// frequency true,// send_same false,// force_send_changed { },// states false,// writable decoder_t::v1_to_v2_der,// decoder nullptr,// encoder false,// received std::make_pair(false, 0),// multiplex false,// is_big_endian static_cast(0),// signed -1,// bit_sign_position ""// unit })} } // end signals vector })} // end message_definition entry }, // end message_definition vector { // beginning diagnostic_messages_ vector {std::make_shared(diagnostic_message_t{ 12, "", 0, 0, UNIT::INVALID, 1.00000f, decoder_t::v1_to_v2_Pid, nullptr, true, false })} , {std::make_shared(diagnostic_message_t{ 12, "", 0, 0, UNIT::INVALID, 1.00000f, nullptr, nullptr, true, false })} , {std::make_shared(diagnostic_message_t{ 6, "", 0, 0, UNIT::INVALID, 1.00000f, decoder_t::v1_to_v2_agRequest, nullptr, true, false })} } // end diagnostic_messages_ vector })} // end message_set entry } // end message_set vector { for(std::shared_ptr cms: message_set_) { std::vector> messages_definition = cms->get_messages_definition(); for(std::shared_ptr cmd : messages_definition) { cmd->set_parent(cms); std::vector> signals = cmd->get_signals(); for(std::shared_ptr sig: signals) { sig->set_parent(cmd); } } std::vector> diagnostic_messages = cms->get_diagnostic_messages(); for(std::shared_ptr dm : diagnostic_messages) { dm->set_parent(cms); } } } const std::string application_t::get_diagnostic_bus() const { return "hs"; } openxc_DynamicField decoder_t::v1_to_v2_gnedSteeringWheelAngle(signal_t& signal, std::shared_ptr message, bool* send){ float value = decoder_t::parse_signal_bitfield(signal, message); openxc_DynamicField ret = decoder_t::gnedSteeringWheelAngle(signal, value, send); if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send ){ *send = false; } signal.set_last_value(value); return ret; } openxc_DynamicField decoder_t::v1_to_v2_der(signal_t& signal, std::shared_ptr message, bool* send){ float value = decoder_t::parse_signal_bitfield(signal, message); openxc_DynamicField ret = decoder_t::der(signal, value, send); if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send ){ *send = false; } signal.set_last_value(value); return ret; } openxc_DynamicField decoder_t::v1_to_v2_Pid(signal_t& signal, std::shared_ptr message, bool* send){ float value = decoder_t::parse_signal_bitfield(signal, message); openxc_DynamicField ret = decoder_t::Pid(signal, value, send); if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send ){ *send = false; } signal.set_last_value(value); return ret; } openxc_DynamicField decoder_t::v1_to_v2_agRequest(signal_t& signal, std::shared_ptr message, bool* send){ float value = decoder_t::parse_signal_bitfield(signal, message); openxc_DynamicField ret = decoder_t::agRequest(signal, value, send); if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send ){ *send = false; } signal.set_last_value(value); return ret; }