summaryrefslogtreecommitdiffstats
path: root/low-can-binding/binding/low-can-cb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'low-can-binding/binding/low-can-cb.cpp')
-rw-r--r--low-can-binding/binding/low-can-cb.cpp85
1 files changed, 59 insertions, 26 deletions
diff --git a/low-can-binding/binding/low-can-cb.cpp b/low-can-binding/binding/low-can-cb.cpp
index f3fe7c83..32fc83d2 100644
--- a/low-can-binding/binding/low-can-cb.cpp
+++ b/low-can-binding/binding/low-can-cb.cpp
@@ -35,6 +35,7 @@
#include "../utils/signals.hpp"
#include "../diagnostic/diagnostic-message.hpp"
#include "../utils/openxc-utils.hpp"
+#include "../utils/signals.hpp"
#ifdef USE_FEATURE_J1939
#include "../can/message/j1939-message.hpp"
@@ -548,47 +549,79 @@ static int send_message(message_t *message, const std::string& bus_name, socket_
static void write_raw_frame(afb_req_t request, const std::string& bus_name, message_t *message, struct json_object *can_data, socket_type type)
{
- if((message->get_length() <= 8 && message->get_length() > 0 && type == socket_type::BCM)
-#ifdef USE_FEATURE_J1939
- || (message->get_length() < J1939_MAX_DLEN && type == socket_type::J1939)
-#endif
- )
- {
- std::vector<uint8_t> data;
- for (int i = 0 ; i < message->get_length() ; i++)
- {
- struct json_object *one_can_data = json_object_array_get_idx(can_data, i);
- data.push_back((json_object_is_type(one_can_data, json_type_int)) ?
- (uint8_t)json_object_get_int(one_can_data) : 0);
- }
- message->set_data(data);
- }
- else
+ struct utils::signals_found sf;
+
+ utils::signals_manager_t::instance().lookup_signals_by_id(message->get_id(), application_t::instance().get_all_signals(), sf.signals);
+
+ if( !sf.signals.empty() )
{
+ AFB_DEBUG("ID WRITE RAW : %d",sf.signals[0]->get_message()->get_id());
if(type == socket_type::BCM)
{
- afb_req_fail(request, "Invalid", "Data array must hold 1 to 8 values.");
+ if(sf.signals[0]->get_message()->is_fd())
+ {
+ AFB_DEBUG("CANFD_MAX_DLEN");
+ message->set_flags(CAN_FD_FRAME);
+ message->set_maxdlen(CANFD_MAX_DLEN);
+ }
+ else
+ {
+ AFB_DEBUG("CAN_MAX_DLEN");
+ message->set_maxdlen(CAN_MAX_DLEN);
+ }
}
- else if(type == socket_type::J1939)
+
+ if((message->get_length()> 0 && (
+ ((type == socket_type::BCM) && (
+ (message->get_length() <= CANFD_MAX_DLEN * MAX_BCM_CAN_FRAMES && message->get_flags() & CAN_FD_FRAME)
+ || (message->get_length() <= CAN_MAX_DLEN * MAX_BCM_CAN_FRAMES && !(message->get_flags() & CAN_FD_FRAME))
+ ))
+ #ifdef USE_FEATURE_J1939
+ || (message->get_length() <= J1939_MAX_DLEN && type == socket_type::J1939)
+ #endif
+ )))
{
- afb_req_fail(request, "Invalid", "Data array too large");
+ std::vector<uint8_t> data;
+ for (int i = 0 ; i < message->get_length() ; i++)
+ {
+ struct json_object *one_can_data = json_object_array_get_idx(can_data, i);
+ data.push_back((json_object_is_type(one_can_data, json_type_int)) ?
+ (uint8_t)json_object_get_int(one_can_data) : 0);
+ }
+ message->set_data(data);
}
else
{
- afb_req_fail(request, "Invalid", "Invalid socket type");
+ if(type == socket_type::BCM)
+ {
+ afb_req_fail(request, "Invalid", "Frame BCM");
+ }
+ else if(type == socket_type::J1939)
+ {
+ afb_req_fail(request, "Invalid", "Frame J1939");
+ }
+ else
+ {
+ afb_req_fail(request, "Invalid", "Frame");
+ }
+ return;
}
- return;
- }
- if(! send_message(message, application_t::instance().get_can_bus_manager().get_can_device_name(bus_name),type))
- {
- afb_req_success(request, nullptr, "Message correctly sent");
+ if(! send_message(message, application_t::instance().get_can_bus_manager().get_can_device_name(bus_name),type))
+ {
+ afb_req_success(request, nullptr, "Message correctly sent");
+ }
+ else
+ {
+ afb_req_fail(request, "Error", "sending the message. See the log for more details.");
+ }
}
else
{
- afb_req_fail(request, "Error", "sending the message. See the log for more details.");
+ afb_req_fail(request, "Error", "no find id in signals. See the log for more details.");
}
+
}
static void write_frame(afb_req_t request, const std::string& bus_name, json_object *json_value)