Add many frames in a subscription in the function tx_send.
[apps/agl-service-can-low-level.git] / low-can-binding / binding / low-can-subscription.cpp
index 54cd314..a1187ed 100644 (file)
@@ -20,9 +20,8 @@
 #include "application.hpp"
 #include "canutil/write.h"
 #include "../utils/socketcan-bcm.hpp"
-
 #ifdef USE_FEATURE_J1939
-       #include "../utils/socketcan-j1939.hpp"
+#include "../utils/socketcan-j1939/socketcan-j1939-data.hpp"
 #endif
 
 low_can_subscription_t::low_can_subscription_t()
@@ -96,8 +95,13 @@ int low_can_subscription_t::set_event()
  */
 int low_can_subscription_t::subscribe(afb_req_t request)
 {
-       if(set_event() < 0)
-               return -1;
+       if(! afb_event_is_valid(event_))
+       {
+               if(set_event() < 0)
+               {
+                       return -1;
+               }
+       }
        return afb_req_subscribe(request, event_);
 }
 
@@ -226,40 +230,24 @@ void low_can_subscription_t::set_max(float max)
        event_filter_.max = max;
 }
 
+void low_can_subscription_t::set_index(int index)
+{
+       index_ = index;
+}
+
 /// @brief Based upon which object is a subscribed CAN signal or diagnostic message
 /// it will open the socket with the required CAN bus device name.
 ///
 /// @return INVALID_SOCKET on failure, else positive integer
-int low_can_subscription_t::open_socket(low_can_subscription_t &subscription, const std::string& bus_name)
+int low_can_subscription_t::open_socket(low_can_subscription_t &subscription, const std::string& bus_name, socket_type type)
 {
-       int ret = 0;
+       int ret = -1;
        if(! subscription.socket_)
        {
-
-               #ifdef USE_FEATURE_J1939
-               if((subscription.signal_ != nullptr || !bus_name.empty()) && subscription.signal_->get_message()->is_j1939())
+               switch (type)
                {
-                       name_t name = J1939_NO_NAME;
-                       pgn_t pgn = J1939_NO_PGN;
-                       uint8_t addr = J1939_NO_ADDR;
-                       pgn = subscription.signal_->get_message()->get_id();
-                       if( subscription.signal_ != nullptr)
-                       {
-                               std::shared_ptr<utils::socketcan_j1939_t> socket = std::make_shared<utils::socketcan_j1939_t>();
-                               ret = socket->open(subscription.signal_->get_message()->get_bus_device_name(), name, pgn, addr);
-                               subscription.socket_ = socket;
-            }
-            else if ( !bus_name.empty())
-            {
-                               std::shared_ptr<utils::socketcan_j1939_t> socket = std::make_shared<utils::socketcan_j1939_t>();
-                               ret = socket->open(bus_name, name, pgn, addr);
-                               subscription.socket_ = socket;
-            }
-            subscription.index_ = (int)subscription.socket_->socket();
-               }
-               else
+               case socket_type::BCM:
                {
-               #endif
                        if( subscription.signal_ != nullptr)
                        {
                                        subscription.socket_ = std::make_shared<utils::socketcan_bcm_t>();
@@ -276,13 +264,56 @@ int low_can_subscription_t::open_socket(low_can_subscription_t &subscription, co
                                        ret = subscription.socket_->open(bus_name);
                        }
                        subscription.index_ = (int)subscription.socket_->socket();
-               #ifdef USE_FEATURE_J1939
+                       break;
+               }
+#ifdef USE_FEATURE_J1939
+               case socket_type::J1939_ADDR_CLAIM:
+               {
+                       pgn_t pgn = J1939_NO_PGN;
+                       if(!bus_name.empty())
+                       {
+                               std::shared_ptr<utils::socketcan_j1939_addressclaiming_t> socket = std::make_shared<utils::socketcan_j1939_addressclaiming_t>();
+                               ret = socket->open(bus_name, pgn);
+                               subscription.socket_ = socket;
+                       }
+                       subscription.index_ = (int)subscription.socket_->socket();
+                       break;
+               }
+               case socket_type::J1939:
+               {
+                       pgn_t pgn = J1939_NO_PGN;
+                       if(subscription.signal_ != nullptr)
+                       {
+                               pgn = subscription.signal_->get_message()->get_id();
+                               std::shared_ptr<utils::socketcan_j1939_data_t> socket = std::make_shared<utils::socketcan_j1939_data_t>();
+                               ret = socket->open(subscription.signal_->get_message()->get_bus_device_name(), pgn);
+                               subscription.socket_ = socket;
+                       }
+                       else if(!bus_name.empty())
+                       {
+                               std::shared_ptr<utils::socketcan_j1939_data_t> socket = std::make_shared<utils::socketcan_j1939_data_t>();
+                               ret = socket->open(bus_name, pgn);
+                               subscription.socket_ = socket;
+                       }
+                       subscription.index_ = (int)subscription.socket_->socket();
+                       break;
+               }
+#endif
+               default:
+               {
+                       AFB_ERROR("Socket format not supported");
+                       return INVALID_SOCKET;
+                       break;
                }
-               #endif
+               }
+       }
+       else{
+               ret = subscription.socket_->socket();
        }
        return ret;
 }
 
