#include <iostream>
#include <algorithm>
#include <vector>
+
#include "./socketcan-j1939.hpp"
#include "socketcan-j1939-addressclaiming.hpp"
*/
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));
{
filter.name = name;
if(name_mask != J1939_NO_NAME)
- {
filter.name_mask = name_mask;
- } else
- {
+ else
filter.name_mask = ~0ULL;
- }
++filter_on;
}
{
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));
- }
}
/**
* @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));
}
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;
- }
-
}
*/
int socketcan_j1939_t::open(std::string device_name)
{
- return open(device_name,0,0,0);
+ return open(device_name, 0, 0, 0);
}
/**
socket_ = socketcan_t::open(PF_CAN, SOCK_DGRAM, CAN_J1939);
- 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)
{
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;
*/
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);
}
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)
{
}
return 0;
}
-}
\ No newline at end of file
+}