#include <mutex>
#include <vector>
#include <thread>
+#include <algorithm>
#include <wrap-json.h>
#include <systemd/sd-event.h>
#include <ctl-config.h>
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(! ctrlConfig->external)
+ if(! ctrlConfig || ! ctrlConfig->external)
return -1;
application_t *application = (application_t*) ctrlConfig->external;
- int active_message_set;
- const char *diagnotic_bus = nullptr;
-
- 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");
return 0;
}
.loadCB=PluginConfig,
.handle=nullptr,
.actions=nullptr},
+ [2]={.key=nullptr , .uid=nullptr, .info=nullptr,
+ .loadCB=nullptr,
+ .handle=nullptr,
+ .actions=nullptr},
};
///*****************************************************************************
event_filter.frequency = event_filter.frequency == 0 ? sig->get_frequency() : event_filter.frequency;
std::shared_ptr<low_can_subscription_t> can_subscription;
- auto it = std::find_if(s.begin(), s.end(), [&sig](std::pair<int, std::shared_ptr<low_can_subscription_t> > sub)
+ auto it = std::find_if(s.begin(), s.end(), [&sig](std::pair<int, std::shared_ptr<low_can_subscription_t> > sub)
{
return (! sub.second->get_diagnostic_message().empty());
});
// 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);
}
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)
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
}
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");
"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 !}",
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);
/// @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();
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;
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;
}