From e2d9043fe92c4bd32c06c0a180d238f1c4ba2471 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Fri, 27 Feb 2026 04:46:03 -0800 Subject: [PATCH 1/7] Potentially might build but rough sketch start Signed-off-by: Daniel Hansen --- CMakeLists.txt | 2 + .../GRCAN/Inc/GRCAN_FancyLayer.h | 19 ++++ .../GRCAN/Src/grcan_fancylayer.c | 97 +++++++++++++++++++ .../GRCAN/grcan_fancylayer.cmake | 47 +++++++++ 4 files changed, 165 insertions(+) create mode 100644 Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h create mode 100644 Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c create mode 100644 Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 64225cf04..ce8b22a4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,8 @@ include("Autogen/CAN/CANfigurator.cmake") # Peripherals include("${lib_path}/Peripherals/USART/common.cmake") include("${lib_path}/Peripherals/CAN/common.cmake") + +include("${lib_path}/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake") include("${lib_path}/FancyLayers-RENAME/ADC/adc.cmake") include("${lib_path}/FancyLayers-RENAME/NeoPixel/neopixel.cmake") diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h new file mode 100644 index 000000000..57a3964e4 --- /dev/null +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h @@ -0,0 +1,19 @@ +#include + +#include "GR_OLD_NODE_ID.h" +#include "GR_OLD_MSG_ID.h" + +#ifndef GRCAN_FANCYLAYER_H +#define GRCAN_FANCYLAYER_H + +typedef struct { + GR_OLD_NODE_ID srcID; + GR_OLD_NODE_ID destNode; + GR_OLD_MSG_ID messageID; +} GRCAN_Fancy_ID; + +uint32_t GRCAN_Fancy_Decode(GRCAN_Fancy_ID id); + +void GRCAN_Fancy_Encode(GRCAN_Fancy_ID *id, uint32_t rawID); + +#endif diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c new file mode 100644 index 000000000..1b41f1bc0 --- /dev/null +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -0,0 +1,97 @@ +#include "GRCAN_FancyLayer.h" + +#include + +#include "GR_OLD_BUS_ID.h" +#include "GR_OLD_MSG_ID.h" +#include "GR_OLD_NODE_ID.h" + +#include "Logomatic.h" +#include "can.h" +#include "main.h" + +static CANHandle* grcan_primary; +static CANHandle* grcan_data; +static GR_OLD_NODE_ID grcan_local_node_id; + +void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle* primaryCAN, CANHandle* dataCAN) +{ + GRCAN_Fancy_RegisterLocalID(localID); + GRCAN_Fancy_RegisterPrimaryCAN(primaryCAN); + GRCAN_Fancy_RegisterDataCAN(dataCAN); +} +grcan_local_node_id = localID; + + if (primaryCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for primary CAN handle\n"); + } + + if (dataCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); + } + + grcan_primary = primaryCAN; + grcan_data = dataCAN; +} + +uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id) +{ + if (id == NULL) { + LOGOMATIC("GRCAN_Fancy_Decode: Received NULL pointer\n"); + return 0; + } + + return ((0xFF & id->srcID) << 20) | ((0xFFF & id->messageID) << 8) | (0xFF & id->destNode); +} + +void GRCAN_Fancy_EncodeID(GRCAN_Fancy_ID *id, uint32_t rawID) +{ + if (id == NULL) { + LOGOMATIC("GRCAN_Fancy_Encode: Received NULL pointer\n"); + } + + id->srcID = (rawID >> 20) & 0xFF; + id->destNode = rawID & 0xFF; + id->messageID = (rawID >> 8) & 0xFFF; +} + +void GRCAN_Fancy_Send(GR_OLD_BUS_ID bus, GR_OLD_NODE_ID destNode, GR_OLD_MSG_ID messageID, void *data, uint32_t size) +{ + GRCAN_Fancy_ID id = { + .srcID = LOCAL_GR_ID, + .destNode = destNode, + .messageID = messageID, + }; + + GRCAN_Raw_Send(bus, GRCAN_Fancy_Decode(&id), data, size); +} + +void GRCAN_Raw_Send(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) +{ + FDCANTxHeaderTypeDef header = { + .Identifier = rawID, + .IdType = FDCAN_STANDARD_ID, + .TxFrameType = FDCAN_DATA_FRAME, + .ErrorStateIndicator = FDCAN_ESI_ACTIVE, + .DataLength = size, + .BitRateSwitch = FDCAN_BRS_OFF, + .TxEventFifoControl = FDCAN_NO_TX_EVENTS, + .MessageMarker = 0, + }; + + FDCANTxMessage msg; + msg.tx_header = header; + memcpy(&(msg.data), data, size); + + switch (bus) { + case GR_OLD_BUS_PRIMARY: + can_send(grcan_primary, &msg); + break; + case GR_OLD_BUS_DATA: + can_send(grcan_data, &msg); + break; + default: + LOGOMATIC("GRCAN_Raw_Send: Invalid bus ID %d\n", bus); + break; + } +} diff --git a/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake new file mode 100644 index 000000000..11eeac90c --- /dev/null +++ b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake @@ -0,0 +1,47 @@ +add_library(GRCAN_FANCYLAYER INTERFACE) + +target_include_directories( + GRCAN_FANCYLAYER + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/Inc +) + +target_sources( + GRCAN_FANCYLAYER + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/Src/grcan_fancylayer.c +) + +target_link_libraries(GRCAN_FANCYLAYER INTERFACE GLOBALSHARE_LIB GRCAN_LIB) + +if(CMAKE_PRESET_NAME STREQUAL "HOOTLTest") + # target_compile_definitions(LOGOMATIC_LIB INTERFACE LOGOMATIC_ENABLED) + + # add_executable(logomatic_simple) + # target_sources( + # logomatic_simple + # PRIVATE + # ${CMAKE_CURRENT_LIST_DIR}/Test/Src/logomatic_simple_print.c + # ) + # target_include_directories( + # logomatic_simple + # PRIVATE + # ${CMAKE_CURRENT_LIST_DIR}/Test/Inc + # ) + # target_link_libraries(logomatic_simple PRIVATE LOGOMATIC_LIB) + # add_test(logomatic_simple_test logomatic_simple) + + # add_executable(logomatic_float) + # target_sources( + # logomatic_float + # PRIVATE + # ${CMAKE_CURRENT_LIST_DIR}/Test/Src/logomatic_float_print.c + # ) + # target_include_directories( + # logomatic_float + # PRIVATE + # ${CMAKE_CURRENT_LIST_DIR}/Test/Inc + # ) + # target_link_libraries(logomatic_float PRIVATE LOGOMATIC_LIB) + # add_test(logomatic_float_test logomatic_float) +endif() From eeb61433f979796fa55e8afcf3df7c4ccaa858dd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:09:40 +0000 Subject: [PATCH 2/7] Automatic CMake Format: Standardized formatting automatically --- Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake index 11eeac90c..3148a0e69 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake +++ b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake @@ -12,7 +12,12 @@ target_sources( ${CMAKE_CURRENT_LIST_DIR}/Src/grcan_fancylayer.c ) -target_link_libraries(GRCAN_FANCYLAYER INTERFACE GLOBALSHARE_LIB GRCAN_LIB) +target_link_libraries( + GRCAN_FANCYLAYER + INTERFACE + GLOBALSHARE_LIB + GRCAN_LIB +) if(CMAKE_PRESET_NAME STREQUAL "HOOTLTest") # target_compile_definitions(LOGOMATIC_LIB INTERFACE LOGOMATIC_ENABLED) From e79909ab3432083160e53ac2a28272e8bb3ad730 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:11:05 +0000 Subject: [PATCH 3/7] Automatic Clang-Format: Standardized formatting automatically --- .../GRCAN/Inc/GRCAN_FancyLayer.h | 2 +- .../GRCAN/Src/grcan_fancylayer.c | 23 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h index 57a3964e4..803b175d8 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h @@ -1,7 +1,7 @@ #include -#include "GR_OLD_NODE_ID.h" #include "GR_OLD_MSG_ID.h" +#include "GR_OLD_NODE_ID.h" #ifndef GRCAN_FANCYLAYER_H #define GRCAN_FANCYLAYER_H diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 1b41f1bc0..5efa17b9e 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -5,16 +5,15 @@ #include "GR_OLD_BUS_ID.h" #include "GR_OLD_MSG_ID.h" #include "GR_OLD_NODE_ID.h" - #include "Logomatic.h" #include "can.h" #include "main.h" -static CANHandle* grcan_primary; -static CANHandle* grcan_data; +static CANHandle *grcan_primary; +static CANHandle *grcan_data; static GR_OLD_NODE_ID grcan_local_node_id; -void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle* primaryCAN, CANHandle* dataCAN) +void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle *dataCAN) { GRCAN_Fancy_RegisterLocalID(localID); GRCAN_Fancy_RegisterPrimaryCAN(primaryCAN); @@ -22,16 +21,16 @@ void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle* primaryCAN, CANHandle* } grcan_local_node_id = localID; - if (primaryCAN == NULL) { - LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for primary CAN handle\n"); - } +if (primaryCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for primary CAN handle\n"); +} - if (dataCAN == NULL) { - LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); - } +if (dataCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); +} - grcan_primary = primaryCAN; - grcan_data = dataCAN; +grcan_primary = primaryCAN; +grcan_data = dataCAN; } uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id) From c4e0b60f17307019411184688e902055ea954e27 Mon Sep 17 00:00:00 2001 From: Daniel Hansen <105574022+dchansen06@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:13:12 -0800 Subject: [PATCH 4/7] Extra closing curly bracket Signed-off-by: Daniel Hansen <105574022+dchansen06@users.noreply.github.com> --- Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 5efa17b9e..ba13f613d 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -18,7 +18,7 @@ void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle * GRCAN_Fancy_RegisterLocalID(localID); GRCAN_Fancy_RegisterPrimaryCAN(primaryCAN); GRCAN_Fancy_RegisterDataCAN(dataCAN); -} + grcan_local_node_id = localID; if (primaryCAN == NULL) { From 6c48271902fcd924dd6a14a549d783773c2ead6a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:14:12 +0000 Subject: [PATCH 5/7] Automatic Clang-Format: Standardized formatting automatically --- .../GRCAN/Src/grcan_fancylayer.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index ba13f613d..7ecd5aec2 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -19,18 +19,18 @@ void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle * GRCAN_Fancy_RegisterPrimaryCAN(primaryCAN); GRCAN_Fancy_RegisterDataCAN(dataCAN); -grcan_local_node_id = localID; + grcan_local_node_id = localID; -if (primaryCAN == NULL) { - LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for primary CAN handle\n"); -} + if (primaryCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for primary CAN handle\n"); + } -if (dataCAN == NULL) { - LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); -} + if (dataCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); + } -grcan_primary = primaryCAN; -grcan_data = dataCAN; + grcan_primary = primaryCAN; + grcan_data = dataCAN; } uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id) From e86a33d169ff4099c76d010e3fa11113dd5c2303 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Mon, 2 Mar 2026 23:58:12 -0800 Subject: [PATCH 6/7] Send implementation should work now. Configuration very rough draft, testing different architectures --- .../GRCAN/Inc/GRCAN_FancyLayer.h | 10 +- .../GRCAN/Inc/grcan_utils.h | 12 + .../GRCAN/Src/grcan_fancylayer.c | 242 ++++++++++++++++-- .../GRCAN/Src/grcan_utils.c | 63 +++++ 4 files changed, 298 insertions(+), 29 deletions(-) create mode 100644 Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h create mode 100644 Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h index 803b175d8..f0d2ac6c7 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h @@ -11,9 +11,15 @@ typedef struct { GR_OLD_NODE_ID destNode; GR_OLD_MSG_ID messageID; } GRCAN_Fancy_ID; +typedef enum { + GRCAN_MODE_CLASSIC, + GRCAN_MODE_FD +} GRCAN_BusMode; -uint32_t GRCAN_Fancy_Decode(GRCAN_Fancy_ID id); +GRCAN_BusMode GRCAN_BusModeForBus(GR_OLD_BUS_ID bus); +void GRCAN_ConfigureBus(GR_OLD_BUS_ID bus, CANConfig *config); -void GRCAN_Fancy_Encode(GRCAN_Fancy_ID *id, uint32_t rawID); +uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id); +void GRCAN_Fancy_EncodeID(GRCAN_Fancy_ID *id, uint32_t rawID); #endif diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h new file mode 100644 index 000000000..bcb9d118d --- /dev/null +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h @@ -0,0 +1,12 @@ +#include + +#include "GR_OLD_MSG_ID.h" +#include "GR_OLD_NODE_ID.h" + +#ifndef GRCAN_UTILS_H +#define GRCAN_UTILS_H + +uint32_t FDCAN_DLC_BYTES(uint32_t size); +uint32_t FDCAN_DLC_SIZE(uint32_t dlc); + +#endif diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 7ecd5aec2..58fa0bf9d 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -1,7 +1,4 @@ -#include "GRCAN_FancyLayer.h" - #include - #include "GR_OLD_BUS_ID.h" #include "GR_OLD_MSG_ID.h" #include "GR_OLD_NODE_ID.h" @@ -11,13 +8,75 @@ static CANHandle *grcan_primary; static CANHandle *grcan_data; +static CANHandle *grcan_testing; +static CANHandle *grcan_charging; + static GR_OLD_NODE_ID grcan_local_node_id; -void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle *dataCAN) +// void Primary_Bus_Configure(CANConfig *config) { +// grcan_primary = can_init(config); +// can_start(grcan_primary); +// } + +// void Data_Bus_Configure(CANConfig *config) { +// grcan_data = can_init(config); +// can_start(grcan_data); +// } + +// void Testing_Bus_Configure(CANConfig *config) { +// grcan_testing = can_init(config); +// can_start(grcan_testing); +// } + +// void Charger_Bus_Configure(CANConfig *config) { +// grcan_charging = can_init(config); +// can_start(grcan_charging); +// } + +GRCAN_BusMode GRCAN_BusModeForBus(GR_OLD_BUS_ID bus) +{ + switch (bus) { + case GR_OLD_BUS_PRIMARY: return GRCAN_MODE_FD; + case GR_OLD_BUS_TESTING: return GRCAN_MODE_FD; + case GR_OLD_BUS_DATA: return GRCAN_MODE_CLASSIC; + case GR_OLD_BUS_CHARGING: return GRCAN_MODE_CLASSIC; // update later + default: + LOGOMATIC("GRCAN_BusModeForBus: unknown bus %d\n", bus); + return GRCAN_MODE_CLASSIC; + } +} + +CANHandle *GRCAN_GetHandle(GR_OLD_BUS_ID bus) { + switch (bus) { + case GR_OLD_BUS_PRIMARY: return grcan_primary; + case GR_OLD_BUS_DATA: return grcan_data; + case GR_OLD_BUS_TESTING: return grcan_testing; + case GR_OLD_BUS_CHARGING: return grcan_charging; + default: return NULL; + } +} + +void GRCAN_ConfigureBus(GR_OLD_BUS_ID bus, CANConfig *config) +{ + CANHandle **h = NULL; + switch (bus) { + case GR_OLD_BUS_PRIMARY: h = &grcan_primary; break; + case GR_OLD_BUS_DATA: h = &grcan_data; break; + case GR_OLD_BUS_TESTING: h = &grcan_testing; break; + case GR_OLD_BUS_CHARGING: h = &grcan_charging; break; + default: LOGOMATIC("Invalid bus\n"); return; + } + + *h = can_init(config); + if (*h == NULL) { + LOGOMATIC("Failed to initialize CAN for bus %d\n", bus); + return; + } + can_start(*h); +} + +void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle *dataCAN, CANHandle *testingCAN, CANHandle *chargingCAN) { - GRCAN_Fancy_RegisterLocalID(localID); - GRCAN_Fancy_RegisterPrimaryCAN(primaryCAN); - GRCAN_Fancy_RegisterDataCAN(dataCAN); grcan_local_node_id = localID; @@ -29,9 +88,19 @@ void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle * LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for data CAN handle\n"); } + if (testingCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for testing CAN handle\n"); + } + + if (chargingCAN == NULL) { + LOGOMATIC("GRCAN_Fancy_Init: Received NULL pointer for charging CAN handle\n"); + } + grcan_primary = primaryCAN; grcan_data = dataCAN; -} + grcan_testing = testingCAN; + grcan_charging = chargingCAN; +} //different version of init function, keeping both architectures to see which works better uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id) { @@ -47,6 +116,7 @@ void GRCAN_Fancy_EncodeID(GRCAN_Fancy_ID *id, uint32_t rawID) { if (id == NULL) { LOGOMATIC("GRCAN_Fancy_Encode: Received NULL pointer\n"); + return; } id->srcID = (rawID >> 20) & 0xFF; @@ -57,40 +127,158 @@ void GRCAN_Fancy_EncodeID(GRCAN_Fancy_ID *id, uint32_t rawID) void GRCAN_Fancy_Send(GR_OLD_BUS_ID bus, GR_OLD_NODE_ID destNode, GR_OLD_MSG_ID messageID, void *data, uint32_t size) { GRCAN_Fancy_ID id = { - .srcID = LOCAL_GR_ID, + .srcID = grcan_local_node_id, .destNode = destNode, .messageID = messageID, }; - GRCAN_Raw_Send(bus, GRCAN_Fancy_Decode(&id), data, size); + if (id.srcID == GR_ALL) { + LOGOMATIC("GRCAN_Fancy_Send: Source ID cannot be GR_ALL\n"); + return; + } + + GRCAN_BusMode mode = GRCAN_BusModeForBus(bus); + if (mode == GRCAN_MODE_FD) { + GRCAN_Raw_Send_FD(bus, GRCAN_Fancy_DecodeID(&id), data, size); + return; + } + else if (mode == GRCAN_MODE_CLASSIC) { + GRCAN_Raw_Send_Classic(bus, GRCAN_Fancy_DecodeID(&id), data, size); + return; + } + else { + LOGOMATIC("GRCAN_Fancy_Send: invalid bus mode for bus %d\n", bus); + return; + } } -void GRCAN_Raw_Send(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) +/* +identifier can be standard (11-bit) or extended (29-bit) +TxFrameType can be data or remote frame + data frame contains 0-8 bytes of data, RTR dominant (0) - send data + remote frame contains no data (still specify DLC), RTR recessive (1) - request data + RTR bit automatically encoded with FDCAN_REMOTE_FRAME and FDCAN_DATA_FRAME, no need to manually set it +ErrorStateIndicator can be active or passive +DataLength can be 0-8 bytes (classic CAN) and must be set to the number of bytes being sent +BitRateSwitch can be on or off, but we will always set it to off +TxEventFifoControl can be set to generate events on transmission +MessageMarker can be used to identify the message in the Tx event FIFO +*/ + +void GRCAN_Raw_Send_Classic(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) { + if (size > 8) { + LOGOMATIC("GRCAN_Raw_Send_Classic: size %lu > 8 (classic CAN)\n", size); + return; + } + FDCANTxHeaderTypeDef header = { .Identifier = rawID, - .IdType = FDCAN_STANDARD_ID, - .TxFrameType = FDCAN_DATA_FRAME, + .IdType = FDCAN_EXTENDED_ID, //using extended ID -- src << 20 | msgID << 8 | dest + .TxFrameType = FDCAN_DATA_FRAME, //data frame .ErrorStateIndicator = FDCAN_ESI_ACTIVE, - .DataLength = size, + .DataLength = FDCAN_DLC_BYTES(size), .BitRateSwitch = FDCAN_BRS_OFF, .TxEventFifoControl = FDCAN_NO_TX_EVENTS, .MessageMarker = 0, }; - FDCANTxMessage msg; + FDCANTxMessage msg = {0}; msg.tx_header = header; - memcpy(&(msg.data), data, size); - - switch (bus) { - case GR_OLD_BUS_PRIMARY: - can_send(grcan_primary, &msg); - break; - case GR_OLD_BUS_DATA: - can_send(grcan_data, &msg); - break; - default: - LOGOMATIC("GRCAN_Raw_Send: Invalid bus ID %d\n", bus); - break; + //memcpy(&(msg.data), data, size); + memcpy(msg.data, data, size); + + if (GRCAN_BusModeForBus(bus) != GRCAN_MODE_CLASSIC) { + LOGOMATIC("GRCAN_Raw_Send_Classic: bus %d is not in classic mode\n", bus); + return; } + + CANHandle *handle = GRCAN_GetHandle(bus); + + if (!handle) { + LOGOMATIC("GRCAN_Raw_Send_Classic: bus %d not configured\n", bus); + return; + } + + can_send(handle, &msg); + // switch (bus) { + // case GR_OLD_BUS_PRIMARY: + // if (!grcan_primary) { LOGOMATIC("ERROR: Primary CAN not configured. Primary Should use FDCAN:\n"); return; } + // can_send(grcan_primary, &msg); + // break; + // case GR_OLD_BUS_DATA: + // if (!grcan_data) { LOGOMATIC("Data CAN not configured\n"); return; } + // can_send(grcan_data, &msg); + // break; + // case GR_OLD_BUS_TESTING: + // if (!grcan_testing) { LOGOMATIC("ERROR: Testing CAN not configured. Testing Should use FDCAN:\n"); return; } + // can_send(grcan_testing, &msg); + // break; + // case GR_OLD_BUS_CHARGING: + // if (!grcan_charging) { LOGOMATIC("Charging CAN not configured\n"); return; } + // can_send(grcan_charging, &msg); + // break; + // default: + // LOGOMATIC("GRCAN_Raw_Send_Classic: Invalid bus ID %d\n", bus); + // break; + // } +} + +void GRCAN_Raw_Send_FD(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) //FDCAN funciton allows for modification with different settings +{ + if (size > 64) { + LOGOMATIC("GRCAN_Raw_Send_FD: size %lu > 64 (CAN FD)\n", size); + return; + } + + FDCANTxHeaderTypeDef header = { + .Identifier = rawID, + .IdType = FDCAN_EXTENDED_ID, //using extended ID -- src << 20 | msgID << 8 | dest + .TxFrameType = FDCAN_DATA_FRAME, //data frame + .ErrorStateIndicator = FDCAN_ESI_ACTIVE, + .DataLength = FDCAN_DLC_BYTES(size), + .BitRateSwitch = FDCAN_BRS_OFF, + .TxEventFifoControl = FDCAN_NO_TX_EVENTS, + .MessageMarker = 0, + }; + + FDCANTxMessage msg = {0}; + msg.tx_header = header; + //memcpy(&(msg.data), data, size); + memcpy(msg.data, data, size); + + if (GRCAN_BusModeForBus(bus) != GRCAN_MODE_FD) { + LOGOMATIC("GRCAN_Raw_Send_FD: bus %d is not in FD mode\n", bus); + return; + } + + CANHandle *handle = GRCAN_GetHandle(bus); + + if (!handle) { + LOGOMATIC("GRCAN_Raw_Send_FD: bus %d not configured\n", bus); + return; + } + + can_send(handle, &msg); + // switch (bus) { + // case GR_OLD_BUS_PRIMARY: + // if (!grcan_primary) { LOGOMATIC("Primary CAN not configured\n"); return; } + // can_send(grcan_primary, &msg); + // break; + // case GR_OLD_BUS_DATA: + // if (!grcan_data) { LOGOMATIC("ERROR: Data CAN not configured. Data Should use FDCAN:\n"); return; } + // can_send(grcan_data, &msg); + // break; + // case GR_OLD_BUS_TESTING: + // if (!grcan_testing) { LOGOMATIC("Testing CAN not configured\n"); return; } + // can_send(grcan_testing, &msg); + // break; + // case GR_OLD_BUS_CHARGING: + // if (!grcan_charging) { LOGOMATIC("ERROR: Charging CAN not configured. Charging Should use FDCAN:\n"); return; } + // can_send(grcan_charging, &msg); + // break; + // default: + // LOGOMATIC("GRCAN_Raw_Send_FD: Invalid bus ID %d\n", bus); + // break; + // } } diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c new file mode 100644 index 000000000..a97a6cea2 --- /dev/null +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c @@ -0,0 +1,63 @@ +#include "GRCAN_FancyLayer.h" + +#include + +#include "GR_OLD_BUS_ID.h" +#include "GR_OLD_MSG_ID.h" +#include "GR_OLD_NODE_ID.h" +#include "Logomatic.h" +#include "can.h" +#include "main.h" + +uint32_t FDCAN_DLC_BYTES(uint32_t size) +{ + switch (size) + { + case 0: return FDCAN_DLC_BYTES_0; + case 1: return FDCAN_DLC_BYTES_1; + case 2: return FDCAN_DLC_BYTES_2; + case 3: return FDCAN_DLC_BYTES_3; + case 4: return FDCAN_DLC_BYTES_4; + case 5: return FDCAN_DLC_BYTES_5; + case 6: return FDCAN_DLC_BYTES_6; + case 7: return FDCAN_DLC_BYTES_7; + case 8: return FDCAN_DLC_BYTES_8; + case 12: return FDCAN_DLC_BYTES_12; + case 16: return FDCAN_DLC_BYTES_16; + case 20: return FDCAN_DLC_BYTES_20; + case 24: return FDCAN_DLC_BYTES_24; + case 32: return FDCAN_DLC_BYTES_32; + case 48: return FDCAN_DLC_BYTES_48; + case 64: return FDCAN_DLC_BYTES_64; + + default: + LOGOMATIC("Invalid CAN FD size: %lu\n", size); + return 0; + } +} + +uint32_t FDCAN_DLC_SIZE(uint32_t dlc) { + switch (dlc) + { + case FDCAN_DLC_BYTES_0: return 0; + case FDCAN_DLC_BYTES_1: return 1; + case FDCAN_DLC_BYTES_2: return 2; + case FDCAN_DLC_BYTES_3: return 3; + case FDCAN_DLC_BYTES_4: return 4; + case FDCAN_DLC_BYTES_5: return 5; + case FDCAN_DLC_BYTES_6: return 6; + case FDCAN_DLC_BYTES_7: return 7; + case FDCAN_DLC_BYTES_8: return 8; + case FDCAN_DLC_BYTES_12: return 12; + case FDCAN_DLC_BYTES_16: return 16; + case FDCAN_DLC_BYTES_20: return 20; + case FDCAN_DLC_BYTES_24: return 24; + case FDCAN_DLC_BYTES_32: return 32; + case FDCAN_DLC_BYTES_48: return 48; + case FDCAN_DLC_BYTES_64: return 64; + + default: + LOGOMATIC("Invalid CAN FD DLC code: %lu\n", dlc); + return 8; + } +} From 7e0f61079440d4cdba4728630b7b2d341d9a756c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 03:58:01 +0000 Subject: [PATCH 7/7] Automatic Clang-Format: Standardized formatting automatically --- .../GRCAN/Inc/GRCAN_FancyLayer.h | 4 +- .../GRCAN/Src/grcan_fancylayer.c | 119 ++++++++++------- .../GRCAN/Src/grcan_utils.c | 124 +++++++++++------- 3 files changed, 148 insertions(+), 99 deletions(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h index f0d2ac6c7..9b79e37f2 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h @@ -12,8 +12,8 @@ typedef struct { GR_OLD_MSG_ID messageID; } GRCAN_Fancy_ID; typedef enum { - GRCAN_MODE_CLASSIC, - GRCAN_MODE_FD + GRCAN_MODE_CLASSIC, + GRCAN_MODE_FD } GRCAN_BusMode; GRCAN_BusMode GRCAN_BusModeForBus(GR_OLD_BUS_ID bus); diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 58fa0bf9d..14806c9ed 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -1,4 +1,5 @@ #include + #include "GR_OLD_BUS_ID.h" #include "GR_OLD_MSG_ID.h" #include "GR_OLD_NODE_ID.h" @@ -35,37 +36,57 @@ static GR_OLD_NODE_ID grcan_local_node_id; GRCAN_BusMode GRCAN_BusModeForBus(GR_OLD_BUS_ID bus) { - switch (bus) { - case GR_OLD_BUS_PRIMARY: return GRCAN_MODE_FD; - case GR_OLD_BUS_TESTING: return GRCAN_MODE_FD; - case GR_OLD_BUS_DATA: return GRCAN_MODE_CLASSIC; - case GR_OLD_BUS_CHARGING: return GRCAN_MODE_CLASSIC; // update later - default: - LOGOMATIC("GRCAN_BusModeForBus: unknown bus %d\n", bus); - return GRCAN_MODE_CLASSIC; - } + switch (bus) { + case GR_OLD_BUS_PRIMARY: + return GRCAN_MODE_FD; + case GR_OLD_BUS_TESTING: + return GRCAN_MODE_FD; + case GR_OLD_BUS_DATA: + return GRCAN_MODE_CLASSIC; + case GR_OLD_BUS_CHARGING: + return GRCAN_MODE_CLASSIC; // update later + default: + LOGOMATIC("GRCAN_BusModeForBus: unknown bus %d\n", bus); + return GRCAN_MODE_CLASSIC; + } } -CANHandle *GRCAN_GetHandle(GR_OLD_BUS_ID bus) { - switch (bus) { - case GR_OLD_BUS_PRIMARY: return grcan_primary; - case GR_OLD_BUS_DATA: return grcan_data; - case GR_OLD_BUS_TESTING: return grcan_testing; - case GR_OLD_BUS_CHARGING: return grcan_charging; - default: return NULL; - } +CANHandle *GRCAN_GetHandle(GR_OLD_BUS_ID bus) +{ + switch (bus) { + case GR_OLD_BUS_PRIMARY: + return grcan_primary; + case GR_OLD_BUS_DATA: + return grcan_data; + case GR_OLD_BUS_TESTING: + return grcan_testing; + case GR_OLD_BUS_CHARGING: + return grcan_charging; + default: + return NULL; + } } void GRCAN_ConfigureBus(GR_OLD_BUS_ID bus, CANConfig *config) { - CANHandle **h = NULL; - switch (bus) { - case GR_OLD_BUS_PRIMARY: h = &grcan_primary; break; - case GR_OLD_BUS_DATA: h = &grcan_data; break; - case GR_OLD_BUS_TESTING: h = &grcan_testing; break; - case GR_OLD_BUS_CHARGING: h = &grcan_charging; break; - default: LOGOMATIC("Invalid bus\n"); return; - } + CANHandle **h = NULL; + switch (bus) { + case GR_OLD_BUS_PRIMARY: + h = &grcan_primary; + break; + case GR_OLD_BUS_DATA: + h = &grcan_data; + break; + case GR_OLD_BUS_TESTING: + h = &grcan_testing; + break; + case GR_OLD_BUS_CHARGING: + h = &grcan_charging; + break; + default: + LOGOMATIC("Invalid bus\n"); + return; + } *h = can_init(config); if (*h == NULL) { @@ -100,7 +121,7 @@ void GRCAN_Fancy_Init(GR_OLD_NODE_ID localID, CANHandle *primaryCAN, CANHandle * grcan_data = dataCAN; grcan_testing = testingCAN; grcan_charging = chargingCAN; -} //different version of init function, keeping both architectures to see which works better +} // different version of init function, keeping both architectures to see which works better uint32_t GRCAN_Fancy_DecodeID(GRCAN_Fancy_ID *id) { @@ -141,13 +162,11 @@ void GRCAN_Fancy_Send(GR_OLD_BUS_ID bus, GR_OLD_NODE_ID destNode, GR_OLD_MSG_ID if (mode == GRCAN_MODE_FD) { GRCAN_Raw_Send_FD(bus, GRCAN_Fancy_DecodeID(&id), data, size); return; - } - else if (mode == GRCAN_MODE_CLASSIC) { + } else if (mode == GRCAN_MODE_CLASSIC) { GRCAN_Raw_Send_Classic(bus, GRCAN_Fancy_DecodeID(&id), data, size); return; - } - else { - LOGOMATIC("GRCAN_Fancy_Send: invalid bus mode for bus %d\n", bus); + } else { + LOGOMATIC("GRCAN_Fancy_Send: invalid bus mode for bus %d\n", bus); return; } } @@ -168,14 +187,14 @@ MessageMarker can be used to identify the message in the Tx event FIFO void GRCAN_Raw_Send_Classic(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) { if (size > 8) { - LOGOMATIC("GRCAN_Raw_Send_Classic: size %lu > 8 (classic CAN)\n", size); - return; - } + LOGOMATIC("GRCAN_Raw_Send_Classic: size %lu > 8 (classic CAN)\n", size); + return; + } FDCANTxHeaderTypeDef header = { .Identifier = rawID, - .IdType = FDCAN_EXTENDED_ID, //using extended ID -- src << 20 | msgID << 8 | dest - .TxFrameType = FDCAN_DATA_FRAME, //data frame + .IdType = FDCAN_EXTENDED_ID, // using extended ID -- src << 20 | msgID << 8 | dest + .TxFrameType = FDCAN_DATA_FRAME, // data frame .ErrorStateIndicator = FDCAN_ESI_ACTIVE, .DataLength = FDCAN_DLC_BYTES(size), .BitRateSwitch = FDCAN_BRS_OFF, @@ -185,7 +204,7 @@ void GRCAN_Raw_Send_Classic(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint3 FDCANTxMessage msg = {0}; msg.tx_header = header; - //memcpy(&(msg.data), data, size); + // memcpy(&(msg.data), data, size); memcpy(msg.data, data, size); if (GRCAN_BusModeForBus(bus) != GRCAN_MODE_CLASSIC) { @@ -196,9 +215,9 @@ void GRCAN_Raw_Send_Classic(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint3 CANHandle *handle = GRCAN_GetHandle(bus); if (!handle) { - LOGOMATIC("GRCAN_Raw_Send_Classic: bus %d not configured\n", bus); - return; - } + LOGOMATIC("GRCAN_Raw_Send_Classic: bus %d not configured\n", bus); + return; + } can_send(handle, &msg); // switch (bus) { @@ -224,17 +243,17 @@ void GRCAN_Raw_Send_Classic(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint3 // } } -void GRCAN_Raw_Send_FD(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) //FDCAN funciton allows for modification with different settings +void GRCAN_Raw_Send_FD(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t size) // FDCAN funciton allows for modification with different settings { if (size > 64) { - LOGOMATIC("GRCAN_Raw_Send_FD: size %lu > 64 (CAN FD)\n", size); - return; - } + LOGOMATIC("GRCAN_Raw_Send_FD: size %lu > 64 (CAN FD)\n", size); + return; + } FDCANTxHeaderTypeDef header = { .Identifier = rawID, - .IdType = FDCAN_EXTENDED_ID, //using extended ID -- src << 20 | msgID << 8 | dest - .TxFrameType = FDCAN_DATA_FRAME, //data frame + .IdType = FDCAN_EXTENDED_ID, // using extended ID -- src << 20 | msgID << 8 | dest + .TxFrameType = FDCAN_DATA_FRAME, // data frame .ErrorStateIndicator = FDCAN_ESI_ACTIVE, .DataLength = FDCAN_DLC_BYTES(size), .BitRateSwitch = FDCAN_BRS_OFF, @@ -244,7 +263,7 @@ void GRCAN_Raw_Send_FD(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t s FDCANTxMessage msg = {0}; msg.tx_header = header; - //memcpy(&(msg.data), data, size); + // memcpy(&(msg.data), data, size); memcpy(msg.data, data, size); if (GRCAN_BusModeForBus(bus) != GRCAN_MODE_FD) { @@ -255,9 +274,9 @@ void GRCAN_Raw_Send_FD(GR_OLD_BUS_ID bus, uint32_t rawID, void *data, uint32_t s CANHandle *handle = GRCAN_GetHandle(bus); if (!handle) { - LOGOMATIC("GRCAN_Raw_Send_FD: bus %d not configured\n", bus); - return; - } + LOGOMATIC("GRCAN_Raw_Send_FD: bus %d not configured\n", bus); + return; + } can_send(handle, &msg); // switch (bus) { diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c index a97a6cea2..17efb60fb 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c @@ -1,7 +1,6 @@ -#include "GRCAN_FancyLayer.h" - #include +#include "GRCAN_FancyLayer.h" #include "GR_OLD_BUS_ID.h" #include "GR_OLD_MSG_ID.h" #include "GR_OLD_NODE_ID.h" @@ -11,53 +10,84 @@ uint32_t FDCAN_DLC_BYTES(uint32_t size) { - switch (size) - { - case 0: return FDCAN_DLC_BYTES_0; - case 1: return FDCAN_DLC_BYTES_1; - case 2: return FDCAN_DLC_BYTES_2; - case 3: return FDCAN_DLC_BYTES_3; - case 4: return FDCAN_DLC_BYTES_4; - case 5: return FDCAN_DLC_BYTES_5; - case 6: return FDCAN_DLC_BYTES_6; - case 7: return FDCAN_DLC_BYTES_7; - case 8: return FDCAN_DLC_BYTES_8; - case 12: return FDCAN_DLC_BYTES_12; - case 16: return FDCAN_DLC_BYTES_16; - case 20: return FDCAN_DLC_BYTES_20; - case 24: return FDCAN_DLC_BYTES_24; - case 32: return FDCAN_DLC_BYTES_32; - case 48: return FDCAN_DLC_BYTES_48; - case 64: return FDCAN_DLC_BYTES_64; + switch (size) { + case 0: + return FDCAN_DLC_BYTES_0; + case 1: + return FDCAN_DLC_BYTES_1; + case 2: + return FDCAN_DLC_BYTES_2; + case 3: + return FDCAN_DLC_BYTES_3; + case 4: + return FDCAN_DLC_BYTES_4; + case 5: + return FDCAN_DLC_BYTES_5; + case 6: + return FDCAN_DLC_BYTES_6; + case 7: + return FDCAN_DLC_BYTES_7; + case 8: + return FDCAN_DLC_BYTES_8; + case 12: + return FDCAN_DLC_BYTES_12; + case 16: + return FDCAN_DLC_BYTES_16; + case 20: + return FDCAN_DLC_BYTES_20; + case 24: + return FDCAN_DLC_BYTES_24; + case 32: + return FDCAN_DLC_BYTES_32; + case 48: + return FDCAN_DLC_BYTES_48; + case 64: + return FDCAN_DLC_BYTES_64; - default: - LOGOMATIC("Invalid CAN FD size: %lu\n", size); - return 0; - } + default: + LOGOMATIC("Invalid CAN FD size: %lu\n", size); + return 0; + } } -uint32_t FDCAN_DLC_SIZE(uint32_t dlc) { - switch (dlc) - { - case FDCAN_DLC_BYTES_0: return 0; - case FDCAN_DLC_BYTES_1: return 1; - case FDCAN_DLC_BYTES_2: return 2; - case FDCAN_DLC_BYTES_3: return 3; - case FDCAN_DLC_BYTES_4: return 4; - case FDCAN_DLC_BYTES_5: return 5; - case FDCAN_DLC_BYTES_6: return 6; - case FDCAN_DLC_BYTES_7: return 7; - case FDCAN_DLC_BYTES_8: return 8; - case FDCAN_DLC_BYTES_12: return 12; - case FDCAN_DLC_BYTES_16: return 16; - case FDCAN_DLC_BYTES_20: return 20; - case FDCAN_DLC_BYTES_24: return 24; - case FDCAN_DLC_BYTES_32: return 32; - case FDCAN_DLC_BYTES_48: return 48; - case FDCAN_DLC_BYTES_64: return 64; +uint32_t FDCAN_DLC_SIZE(uint32_t dlc) +{ + switch (dlc) { + case FDCAN_DLC_BYTES_0: + return 0; + case FDCAN_DLC_BYTES_1: + return 1; + case FDCAN_DLC_BYTES_2: + return 2; + case FDCAN_DLC_BYTES_3: + return 3; + case FDCAN_DLC_BYTES_4: + return 4; + case FDCAN_DLC_BYTES_5: + return 5; + case FDCAN_DLC_BYTES_6: + return 6; + case FDCAN_DLC_BYTES_7: + return 7; + case FDCAN_DLC_BYTES_8: + return 8; + case FDCAN_DLC_BYTES_12: + return 12; + case FDCAN_DLC_BYTES_16: + return 16; + case FDCAN_DLC_BYTES_20: + return 20; + case FDCAN_DLC_BYTES_24: + return 24; + case FDCAN_DLC_BYTES_32: + return 32; + case FDCAN_DLC_BYTES_48: + return 48; + case FDCAN_DLC_BYTES_64: + return 64; - default: - LOGOMATIC("Invalid CAN FD DLC code: %lu\n", dlc); - return 8; - } + default: + LOGOMATIC("Invalid CAN FD DLC code: %lu\n", dlc); + return 8; + } }