X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fcan-bus.cpp;h=49a6b60a6cc3f0e31f3211f75fd87eecbfa9de50;hb=ff089ab8b009c81bcf92abf181faa00348eb62cd;hp=616733502bc6247d00061ceb8746b29d9aa46b24;hpb=32e25cbca210a359b09768537b6f443fe90a3070;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 61673350..49a6b60a 100644 --- a/low-can-binding/can/can-bus.cpp +++ b/low-can-binding/can/can-bus.cpp @@ -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; } @@ -83,7 +93,7 @@ void can_bus_t::process_can_signals(const can_message_t& can_message, std::mapget_event())) { bool send = true; - decoded_message = decoder_t::translateSignal(*sig->get_can_signal(), can_message, application_t::instance().get_all_can_signals(), &send); + 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); - 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())) { @@ -116,7 +128,7 @@ void can_bus_t::process_diagnostic_signals(diagnostic_manager_t& manager, const { std::lock_guard decoded_can_message_lock(decoded_can_message_mutex_); push_new_vehicle_message(subscription_id, vehicle_message); - DEBUG("%s CAN signals processed.", s[subscription_id]->get_name().c_str()); + AFB_DEBUG("%s CAN signals processed.", s[subscription_id]->get_name().c_str()); } } } @@ -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) @@ -249,7 +259,7 @@ const can_message_t can_bus_t::next_can_message() { can_msg = can_message_q_.front(); can_message_q_.pop(); - DEBUG("Here is the next can message : id %X, length %X, data %02X%02X%02X%02X%02X%02X%02X%02X", can_msg.get_id(), can_msg.get_length(), + AFB_DEBUG("Here is the next can message : id %X, length %X, data %02X%02X%02X%02X%02X%02X%02X%02X", can_msg.get_id(), can_msg.get_length(), can_msg.get_data()[0], can_msg.get_data()[1], can_msg.get_data()[2], can_msg.get_data()[3], can_msg.get_data()[4], can_msg.get_data()[5], can_msg.get_data()[6], can_msg.get_data()[7]); return can_msg; } @@ -276,7 +286,7 @@ std::pair can_bus_t::next_vehicle_message() { v_msg = vehicle_message_q_.front(); vehicle_message_q_.pop(); - DEBUG("next vehicle message poped"); + AFB_DEBUG("next vehicle message poped"); return v_msg; } @@ -295,12 +305,15 @@ void can_bus_t::push_new_vehicle_message(int subscription_id, const openxc_Vehic /// mapping configuration file read at initialization. void can_bus_t::set_can_devices() { - can_devices_ = conf_file_.get_devices_name(); - - if(can_devices_.empty()) + if(conf_file_.check_conf()) { - ERROR("No mapping found in config file: '%s'. Check it that it have a CANbus-mapping section.", - conf_file_.filepath().c_str()); + can_devices_mapping_ = conf_file_.get_devices_name(); + + 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()); + } } } @@ -310,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; @@ -324,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) {