socket: Raise an error if open function failed.
[apps/agl-service-can-low-level.git] / low-can-binding / utils / socketcan-j1939 / socketcan-j1939.cpp
index 25d0f76..000999f 100644 (file)
@@ -21,6 +21,7 @@
 #include <iostream>
 #include <algorithm>
 #include <vector>
+
 #include "./socketcan-j1939.hpp"
 #include "socketcan-j1939-addressclaiming.hpp"
 
@@ -41,8 +42,8 @@ namespace utils
         */
        void socketcan_j1939_t::add_filter(name_t name, pgn_t pgn, uint8_t addr, name_t name_mask, pgn_t pgn_mask, uint8_t addr_mask)
        {
-       //      AFB_DEBUG("[socketcan_j1939_t][add_filter] PGN : %" PRIu32 " ; NAME : %" PRIu64 " ; ADDR : %" PRIu8,pgn,(long unsigned int)name,addr);
-       //      AFB_DEBUG("PGN_MASK : %" PRIu32 " ; NAME_MASK : %" PRIu64 "; ADDR_MASK : %" PRIu8,pgn_mask,(long unsigned int)name_mask,addr_mask);
+       //      AFB_DEBUG("[socketcan_j1939_t][add_filter] PGN : %" PRIu32 " ; NAME : %" PRIu64 " ; ADDR : %" PRIu8, pgn,(long unsigned int)name, addr);
+       //      AFB_DEBUG("PGN_MASK : %" PRIu32 " ; NAME_MASK : %" PRIu64 "; ADDR_MASK : %" PRIu8, pgn_mask,(long unsigned int)name_mask, addr_mask);
                int filter_on = 0;
                struct j1939_filter filter;
                memset(&filter, 0, sizeof(filter));
@@ -50,12 +51,9 @@ namespace utils
                {
                        filter.name = name;
                        if(name_mask != J1939_NO_NAME)
-                       {
                                filter.name_mask = name_mask;
-                       } else
-                       {
+                       else
                                filter.name_mask = ~0ULL;
-                       }
                        ++filter_on;
                }
 
@@ -63,30 +61,25 @@ namespace utils
                {
                        filter.addr = addr;
                        if(addr_mask != J1939_NO_ADDR)
-                       {
                                filter.addr_mask = addr_mask;
-                       } else
-                       {
+                       else
                                filter.addr_mask = ~0;
-                       }
+
                        ++filter_on;
                }
                if (pgn <= J1939_PGN_MAX)
                {
                        filter.pgn = pgn;
                        if(pgn_mask != J1939_NO_PGN)
-                       {
                                filter.pgn_mask = pgn_mask;
-                       } else
-                       {
+                       else
                                filter.pgn_mask = ~0;
-                       }
+
                        ++filter_on;
                }
+
                if(filter_on)
-               {
                        setopt(SOL_CAN_J1939, SO_J1939_FILTER, &filter, sizeof(filter));
-               }
        }
 
        /**
@@ -96,18 +89,14 @@ namespace utils
         * @param recv_own_msgs - Allows you to receive your own packets
         * @param broadcast - Allows to write message with address brodcast (255)
         */
-    void socketcan_j1939_t::define_opt(bool promisc, bool recv_own_msgs, bool broadcast)
+       void socketcan_j1939_t::define_opt(bool promisc, bool recv_own_msgs, bool broadcast)
        {
-               int promisc_i = 0;
-               int recv_own_msgs_i = 0;
-               int broadcast_i = 0;
-
-               if(promisc) promisc_i = 1;
-               if(recv_own_msgs) recv_own_msgs_i=1;
-               if(broadcast) broadcast_i = 1;
+               int promisc_i = promisc ? 1 : 0;
+               //int recv_own_msgs_i = recv_own_msgs ? 1 : 0;
+               int broadcast_i = broadcast ? 1 : 0;
 
                setopt(SOL_CAN_J1939, SO_J1939_PROMISC, &promisc_i, sizeof(promisc_i));
-               setopt(SOL_CAN_J1939, SO_J1939_RECV_OWN, &recv_own_msgs_i, sizeof(recv_own_msgs_i));
+               //setopt(SOL_CAN_J1939, SO_J1939_RECV_OWN, &recv_own_msgs_i, sizeof(recv_own_msgs_i));
                setopt(SOL_SOCKET, SO_BROADCAST, &broadcast_i, sizeof(broadcast_i));
        }
 
@@ -141,32 +130,18 @@ namespace utils
 
 
                if(addr <= 0 || addr >= UINT8_MAX )
-               {
                        tx_address_.can_addr.j1939.addr = J1939_NO_ADDR;
-               }
                else
-               {
                        tx_address_.can_addr.j1939.addr = addr;
-               }
-
                if(name <= 0 || name >= UINT64_MAX )
-               {
                        tx_address_.can_addr.j1939.name = J1939_NO_NAME;
-               }
                else
-               {
                        tx_address_.can_addr.j1939.name = name;
-               }
 
                if(pgn <= 0 || pgn > J1939_PGN_MAX)
-               {
                        tx_address_.can_addr.j1939.pgn = J1939_NO_PGN;
-               }
                else
-               {
                        tx_address_.can_addr.j1939.pgn = pgn;
-               }
-
        }
 
 
@@ -178,7 +153,7 @@ namespace utils
         */
        int socketcan_j1939_t::open(std::string device_name)
        {
-               return open(device_name,0,0,0);
+               return open(device_name, 0, 0, 0);
        }
 
        /**
@@ -194,8 +169,10 @@ namespace utils
        {
 
                socket_ = socketcan_t::open(PF_CAN, SOCK_DGRAM, CAN_J1939);
+               if (socket_ < 0)
+                       return socket_;
 
-               define_tx_address(device_name,name,pgn,addr);
+               define_tx_address(device_name, name, pgn, addr);
 
                if(bind((struct sockaddr *)&tx_address_, sizeof(tx_address_)) < 0)
                {
@@ -233,9 +210,8 @@ namespace utils
                ssize_t nbytes = recvfrom(socket_, &data, sizeof(data), flag, (struct sockaddr *)&peername,  &peernamelen);
 
                if(nbytes < 0)
-               {
                        return nullptr;
-               }
+
                //AFB_DEBUG("Data available: %i bytes read", (int)nbytes);
 
                struct timeval tv;
@@ -256,8 +232,8 @@ namespace utils
         */
        int socketcan_j1939_t::write_j1939_message(pgn_t pgn, std::vector<uint8_t> &data, uint32_t len_data)
        {
-               j1939_message_t msg = j1939_message_t(J1939_MAX_DLEN, len_data, message_format_t::J1939, data, 0, 0, pgn, 0);
-               msg.set_sockname(pgn,J1939_NO_NAME,J1939_NO_ADDR);
+               j1939_message_t msg = j1939_message_t(len_data, data, 0, 0, pgn, 0);
+               msg.set_sockname(pgn, J1939_NO_NAME, J1939_NO_ADDR);
                return write_message(msg);
        }
 
@@ -274,9 +250,7 @@ namespace utils
                uint8_t data[jm.get_data_vector().size()];
 
                for(int i=0; i<jm.get_data_vector().size(); i++)
-               {
                        data[i] = jm.get_data_vector()[i];
-               }
 
                if (sendto(socket_, &data, sizeof(data), 0, (const struct sockaddr *)&sockname, sizeof(sockname)) < 0)
                {
@@ -285,4 +259,4 @@ namespace utils
                }
                return 0;
        }
-}
\ No newline at end of file
+}