5#include "../../../../Inc/Systems/Comms/Can/Can.h"
6#include "../../../../Inc/Systems/Comms/Can/DBCParser.h"
7#include "../../../../Inc/Systems/PrintHelpers.h"
31 unsigned char* dbc_contents = filename;
63 strcpy(message.
name, name);
64 strcpy(message.
sender, sender);
69 for (
int i = 0; i < signal_count; i++) {
70 message.
signals[i] = signals[i];
80 CAN_TxHeaderTypeDef TxHeader;
83 TxHeader.IDE = CAN_ID_STD;
84 }
else if (protocol ==
CAN_2B) {
86 TxHeader.IDE = CAN_ID_EXT;
88 printf(
"Invalid CAN protocol\r\n");
92 TxHeader.RTR = CAN_RTR_DATA;
97 for (
int i = 0; i < len; i++) {
98 printf(
"%02X ", data[i]);
114 can_message->
header = *RxHeader;
115 memcpy(can_message->
data, RxData, 8);
140 if (msg->
id == can_message->
header.StdId || msg->
id == can_message->
header.ExtId) {
164 uint64_t raw_data = 0;
165 for (
int i = signal->
start_bit; i < signal->start_bit + signal->
length; i++) {
166 raw_data |= ((can_message->
data[i / 8] >> (i % 8)) & 1) << (i - signal->
start_bit);
170 if (signal->
endian == 1) {
172 uint64_t reversed_data = 0;
173 for (
int i = 0; i < signal->
length; i++) {
174 reversed_data |= ((raw_data >> i) & 1) << (signal->
length - i - 1);
176 raw_data = reversed_data;
182 raw_data = (raw_data << (64 - signal->
length)) >> (64 - signal->
length);
191 for (
int i = 0; i <
MAX_BUS; i++) {
192 printf(
"Printing CAN Message List for bus %d with %d messages\r\n", i,
can_messages[i].num_messages);
198 printf(
"\t" ANSI_COLOR_BLUE "Signal" ANSI_COLOR_RESET ": %s (Start bit: %d, Length: %d, Endain: %d, Signed: %c,\r\n\t\tScale: %f, Offset: %f, Min: %f, Max: %f, \r\n\t\tUnit: %s, Reciever: %s)\r\n", sig->
name, sig->
start_bit, sig->
length, sig->
endian, sig->
isSigned, sig->
scale, sig->
offset, sig->
min, sig->
max, sig->
unit, sig->
reciever);
203 printf(
"No messages on bus %d\r\n", i);
int init_CANBus(CANBus bus)
Initializes the CANBus struct.
CAN_MessageList can_messages[MAX_BUS]
void parseSignals(CAN_Message_Template *message, CAN_Message *can_message)
Parses signals in a CAN message.
void parseSignal(CAN_Signal_Template *signal, CAN_Signal *can_signal, CAN_Message *can_message)
Parses a CAN signal.
void parseMessage(CAN_MessageList *messages, CAN_Message *can_message)
Parses a CAN message.
int add_message(CANBus bus, CAN_Message_Template message)
Adds a message to the CAN message list.
int add_message_lop(CANBus bus, int id, int dlc, int ide, int rtr, const char *name, const char *sender, int signal_count, CAN_Signal_Template *signals)
Adds a message to the CAN message list by passing in the individual message parameters hence "LOP" (L...
int send_CAN_message(CANBus bus, CANProtocol protocol, uint32_t id, uint8_t *data, uint8_t len)
Sends a CAN message.
void receive_CAN_message(CAN_RxHeaderTypeDef *RxHeader, uint8_t *RxData, CANBus bus)
Receives a CAN message.
int load_dbc_file(CANBus bus, const unsigned char *filename)
Loads a DBC file into the CAN database. Makes the messages and signals and stores them in the list.
void print_CAN_Messages_Lists()
Prints the CAN message list.
int parseDbcFile(CAN_MessageList *messages, const unsigned char *dbc_contents)
Parses a DBC (CAN database) file and populates the DBC structure.
void print_CAN_MessageList(const CAN_MessageList *messages)
Prints the contents of a CAN message list (aka DBC file).
#define ANSI_COLOR_YELLOW
#define ANSI_COLOR_MAGENTA
This file contains the headers of the interrupt handlers.
int send_CAN_message_helper(CANBus bus, CAN_TxHeaderTypeDef *TxHeader, uint8_t *data)
CAN_Message_Template messages[MAX_MESSAGES]
char sender[MAX_NODE_NAME_LENGTH]
CAN_Signal_Template signals[MAX_SIGNALS]
char name[MAX_MESSAGE_NAME_LENGTH]
CAN_Message_Template * template
CAN_RxHeaderTypeDef header
char unit[MAX_UNIT_NAME_LENGTH]
char reciever[MAX_NODE_NAME_LENGTH]
char name[MAX_SIGNAL_NAME_LENGTH]
CAN_Signal_Template * template