Skip to content

Commit

Permalink
Added #defines for timeouts as per ISO 11783-3
Browse files Browse the repository at this point in the history
Changed CAN_FRAME to CAN_Frame; subtle perhaps, but all caps usually
 indicates a #define or other constant
Added uint16_t timeout to CAN_Frame
Added new struct CAN_Filter
Revised keywords.txt to reflect new API
Began standardizing private functions using set and get prefixes and
 camel case
Use const CAN_Frame in write() to minimize memory use
Bugfix for extended ID decoding in CAN_MCP2515::read()
Began revising CAN_K2X.{h,cpp} to match CANClass API
  • Loading branch information
McNeight committed Jun 14, 2014
1 parent b467746 commit 063fd18
Show file tree
Hide file tree
Showing 11 changed files with 210 additions and 226 deletions.
116 changes: 28 additions & 88 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,74 +6,19 @@
# Datatypes (KEYWORD1)
#######################################

CAN KEYWORD1
J1939 KEYWORD1
CANopen KEYWORD1

# From due_can library

CAN_FRAME KEYWORD1
CANClass KEYWORD1
CAN_Frame KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

begin KEYWORD2
bitRate KEYWORD2
setMode KEYWORD2
reset KEYWORD2
readMode KEYWORD2
readRate KEYWORD2

# From due_can library

set_baudrate KEYWORD2
init KEYWORD2
enable KEYWORD2
disable KEYWORD2
disable_low_power_mode KEYWORD2
enable_low_power_mode KEYWORD2
disable_autobaud_listen_mode KEYWORD2
enable_autobaud_listen_mode KEYWORD2
disable_overload_frame KEYWORD2
enable_overload_frame KEYWORD2
set_timestamp_capture_point KEYWORD2
disable_time_triggered_mode KEYWORD2
enable_time_triggered_mode KEYWORD2
disable_timer_freeze KEYWORD2
enable_timer_freeze KEYWORD2
disable_tx_repeat KEYWORD2
enable_tx_repeat KEYWORD2
set_rx_sync_stage KEYWORD2
enable_interrupt KEYWORD2
disable_interrupt KEYWORD2
get_interrupt_mask KEYWORD2
get_status KEYWORD2
get_internal_timer_value KEYWORD2
get_timestamp_value KEYWORD2
get_tx_error_cnt KEYWORD2
get_rx_error_cnt KEYWORD2
reset_internal_timer KEYWORD2
global_send_transfer_cmd KEYWORD2
global_send_abort_cmd KEYWORD2
mailbox_set_timemark KEYWORD2
mailbox_get_status KEYWORD2
mailbox_send_transfer_cmd KEYWORD2
mailbox_send_abort_cmd KEYWORD2
mailbox_init KEYWORD2
mailbox_read KEYWORD2
mailbox_tx_frame KEYWORD2
mailbox_set_id KEYWORD2
mailbox_set_priority KEYWORD2
mailbox_set_accept_mask KEYWORD2
mailbox_set_mode KEYWORD2
mailbox_set_databyte KEYWORD2
mailbox_set_datalen KEYWORD2
mailbox_set_datal KEYWORD2
mailbox_set_datah KEYWORD2
reset_all_mailbox KEYWORD2
rx_avail KEYWORD2
get_rx_buff KEYWORD2
end KEYWORD2
available KEYWORD2
read KEYWORD2
flush KEYWORD2
write KEYWORD2

#######################################
# Instances (KEYWORD2)
Expand All @@ -86,38 +31,33 @@ CAN2 KEYWORD2
# Constants (LITERAL1)
#######################################

CAN_DOMINANT LITERAL1
CAN_RECESSIVE LITERAL1
CAN_STANDARD_FRAME LITERAL1
CAN_EXTENDED_FRAME LITERAL1
CAN_STANDARD_ID_MASK LITERAL1
CAN_EXTENDED_ID_MASK LITERAL1
CAN_BPS_1M LITERAL1
CAN_BPS_1000K LITERAL1
CAN_BPS_800K LITERAL1
CAN_BPS_500K LITERAL1
CAN_BPS_250K LITERAL1
CAN_BPS_200K LITERAL1
CAN_BPS_125K LITERAL1
CAN_BPS_100K LITERAL1
CAN_BPS_83K LITERAL1
CAN_BPS_80K LITERAL1
CAN_BPS_50K LITERAL1
CAN_BPS_40K LITERAL1
CAN_BPS_33333 LITERAL1
CAN_BPS_31K25 LITERAL1
CAN_BPS_25K LITERAL1
CAN_BPS_20K LITERAL1
CAN_BPS_10K LITERAL1
CAN_BPS_5K LITERAL1
CAN_MB_DISABLE_MODE LITERAL1
CAN_MB_RX_MODE LITERAL1
CAN_MB_RX_OVER_WR_MODE LITERAL1
CAN_MB_TX_MODE LITERAL1
CAN_MB_CONSUMER_MODE LITERAL1
CAN_MB_PRODUCER_MODE LITERAL1
CAN_TCR_MB0 LITERAL1
CAN_TCR_MB1 LITERAL1
CAN_TCR_MB2 LITERAL1
CAN_TCR_MB3 LITERAL1
CAN_TCR_MB4 LITERAL1
CAN_TCR_MB5 LITERAL1
CAN_TCR_MB6 LITERAL1
CAN_TCR_MB7 LITERAL1
CAN_MSR_MRDY LITERAL1
CAN_IER_MB0 LITERAL1
CAN_IER_MB1 LITERAL1
CAN_IER_MB2 LITERAL1
CAN_IER_MB3 LITERAL1
CAN_IER_MB4 LITERAL1
CAN_IER_MB5 LITERAL1
CAN_IER_MB6 LITERAL1
CAN_IER_MB7 LITERAL1
CAN_DISABLE_ALL_INTERRUPT_MASK LITERAL1
CAN0_IRQn LITERAL1
CAN1_IRQn LITERAL1
CAN_TIMEOUT_TR LITERAL1
CAN_TIMEOUT_TH LITERAL1
CAN_TIMEOUT_T1 LITERAL1
CAN_TIMEOUT_T2 LITERAL1
CAN_TIMEOUT_T3 LITERAL1
CAN_TIMEOUT_T4 LITERAL1
2 changes: 1 addition & 1 deletion src/CAN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ DATE VER WHO WHAT

