X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fbinding%2Flow-can-cb.cpp;h=5879b686be7850e2c4057252ba7fc7b87caa1af0;hb=3fb5cd5d762006c3bc20ffc7acd86f8a74156f9b;hp=2c6e2be36676a6595bce0df74314b61204c62339;hpb=22b1864b72c2520fbc9d4e3d3332c28916b5a9ed;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/binding/low-can-cb.cpp b/low-can-binding/binding/low-can-cb.cpp index 2c6e2be3..5879b686 100644 --- a/low-can-binding/binding/low-can-cb.cpp +++ b/low-can-binding/binding/low-can-cb.cpp @@ -47,7 +47,7 @@ /// ///*******************************************************************************/ -void on_no_clients(std::shared_ptr can_subscription, uint32_t pid, std::map >& s) +void on_no_clients(std::shared_ptr can_subscription, uint32_t pid, map_subscription& s) { bool is_permanent_recurring_request = false; @@ -68,7 +68,7 @@ void on_no_clients(std::shared_ptr can_subscription, uin on_no_clients(can_subscription, s); } -void on_no_clients(std::shared_ptr can_subscription, std::map >& s) +void on_no_clients(std::shared_ptr can_subscription, map_subscription& s) { auto it = s.find(can_subscription->get_index()); s.erase(it); @@ -132,7 +132,7 @@ int read_message(sd_event_source *event_source, int fd, uint32_t revents, void * static int subscribe_unsubscribe_signal(afb_req_t request, bool subscribe, std::shared_ptr& can_subscription, - std::map >& s) + map_subscription& s) { int ret = 0; int sub_index = can_subscription->get_index(); @@ -194,9 +194,9 @@ static int add_to_event_loop(std::shared_ptr& can_subscr static int subscribe_unsubscribe_diagnostic_messages(afb_req_t request, bool subscribe, - std::vector > diagnostic_messages, + list_ptr_diag_msg_t diagnostic_messages, struct event_filter_t& event_filter, - std::map >& s, + map_subscription& s, bool perm_rec_diag_req) { int rets = 0; @@ -259,9 +259,9 @@ static int subscribe_unsubscribe_diagnostic_messages(afb_req_t request, static int subscribe_unsubscribe_signals(afb_req_t request, bool subscribe, - std::vector > signals, + list_ptr_signal_t signals, struct event_filter_t& event_filter, - std::map >& s) + map_subscription& s) { int rets = 0; for(const auto& sig: signals) @@ -309,7 +309,7 @@ static int subscribe_unsubscribe_signals(afb_req_t request, utils::signals_manager_t& sm = utils::signals_manager_t::instance(); std::lock_guard subscribed_signals_lock(sm.get_subscribed_signals_mutex()); - std::map >& s = sm.get_subscribed_signals(); + map_subscription& s = sm.get_subscribed_signals(); rets += subscribe_unsubscribe_diagnostic_messages(request, subscribe, signals.diagnostic_messages, event_filter, s, false); rets += subscribe_unsubscribe_signals(request, subscribe, signals.signals, event_filter, s); @@ -353,6 +353,22 @@ static int one_subscribe_unsubscribe_events(afb_req_t request, bool subscribe, c // subscribe or unsubscribe openxc_DynamicField search_key = build_DynamicField(tag); sf = utils::signals_manager_t::instance().find_signals(search_key); + + +#ifdef USE_FEATURE_ISOTP + if(sf.signals.size() > 1) + { + sf.signals.remove_if([](std::shared_ptr x){ + bool isotp = x->get_message()->is_isotp(); + if(isotp) + { + AFB_NOTICE("ISO TP messages need to be subscribed one by one (rx, tx)"); + } + return isotp; + }); + } +#endif + if (sf.signals.empty() && sf.diagnostic_messages.empty()) { AFB_NOTICE("No signal(s) found for %s.", tag.c_str()); @@ -374,7 +390,7 @@ static int one_subscribe_unsubscribe_id(afb_req_t request, bool subscribe, const if(message_definition) { - sf.signals = message_definition->get_signals(); + sf.signals = list_ptr_signal_t(message_definition->get_signals().begin(),message_definition->get_signals().end()); } if(sf.signals.empty()) @@ -571,10 +587,10 @@ static void write_raw_frame(afb_req_t request, const std::string& bus_name, mess if( !sf.signals.empty() ) { - AFB_DEBUG("ID WRITE RAW : %d",sf.signals[0]->get_message()->get_id()); + AFB_DEBUG("ID WRITE RAW : %d",sf.signals.front()->get_message()->get_id()); if(flags&BCM_PROTOCOL) { - if(sf.signals[0]->get_message()->is_fd()) + if(sf.signals.front()->get_message()->is_fd()) { AFB_DEBUG("CANFD_MAX_DLEN"); message->set_flags(CAN_FD_FRAME); @@ -586,7 +602,7 @@ static void write_raw_frame(afb_req_t request, const std::string& bus_name, mess message->set_maxdlen(CAN_MAX_DLEN); } - if(sf.signals[0]->get_message()->is_isotp()) + if(sf.signals.front()->get_message()->is_isotp()) { flags = ISOTP_PROTOCOL; message->set_maxdlen(MAX_ISOTP_FRAMES * message->get_maxdlen()); @@ -632,7 +648,7 @@ static void write_raw_frame(afb_req_t request, const std::string& bus_name, mess return; } - if(! send_message(message, application_t::instance().get_can_bus_manager().get_can_device_name(bus_name), flags, event_filter, sf.signals[0])) + if(! send_message(message, application_t::instance().get_can_bus_manager().get_can_device_name(bus_name), flags, event_filter, sf.signals.front())) { afb_req_success(request, nullptr, "Message correctly sent"); } @@ -703,7 +719,7 @@ static void write_signal(afb_req_t request, const std::string& name, json_object return; } - std::shared_ptr sig = sf.signals[0]; + std::shared_ptr sig = sf.signals.front(); if(! sig->get_writable()) { afb_req_fail_f(request, "%s isn't writable. Message not sent.", sig->get_name().c_str()); @@ -940,14 +956,14 @@ int init_binding(afb_api_t api) struct event_filter_t event_filter; event_filter.frequency = sf.diagnostic_messages.front()->get_frequency(); - std::map >& s = sm.get_subscribed_signals(); + map_subscription& s = sm.get_subscribed_signals(); subscribe_unsubscribe_diagnostic_messages(request, true, sf.diagnostic_messages, event_filter, s, true); } #ifdef USE_FEATURE_J1939 - std::vector> current_messages_definition = application.get_messages_definition(); + vect_ptr_msg_def_t current_messages_definition = application.get_messages_definition(); for(std::shared_ptr message_definition: current_messages_definition) { if(message_definition->is_j1939())