can-bus: Use configuration from JSON file
[apps/agl-service-can-low-level.git] / low-can-binding / binding / low-can-cb.cpp
index afc9c3e..3037994 100644 (file)
@@ -24,6 +24,7 @@
 #include <mutex>
 #include <vector>
 #include <thread>
+#include <algorithm>
 #include <wrap-json.h>
 #include <systemd/sd-event.h>
 #include <ctl-config.h>
@@ -64,6 +65,7 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_
        application_t *application = (application_t*) ctrlConfig->external;
 
        int active_message_set;
+       json_object *dev_mapping = nullptr;
        const char *diagnotic_bus = nullptr;
 
        if(wrap_json_unpack(json_obj, "{si, ss}",
@@ -73,6 +75,12 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_
 
        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))
@@ -93,6 +101,10 @@ CtlSectionT ctlSections_[] = {
                .loadCB=PluginConfig,
                .handle=nullptr,
                .actions=nullptr},
+       [2]={.key=nullptr , .uid=nullptr, .info=nullptr,
+               .loadCB=nullptr,
+               .handle=nullptr,
+               .actions=nullptr},
 };
 
 ///*****************************************************************************
@@ -522,7 +534,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)
@@ -548,12 +560,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
@@ -587,7 +599,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");
@@ -627,7 +639,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 !}",
@@ -684,7 +696,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);
@@ -862,8 +874,6 @@ 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();