#include "CAN.h"

//CAN_FRAME& CANClass::operator=(const CAN_FRAME&)
//CAN_Frame& CANClass::operator=(const CAN_Frame&)
//{
//}
66 changes: 38 additions & 28 deletions src/CAN.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,32 +80,42 @@ DATE VER WHO WHAT
#define CAN_BPS_10K 10000
#define CAN_BPS_5K 5000

typedef struct
// ISO 11783-3:2014
// Section 5.13.3
// Controller response time and timeout defaults
#define CAN_TIMEOUT_TR 200
#define CAN_TIMEOUT_TH 500
#define CAN_TIMEOUT_T1 750
#define CAN_TIMEOUT_T2 1250
#define CAN_TIMEOUT_T3 1250
#define CAN_TIMEOUT_T4 1050


typedef struct __attribute__((__packed__))
{
uint32_t id : 29; // if (ide == CAN_RECESSIVE) { extended ID } else { standard ID }
uint8_t valid : 1; // To avoid passing garbage frames around
uint8_t rtr : 1; // Remote Transmission Request Bit
uint8_t extended : 1; // Identifier Extension Bit
uint32_t fid; // family ID
uint8_t priority : 4; // Priority but only important for TX frames and then only for special uses.
uint8_t length : 4; // Data Length
uint8_t data[8]; // Message data
} CAN_FRAME;

typedef struct CAN_message_t {
uint32_t id; // can identifier
uint8_t ext; // identifier is extended
uint8_t len; // length of data
uint16_t timeout; // milliseconds, zero will disable waiting
uint8_t buf[8];
} CAN_message_t;

typedef struct CAN_filter_t {
uint8_t rtr;
uint8_t ext;
uint32_t id;
uint8_t data[2];
} CAN_filter_t;
uint32_t id : 29; // if (ide == CAN_RECESSIVE) { extended ID }
// else { standard ID }
uint8_t valid : 1; // To avoid passing garbage frames around
uint8_t rtr : 1; // Remote Transmission Request Bit (RTR)
uint8_t extended : 1; // Identifier Extension Bit (IDE)
uint32_t fid; // family ID
uint8_t priority : 4; // Priority but only important for TX frames and then only for special uses.
uint8_t length : 4; // Data Length
uint16_t timeout; // milliseconds, zero will disable waiting
uint8_t data[8]; // Message data
} CAN_Frame; // suffix of '_t' is reserved by POSIX for future use


// From http://www.cse.dmu.ac.uk/~eg/tele/CanbusIDandMask.html
//
typedef struct __attribute__((__packed__))
{
uint32_t id : 29; // if (ide == CAN_RECESSIVE) { extended ID }
// else { standard ID }
uint8_t rtr : 1; // Remote Transmission Request Bit (RTR)
uint8_t extended : 1; // Identifier Extension Bit (IDE)
uint8_t data[2]; // Filter / Mask for message data
} CAN_Filter; // suffix of '_t' is reserved by POSIX for future use


class CANClass // Can't inherit from Stream
Expand All @@ -114,11 +124,11 @@ class CANClass // Can't inherit from Stream
virtual void begin(uint32_t bitrate);
virtual void end();
virtual uint8_t available();
virtual CAN_FRAME read();
virtual CAN_Frame read();
virtual void flush();
virtual uint8_t write(CAN_FRAME&);
virtual uint8_t write(const CAN_Frame&);

//CAN_FRAME& operator=(const CAN_FRAME&);
//CAN_Frame& operator=(const CAN_Frame&);
};

//extern CANClass CAN;
Expand Down
4 changes: 2 additions & 2 deletions src/CAN_AT90CAN.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,13 @@ class CAN_AT90CAN : public CANClass
// check if message has been received on any of the buffers
uint8_t available();
//Receive and display CAN message and allows use of the message structure for easier message handling
CAN_FRAME read();
CAN_Frame read();
// Receive and display any message (J1939, CANopen, CAN)
void read(uint32_t *ID, uint8_t *length_out, uint8_t *data_out);

void flush();

uint8_t write(CAN_FRAME&);
uint8_t write(CAN_Frame&);
// Load and send message. No RTS needed.
uint8_t write(uint32_t ID, uint8_t frameType, uint8_t length, uint8_t *data);

Expand Down
Loading

0 comments on commit 063fd18

Please sign in to comment.