Modify function to open socket j1939 10/21410/10
authorRomain Forlot <romain.forlot@iot.bzh>
Tue, 25 Jun 2019 14:21:31 +0000 (16:21 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Wed, 26 Jun 2019 16:06:54 +0000 (18:06 +0200)
The function open_socket has been modified
to open a j1939 socket with a filter

Bug-AGL: SPEC-2386

Change-Id: Ieed5c1d14efdb469f5a7b831c9e8a950e04e9d42
Signed-off-by: Arthur Guyader <arthur.guyader@iot.bzh>
Signed-off-by: Stephane Desneux <stephane.desneux@iot.bzh>
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
low-can-binding/binding/low-can-subscription.cpp
low-can-binding/binding/low-can-subscription.hpp

index 8e4429f..eb3f6c3 100644 (file)
@@ -224,22 +224,60 @@ void low_can_subscription_t::set_max(float max)
 {
        event_filter_.max = max;
 }
+
 /// @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(const std::string& bus_name)
+int low_can_subscription_t::open_socket(low_can_subscription_t &subscription, const std::string& bus_name)
 {
        int ret = 0;
-       if(! socket_)
+       if(! subscription.socket_)
        {
-               if( signal_ != nullptr)
-                       {ret = socket_->open(signal_->get_message()->get_bus_device_name());}
-               else if (! diagnostic_message_ .empty())
-                       {ret = socket_->open(application_t::instance().get_diagnostic_manager().get_bus_device_name());}
-               else if ( ! bus_name.empty())
-                       { ret = socket_->open(bus_name);}
-               index_ = (int)socket_->socket();
+
+               #ifdef USE_FEATURE_J1939
+               if((subscription.signal_ != nullptr || !bus_name.empty()) && subscription.signal_->get_message()->is_j1939())
+               {
+                       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
+               {
+               #endif
+                       if( subscription.signal_ != nullptr)
+                       {
+                                       subscription.socket_ = std::make_shared<utils::socketcan_bcm_t>();
+                                       ret = subscription.socket_->open(subscription.signal_->get_message()->get_bus_device_name());
+                       }
+                       else if (! subscription.diagnostic_message_ .empty())
+                       {
+                                       subscription.socket_ = std::make_shared<utils::socketcan_bcm_t>();
+                                       ret = subscription.socket_->open(application_t::instance().get_diagnostic_manager().get_bus_device_name());
+                       }
+                       else if ( !bus_name.empty())
+                       {
+                                       subscription.socket_ = std::make_shared<utils::socketcan_bcm_t>();
+                                       ret = subscription.socket_->open(bus_name);
+                       }
+                       subscription.index_ = (int)subscription.socket_->socket();
+               #ifdef USE_FEATURE_J1939
+               }
+               #endif
        }
        return ret;
 }
@@ -248,7 +286,7 @@ int low_can_subscription_t::open_socket(const std::string& bus_name)
 ///
 /// @returns a bcm_msg with the msg_head parts set and can_frame
 /// zeroed.
-struct bcm_msg low_can_subscription_t::make_bcm_head(uint32_t opcode, uint32_t can_id, uint32_t flags, const struct timeval& timeout, const struct timeval& frequency_thinning) const
+struct bcm_msg low_can_subscription_t::make_bcm_head(uint32_t opcode, uint32_t can_id, uint32_t flags, const struct timeval& timeout, const struct timeval& frequency_thinning)
 {
        struct bcm_msg bcm_msg;
        ::memset(&bcm_msg, 0, sizeof(bcm_msg));
@@ -267,7 +305,7 @@ struct bcm_msg low_can_subscription_t::make_bcm_head(uint32_t opcode, uint32_t c
 /// @brief Take an existing bcm_msg struct and add a can_frame.
 /// Currently only 1 uniq can_frame can be added, it's not possible to build
 /// a multiplexed message with several can_frame.
-void low_can_subscription_t::add_one_bcm_frame(struct canfd_frame& cfd, struct bcm_msg& bcm_msg) const
+void low_can_subscription_t::add_one_bcm_frame(struct canfd_frame& cfd, struct bcm_msg& bcm_msg)
 {
        struct can_frame cf;
 
@@ -289,7 +327,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(subscription.open_socket() < 0)
+       if(open_socket(subscription) < 0)
        {
                        return -1;
        }
@@ -382,13 +420,13 @@ 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() < 0)
+       if(subscription.open_socket(subscription) < 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<message_t> msg = std::make_shared<can_message_t>();
+       std::shared_ptr<can_message_t> msg = std::make_shared<can_message_t>();
 
        msg->set_bcm_msg(bcm_msg);
 
@@ -421,11 +459,11 @@ int low_can_subscription_t::tx_send(low_can_subscription_t &subscription, struct
        struct bcm_msg bcm_msg = subscription.make_bcm_head(TX_SEND, cfd.can_id);
        subscription.add_one_bcm_frame(cfd, bcm_msg);
 
-       if(subscription.open_socket(bus_name) < 0)
+       if(subscription.open_socket(subscription, bus_name) < 0)
                {return -1;}
 
 
-       std::shared_ptr<message_t> msg = std::make_shared<can_message_t>();
+       std::shared_ptr<can_message_t> msg = std::make_shared<can_message_t>();
 
        msg->set_bcm_msg(bcm_msg);
 
index 01264ff..691eb88 100644 (file)
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-  #pragma once
+#pragma once
 
 #include <string>
 #include <cmath>
@@ -89,16 +89,16 @@ public:
        void set_min(float min);
        void set_max(float max);
 
-       struct bcm_msg make_bcm_head(uint32_t opcode, uint32_t can_id = 0, uint32_t flags = 0, const struct timeval& timeout = {0,0}, const struct timeval& frequency_thinning = {0,0}) const;
-       void add_one_bcm_frame(struct canfd_frame& cfd, struct bcm_msg& bcm_msg) const;
+       static struct bcm_msg make_bcm_head(uint32_t opcode, uint32_t can_id = 0, uint32_t flags = 0, const struct timeval& timeout = {0,0}, const struct timeval& frequency_thinning = {0,0});
+       static void add_one_bcm_frame(struct canfd_frame& cfd, struct bcm_msg& bcm_msg);
 
-       int open_socket(const std::string& bus_name = "");
+       static int open_socket(low_can_subscription_t &subscription, const std::string& bus_name = "");
 
        int create_rx_filter(std::shared_ptr<signal_t> sig);
        int create_rx_filter(std::shared_ptr<diagnostic_message_t> sig);
        static int create_rx_filter_can(low_can_subscription_t &subscription, std::shared_ptr<signal_t> sig);
        static int create_rx_filter_j1939(low_can_subscription_t &subscription, std::shared_ptr<signal_t> sig);
-       static int create_rx_filter_bcm(low_can_subscription_t &subscription, struct bcm_msg& bcm_msg);
+       static int create_rx_filter_bcm(low_can_subscription_t &subscription, bcm_msg& bcm_msg);
 
        static int tx_send(low_can_subscription_t &subscription, struct canfd_frame& cfd, const std::string& bus_name);
 };