X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fcan-bus.cpp;h=e798618d05a84ae0fade53009de1194ce9cf253b;hb=97a08a7e37835f0e8619d22c83243bee26a2bff2;hp=71e784952b6ec2f868934b5c6331a1df3e943f46;hpb=e75bc1833664ec34852d38a46e133334c19ac58c;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/can/can-bus.cpp b/low-can-binding/can/can-bus.cpp index 71e78495..e798618d 100644 --- a/low-can-binding/can/can-bus.cpp +++ b/low-can-binding/can/can-bus.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015, 2016 "IoT.bzh" + * Copyright (C) 2015, 2018 "IoT.bzh" * Author "Romain Forlot" * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -33,6 +33,16 @@ #include "../utils/signals.hpp" #include "../utils/openxc-utils.hpp" +/// @brief Class destructor +/// +/// @param[in] conf_file - Stop threads and unlock them to correctly finish them +/// even without any activity on the CAN bus. +can_bus_t::~can_bus_t() +{ + stop_threads(); + new_can_message_cv_.notify_one(); +} + /// @brief Class constructor /// /// @param[in] conf_file - handle to the json configuration file. @@ -40,10 +50,10 @@ can_bus_t::can_bus_t(utils::config_parser_t conf_file) : conf_file_{conf_file} {} -/// @brief Take a decoded message to determine if its value comply with the wanted -/// filtering values. +/// @brief Take a decoded message to determine if its value complies with the desired +/// filters. /// -/// @param[in] vehicle_message - A decoded message to analyze +/// @param[in] vehicle_message - The decoded message to be analyzed. /// @param[in] can_subscription - the subscription which will be notified depending /// on its filtering values. Filtering values are stored in the event_filtermember. /// @@ -53,10 +63,10 @@ bool can_bus_t::apply_filter(const openxc_VehicleMessage& vehicle_message, std:: bool send = false; if(is_valid(vehicle_message)) { - float min = std::isnan(can_subscription->get_min()) ? -INFINITY : can_subscription->get_min(); - float max = std::isnan(can_subscription->get_max()) ? INFINITY : can_subscription->get_max(); + float min = can_subscription->get_min(); + float max = can_subscription->get_max(); double value = get_numerical_from_DynamicField(vehicle_message); - send = (value < min && value > max) ? false : true; + send = (value < min || value > max) ? false : true; } return send; } @@ -77,13 +87,13 @@ void can_bus_t::process_can_signals(const can_message_t& can_message, std::map sig = s[subscription_id]; - if( s.find(subscription_id) != s.end() && afb_event_is_valid(s[subscription_id]->get_event())) { bool send = true; - decoded_message = decoder_t::translateSignal(*sig->get_can_signal(), can_message, application_t::instance().get_all_can_signals(), &send); + // First we have to found which can_signal_t it is + std::shared_ptr sig = s[subscription_id]; + + decoded_message = decoder_t::translate_signal(*sig->get_can_signal(), can_message, &send); openxc_SimpleMessage s_message = build_SimpleMessage(sig->get_name(), decoded_message); vehicle_message = build_VehicleMessage(s_message, can_message.get_timestamp()); @@ -91,7 +101,7 @@ void can_bus_t::process_can_signals(const can_message_t& can_message, std::map decoded_can_message_lock(decoded_can_message_mutex_); push_new_vehicle_message(subscription_id, vehicle_message); - AFB_DEBUG("%s CAN signals processed.", sig->get_name().c_str()); + AFB_DEBUG("%s CAN signals processed.", sig->get_name().c_str()); } } } @@ -109,6 +119,8 @@ void can_bus_t::process_diagnostic_signals(diagnostic_manager_t& manager, const int subscription_id = can_message.get_sub_id(); openxc_VehicleMessage vehicle_message = manager.find_and_decode_adr(can_message); + if (can_message.get_timestamp()) + {vehicle_message.timestamp = can_message.get_timestamp();} if( (vehicle_message.has_simple_message && vehicle_message.simple_message.has_name) && s.find(subscription_id) != s.end() && afb_event_is_valid(s[subscription_id]->get_event())) { @@ -128,7 +140,7 @@ void can_bus_t::process_diagnostic_signals(diagnostic_manager_t& manager, const /// /// It will take from the can_message_q_ queue the next can message to process then it search /// about signal subscribed if there is a valid afb_event for it. We only decode signal for which a -/// subscription has been made. Can message will be decoded using translateSignal that will pass it to the +/// subscription has been made. Can message will be decoded using translate_signal that will pass it to the /// corresponding decoding function if there is one assigned for that signal. If not, it will be the default /// noopDecoder function that will operate on it. /// @@ -156,8 +168,8 @@ void can_bus_t::can_decode_message() } can_message_lock.lock(); } - new_decoded_can_message_.notify_one(); - can_message_lock.unlock(); + new_decoded_can_message_.notify_one(); + can_message_lock.unlock(); } } @@ -165,7 +177,6 @@ void can_bus_t::can_decode_message() /// which are events that has to be pushed. void can_bus_t::can_event_push() { - openxc_SimpleMessage s_message; json_object* jo; utils::signals_manager_t& sm = utils::signals_manager_t::instance(); @@ -180,11 +191,10 @@ void can_bus_t::can_event_push() { std::lock_guard subscribed_signals_lock(sm.get_subscribed_signals_mutex()); std::map >& s = sm.get_subscribed_signals(); - s_message = get_simple_message(v_message.second); if(s.find(v_message.first) != s.end() && afb_event_is_valid(s[v_message.first]->get_event())) { jo = json_object_new_object(); - jsonify_simple(s_message, jo); + jsonify_vehicle(v_message.second, jo); if(afb_event_push(s[v_message.first]->get_event(), jo) == 0) { if(v_message.second.has_diagnostic_response) @@ -297,9 +307,9 @@ void can_bus_t::set_can_devices() { if(conf_file_.check_conf()) { - can_devices_ = conf_file_.get_devices_name(); + can_devices_mapping_ = conf_file_.get_devices_name(); - if(can_devices_.empty()) + if(can_devices_mapping_.empty()) { AFB_ERROR("No mapping found in config file: '%s'. Check it that it have a CANbus-mapping section.", conf_file_.filepath().c_str()); @@ -313,7 +323,7 @@ void can_bus_t::set_can_devices() int can_bus_t::get_can_device_index(const std::string& bus_name) const { int i = 0; - for(const auto& d: can_devices_) + for(const auto& d: can_devices_mapping_) { if(d.first == bus_name) break; @@ -327,8 +337,8 @@ int can_bus_t::get_can_device_index(const std::string& bus_name) const /// general. const std::string can_bus_t::get_can_device_name(const std::string& id_name) const { - std::string ret; - for(const auto& d: can_devices_) + std::string ret = ""; + for(const auto& d: can_devices_mapping_) { if(d.first == id_name) {