X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fbinding%2Flow-can-cb.cpp;h=5e03c754cfa511d06977ba7b3e4d3803fb774440;hb=cc48ab799cf5357f4d573d80c07f6843e50bc8e8;hp=0672e715749acae6adf980223a55a0bc9b1da876;hpb=db13354c18e888d04b776e584addb668d8614da4;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 0672e715..5e03c754 100644 --- a/low-can-binding/binding/low-can-cb.cpp +++ b/low-can-binding/binding/low-can-cb.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -52,35 +53,33 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_obj) { AFB_DEBUG("Config %s", json_object_to_json_string(json_obj)); - CtlConfigT *ctrlConfig; - - ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle); - if(!ctrlConfig) - return -1; + CtlConfigT *ctrlConfig = (CtlConfigT *) afb_api_get_userdata(apiHandle); + int active_message_set = 0; + json_object *dev_mapping = nullptr; + const char *diagnotic_bus = nullptr; - if(!section->handle) + if(! ctrlConfig || ! ctrlConfig->external) return -1; - application_t *application = (application_t*) section->handle; - - - int active_message_set; - const char *diagnotic_bus = nullptr; + application_t *application = (application_t*) ctrlConfig->external; - if(wrap_json_unpack(json_obj, "{si, ss}", + if(wrap_json_unpack(json_obj, "{si, s?s}", "active_message_set", &active_message_set, "diagnostic_bus", &diagnotic_bus)) return -1; application->set_active_message_set((uint8_t)active_message_set); + if(wrap_json_unpack(json_obj, "{so}", + "dev-mapping", &dev_mapping)) + return -1; + + application->get_can_bus_manager().set_can_devices(dev_mapping); + /// Initialize Diagnostic manager that will handle obd2 requests. /// We pass by default the first CAN bus device to its Initialization. - if(! application_t::instance().get_diagnostic_manager().initialize(diagnotic_bus)) - { - AFB_ERROR("Diagnostic Manager: error at initialization"); - return -1; - } + if(! diagnotic_bus || application_t::instance().get_diagnostic_manager().initialize(diagnotic_bus)) + AFB_WARNING("Diagnostic Manager: not initialized. No diagnostic messages will be processed."); return 0; } @@ -94,6 +93,10 @@ CtlSectionT ctlSections_[] = { .loadCB=PluginConfig, .handle=nullptr, .actions=nullptr}, + [2]={.key=nullptr , .uid=nullptr, .info=nullptr, + .loadCB=nullptr, + .handle=nullptr, + .actions=nullptr}, }; ///***************************************************************************** @@ -185,7 +188,7 @@ static int subscribe_unsubscribe_diagnostic_messages(afb_req_t request, event_filter.frequency = event_filter.frequency == 0 ? sig->get_frequency() : event_filter.frequency; std::shared_ptr can_subscription; - auto it = std::find_if(s.begin(), s.end(), [&sig](std::pair > sub) + auto it = std::find_if(s.begin(), s.end(), [&sig](std::pair > sub) { return (! sub.second->get_diagnostic_message().empty()); }); @@ -391,11 +394,9 @@ static int process_one_subscribe_args(afb_req_t request, bool subscribe, json_ob // 2 cases : ID(PGN) and event json_object_object_get_ex(args,"event",&event); - json_bool test_id = json_object_object_get_ex(args,"id",&id); - if(!test_id) - test_id = json_object_object_get_ex(args,"pgn",&id); + json_object_object_get_ex(args,"id",&id) || json_object_object_get_ex(args,"pgn",&id); - if( args == NULL || (id && ((std::string)json_object_get_string(id)).compare("*") == 0)) + if( args == NULL || (id && ((std::string)json_object_get_string(id)).compare("*") == 0)) { rc = one_subscribe_unsubscribe_events(request, subscribe, "*", args); } @@ -523,7 +524,7 @@ static int send_message(message_t *message, const std::string& bus_name, uint32_ cd[bus_name]->set_signal(signal); - if(flags&BCM_PROTOCOL) + if(flags&CAN_PROTOCOL) return low_can_subscription_t::tx_send(*cd[bus_name], message, bus_name); #ifdef USE_FEATURE_ISOTP else if(flags&ISOTP_PROTOCOL) @@ -549,12 +550,12 @@ 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.front()->get_message()->get_id()); - if(flags & BCM_PROTOCOL) + if(flags & CAN_PROTOCOL) { if(sf.signals.front()->get_message()->is_fd()) { AFB_DEBUG("CANFD_MAX_DLEN"); - message->set_flags(CAN_FD_FRAME); + message->set_flags(CAN_PROTOCOL_WITH_FD_FRAME); message->set_maxdlen(CANFD_MAX_DLEN); } else @@ -588,7 +589,7 @@ static void write_raw_frame(afb_req_t request, const std::string& bus_name, mess } else { - if(flags&BCM_PROTOCOL) + if(flags&CAN_PROTOCOL) afb_req_fail(request, "Invalid", "Frame BCM"); else if(flags&J1939_PROTOCOL) afb_req_fail(request, "Invalid", "Frame J1939"); @@ -628,7 +629,7 @@ static void write_frame(afb_req_t request, const std::string& bus_name, json_obj "can_data", &can_data)) { message = new can_message_t(0, id, length, false, 0, data, 0); - write_raw_frame(request, bus_name, message, can_data, BCM_PROTOCOL, event_filter); + write_raw_frame(request, bus_name, message, can_data, CAN_PROTOCOL, event_filter); } #ifdef USE_FEATURE_J1939 else if(!wrap_json_unpack(json_value, "{si, si, so !}", @@ -685,7 +686,7 @@ static void write_signal(afb_req_t request, const std::string& name, json_object else if(sig->get_message()->is_isotp()) flags = ISOTP_PROTOCOL; else - flags = BCM_PROTOCOL; + flags = CAN_PROTOCOL; // cfd = encoder_t::build_frame(sig, value); message_t *message = encoder_t::build_message(sig, value, false, false); @@ -853,7 +854,7 @@ void list(afb_req_t request) /// @return Exit code, zero if success. int init_binding(afb_api_t api) { - int ret = 1; + int ret = 0; application_t& application = application_t::instance(); can_bus_t& can_bus_manager = application.get_can_bus_manager(); @@ -863,27 +864,27 @@ int init_binding(afb_api_t api) return -1; } - - can_bus_manager.set_can_devices(); can_bus_manager.start_threads(); utils::signals_manager_t& sm = utils::signals_manager_t::instance(); - // Add a recurring dignostic message request to get engine speed at all times. - openxc_DynamicField search_key = build_DynamicField("diagnostic_messages.engine.speed"); - struct utils::signals_found sf = sm.find_signals(search_key); - - if(sf.signals.empty() && sf.diagnostic_messages.size() == 1) + if (application.get_diagnostic_manager().is_initialized()) { - afb_req_t request = nullptr; + // Add a recurring dignostic message request to get engine speed at all times. + openxc_DynamicField search_key = build_DynamicField("diagnostic_messages.engine.speed"); + struct utils::signals_found sf = sm.find_signals(search_key); - struct event_filter_t event_filter; - event_filter.frequency = sf.diagnostic_messages.front()->get_frequency(); + if(sf.signals.empty() && sf.diagnostic_messages.size() == 1) + { + afb_req_t request = nullptr; - map_subscription& s = sm.get_subscribed_signals(); + struct event_filter_t event_filter; + event_filter.frequency = sf.diagnostic_messages.front()->get_frequency(); - subscribe_unsubscribe_diagnostic_messages(request, true, sf.diagnostic_messages, event_filter, s, true); - } + 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::string j1939_bus; @@ -920,7 +921,7 @@ int init_binding(afb_api_t api) return ret; } -int load_conf(afb_api_t api) +int load_config(afb_api_t api) { int ret = 0; CtlConfigT *ctlConfig; @@ -937,7 +938,7 @@ int load_conf(afb_api_t api) if (!configPath) { - AFB_ERROR_V3("CtlPreInit: No control-* config found invalid JSON %s ", filepath.c_str()); + AFB_ERROR_V3("CtlPreInit: No control-%s* config found invalid JSON %s ", GetBinderName(), filepath.c_str()); return -1; }