+
 /// @brief Builds a BCM message head but doesn't set can_frame.
 ///
 /// @returns a bcm_msg with the msg_head parts set and can_frame
@@ -328,7 +359,7 @@ int low_can_subscription_t::create_rx_filter_j1939(low_can_subscription_t &subsc
        subscription.signal_= sig;
 
        // Make sure that socket is opened.
-       if(open_socket(subscription) < 0)
+       if(open_socket(subscription,"",socket_type::J1939) < 0)
        {
                        return -1;
        }
@@ -421,15 +452,15 @@ int low_can_subscription_t::create_rx_filter(std::shared_ptr<diagnostic_message_
 int low_can_subscription_t::create_rx_filter_bcm(low_can_subscription_t &subscription, struct bcm_msg& bcm_msg)
 {
        // Make sure that socket is opened.
-       if(subscription.open_socket(subscription) < 0)
+       if(subscription.open_socket(subscription,"",socket_type::BCM) < 0)
                {return -1;}
 
        // If it's not an OBD2 CAN ID then just add a simple RX_SETUP job
        // else monitor all standard 8 CAN OBD2 ID response.
 
-       std::shared_ptr<can_message_t> msg = std::make_shared<can_message_t>();
+       can_message_t msg = can_message_t();
 
-       msg->set_bcm_msg(bcm_msg);
+       msg.set_bcm_msg(bcm_msg);
 
        if(bcm_msg.msg_head.can_id != OBD2_FUNCTIONAL_BROADCAST_ID)
        {
@@ -442,7 +473,7 @@ int low_can_subscription_t::create_rx_filter_bcm(low_can_subscription_t &subscri
                for(uint8_t i = 0; i < 8; i++)
                {
                        bcm_msg.msg_head.can_id  =  OBD2_FUNCTIONAL_RESPONSE_START + i;
-                       msg->set_bcm_msg(bcm_msg);
+                       msg.set_bcm_msg(bcm_msg);
                        subscription.socket_->write_message(msg);
                        if(! subscription.socket_)
                                return -1;
@@ -455,22 +486,51 @@ int low_can_subscription_t::create_rx_filter_bcm(low_can_subscription_t &subscri
 /// send a message
 ///
 /// @return 0 if ok else -1
-int low_can_subscription_t::tx_send(low_can_subscription_t &subscription, struct canfd_frame& cfd, const std::string& bus_name)
+int low_can_subscription_t::tx_send(low_can_subscription_t &subscription, message_t *message, const std::string& bus_name)
 {
-       struct bcm_msg bcm_msg = subscription.make_bcm_head(TX_SEND, cfd.can_id);
-       subscription.add_one_bcm_frame(cfd, bcm_msg);
+       can_message_t *cm = static_cast<can_message_t*>(message);
 
-       if(subscription.open_socket(subscription, bus_name) < 0)
-               {return -1;}
+       struct bcm_msg bcm_msg = subscription.make_bcm_head(TX_SEND, cm->get_id(),cm->get_flags() | TX_CP_CAN_ID); // TX_CP_CAN_ID -> copy in cfd the id of bcm
+       std::vector<canfd_frame> cfd_vect = cm->convert_to_canfd_frame_vector();
+       for(auto cfd: cfd_vect)
+       {
+               subscription.add_one_bcm_frame(cfd, bcm_msg);
+       }
+
+       if(subscription.open_socket(subscription, bus_name,socket_type::BCM) < 0)
+       {
+                       return -1;
+       }
+
+       cm->set_bcm_msg(bcm_msg);
+       subscription.socket_->write_message(*cm);
+       if(! subscription.socket_.get())
+       {
+                       return -1;
+       }
 
+       return 0;
+}
 
-       std::shared_ptr<can_message_t> msg = std::make_shared<can_message_t>();
+#ifdef USE_FEATURE_J1939
+int low_can_subscription_t::j1939_send(low_can_subscription_t &subscription, message_t *message, const std::string& bus_name)
+{
+       //struct bcm_msg bcm_msg = subscription.make_bcm_head(TX_SEND, cfd.can_id);
+       //subscription.add_one_bcm_frame(cfd, bcm_msg);
 
-       msg->set_bcm_msg(bcm_msg);
+       if(subscription.open_socket(subscription, bus_name, socket_type::J1939) < 0)
+       {
+               return -1;
+       }
 
-       subscription.socket_->write_message(msg);
-       if(! subscription.socket_.get())
+       j1939_message_t *jm = static_cast<j1939_message_t*>(message);
+       jm->set_sockname(jm->get_pgn(),J1939_NO_NAME,J1939_NO_ADDR);
+       if(subscription.socket_->write_message(*jm) < 0)
+       {
+               AFB_ERROR("Error write j1939 message");
                return -1;
+       }
 
        return 0;
 }
+#endif
\ No newline at end of file