From 8ba2d5e4fbcceaf26e66d43faf4f2923d07139ea Mon Sep 17 00:00:00 2001 From: bquan0 Date: Sun, 29 Sep 2024 11:07:58 -0500 Subject: [PATCH 1/8] add code to read CAN messages every 1s --- platformio.ini | 2 ++ src/main.cpp | 19 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/platformio.ini b/platformio.ini index 7b1bcdb..15ea4d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,3 +12,5 @@ platform = ststm32 board = nucleo_f767zi framework = arduino +build_flags = -DHAL_CAN_MODULE_ENABLED +lib_deps = pazi88/STM32_CAN@^1.1.2 diff --git a/src/main.cpp b/src/main.cpp index cb9fbba..67d9d89 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,17 @@ #include +#include "STM32_CAN.h" -// put function declarations here: -int myFunction(int, int); +STM32_CAN canBus( CAN1, ALT_2 ); + +CAN_message_t msg; void setup() { - // put your setup code here, to run once: - int result = myFunction(2, 3); + canBus.setBaudRate(500000); } void loop() { - // put your main code here, to run repeatedly: + delay(1000); + if (canBus.read(msg)) { + printf("Message received: %x | %d\n", msg.id, msg.buf[0]); + } } - -// put function definitions here: -int myFunction(int x, int y) { - return x + y; -} \ No newline at end of file From 8f9e659a47983466aa3adfbdcb34a6172627c6a1 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Sun, 29 Sep 2024 11:43:45 -0500 Subject: [PATCH 2/8] add canBus.begin() --- src/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 67d9d89..469746a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,11 +7,14 @@ CAN_message_t msg; void setup() { canBus.setBaudRate(500000); + canBus.begin(); } void loop() { delay(1000); if (canBus.read(msg)) { printf("Message received: %x | %d\n", msg.id, msg.buf[0]); + } else { + printf("no read"); } } From 0774d526f3269d6cecdd486469474956fa176387 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Sun, 29 Sep 2024 11:55:49 -0500 Subject: [PATCH 3/8] working read example --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 469746a..4e99ac2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,8 +6,8 @@ STM32_CAN canBus( CAN1, ALT_2 ); CAN_message_t msg; void setup() { - canBus.setBaudRate(500000); canBus.begin(); + canBus.setBaudRate(500000); } void loop() { @@ -15,6 +15,6 @@ void loop() { if (canBus.read(msg)) { printf("Message received: %x | %d\n", msg.id, msg.buf[0]); } else { - printf("no read"); + printf("no messages in read queue\n"); } } From 314c2420524c7bd5c251b130a23d61615d6c0595 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Mon, 30 Sep 2024 23:19:49 -0500 Subject: [PATCH 4/8] add submodule with canmanager --- .gitmodules | 3 +++ embedded-pio | 1 + platformio.ini | 3 +++ src/main.cpp | 13 +++++-------- 4 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 .gitmodules create mode 160000 embedded-pio diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b71b998 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "embedded-pio"] + path = embedded-pio + url = git@github.com:badgerloop-software/embedded-pio.git diff --git a/embedded-pio b/embedded-pio new file mode 160000 index 0000000..7813369 --- /dev/null +++ b/embedded-pio @@ -0,0 +1 @@ +Subproject commit 78133696ad23cf60ba8693de9ef3ae5699f7c293 diff --git a/platformio.ini b/platformio.ini index 15ea4d0..a9e0ed6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,4 +13,7 @@ platform = ststm32 board = nucleo_f767zi framework = arduino build_flags = -DHAL_CAN_MODULE_ENABLED +lib_extra_dirs = ./embedded-pio lib_deps = pazi88/STM32_CAN@^1.1.2 + + diff --git a/src/main.cpp b/src/main.cpp index 4e99ac2..5f8f89c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,20 +1,17 @@ #include #include "STM32_CAN.h" +#include "canmanager.h" -STM32_CAN canBus( CAN1, ALT_2 ); +// STM32_CAN canBus( CAN1, ALT_2 ); +CANManager canBus(CAN1, ALT_2); CAN_message_t msg; void setup() { - canBus.begin(); - canBus.setBaudRate(500000); + Serial.begin(9600); } void loop() { + Serial.println("hey"); delay(1000); - if (canBus.read(msg)) { - printf("Message received: %x | %d\n", msg.id, msg.buf[0]); - } else { - printf("no messages in read queue\n"); - } } From 16e72ea0406743e4d526983a14a248505a118d64 Mon Sep 17 00:00:00 2001 From: Dhruv Aron Date: Tue, 8 Oct 2024 21:09:33 -0500 Subject: [PATCH 5/8] First (untested) version of new CANDecoder class for testing purposes --- include/candecoder.h | 21 ++++++++++++ src/candecoder.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 include/candecoder.h create mode 100644 src/candecoder.cpp diff --git a/include/candecoder.h b/include/candecoder.h new file mode 100644 index 0000000..151007d --- /dev/null +++ b/include/candecoder.h @@ -0,0 +1,21 @@ +#include "canmanager.h" + +class CANDecoder : public CANManager { + public: + + CANDecoder(PinName rd, PinName td, int frequency = DEFAULT_CAN_FREQ); + + /* Reads input message and does any logic handling needed + * Intended to be implemented by class extension per board + */ + virtual void readHandler(CAN_data msg) = 0; + + /* Send a message over CAN + * + * messageID: CAN ID to use to identify the signal + * data: Payload array + * length: Size of data in bytes + * timeout: in milliseconds + */ + int sendSignal(); +}; \ No newline at end of file diff --git a/src/candecoder.cpp b/src/candecoder.cpp new file mode 100644 index 0000000..c78f6bf --- /dev/null +++ b/src/candecoder.cpp @@ -0,0 +1,79 @@ +#include "candecoder.h" + +#define FIRST_CAN 0x000 +#define SECOND_CAN 0x100 + +#define IS_FIRST_CAN true + +uint8_t int8Received; +uint16_t int16Received; +float floatReceived; +boolean boolReceived; + + +CANDecoder::CANDecoder(PinName rd, PinName td, int frequency = DEFAULT_CAN_FREQ) : CANManager(CAN_TypeDef* canPort, CAN_PINS pins, int frequency){}; + +#if IS_FIRST_CAN +void CANDecoder::readHandler(CAN_data msg) { + switch (msg.id) { + case (FIRST_CAN + 0): + int8Received = *msg.buf; + break; + case (FIRST_CAN + 1): + int16Received = *msg.buf; + break; + case (FIRST_CAN + 2): + floatReceived = *msg.buf; + break; + case (FIRST_CAN + 3): + boolReceived = *msg.buf; + break; + } +} + +int CANDecoder::sendSignal() { + uint8_t test8int = 496; // random 8-bit integer + this->sendMessage(SECOND_CAN + 0, (void*)&test8int, sizeof(test8int)); + + uint16_t test16int = 30271; // random 16-bit integer + this->sendMessage(SECOND_CAN + 1, (void*)&test16int, sizeof(test16int)); + + float testFloat = 9.8; // random floating point number + this->sendMessage(SECOND_CAN + 2, (void*)&testFloat, sizeof(testFloat)); + + float testBoolean = true; + this->sendMessage(SECOND_CAN + 3, (void*)&testBoolean, sizeof(testBoolean)); +} + +#else +void CANDecoder::readHandler(CAN_data msg) { + switch (msg.id) { + case (SECOND_CAN + 0): + int8Received = *msg.buf; + break; + case (SECOND_CAN + 1): + int16Received = *msg.buf; + break; + case (SECOND_CAN + 2): + floatReceived = *msg.buf; + break; + case (SECOND_CAN + 3): + boolReceived = *msg.buf; + break; + } +} + +int CANDecoder::sendSignal() { + uint8_t test8int = 234; // random 8-bit integer + this->sendMessage(FIRST_CAN + 0, (void*)&test8int, sizeof(test8int)); + + uint16_t test16int = 57219; // random 16-bit integer + this->sendMessage(FIRST_CAN + 1, (void*)&test16int, sizeof(test16int)); + + float testFloat = 8.6; // random floating point number + this->sendMessage(FIRST_CAN + 2, (void*)&testFloat, sizeof(testFloat)); + + float testBoolean = false; + this->sendMessage(FIRST_CAN + 3, (void*)&testBoolean, sizeof(testBoolean)); +} +#endif \ No newline at end of file From 06ccd480e69bf391f1e373348d4a227e7c141f52 Mon Sep 17 00:00:00 2001 From: Dhruv Aron Date: Sun, 13 Oct 2024 12:13:43 -0500 Subject: [PATCH 6/8] Updated CANDecoder implementation based on new CANManager implementation and comments from PR 'Check new CANDecoder Implementation'#1 --- include/candecoder.h | 8 ++-- src/candecoder.cpp | 94 +++++++++++++++++--------------------------- src/main.cpp | 21 +++++++--- 3 files changed, 55 insertions(+), 68 deletions(-) diff --git a/include/candecoder.h b/include/candecoder.h index 151007d..787c136 100644 --- a/include/candecoder.h +++ b/include/candecoder.h @@ -2,13 +2,13 @@ class CANDecoder : public CANManager { public: - - CANDecoder(PinName rd, PinName td, int frequency = DEFAULT_CAN_FREQ); + + CANDecoder(CAN_TypeDef* canPort, CAN_PINS pins, int frequency = DEFAULT_CAN_FREQ); /* Reads input message and does any logic handling needed * Intended to be implemented by class extension per board */ - virtual void readHandler(CAN_data msg) = 0; + void readHandler(CAN_data msg); /* Send a message over CAN * @@ -17,5 +17,5 @@ class CANDecoder : public CANManager { * length: Size of data in bytes * timeout: in milliseconds */ - int sendSignal(); + void sendSignal(); }; \ No newline at end of file diff --git a/src/candecoder.cpp b/src/candecoder.cpp index c78f6bf..c9c3902 100644 --- a/src/candecoder.cpp +++ b/src/candecoder.cpp @@ -1,79 +1,57 @@ #include "candecoder.h" -#define FIRST_CAN 0x000 -#define SECOND_CAN 0x100 - #define IS_FIRST_CAN true +#if IS_FIRST_CAN +#define RECEIVE_BASE_ID 0x000 +#define SEND_BASE_ID 0x100 +#define INT8_VAL 16 +#define INT16_VAL 30271 +#define FLOAT_VAL 9.8 +#define BOOL_VAL true +#else +#define RECEIVE_BASE_ID 0x100 +#define SEND_BASE_ID 0x000 +#define INT8_VAL 234 +#define INT16_VAL 57219 +#define FLOAT_VAL 8.6 +#define BOOL_VAL false +#endif + uint8_t int8Received; uint16_t int16Received; float floatReceived; -boolean boolReceived; - - -CANDecoder::CANDecoder(PinName rd, PinName td, int frequency = DEFAULT_CAN_FREQ) : CANManager(CAN_TypeDef* canPort, CAN_PINS pins, int frequency){}; - -#if IS_FIRST_CAN -void CANDecoder::readHandler(CAN_data msg) { - switch (msg.id) { - case (FIRST_CAN + 0): - int8Received = *msg.buf; - break; - case (FIRST_CAN + 1): - int16Received = *msg.buf; - break; - case (FIRST_CAN + 2): - floatReceived = *msg.buf; - break; - case (FIRST_CAN + 3): - boolReceived = *msg.buf; - break; - } -} - -int CANDecoder::sendSignal() { - uint8_t test8int = 496; // random 8-bit integer - this->sendMessage(SECOND_CAN + 0, (void*)&test8int, sizeof(test8int)); +bool boolReceived; - uint16_t test16int = 30271; // random 16-bit integer - this->sendMessage(SECOND_CAN + 1, (void*)&test16int, sizeof(test16int)); +CANDecoder::CANDecoder(CAN_TypeDef* canPort, CAN_PINS pins, int frequency /*=DEFAULT_CAN_FREQ*/) : CANManager(canPort, pins, frequency){}; - float testFloat = 9.8; // random floating point number - this->sendMessage(SECOND_CAN + 2, (void*)&testFloat, sizeof(testFloat)); - - float testBoolean = true; - this->sendMessage(SECOND_CAN + 3, (void*)&testBoolean, sizeof(testBoolean)); -} - -#else void CANDecoder::readHandler(CAN_data msg) { switch (msg.id) { - case (SECOND_CAN + 0): - int8Received = *msg.buf; + case (RECEIVE_BASE_ID + 0): + int8Received = *(int8_t*)msg.buf; break; - case (SECOND_CAN + 1): - int16Received = *msg.buf; + case (RECEIVE_BASE_ID + 1): + int16Received = *(int16_t*)msg.buf; break; - case (SECOND_CAN + 2): - floatReceived = *msg.buf; + case (RECEIVE_BASE_ID + 2): + floatReceived = *(float*)msg.buf; break; - case (SECOND_CAN + 3): - boolReceived = *msg.buf; + case (RECEIVE_BASE_ID + 3): + boolReceived = *(bool*)msg.buf; break; } } -int CANDecoder::sendSignal() { - uint8_t test8int = 234; // random 8-bit integer - this->sendMessage(FIRST_CAN + 0, (void*)&test8int, sizeof(test8int)); +void CANDecoder::sendSignal() { + uint8_t test8int = INT8_VAL; + this->sendMessage(SEND_BASE_ID + 0, (void*)&test8int, sizeof(test8int)); - uint16_t test16int = 57219; // random 16-bit integer - this->sendMessage(FIRST_CAN + 1, (void*)&test16int, sizeof(test16int)); + uint16_t test16int = INT16_VAL; + this->sendMessage(SEND_BASE_ID + 1, (void*)&test16int, sizeof(test16int)); - float testFloat = 8.6; // random floating point number - this->sendMessage(FIRST_CAN + 2, (void*)&testFloat, sizeof(testFloat)); + float testFloat = FLOAT_VAL; + this->sendMessage(SEND_BASE_ID + 2, (void*)&testFloat, sizeof(testFloat)); - float testBoolean = false; - this->sendMessage(FIRST_CAN + 3, (void*)&testBoolean, sizeof(testBoolean)); -} -#endif \ No newline at end of file + bool testBoolean = BOOL_VAL; + this->sendMessage(SEND_BASE_ID + 3, (void*)&testBoolean, sizeof(testBoolean)); +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5f8f89c..680f78c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,13 @@ #include #include "STM32_CAN.h" -#include "canmanager.h" +#include "candecoder.h" -// STM32_CAN canBus( CAN1, ALT_2 ); -CANManager canBus(CAN1, ALT_2); +CANDecoder candecoder(CAN1, ALT_2); -CAN_message_t msg; +extern uint8_t int8Received; +extern uint16_t int16Received; +extern float floatReceived; +extern bool boolReceived; void setup() { Serial.begin(9600); @@ -13,5 +15,12 @@ void setup() { void loop() { Serial.println("hey"); - delay(1000); -} + + candecoder.sendSignal(); + candecoder.runQueue(1000); + + Serial.println(int8Received); + Serial.println(int16Received); + Serial.println(floatReceived); + Serial.println(boolReceived); +} \ No newline at end of file From d786f5d7df6b3b1c8899b2c595b3c76a7290bd7f Mon Sep 17 00:00:00 2001 From: bquan0 Date: Mon, 14 Oct 2024 22:54:33 -0500 Subject: [PATCH 7/8] working tested canmanager & candecoder code --- embedded-pio | 2 +- include/candecoder.h | 2 +- src/candecoder.cpp | 10 ++++++++-- src/main.cpp | 23 +++++++++++++++-------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/embedded-pio b/embedded-pio index 7813369..adfb121 160000 --- a/embedded-pio +++ b/embedded-pio @@ -1 +1 @@ -Subproject commit 78133696ad23cf60ba8693de9ef3ae5699f7c293 +Subproject commit adfb121686bc204378ac39c4631ffd92736da0d9 diff --git a/include/candecoder.h b/include/candecoder.h index 787c136..b4b12ae 100644 --- a/include/candecoder.h +++ b/include/candecoder.h @@ -8,7 +8,7 @@ class CANDecoder : public CANManager { /* Reads input message and does any logic handling needed * Intended to be implemented by class extension per board */ - void readHandler(CAN_data msg); + void readHandler(CAN_message_t msg); /* Send a message over CAN * diff --git a/src/candecoder.cpp b/src/candecoder.cpp index c9c3902..7638c3b 100644 --- a/src/candecoder.cpp +++ b/src/candecoder.cpp @@ -1,6 +1,6 @@ #include "candecoder.h" -#define IS_FIRST_CAN true +#define IS_FIRST_CAN false #if IS_FIRST_CAN #define RECEIVE_BASE_ID 0x000 @@ -23,21 +23,27 @@ uint16_t int16Received; float floatReceived; bool boolReceived; +int numMessagesReceived[4] = {0,0,0,0}; + CANDecoder::CANDecoder(CAN_TypeDef* canPort, CAN_PINS pins, int frequency /*=DEFAULT_CAN_FREQ*/) : CANManager(canPort, pins, frequency){}; -void CANDecoder::readHandler(CAN_data msg) { +void CANDecoder::readHandler(CAN_message_t msg) { switch (msg.id) { case (RECEIVE_BASE_ID + 0): int8Received = *(int8_t*)msg.buf; + numMessagesReceived[0]++; break; case (RECEIVE_BASE_ID + 1): int16Received = *(int16_t*)msg.buf; + numMessagesReceived[1]++; break; case (RECEIVE_BASE_ID + 2): floatReceived = *(float*)msg.buf; + numMessagesReceived[2]++; break; case (RECEIVE_BASE_ID + 3): boolReceived = *(bool*)msg.buf; + numMessagesReceived[3]++; break; } } diff --git a/src/main.cpp b/src/main.cpp index 680f78c..4ed7042 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,25 +2,32 @@ #include "STM32_CAN.h" #include "candecoder.h" -CANDecoder candecoder(CAN1, ALT_2); +CANDecoder candecoder(CAN1, ALT_2, 500000); extern uint8_t int8Received; extern uint16_t int16Received; extern float floatReceived; extern bool boolReceived; +extern int numMessagesReceived[4]; + +int counter = 0; + void setup() { Serial.begin(9600); } void loop() { - Serial.println("hey"); - candecoder.sendSignal(); - candecoder.runQueue(1000); + candecoder.runQueue(50); + counter++; - Serial.println(int8Received); - Serial.println(int16Received); - Serial.println(floatReceived); - Serial.println(boolReceived); + if (counter > 20) { + counter = 0; + Serial.println(int8Received); + Serial.println(int16Received); + Serial.println(floatReceived); + Serial.println(boolReceived); + printf("%d | %d | %d | %d\n\n", numMessagesReceived[0], numMessagesReceived[1], numMessagesReceived[2], numMessagesReceived[3]); + } } \ No newline at end of file From 821855e70e79eca71afc3f4d8eb601fdacc2012a Mon Sep 17 00:00:00 2001 From: bquan0 Date: Mon, 14 Oct 2024 23:04:22 -0500 Subject: [PATCH 8/8] clean up code, add comments --- embedded-pio | 2 +- include/candecoder.h | 7 +------ src/candecoder.cpp | 2 +- src/main.cpp | 3 ++- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/embedded-pio b/embedded-pio index adfb121..ce0f7c8 160000 --- a/embedded-pio +++ b/embedded-pio @@ -1 +1 @@ -Subproject commit adfb121686bc204378ac39c4631ffd92736da0d9 +Subproject commit ce0f7c83cbf9592b13fa20d8e59f7f27b6d20861 diff --git a/include/candecoder.h b/include/candecoder.h index b4b12ae..d57a9e6 100644 --- a/include/candecoder.h +++ b/include/candecoder.h @@ -10,12 +10,7 @@ class CANDecoder : public CANManager { */ void readHandler(CAN_message_t msg); - /* Send a message over CAN - * - * messageID: CAN ID to use to identify the signal - * data: Payload array - * length: Size of data in bytes - * timeout: in milliseconds + /* Send all of this board's message over CAN */ void sendSignal(); }; \ No newline at end of file diff --git a/src/candecoder.cpp b/src/candecoder.cpp index 7638c3b..0a3cd1b 100644 --- a/src/candecoder.cpp +++ b/src/candecoder.cpp @@ -25,7 +25,7 @@ bool boolReceived; int numMessagesReceived[4] = {0,0,0,0}; -CANDecoder::CANDecoder(CAN_TypeDef* canPort, CAN_PINS pins, int frequency /*=DEFAULT_CAN_FREQ*/) : CANManager(canPort, pins, frequency){}; +CANDecoder::CANDecoder(CAN_TypeDef* canPort, CAN_PINS pins, int frequency) : CANManager(canPort, pins, frequency){}; void CANDecoder::readHandler(CAN_message_t msg) { switch (msg.id) { diff --git a/src/main.cpp b/src/main.cpp index 4ed7042..854194d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,9 +19,10 @@ void setup() { void loop() { candecoder.sendSignal(); - candecoder.runQueue(50); + candecoder.runQueue(50); // 50ms, so 20 sets of messages sent per second counter++; + // print out debug info every second (instead of every 50ms) if (counter > 20) { counter = 0; Serial.println(int8Received);