Code Review
/
apps
/
agl-service-can-low-level.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
socketcan-bcm: Fix wrongly opened socket
[apps/agl-service-can-low-level.git]
/
low-can-binding
/
diagnostic
/
diagnostic-manager.cpp
diff --git
a/low-can-binding/diagnostic/diagnostic-manager.cpp
b/low-can-binding/diagnostic/diagnostic-manager.cpp
index
2f22b14
..
f3c513c
100644
(file)
--- a/
low-can-binding/diagnostic/diagnostic-manager.cpp
+++ b/
low-can-binding/diagnostic/diagnostic-manager.cpp
@@
-49,23
+49,26
@@
diagnostic_manager_t::~diagnostic_manager_t()
}
}
}
}
-/// @brief Diagnostic manager is
n'
t initialized at launch but after
-///
CAN bus devices initialization
. For the moment, it is only possible
+/// @brief Diagnostic manager is
no
t initialized at launch but after
+///
the initialization of CAN bus devices
. For the moment, it is only possible
/// to have 1 diagnostic bus which are the first bus declared in the JSON
/// description file. Configuration instance will return it.
///
/// this will initialize DiagnosticShims and cancel all active requests
/// if there are any.
/// to have 1 diagnostic bus which are the first bus declared in the JSON
/// description file. Configuration instance will return it.
///
/// this will initialize DiagnosticShims and cancel all active requests
/// if there are any.
-bool diagnostic_manager_t::initialize()
+bool diagnostic_manager_t::initialize(
std::string diagnostic_bus
)
{
{
- // Mandatory to set the bus before intialize shims.
- bus_ = application_t::instance().get_diagnostic_bus();
-
- init_diagnostic_shims();
- reset();
+ if (! diagnostic_bus.empty())
+ {
+ bus_ = diagnostic_bus;
+
init_diagnostic_shims();
+
reset();
- initialized_ = true;
- AFB_DEBUG("Diagnostic Manager initialized");
+ AFB_DEBUG("Diagnostic Manager initialized");
+ initialized_ = true;
+ return initialized_;
+ }
+ AFB_ERROR("Diagnostic Manager missing its bus name in the config");
return initialized_;
}
return initialized_;
}
@@
-102,29
+105,33
@@
bool diagnostic_manager_t::shims_send(const uint32_t arbitration_id, const uint8
// Make sure that socket has been opened.
if(! tx_socket)
// Make sure that socket has been opened.
if(! tx_socket)
- tx_socket.open(
- dm.get_bus_device_name());
+ tx_socket.open(dm.get_bus_device_name());
- struct utils::simple_bcm_msg bcm_msg;
- struct can_frame cfd;
-
- memset(&cfd, 0, sizeof(cfd));
- memset(&bcm_msg.msg_head, 0, sizeof(bcm_msg.msg_head));
+ struct bcm_msg bcm_msg;
+ struct can_frame cf;
struct timeval freq = current_adr->get_frequency_clock().get_timeval_from_period();
bcm_msg.msg_head.opcode = TX_SETUP;
bcm_msg.msg_head.can_id = arbitration_id;
bcm_msg.msg_head.flags = SETTIMER|STARTTIMER|TX_CP_CAN_ID;
struct timeval freq = current_adr->get_frequency_clock().get_timeval_from_period();
bcm_msg.msg_head.opcode = TX_SETUP;
bcm_msg.msg_head.can_id = arbitration_id;
bcm_msg.msg_head.flags = SETTIMER|STARTTIMER|TX_CP_CAN_ID;
+ bcm_msg.msg_head.count = 0;
bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec;
bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec;
bcm_msg.msg_head.nframes = 1;
bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec;
bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec;
bcm_msg.msg_head.nframes = 1;
- cfd.can_dlc = size;
- ::memcpy(cfd.data, data, size);
+ cf.can_dlc = size;
+
+ ::memset(cf.data, 0, sizeof(cf.data));
+ ::memcpy(cf.data, data, size);
- bcm_msg.frames
= cfd
;
+ bcm_msg.frames
[0] = cf
;
- tx_socket << bcm_msg;
+
+ can_message_t msg = can_message_t();
+
+ msg.set_bcm_msg(bcm_msg);
+
+ tx_socket.write_message(msg);
if(tx_socket)
return true;
return false;
if(tx_socket)
return true;
return false;
@@
-252,12
+259,12
@@
active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(Diagno
if(entry != nullptr)
{
if(diagnostic_request_equals(&entry->get_handle()->request, &request))
if(entry != nullptr)
{
if(diagnostic_request_equals(&entry->get_handle()->request, &request))
- {return entry;}
+ return entry;
}
}
return nullptr;
}
}
}
return nullptr;
}
-
+/*
/// @brief Add and send a new one-time diagnostic request. DON'T USED AT THIS TIME
///
/// A one-time (aka non-recurring) request can existing in parallel with a
/// @brief Add and send a new one-time diagnostic request. DON'T USED AT THIS TIME
///
/// A one-time (aka non-recurring) request can existing in parallel with a
@@
-314,7
+321,7
@@
active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest
}
return entry;
}
}
return entry;
}
-
+*/
/// @brief Validate frequency asked don't get higher than the maximum of a classical
/// CAN bus OBD2 request.
///
/// @brief Validate frequency asked don't get higher than the maximum of a classical
/// CAN bus OBD2 request.
///
@@
-386,7
+393,7
@@
active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
}
}
else
}
}
else
- { AFB_DEBUG("Can't add request, one already exists with same key");}
+ AFB_DEBUG("Can't add request, one already exists with same key");
return entry;
}
return entry;
}
@@
-405,9
+412,7
@@
openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField((double) adr->get_pid()));
if(adr->get_decoder() != nullptr)
found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField((double) adr->get_pid()));
if(adr->get_decoder() != nullptr)
- {
value = adr->get_decoder()(&response, value);
value = adr->get_decoder()(&response, value);
- }
if((response.success && adr->get_name().size()) > 0)
{
if((response.success && adr->get_name().size()) > 0)
{
@@
-436,9
+441,7
@@
openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
}
if(adr->get_callback() != nullptr)
}
if(adr->get_callback() != nullptr)
- {
adr->get_callback()(adr, &response, value);
adr->get_callback()(adr, &response, value);
- }
// Reset the completed flag handle to make sure that it will be reprocessed the next time.
adr->get_handle()->success = false;
// Reset the completed flag handle to make sure that it will be reprocessed the next time.
adr->get_handle()->success = false;
@@
-467,13
+470,13
@@
openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
/// @param[in] cm - A raw CAN message.
///
/// @return A pointer to a filled openxc_VehicleMessage or a nullptr if nothing has been found.
/// @param[in] cm - A raw CAN message.
///
/// @return A pointer to a filled openxc_VehicleMessage or a nullptr if nothing has been found.
-openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagnostic_request_t* entry,
const can_message_t& c
m)
+openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagnostic_request_t* entry,
std::shared_ptr<message_t>
m)
{
{
- DiagnosticResponse response = diagnostic_receive_can_frame(&shims_, entry->get_handle(),
cm.get_id(), cm.get_data(), cm.
get_length());
+ DiagnosticResponse response = diagnostic_receive_can_frame(&shims_, entry->get_handle(),
m->get_id(), m->get_data(), (uint8_t)m->
get_length());
if(response.completed && entry->get_handle()->completed)
{
if(entry->get_handle()->success)
if(response.completed && entry->get_handle()->completed)
{
if(entry->get_handle()->success)
- return relay_diagnostic_response(entry, response,
cm.
get_timestamp());
+ return relay_diagnostic_response(entry, response,
m->
get_timestamp());
}
else if(!response.completed && response.multi_frame)
{
}
else if(!response.completed && response.multi_frame)
{
@@
-492,20
+495,20
@@
openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagn
/// @param[in] cm - Raw CAN message received
///
/// @return VehicleMessage with decoded value.
/// @param[in] cm - Raw CAN message received
///
/// @return VehicleMessage with decoded value.
-openxc_VehicleMessage diagnostic_manager_t::find_and_decode_adr(
const can_message_t& c
m)
+openxc_VehicleMessage diagnostic_manager_t::find_and_decode_adr(
std::shared_ptr<message_t>
m)
{
openxc_VehicleMessage vehicle_message = build_VehicleMessage();
for ( auto entry : non_recurring_requests_)
{
{
openxc_VehicleMessage vehicle_message = build_VehicleMessage();
for ( auto entry : non_recurring_requests_)
{
- vehicle_message = relay_diagnostic_handle(entry,
c
m);
+ vehicle_message = relay_diagnostic_handle(entry, m);
if (is_valid(vehicle_message))
return vehicle_message;
}
for ( auto entry : recurring_requests_)
{
if (is_valid(vehicle_message))
return vehicle_message;
}
for ( auto entry : recurring_requests_)
{
- vehicle_message = relay_diagnostic_handle(entry,
c
m);
+ vehicle_message = relay_diagnostic_handle(entry, m);
if (is_valid(vehicle_message))
return vehicle_message;
}
if (is_valid(vehicle_message))
return vehicle_message;
}
@@
-520,9
+523,12
@@
openxc_VehicleMessage diagnostic_manager_t::find_and_decode_adr(const can_messag
/// @param[in] cm - CAN message received from the socket.
///
/// @return True if the active diagnostic request match the response.
/// @param[in] cm - CAN message received from the socket.
///
/// @return True if the active diagnostic request match the response.
-bool diagnostic_manager_t::is_diagnostic_response(
const can_message_t& c
m)
+bool diagnostic_manager_t::is_diagnostic_response(
std::shared_ptr<message_t>
m)
{
{
- if (cm.get_id() >= 0x7e8 && cm.get_id() <= 0x7ef)
- return true;
+ if(m->get_id() & CAN_SFF_MASK || m->get_id() & CAN_EFF_MASK)
+ {
+ if (m->get_id() >= 0x7e8 && m->get_id() <= 0x7ef)
+ return true;
+ }
return false;
}
return false;
}