From 1d327ad490009f1a35cc9227ee669b0081dc3113 Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 20:54:34 -0700 Subject: [PATCH 01/34] starting sniffer stuff --- CANine/Core/Inc/can_cfg.h | 7 ++ CANine/Core/Inc/fdcan.h | 53 ++++++++++++++ CANine/Core/Src/fdcan.c | 141 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 CANine/Core/Inc/can_cfg.h create mode 100644 CANine/Core/Inc/fdcan.h create mode 100644 CANine/Core/Src/fdcan.c diff --git a/CANine/Core/Inc/can_cfg.h b/CANine/Core/Inc/can_cfg.h new file mode 100644 index 000000000..0e987b82d --- /dev/null +++ b/CANine/Core/Inc/can_cfg.h @@ -0,0 +1,7 @@ +#ifndef CAN_CFG_H +#define CAN_CFG_H + +#define USECAN1 +#define TX_BUFFER_1_SIZE 10 + +#endif diff --git a/CANine/Core/Inc/fdcan.h b/CANine/Core/Inc/fdcan.h new file mode 100644 index 000000000..ceb9a8256 --- /dev/null +++ b/CANine/Core/Inc/fdcan.h @@ -0,0 +1,53 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FDCAN_H__ +#define __FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern FDCAN_HandleTypeDef hfdcan1; + + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_FDCAN1_Init(void); + + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FDCAN_H__ */ diff --git a/CANine/Core/Src/fdcan.c b/CANine/Core/Src/fdcan.c new file mode 100644 index 000000000..0b59d342c --- /dev/null +++ b/CANine/Core/Src/fdcan.c @@ -0,0 +1,141 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "fdcan.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +FDCAN_HandleTypeDef hfdcan1; + +/* FDCAN1 init function */ +void MX_FDCAN1_Init(void) +{ + + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = ENABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = ENABLE; + hfdcan1.Init.NominalPrescaler = 1; + hfdcan1.Init.NominalSyncJumpWidth = 16; + hfdcan1.Init.NominalTimeSeg1 = 119; + hfdcan1.Init.NominalTimeSeg2 = 40; + hfdcan1.Init.DataPrescaler = 8; + hfdcan1.Init.DataSyncJumpWidth = 16; + hfdcan1.Init.DataTimeSeg1 = 14; + hfdcan1.Init.DataTimeSeg2 = 5; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 2; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ +} + +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; + +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* FDCAN1 interrupt Init */ + HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } +} + +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) +{ + + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); + + /* FDCAN1 interrupt Deinit */ + HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn); + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ From 1f6a0768f10f182401704ea28db448b4621ddb1e Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 21:04:11 -0700 Subject: [PATCH 02/34] more stuff --- CANine/Core/Src/stm32g4xx_it.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CANine/Core/Src/stm32g4xx_it.c b/CANine/Core/Src/stm32g4xx_it.c index dc40b1624..414efb2aa 100644 --- a/CANine/Core/Src/stm32g4xx_it.c +++ b/CANine/Core/Src/stm32g4xx_it.c @@ -56,6 +56,8 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern FDCAN_HandleTypeDef hfdcan1; + /* USER CODE BEGIN EV */ @@ -186,6 +188,12 @@ void SysTick_Handler(void) /* USER CODE END SysTick_IRQn 1 */ } +void FDCAN1_IT0_IRQHandler(void){ + + HAL_FDCAN_IRQHandler(&hfdcan1); + +} + /******************************************************************************/ /* STM32G4xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ From dd9ffa987c26271c5112b253b9161c54176bee35 Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 21:17:35 -0700 Subject: [PATCH 03/34] can init --- CANine/Core/Src/main.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index f136aa096..1dff03547 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -23,6 +23,9 @@ /* USER CODE BEGIN Includes */ #include "Logomatic.h" #include "vcp.h" +#include "can.h" +#include "fdcan.h" +#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -83,6 +86,16 @@ VCP_Config vcp_config = {.baud_rate = 4000000, .rx_fifo_threshold = VCP_Threshold_1_8, .usart_instance = USART2, .alternate_function = LL_GPIO_AF_7}; + + +static CANHandle *can1; + +static void can_rx_callback(uint32_t id, void *data, uint32_t size){ + uint8_t buf[FDCAN_MAX_DATA_BYTES]; + memcpy(buf, data, size); + LOGOMATIC("CAN RX: id = 0x%1x size = %1u data[0]=0x%x\n", id, size, buf[0]); +} + /* USER CODE END 0 */ /** @@ -113,13 +126,37 @@ int main(void) /* USER CODE BEGIN SysInit */ Setup_Logomatic(&logomaticConfig); Setup_VCP(&vcp_config); + + LOGOMATIC("Logomatic initialization complete\n"); + VCP_Send((uint8_t *)"VCP initialization complete\n", 29); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ - LOGOMATIC("Logomatic initialization complete\n"); - VCP_Send((uint8_t *)"VCP initialization complete\n", 29); + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + CANConfig cfg1; + if (get_cfg(FDCAN1, can_rx_callback, &cfg1, FDCAN_MODE_NORMAL, 0, 0)){ + LOGOMATIC("CAN: failed to get config\n"); + Error_Handler(); + } + can1 = can_init(&cfg1); + if (can1 == NULL){ + LOGOMATIC("CAN: init failed\n"); + Error_Handler(); + } + + HAL_FDCAN_ConfigGlobalFilter(can1->hal_fdcanP, 0, 0, 0, 0); + + if (can_start(can1)){ + LOGOMATIC("CAN: start failed\n"); + Error_Handler(); + } + + LOGOMATIC("CAN: ready\n"); + + /* USER CODE END 2 */ /* Infinite loop */ From 26f76c8802a878ca210acd73b9520dafaa327f7c Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 21:22:43 -0700 Subject: [PATCH 04/34] update cmake --- CANine/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index 3410dbbb7..73ae6aa75 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -33,6 +33,7 @@ target_sources( Core/Src/main.c Core/Src/stm32g4xx_it.c Core/Src/stm32g4xx_hal_msp.c + Core/Src/fdcan.c ) target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE VCP_LIB) From d26949fd2b059a0d8df0efa2df095f25911c1d0b Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 21:23:41 -0700 Subject: [PATCH 05/34] update cmake --- CANine/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index 73ae6aa75..176c7e4c0 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -36,6 +36,6 @@ target_sources( Core/Src/fdcan.c ) -target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE VCP_LIB) +target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE VCP_LIB PERIPHERAL_CAN_LIB) target_include_directories(${GR_PROJECT_NAME}_USER_CODE INTERFACE Core/Inc) From f25efa4ee941b55cea602cc04f6fabf37575fac4 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:25:17 +0000 Subject: [PATCH 06/34] Automatic CMake Format: Standardized formatting automatically --- CANine/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index 176c7e4c0..299acba46 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -36,6 +36,11 @@ target_sources( Core/Src/fdcan.c ) -target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE VCP_LIB PERIPHERAL_CAN_LIB) +target_link_libraries( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + VCP_LIB + PERIPHERAL_CAN_LIB +) target_include_directories(${GR_PROJECT_NAME}_USER_CODE INTERFACE Core/Inc) From a3d0348636e78460a8b15207041781d3c57f528f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:26:59 +0000 Subject: [PATCH 07/34] Automatic Clang-Format: Standardized formatting automatically --- CANine/Core/Inc/fdcan.h | 2 -- CANine/Core/Src/fdcan.c | 2 +- CANine/Core/Src/main.c | 16 ++++++++-------- CANine/Core/Src/stm32g4xx_it.c | 5 ++--- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/CANine/Core/Inc/fdcan.h b/CANine/Core/Inc/fdcan.h index ceb9a8256..8a144ca5e 100644 --- a/CANine/Core/Inc/fdcan.h +++ b/CANine/Core/Inc/fdcan.h @@ -34,14 +34,12 @@ extern "C" { extern FDCAN_HandleTypeDef hfdcan1; - /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_FDCAN1_Init(void); - /* USER CODE BEGIN Prototypes */ /* USER CODE END Prototypes */ diff --git a/CANine/Core/Src/fdcan.c b/CANine/Core/Src/fdcan.c index 0b59d342c..600ebf188 100644 --- a/CANine/Core/Src/fdcan.c +++ b/CANine/Core/Src/fdcan.c @@ -106,7 +106,7 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) /* USER CODE BEGIN FDCAN1_MspInit 1 */ /* USER CODE END FDCAN1_MspInit 1 */ - } + } } void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 1dff03547..d1d65af33 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -21,11 +21,12 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include + #include "Logomatic.h" -#include "vcp.h" #include "can.h" #include "fdcan.h" -#include +#include "vcp.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -87,10 +88,10 @@ VCP_Config vcp_config = {.baud_rate = 4000000, .usart_instance = USART2, .alternate_function = LL_GPIO_AF_7}; - static CANHandle *can1; -static void can_rx_callback(uint32_t id, void *data, uint32_t size){ +static void can_rx_callback(uint32_t id, void *data, uint32_t size) +{ uint8_t buf[FDCAN_MAX_DATA_BYTES]; memcpy(buf, data, size); LOGOMATIC("CAN RX: id = 0x%1x size = %1u data[0]=0x%x\n", id, size, buf[0]); @@ -137,26 +138,25 @@ int main(void) can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); CANConfig cfg1; - if (get_cfg(FDCAN1, can_rx_callback, &cfg1, FDCAN_MODE_NORMAL, 0, 0)){ + if (get_cfg(FDCAN1, can_rx_callback, &cfg1, FDCAN_MODE_NORMAL, 0, 0)) { LOGOMATIC("CAN: failed to get config\n"); Error_Handler(); } can1 = can_init(&cfg1); - if (can1 == NULL){ + if (can1 == NULL) { LOGOMATIC("CAN: init failed\n"); Error_Handler(); } HAL_FDCAN_ConfigGlobalFilter(can1->hal_fdcanP, 0, 0, 0, 0); - if (can_start(can1)){ + if (can_start(can1)) { LOGOMATIC("CAN: start failed\n"); Error_Handler(); } LOGOMATIC("CAN: ready\n"); - /* USER CODE END 2 */ /* Infinite loop */ diff --git a/CANine/Core/Src/stm32g4xx_it.c b/CANine/Core/Src/stm32g4xx_it.c index 414efb2aa..b3e17d54a 100644 --- a/CANine/Core/Src/stm32g4xx_it.c +++ b/CANine/Core/Src/stm32g4xx_it.c @@ -58,7 +58,6 @@ /* External variables --------------------------------------------------------*/ extern FDCAN_HandleTypeDef hfdcan1; - /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -188,10 +187,10 @@ void SysTick_Handler(void) /* USER CODE END SysTick_IRQn 1 */ } -void FDCAN1_IT0_IRQHandler(void){ +void FDCAN1_IT0_IRQHandler(void) +{ HAL_FDCAN_IRQHandler(&hfdcan1); - } /******************************************************************************/ From fef1fd1b8249fada99e40587e7e066aae822e2cf Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 21:32:40 -0700 Subject: [PATCH 08/34] fixing fdcan --- CANine/Core/Inc/stm32g4xx_hal_conf.h | 2 +- CANine/Core/Src/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CANine/Core/Inc/stm32g4xx_hal_conf.h b/CANine/Core/Inc/stm32g4xx_hal_conf.h index 0888f0058..673034544 100644 --- a/CANine/Core/Inc/stm32g4xx_hal_conf.h +++ b/CANine/Core/Inc/stm32g4xx_hal_conf.h @@ -42,7 +42,7 @@ extern "C" { /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_CRYP_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_FDCAN_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED /*#define HAL_FMAC_MODULE_ENABLED */ /*#define HAL_HRTIM_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index d1d65af33..a54cc8a00 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -94,7 +94,7 @@ static void can_rx_callback(uint32_t id, void *data, uint32_t size) { uint8_t buf[FDCAN_MAX_DATA_BYTES]; memcpy(buf, data, size); - LOGOMATIC("CAN RX: id = 0x%1x size = %1u data[0]=0x%x\n", id, size, buf[0]); + LOGOMATIC("CAN RX: id = 0x%lx size = %lu data[0]=0x%x\n", id, size, buf[0]); } /* USER CODE END 0 */ From 9e357560ff2ce01eefb8735f6424e2e50dfa2852 Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Mon, 6 Apr 2026 21:47:17 -0700 Subject: [PATCH 09/34] fix crash --- CANine/Core/Src/stm32g4xx_it.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/CANine/Core/Src/stm32g4xx_it.c b/CANine/Core/Src/stm32g4xx_it.c index b3e17d54a..dc40b1624 100644 --- a/CANine/Core/Src/stm32g4xx_it.c +++ b/CANine/Core/Src/stm32g4xx_it.c @@ -56,7 +56,6 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ -extern FDCAN_HandleTypeDef hfdcan1; /* USER CODE BEGIN EV */ @@ -187,12 +186,6 @@ void SysTick_Handler(void) /* USER CODE END SysTick_IRQn 1 */ } -void FDCAN1_IT0_IRQHandler(void) -{ - - HAL_FDCAN_IRQHandler(&hfdcan1); -} - /******************************************************************************/ /* STM32G4xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ From 411b5c5cb916abe26fedac9113774c6eeb218a2e Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Mon, 6 Apr 2026 21:55:32 -0700 Subject: [PATCH 10/34] ye --- CANine/CMakeLists.txt | 1 - CANine/Core/Src/fdcan.c | 141 ---------------------------------------- CANine/Core/Src/main.c | 1 - 3 files changed, 143 deletions(-) delete mode 100644 CANine/Core/Src/fdcan.c diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index 299acba46..af31b3e17 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -33,7 +33,6 @@ target_sources( Core/Src/main.c Core/Src/stm32g4xx_it.c Core/Src/stm32g4xx_hal_msp.c - Core/Src/fdcan.c ) target_link_libraries( diff --git a/CANine/Core/Src/fdcan.c b/CANine/Core/Src/fdcan.c deleted file mode 100644 index 600ebf188..000000000 --- a/CANine/Core/Src/fdcan.c +++ /dev/null @@ -1,141 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "fdcan.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -FDCAN_HandleTypeDef hfdcan1; - -/* FDCAN1 init function */ -void MX_FDCAN1_Init(void) -{ - - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = ENABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = ENABLE; - hfdcan1.Init.NominalPrescaler = 1; - hfdcan1.Init.NominalSyncJumpWidth = 16; - hfdcan1.Init.NominalTimeSeg1 = 119; - hfdcan1.Init.NominalTimeSeg2 = 40; - hfdcan1.Init.DataPrescaler = 8; - hfdcan1.Init.DataSyncJumpWidth = 16; - hfdcan1.Init.DataTimeSeg1 = 14; - hfdcan1.Init.DataTimeSeg2 = 5; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 2; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ -} - -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; - -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* FDCAN1 interrupt Init */ - HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } -} - -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); - - /* FDCAN1 interrupt Deinit */ - HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn); - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index a54cc8a00..15d56dc35 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -25,7 +25,6 @@ #include "Logomatic.h" #include "can.h" -#include "fdcan.h" #include "vcp.h" /* USER CODE END Includes */ From 93236af465908e67dc04ccfe64dc519cd2a916b0 Mon Sep 17 00:00:00 2001 From: Nandini Date: Mon, 6 Apr 2026 22:42:33 -0700 Subject: [PATCH 11/34] config not working --- CANine/Application/Src/CANdler.c | 0 CANine/Core/Src/main.c | 135 +++++++++++++++++++++++++------ 2 files changed, 110 insertions(+), 25 deletions(-) create mode 100644 CANine/Application/Src/CANdler.c diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c new file mode 100644 index 000000000..e69de29bb diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 15d56dc35..aecf2873c 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -89,19 +89,124 @@ VCP_Config vcp_config = {.baud_rate = 4000000, static CANHandle *can1; -static void can_rx_callback(uint32_t id, void *data, uint32_t size) +void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) { - uint8_t buf[FDCAN_MAX_DATA_BYTES]; - memcpy(buf, data, size); - LOGOMATIC("CAN RX: id = 0x%lx size = %lu data[0]=0x%x\n", id, size, buf[0]); + // ECU_CAN_MessageHandler(&stateLump, GR_OLD_BUS_PRIMARY, + // (0x000FFF00 & ID) >> 8, // TODO: Double check + // (0xFF00000 & ID) >> 20, data, size); } + //CANConfig cfg1; + void CAN_Configure() { + + + CANConfig canCfg; + can1 = can_init(&canCfg); + + + // SHARED config ddata for CAN1 and CAN2 + canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; + canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; + canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + canCfg.hal_fdcan_init.Mode = FDCAN_MODE_NORMAL; + canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; + canCfg.hal_fdcan_init.TransmitPause = DISABLE; + canCfg.hal_fdcan_init.ProtocolException = ENABLE; + canCfg.hal_fdcan_init.NominalPrescaler = 1; + canCfg.hal_fdcan_init.NominalSyncJumpWidth = 16; + canCfg.hal_fdcan_init.NominalTimeSeg1 = 127; // Updated for 170MHz: (1+127+42)*1 = 170 ticks -> 1 Mbps + canCfg.hal_fdcan_init.NominalTimeSeg2 = 42; + canCfg.hal_fdcan_init.DataPrescaler = 2; + canCfg.hal_fdcan_init.DataSyncJumpWidth = 16; + canCfg.hal_fdcan_init.DataTimeSeg1 = 12; // Updated for 170MHz: 170 MHz/((1+12+4)*2) = 5 Mbps + canCfg.hal_fdcan_init.DataTimeSeg2 = 4; + canCfg.hal_fdcan_init.StdFiltersNbr = 1; + canCfg.hal_fdcan_init.ExtFiltersNbr = 0; + + canCfg.rx_callback = NULL; + canCfg.rx_interrupt_priority = 15; // TODO: Maybe make these not hardcoded + canCfg.tx_interrupt_priority = 15; + // canCfg.tx_buffer_length = CAN_TX_BUFFER_LENGTH; + + // RX shared settings + canCfg.init_rx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_rx_gpio.Pull = GPIO_PULLUP; + canCfg.init_rx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + // TX Shared settings + canCfg.init_tx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_tx_gpio.Pull = GPIO_NOPULL; + canCfg.init_tx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + /*FDCAN_TxHeaderTypeDef TxHeader = { + .Identifier = 1, + + .IdType = FDCAN_STANDARD_ID, + .TxFrameType = FDCAN_DATA_FRAME, + .ErrorStateIndicator = FDCAN_ESI_ACTIVE, // honestly this might be a value you have to read from a node + // FDCAN_ESI_ACTIVE is just a state that assumes there are minimal errors + .DataLength = 1, + .BitRateSwitch = FDCAN_BRS_OFF, + .TxEventFifoControl = FDCAN_NO_TX_EVENTS, // change to FDCAN_STORE_TX_EVENTS if you need to store info regarding transmitted messages + .MessageMarker = 0 // also change this to a real address if you change fifo control + }; + + FDCANTxMessage msg = {.data = {0x80}, .tx_header = TxHeader}; + */ + + // PCLK1 from SYSCLK + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + // CAN1 ===================================================================== + canCfg.fdcan_instance = FDCAN1; + canCfg.rx_gpio = GPIOA; + canCfg.init_rx_gpio.Pin = GPIO_PIN_11; + canCfg.init_rx_gpio.Alternate = GPIO_AF9_FDCAN1; + + canCfg.tx_gpio = GPIOA; + canCfg.init_tx_gpio.Pin = GPIO_PIN_12; + canCfg.init_tx_gpio.Alternate = GPIO_AF9_FDCAN1; + + // RX Callback CAN1 + canCfg.rx_callback = CAN1_rx_callback; // TODO: Make sure the wrapper for this is defined correctly + + //primary_can = can_init(&canCfg); + + // // Filter 1 Definitions + // FDCAN_FilterTypeDef fdcan1_filter; + + // fdcan1_filter.IdType = FDCAN_EXTENDED_ID; + // fdcan1_filter.FilterIndex = 0; + // fdcan1_filter.FilterType = FDCAN_FILTER_MASK; + // fdcan1_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; + // fdcan1_filter.FilterID1 = LOCAL_GR_ID; // filter messages with ECU destination + // fdcan1_filter.FilterID2 = 0x00000FF; + + // fdcan1_filter.FilterIndex = 1; + // fdcan1_filter.FilterID1 = 0xFF; // filter messages for all targets + // HAL_FDCAN_ConfigFilter(primary_can->hal_fdcanP, &fdcan1_filter); + + //data_can = can_init(&canCfg); + + // accept unmatched standard and extended frames into RXFIFO0 - default behaviour + + can_start(can1); +} + + + + /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ + + + + + int main(void) { @@ -134,28 +239,8 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - CANConfig cfg1; - if (get_cfg(FDCAN1, can_rx_callback, &cfg1, FDCAN_MODE_NORMAL, 0, 0)) { - LOGOMATIC("CAN: failed to get config\n"); - Error_Handler(); - } - can1 = can_init(&cfg1); - if (can1 == NULL) { - LOGOMATIC("CAN: init failed\n"); - Error_Handler(); - } - - HAL_FDCAN_ConfigGlobalFilter(can1->hal_fdcanP, 0, 0, 0, 0); - - if (can_start(can1)) { - LOGOMATIC("CAN: start failed\n"); - Error_Handler(); - } - - LOGOMATIC("CAN: ready\n"); + CAN_Configure(); /* USER CODE END 2 */ /* Infinite loop */ From 2936df32b7996dc4d1c3acf7b3d3c85c268d0d70 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:43:48 +0000 Subject: [PATCH 12/34] Automatic Clang-Format: Standardized formatting automatically --- CANine/Core/Src/main.c | 196 ++++++++++++++++++++--------------------- 1 file changed, 94 insertions(+), 102 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index aecf2873c..cef867cdd 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -96,105 +96,101 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) // (0xFF00000 & ID) >> 20, data, size); } - //CANConfig cfg1; - void CAN_Configure() { - - - CANConfig canCfg; - can1 = can_init(&canCfg); - - - // SHARED config ddata for CAN1 and CAN2 - canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; - canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; - canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - canCfg.hal_fdcan_init.Mode = FDCAN_MODE_NORMAL; - canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; - canCfg.hal_fdcan_init.TransmitPause = DISABLE; - canCfg.hal_fdcan_init.ProtocolException = ENABLE; - canCfg.hal_fdcan_init.NominalPrescaler = 1; - canCfg.hal_fdcan_init.NominalSyncJumpWidth = 16; - canCfg.hal_fdcan_init.NominalTimeSeg1 = 127; // Updated for 170MHz: (1+127+42)*1 = 170 ticks -> 1 Mbps - canCfg.hal_fdcan_init.NominalTimeSeg2 = 42; - canCfg.hal_fdcan_init.DataPrescaler = 2; - canCfg.hal_fdcan_init.DataSyncJumpWidth = 16; - canCfg.hal_fdcan_init.DataTimeSeg1 = 12; // Updated for 170MHz: 170 MHz/((1+12+4)*2) = 5 Mbps - canCfg.hal_fdcan_init.DataTimeSeg2 = 4; - canCfg.hal_fdcan_init.StdFiltersNbr = 1; - canCfg.hal_fdcan_init.ExtFiltersNbr = 0; - - canCfg.rx_callback = NULL; - canCfg.rx_interrupt_priority = 15; // TODO: Maybe make these not hardcoded - canCfg.tx_interrupt_priority = 15; - // canCfg.tx_buffer_length = CAN_TX_BUFFER_LENGTH; - - // RX shared settings - canCfg.init_rx_gpio.Mode = GPIO_MODE_AF_PP; - canCfg.init_rx_gpio.Pull = GPIO_PULLUP; - canCfg.init_rx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - - // TX Shared settings - canCfg.init_tx_gpio.Mode = GPIO_MODE_AF_PP; - canCfg.init_tx_gpio.Pull = GPIO_NOPULL; - canCfg.init_tx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - - /*FDCAN_TxHeaderTypeDef TxHeader = { - .Identifier = 1, - - .IdType = FDCAN_STANDARD_ID, - .TxFrameType = FDCAN_DATA_FRAME, - .ErrorStateIndicator = FDCAN_ESI_ACTIVE, // honestly this might be a value you have to read from a node - // FDCAN_ESI_ACTIVE is just a state that assumes there are minimal errors - .DataLength = 1, - .BitRateSwitch = FDCAN_BRS_OFF, - .TxEventFifoControl = FDCAN_NO_TX_EVENTS, // change to FDCAN_STORE_TX_EVENTS if you need to store info regarding transmitted messages - .MessageMarker = 0 // also change this to a real address if you change fifo control - }; - - FDCANTxMessage msg = {.data = {0x80}, .tx_header = TxHeader}; - */ - - // PCLK1 from SYSCLK - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - // CAN1 ===================================================================== - canCfg.fdcan_instance = FDCAN1; - canCfg.rx_gpio = GPIOA; - canCfg.init_rx_gpio.Pin = GPIO_PIN_11; - canCfg.init_rx_gpio.Alternate = GPIO_AF9_FDCAN1; - - canCfg.tx_gpio = GPIOA; - canCfg.init_tx_gpio.Pin = GPIO_PIN_12; - canCfg.init_tx_gpio.Alternate = GPIO_AF9_FDCAN1; - - // RX Callback CAN1 - canCfg.rx_callback = CAN1_rx_callback; // TODO: Make sure the wrapper for this is defined correctly - - //primary_can = can_init(&canCfg); - - // // Filter 1 Definitions - // FDCAN_FilterTypeDef fdcan1_filter; - - // fdcan1_filter.IdType = FDCAN_EXTENDED_ID; - // fdcan1_filter.FilterIndex = 0; - // fdcan1_filter.FilterType = FDCAN_FILTER_MASK; - // fdcan1_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; - // fdcan1_filter.FilterID1 = LOCAL_GR_ID; // filter messages with ECU destination - // fdcan1_filter.FilterID2 = 0x00000FF; - - // fdcan1_filter.FilterIndex = 1; - // fdcan1_filter.FilterID1 = 0xFF; // filter messages for all targets - // HAL_FDCAN_ConfigFilter(primary_can->hal_fdcanP, &fdcan1_filter); - - //data_can = can_init(&canCfg); - - // accept unmatched standard and extended frames into RXFIFO0 - default behaviour - - can_start(can1); -} - - +// CANConfig cfg1; +void CAN_Configure() +{ + CANConfig canCfg; + can1 = can_init(&canCfg); + + // SHARED config ddata for CAN1 and CAN2 + canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; + canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; + canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + canCfg.hal_fdcan_init.Mode = FDCAN_MODE_NORMAL; + canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; + canCfg.hal_fdcan_init.TransmitPause = DISABLE; + canCfg.hal_fdcan_init.ProtocolException = ENABLE; + canCfg.hal_fdcan_init.NominalPrescaler = 1; + canCfg.hal_fdcan_init.NominalSyncJumpWidth = 16; + canCfg.hal_fdcan_init.NominalTimeSeg1 = 127; // Updated for 170MHz: (1+127+42)*1 = 170 ticks -> 1 Mbps + canCfg.hal_fdcan_init.NominalTimeSeg2 = 42; + canCfg.hal_fdcan_init.DataPrescaler = 2; + canCfg.hal_fdcan_init.DataSyncJumpWidth = 16; + canCfg.hal_fdcan_init.DataTimeSeg1 = 12; // Updated for 170MHz: 170 MHz/((1+12+4)*2) = 5 Mbps + canCfg.hal_fdcan_init.DataTimeSeg2 = 4; + canCfg.hal_fdcan_init.StdFiltersNbr = 1; + canCfg.hal_fdcan_init.ExtFiltersNbr = 0; + + canCfg.rx_callback = NULL; + canCfg.rx_interrupt_priority = 15; // TODO: Maybe make these not hardcoded + canCfg.tx_interrupt_priority = 15; + // canCfg.tx_buffer_length = CAN_TX_BUFFER_LENGTH; + + // RX shared settings + canCfg.init_rx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_rx_gpio.Pull = GPIO_PULLUP; + canCfg.init_rx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + // TX Shared settings + canCfg.init_tx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_tx_gpio.Pull = GPIO_NOPULL; + canCfg.init_tx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + /*FDCAN_TxHeaderTypeDef TxHeader = { + .Identifier = 1, + + .IdType = FDCAN_STANDARD_ID, + .TxFrameType = FDCAN_DATA_FRAME, + .ErrorStateIndicator = FDCAN_ESI_ACTIVE, // honestly this might be a value you have to read from a node + // FDCAN_ESI_ACTIVE is just a state that assumes there are minimal errors + .DataLength = 1, + .BitRateSwitch = FDCAN_BRS_OFF, + .TxEventFifoControl = FDCAN_NO_TX_EVENTS, // change to FDCAN_STORE_TX_EVENTS if you need to store info regarding transmitted messages + .MessageMarker = 0 // also change this to a real address if you change fifo control + }; + + FDCANTxMessage msg = {.data = {0x80}, .tx_header = TxHeader}; + */ + + // PCLK1 from SYSCLK + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + // CAN1 ===================================================================== + canCfg.fdcan_instance = FDCAN1; + canCfg.rx_gpio = GPIOA; + canCfg.init_rx_gpio.Pin = GPIO_PIN_11; + canCfg.init_rx_gpio.Alternate = GPIO_AF9_FDCAN1; + + canCfg.tx_gpio = GPIOA; + canCfg.init_tx_gpio.Pin = GPIO_PIN_12; + canCfg.init_tx_gpio.Alternate = GPIO_AF9_FDCAN1; + + // RX Callback CAN1 + canCfg.rx_callback = CAN1_rx_callback; // TODO: Make sure the wrapper for this is defined correctly + + // primary_can = can_init(&canCfg); + + // // Filter 1 Definitions + // FDCAN_FilterTypeDef fdcan1_filter; + + // fdcan1_filter.IdType = FDCAN_EXTENDED_ID; + // fdcan1_filter.FilterIndex = 0; + // fdcan1_filter.FilterType = FDCAN_FILTER_MASK; + // fdcan1_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; + // fdcan1_filter.FilterID1 = LOCAL_GR_ID; // filter messages with ECU destination + // fdcan1_filter.FilterID2 = 0x00000FF; + + // fdcan1_filter.FilterIndex = 1; + // fdcan1_filter.FilterID1 = 0xFF; // filter messages for all targets + // HAL_FDCAN_ConfigFilter(primary_can->hal_fdcanP, &fdcan1_filter); + + // data_can = can_init(&canCfg); + + // accept unmatched standard and extended frames into RXFIFO0 - default behaviour + + can_start(can1); +} /* USER CODE END 0 */ @@ -203,10 +199,6 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) * @retval int */ - - - - int main(void) { From ecc79adf309408462d8ca6ec1d60dea532002a78 Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Thu, 9 Apr 2026 20:57:32 -0700 Subject: [PATCH 13/34] comment out logo and vcp fornow --- CANine/Core/Src/main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index cef867cdd..e77fe73ce 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -63,7 +63,7 @@ static void MX_GPIO_Init(void); LogomaticConfig logomaticConfig = {.clock_source = LOGOMATIC_PCLK1, .bus = LOGOMATIC_BUS, .gpio_port = LOGOMATIC_GPIOA, - .gpio_pin_rx_tx_mask = LL_GPIO_PIN_9 | LL_GPIO_PIN_10, + .gpio_pin_rx_tx_mask = LL_GPIO_PIN_2 | LL_GPIO_PIN_3, .baud_rate = 115200, .data_width = LOGOMATIC_DATAWIDTH_8B, .stop_bits = LOGOMATIC_STOPBITS_1, @@ -101,7 +101,6 @@ void CAN_Configure() { CANConfig canCfg; - can1 = can_init(&canCfg); // SHARED config ddata for CAN1 and CAN2 canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; @@ -188,6 +187,7 @@ void CAN_Configure() // data_can = can_init(&canCfg); // accept unmatched standard and extended frames into RXFIFO0 - default behaviour + can1 = can_init(&canCfg); can_start(can1); } @@ -224,8 +224,8 @@ int main(void) Setup_Logomatic(&logomaticConfig); Setup_VCP(&vcp_config); - LOGOMATIC("Logomatic initialization complete\n"); - VCP_Send((uint8_t *)"VCP initialization complete\n", 29); + // LOGOMATIC("Logomatic initialization complete\n"); + // VCP_Send((uint8_t *)"VCP initialization complete\n", 29); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ @@ -241,8 +241,8 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - LOGOMATIC("Hello, LOGOMATIC! Great to be here\n"); - VCP_Send((uint8_t *)"Hello, VCP! Great to be here\n", 30); + // LOGOMATIC("Hello, LOGOMATIC! Great to be here\n"); + // VCP_Send((uint8_t *)"Hello, VCP! Great to be here\n", 30); LL_mDelay(750); } From f52de54565b4d5dcfccad033d0cb15d694ef98d3 Mon Sep 17 00:00:00 2001 From: Nandini Date: Thu, 9 Apr 2026 21:06:11 -0700 Subject: [PATCH 14/34] so like idk what to do but we writing switch cases for message handling ig --- CANine/Application/Src/CANdler.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index e69de29bb..c8e19cc33 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -0,0 +1,18 @@ +#include "CANdler.h" + +#include + +#include "GRCAN_BUS_ID.h" +#include "GRCAN_MSG_ID.h" +#include "GRCAN_NODE_ID.h" +#include "GRCAN_MSG_DATA.h" +#include "Logomatic.h" +#include "Pinging.h" +#include "StateData.h" +#include "bitManipulations.h" + + + +void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length){ + +} From 796c872abdde6104325d182d9d192eb7816b6857 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:07:29 +0000 Subject: [PATCH 15/34] Automatic Clang-Format: Standardized formatting automatically --- CANine/Application/Src/CANdler.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index c8e19cc33..9896918dd 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -3,16 +3,12 @@ #include #include "GRCAN_BUS_ID.h" +#include "GRCAN_MSG_DATA.h" #include "GRCAN_MSG_ID.h" #include "GRCAN_NODE_ID.h" -#include "GRCAN_MSG_DATA.h" #include "Logomatic.h" #include "Pinging.h" #include "StateData.h" #include "bitManipulations.h" - - -void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length){ - -} +void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) {} From 7e9794c11e21285d1b1a48b5c290a3ffda0e0efb Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Thu, 9 Apr 2026 21:21:01 -0700 Subject: [PATCH 16/34] fix unused --- CANine/Core/Src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index e77fe73ce..dc1185477 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -91,6 +91,9 @@ static CANHandle *can1; void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) { + UNUSED(ID); + UNUSED(data); + UNUSED(size); // ECU_CAN_MessageHandler(&stateLump, GR_OLD_BUS_PRIMARY, // (0x000FFF00 & ID) >> 8, // TODO: Double check // (0xFF00000 & ID) >> 20, data, size); From 895662a455c615bd616066648ffcf9fcefb34be9 Mon Sep 17 00:00:00 2001 From: Nandini Date: Thu, 9 Apr 2026 21:58:55 -0700 Subject: [PATCH 17/34] okie now we all branch off and do our own thing --- CANine/Application/Src/CANdler.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index 9896918dd..8dc5dda4e 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -11,4 +11,8 @@ #include "StateData.h" #include "bitManipulations.h" -void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) {} +void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) { + switch (msg_id){ + + } +} From 9907b0a21151b847d1840af327ab020dfe38f118 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 05:00:11 +0000 Subject: [PATCH 18/34] Automatic Clang-Format: Standardized formatting automatically --- CANine/Application/Src/CANdler.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index 8dc5dda4e..b2fe07df9 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -11,8 +11,8 @@ #include "StateData.h" #include "bitManipulations.h" -void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) { - switch (msg_id){ - - } +void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) +{ + switch (msg_id) { + } } From bdd3b5da74864614672a4b94cdfc29a6ec084457 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 12 Apr 2026 22:58:10 -0700 Subject: [PATCH 19/34] Remove VCP (no support) Signed-off-by: Daniel Hansen --- CANine/Core/Src/main.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index dc1185477..2a26c30f7 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -25,7 +25,6 @@ #include "Logomatic.h" #include "can.h" -#include "vcp.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -74,19 +73,6 @@ LogomaticConfig logomaticConfig = {.clock_source = LOGOMATIC_PCLK1, .tx_fifo_threshold = LOGOMATIC_FIFOTHRESHOLD_1_8, .rx_fifo_threshold = LOGOMATIC_FIFOTHRESHOLD_1_8}; -VCP_Config vcp_config = {.baud_rate = 4000000, - .clock_source = VCP_CLOCK_PCLK, - .gpio_tx_rx_pin_mask = LL_GPIO_PIN_2 | LL_GPIO_PIN_3, - .bus_port = VCP_Port_A, - .parity = VCP_Parity_None, - .prescaler = VCP_Prescalar_Div1, - .stop_bits = VCP_StopBits_1, - .oversampling = VCP_Oversampling_16, - .tx_fifo_threshold = VCP_Threshold_1_8, - .rx_fifo_threshold = VCP_Threshold_1_8, - .usart_instance = USART2, - .alternate_function = LL_GPIO_AF_7}; - static CANHandle *can1; void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) @@ -225,7 +211,6 @@ int main(void) /* USER CODE BEGIN SysInit */ Setup_Logomatic(&logomaticConfig); - Setup_VCP(&vcp_config); // LOGOMATIC("Logomatic initialization complete\n"); // VCP_Send((uint8_t *)"VCP initialization complete\n", 29); @@ -244,7 +229,7 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - // LOGOMATIC("Hello, LOGOMATIC! Great to be here\n"); + LOGOMATIC("Hello, LOGOMATIC! Great to be here\n"); // VCP_Send((uint8_t *)"Hello, VCP! Great to be here\n", 30); LL_mDelay(750); From fb858379f477e829a1cf918b17ef6ab0fbf362a5 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 12 Apr 2026 23:33:58 -0700 Subject: [PATCH 20/34] Cleanup CANine and setup loopback testing for debugging Signed-off-by: Daniel Hansen --- CANine/Application/Inc/CANdler.h | 6 ++ CANine/Application/Src/CANdler.c | 15 ++--- CANine/CMakeLists.txt | 9 ++- CANine/Core/Inc/fdcan.h | 51 ----------------- CANine/Core/Src/main.c | 49 ++++++++++++---- CANine/Core/Src/stm32g4xx_hal_msp.c | 86 ----------------------------- 6 files changed, 57 insertions(+), 159 deletions(-) create mode 100644 CANine/Application/Inc/CANdler.h delete mode 100644 CANine/Core/Inc/fdcan.h delete mode 100644 CANine/Core/Src/stm32g4xx_hal_msp.c diff --git a/CANine/Application/Inc/CANdler.h b/CANine/Application/Inc/CANdler.h new file mode 100644 index 000000000..fda166893 --- /dev/null +++ b/CANine/Application/Inc/CANdler.h @@ -0,0 +1,6 @@ +#include + +#ifndef CANDLER_H +#define CANDLER_H +void LoopbackTest(uint32_t ID, void *data, uint32_t size); +#endif diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index b2fe07df9..e81a7b152 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -2,17 +2,14 @@ #include -#include "GRCAN_BUS_ID.h" -#include "GRCAN_MSG_DATA.h" -#include "GRCAN_MSG_ID.h" -#include "GRCAN_NODE_ID.h" #include "Logomatic.h" -#include "Pinging.h" -#include "StateData.h" -#include "bitManipulations.h" -void ECU_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) +void LoopbackTest(uint32_t ID, void *data, uint32_t size) { - switch (msg_id) { + uint8_t *bytes = (uint8_t *)data; + LOGOMATIC("Received CAN message with ID: 0x%lX, data: 0x", ID); + for (uint32_t i = 0; i < size; i++) { + LOGOMATIC("%02X", bytes[i]); } + LOGOMATIC("\n"); } diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index af31b3e17..7c8a029bf 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -30,16 +30,19 @@ add_library(${GR_PROJECT_NAME}_USER_CODE INTERFACE) target_sources( ${GR_PROJECT_NAME}_USER_CODE INTERFACE + # Core Core/Src/main.c Core/Src/stm32g4xx_it.c - Core/Src/stm32g4xx_hal_msp.c + # Application + Application/Src/CANdler.c ) target_link_libraries( ${GR_PROJECT_NAME}_USER_CODE INTERFACE - VCP_LIB PERIPHERAL_CAN_LIB + CANfigurator + BitManipulations_Lib ) -target_include_directories(${GR_PROJECT_NAME}_USER_CODE INTERFACE Core/Inc) +target_include_directories(${GR_PROJECT_NAME}_USER_CODE INTERFACE Core/Inc Application/Inc) diff --git a/CANine/Core/Inc/fdcan.h b/CANine/Core/Inc/fdcan.h deleted file mode 100644 index 8a144ca5e..000000000 --- a/CANine/Core/Inc/fdcan.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FDCAN_H__ -#define __FDCAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern FDCAN_HandleTypeDef hfdcan1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FDCAN1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __FDCAN_H__ */ diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 2a26c30f7..ba32affe1 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -22,7 +22,10 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include - +#include "CANdler.h" +#include "GRCAN_MSG_DATA.h" +#include "GRCAN_MSG_ID.h" +#include "GRCAN_NODE_ID.h" #include "Logomatic.h" #include "can.h" /* USER CODE END Includes */ @@ -35,11 +38,18 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ +// TODO Comment and uncomment this line as relevant +#define EXTERNAL_LOOPBACK_TEST + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ - +#ifdef EXTERNAL_LOOPBACK_TEST +#pragma message("Testing with external loopback") +#else +#pragma message("Testing with external CAN bus") +#endif /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ @@ -77,12 +87,11 @@ static CANHandle *can1; void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) { - UNUSED(ID); - UNUSED(data); - UNUSED(size); - // ECU_CAN_MessageHandler(&stateLump, GR_OLD_BUS_PRIMARY, - // (0x000FFF00 & ID) >> 8, // TODO: Double check - // (0xFF00000 & ID) >> 20, data, size); + #ifdef EXTERNAL_LOOPBACK_TEST + LoopbackTest(ID, data, size); + #else + // FIXME Put a call to the actual callback here + #endif } // CANConfig cfg1; @@ -95,7 +104,11 @@ void CAN_Configure() canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + #ifdef EXTERNAL_LOOPBACK_TEST + canCfg.hal_fdcan_init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK; + #else canCfg.hal_fdcan_init.Mode = FDCAN_MODE_NORMAL; + #endif canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; canCfg.hal_fdcan_init.TransmitPause = DISABLE; canCfg.hal_fdcan_init.ProtocolException = ENABLE; @@ -229,8 +242,24 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - LOGOMATIC("Hello, LOGOMATIC! Great to be here\n"); - // VCP_Send((uint8_t *)"Hello, VCP! Great to be here\n", 30); + LOGOMATIC("Main loop iteration\n"); + + #ifdef EXTERNAL_LOOPBACK_TEST + LOGOMATIC("Sending CAN message in external loopback mode\n"); + FDCANTxMessage sendECUMsg; + sendECUMsg.tx_header.Identifier = 0x12345678; + sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; + sendECUMsg.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendECUMsg.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendECUMsg.tx_header.DataLength = FDCAN_DLC_BYTES_3; + sendECUMsg.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendECUMsg.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendECUMsg.tx_header.MessageMarker = 0; + sendECUMsg.data[0] = 0xAB; + sendECUMsg.data[1] = 0xCD; + sendECUMsg.data[2] = 0xEF; + can_send(can1, &sendECUMsg); + #endif LL_mDelay(750); } diff --git a/CANine/Core/Src/stm32g4xx_hal_msp.c b/CANine/Core/Src/stm32g4xx_hal_msp.c deleted file mode 100644 index f266230dd..000000000 --- a/CANine/Core/Src/stm32g4xx_hal_msp.c +++ /dev/null @@ -1,86 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ From 49823fc4e5cf3a486c10235c4a32e93408af924c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 06:35:09 +0000 Subject: [PATCH 21/34] Automatic CMake Format: Standardized formatting automatically --- CANine/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CANine/CMakeLists.txt b/CANine/CMakeLists.txt index 7c8a029bf..3884f59f2 100644 --- a/CANine/CMakeLists.txt +++ b/CANine/CMakeLists.txt @@ -45,4 +45,9 @@ target_link_libraries( BitManipulations_Lib ) -target_include_directories(${GR_PROJECT_NAME}_USER_CODE INTERFACE Core/Inc Application/Inc) +target_include_directories( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + Core/Inc + Application/Inc +) From 4b3241da6dd5e5206552b7107c037dd5f1593bf8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 06:36:36 +0000 Subject: [PATCH 22/34] Automatic Clang-Format: Standardized formatting automatically --- CANine/Core/Src/main.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index ba32affe1..e305881ea 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -22,6 +22,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include + #include "CANdler.h" #include "GRCAN_MSG_DATA.h" #include "GRCAN_MSG_ID.h" @@ -87,11 +88,11 @@ static CANHandle *can1; void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) { - #ifdef EXTERNAL_LOOPBACK_TEST +#ifdef EXTERNAL_LOOPBACK_TEST LoopbackTest(ID, data, size); - #else - // FIXME Put a call to the actual callback here - #endif +#else +// FIXME Put a call to the actual callback here +#endif } // CANConfig cfg1; @@ -104,11 +105,11 @@ void CAN_Configure() canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - #ifdef EXTERNAL_LOOPBACK_TEST +#ifdef EXTERNAL_LOOPBACK_TEST canCfg.hal_fdcan_init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK; - #else +#else canCfg.hal_fdcan_init.Mode = FDCAN_MODE_NORMAL; - #endif +#endif canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; canCfg.hal_fdcan_init.TransmitPause = DISABLE; canCfg.hal_fdcan_init.ProtocolException = ENABLE; @@ -244,7 +245,7 @@ int main(void) /* USER CODE BEGIN 3 */ LOGOMATIC("Main loop iteration\n"); - #ifdef EXTERNAL_LOOPBACK_TEST +#ifdef EXTERNAL_LOOPBACK_TEST LOGOMATIC("Sending CAN message in external loopback mode\n"); FDCANTxMessage sendECUMsg; sendECUMsg.tx_header.Identifier = 0x12345678; @@ -259,7 +260,7 @@ int main(void) sendECUMsg.data[1] = 0xCD; sendECUMsg.data[2] = 0xEF; can_send(can1, &sendECUMsg); - #endif +#endif LL_mDelay(750); } From 25b7bed31249743fe8ab1b059adf39ca9793ae3c Mon Sep 17 00:00:00 2001 From: krai19 Date: Mon, 13 Apr 2026 21:34:50 -0700 Subject: [PATCH 23/34] most updated CANdler.c file with LOGOMATIC statements --- CANine/Application/Src/CANdler.c | 205 ++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 1 deletion(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index e81a7b152..eae260afa 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -1,8 +1,26 @@ #include "CANdler.h" #include - +#include "GRCAN_MSG_DATA.h" +#include "GRCAN_BUS_ID.h" +#include "GRCAN_MSG_ID.h" +#include "GRCAN_NODE_ID.h" #include "Logomatic.h" +#include "bitManipulations.h" + +void ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + // TODO Ideally change some state data to note a bad message, ie if BCU + // that can be a comms error + LOGOMATIC("Bad CAN Message length! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + +void ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + // Filtering likely needs to be adjusted if this is happening often + LOGOMATIC("Unhandled ECU CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + void LoopbackTest(uint32_t ID, void *data, uint32_t size) { @@ -13,3 +31,188 @@ void LoopbackTest(uint32_t ID, void *data, uint32_t size) } LOGOMATIC("\n"); } + +void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) { + switch (msg_id) { + case GRCAN_DEBUG_2_0: + if (data_length > sizeof(GRCAN_DEBUG_2_0)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + LOGOMATIC("Received from %02X on bus %d: %.*s\n", sender_id, bus_id, (int)data_length, data); + break; + + case GRCAN_DEBUG_FD: + if (data_length > sizeof(GRCAN_DEBUG_FD)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + LOGOMATIC("Received from %02X on bus %d: %.*s\n", sender_id, bus_id, (int)data_length, data); + break; + case GRCAN_DASH_CONFIG: + if (data_length > sizeof(GRCAN_DASH_CONFIG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_DASH_CONFIG_MSG * grcan_dash_config_msg = (GRCAN_DASH_CONFIG_MSG *) data; + LOGOMATIC("BMS: %s\n", GETBIT(grcan_dash_config_msg->led_bits, 0) ? "true" : "false"); + LOGOMATIC("IMD %s\n", GETBIT(grcan_dash_config_msg->led_bits, 1) ? "true" : "false"); + LOGOMATIC("BSPD %s\n", GETBIT(grcan_dash_config_msg->led_bits, 2) ? "true" : "false"); + break; + case GRCAN_TCM_STATUS: + if (data_length > sizeof(GRCAN_TCM_STATUS_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_TCM_STATUS_MSG * grcan_tcm_status_msg = (GRCAN_TCM_STATUS_MSG *)data; + LOGOMATIC("Connection Status: %s\n", GETBIT(grcan_tcm_status_msg->status_bits, 0) ? "OK" : "Timeout"); + LOGOMATIC("MQTT Status: %s\n", GETBIT(grcan_tcm_status_msg->status_bits, 1) ? "OK" : "Timeout"); + LOGOMATIC("Epic Shelter Status %s\n", GETBIT(grcan_tcm_status_msg->status_bits, 2) ? "In Progress" : "Idle"); + LOGOMATIC("Camera Status %s\n", GETBIT(grcan_tcm_status_msg->status_bits, 3) ? "Recording" : "Idle"); + + LOGOMATIC("Mapache Ping: %u ms\n", grcan_tcm_status_msg->mapache_ping); + LOGOMATIC("Cache Size: %lu \n", grcan_tcm_status_msg->cache_size); + + break; + case GRCAN_TCM_RESOURCE_UTILIZATION: + if (data_length > sizeof(GRCAN_TCM_RESOURCE_UTILIZATION_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_TCM_RESOURCE_UTILIZATION_MSG * grcan_tcm_resource_utilization_msg = (GRCAN_TCM_RESOURCE_UTILIZATION_MSG *)data; + LOGOMATIC("Core 0 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_0_freq); + LOGOMATIC("Core 0 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_0_util); + LOGOMATIC("Core 1 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_1_freq); + LOGOMATIC("Core 1 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_1_util); + LOGOMATIC("Core 2 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_2_freq); + LOGOMATIC("Core 2 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_2_util); + LOGOMATIC("Core 3 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_3_freq); + LOGOMATIC("Core 3 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_3_util); + LOGOMATIC("Core 4 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_4_freq); + LOGOMATIC("Core 4 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_4_util); + LOGOMATIC("Core 5 Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->cpu_5_freq); + LOGOMATIC("Core 5 Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_5_util); + LOGOMATIC("Total CPU Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->cpu_total_util); + LOGOMATIC("Total Memory: %u MB\n", grcan_tcm_resource_utilization_msg->ram_total); + LOGOMATIC("Used Memory: %u MB\n", grcan_tcm_resource_utilization_msg->ram_used); + LOGOMATIC("Memory Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->ram_util); + LOGOMATIC("GPU Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->gpu_util); + LOGOMATIC("GPU Frequency: %u MHz\n", grcan_tcm_resource_utilization_msg->gpu_freq); + LOGOMATIC("Total Disk Space: %lu MB\n", grcan_tcm_resource_utilization_msg->disk_total); + LOGOMATIC("Used Disk Space: %lu MB\n", grcan_tcm_resource_utilization_msg->disk_used); + LOGOMATIC("Disk Utilization: %u%%\n", grcan_tcm_resource_utilization_msg->disk_util); + LOGOMATIC("CPU Temp: %u ˚C\n", grcan_tcm_resource_utilization_msg->cpu_temp); + LOGOMATIC("GPU Temp: %u ˚C\n", grcan_tcm_resource_utilization_msg->gpu_temp); + LOGOMATIC("Voltage Draw: %u mV\n", grcan_tcm_resource_utilization_msg->voltage_draw); + LOGOMATIC("Current Draw: %u mA\n", grcan_tcm_resource_utilization_msg->current_draw); + LOGOMATIC("Power Draw: %u mW\n", grcan_tcm_resource_utilization_msg->power_draw); + + break; + case GRCAN_ECU_ANALOG_DATA: + if (data_length > sizeof(GRCAN_ECU_ANALOG_DATA_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_ECU_ANALOG_DATA_MSG * grcan_ecu_analog_data_msg = (GRCAN_ECU_ANALOG_DATA_MSG *)data; + + LOGOMATIC("All of the following ECU Analog Signals are in the range of 4-20 mA: "); + LOGOMATIC("BSPD Signal: %u mA\n", grcan_ecu_analog_data_msg->bspd_signal); + LOGOMATIC("BSE Signal: %u mA\n", grcan_ecu_analog_data_msg->bse_signal); + LOGOMATIC("Apps 1 Signal: %u mA\n", grcan_ecu_analog_data_msg->apps_1_signal); + LOGOMATIC("Apps 2 Signal: %u mA\n", grcan_ecu_analog_data_msg->apps_2_signal); + LOGOMATIC("Brakeline F Signal: %u mA\n", grcan_ecu_analog_data_msg->brakeline_f_signal); + LOGOMATIC("Brakeline R Signal: %u mA\n", grcan_ecu_analog_data_msg->brakeline_r_signal); + LOGOMATIC("Steering Angle Signal: %u mA\n", grcan_ecu_analog_data_msg->steering_angle_signal); + LOGOMATIC("Aux Signal: %u mA\n", grcan_ecu_analog_data_msg->aux_signal); + + break; + case GRCAN_GPS_LAT: + if (data_length > sizeof(GRCAN_GPS_LAT_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_LAT_MSG * grcan_gps_lat_msg = (GRCAN_GPS_LAT_MSG *)data; + + LOGOMATIC("Lattitude: %u \n", grcan_gps_lat_msg->lat); + break; + case GRCAN_GPS_LON: + if (data_length > sizeof(GRCAN_GPS_LON_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_LON_MSG * grcan_gps_lon_msg = (GRCAN_GPS_LON_MSG *)data; + + LOGOMATIC("Longitude: %u \n", grcan_gps_lon_msg->lon); + break; + case GRCAN_GPS_ALT: + if (data_length > sizeof(GRCAN_GPS_ALT_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_ALT_MSG * grcan_gps_alt_msg = (GRCAN_GPS_ALT_MSG *)data; + + LOGOMATIC("Altitude: %u \n", grcan_gps_alt_msg->alt); + break; + case GRCAN_GPS_PX: + if (data_length > sizeof(GRCAN_GPS_PX_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_PX_MSG * grcan_gps_px_msg = (GRCAN_GPS_PX_MSG *)data; + + LOGOMATIC("Theta: %u \n", grcan_gps_px_msg->theta); + LOGOMATIC("Acc: %u \n", grcan_gps_px_msg->acc); + LOGOMATIC("Status: %lu \n", grcan_gps_px_msg->status); + + break; + case GRCAN_GPS_QY: + if (data_length > sizeof(GRCAN_GPS_QY_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_QY_MSG * grcan_gps_qy_msg = (GRCAN_GPS_QY_MSG *)data; + + LOGOMATIC("Theta: %u \n", grcan_gps_qy_msg->theta); + LOGOMATIC("Acc: %u \n", grcan_gps_qy_msg->acc); + LOGOMATIC("Status: %lu \n", grcan_gps_qy_msg->status); + + break; + case GRCAN_GPS_RZ: + if (data_length > sizeof(GRCAN_GPS_RZ_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_GPS_RZ_MSG * grcan_gps_rz_msg = (GRCAN_GPS_RZ_MSG *)data; + + LOGOMATIC("Theta: %u \n", grcan_gps_rz_msg->theta); + LOGOMATIC("Acc: %u \n", grcan_gps_rz_msg->acc); + LOGOMATIC("Status: %lu \n", grcan_gps_rz_msg->status); + + break; + case GRCAN_UVW_DGPS: + if (data_length > sizeof(GRCAN_UVW_DGPS_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_UVW_DGPS_MSG * grcan_uvw_dgps_msg = (GRCAN_UVW_DGPS_MSG *)data; + + LOGOMATIC("U: %u \n", grcan_uvw_dgps_msg->dgps_u); + LOGOMATIC("V: %u \n", grcan_uvw_dgps_msg->dgps_v); + LOGOMATIC("W: %u \n", grcan_uvw_dgps_msg->dgps_w); + + break; + case GRCAN_ECU_PERFORMANCE: + if (data_length > sizeof(GRCAN_ECU_PERFORMANCE_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_ECU_PERFORMANCE_MSG * grcan_ecu_performance_msg = (GRCAN_ECU_PERFORMANCE_MSG *)data; + + LOGOMATIC("Total number of clock cycles elapsed for 10 iterations of the main loop: %lu \n", grcan_ecu_performance_msg->elapsed_cycles); + + break; + default: + ReportUnhandledMessage(bus_id, msg_id, sender_id); + break; + } +} From 9589bbbf613d7dd1498d1dd7e15ed4c1b9056654 Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Mon, 13 Apr 2026 22:07:01 -0700 Subject: [PATCH 24/34] all --- CANine/Application/Inc/CANdler.h | 9 +++++++++ CANine/Core/Src/main.c | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CANine/Application/Inc/CANdler.h b/CANine/Application/Inc/CANdler.h index fda166893..2316ce77a 100644 --- a/CANine/Application/Inc/CANdler.h +++ b/CANine/Application/Inc/CANdler.h @@ -1,6 +1,15 @@ #include +#include "GRCAN_MSG_DATA.h" +#include "GRCAN_MSG_ID.h" +#include "GRCAN_BUS_ID.h" +#include "GRCAN_NODE_ID.h" #ifndef CANDLER_H #define CANDLER_H +void ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id); +void ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id); void LoopbackTest(uint32_t ID, void *data, uint32_t size); +void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length); + + #endif diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index e305881ea..afcc8adde 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -91,7 +91,7 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) #ifdef EXTERNAL_LOOPBACK_TEST LoopbackTest(ID, data, size); #else -// FIXME Put a call to the actual callback here + CAN_MessageHandler(GRCAN_BUS_PRIMARY, (0x000FFF00 & ID) >> 8, (0xFF00000 & ID) >> 20, (uint8_t*)data, size); #endif } From 0cafac453c0132361435cc99217b3cc960123701 Mon Sep 17 00:00:00 2001 From: CrolineCrois Date: Mon, 13 Apr 2026 22:32:12 -0700 Subject: [PATCH 25/34] send msg for test --- CANine/Core/Src/main.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index afcc8adde..8a24d8e69 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -40,7 +40,7 @@ /* USER CODE BEGIN PD */ // TODO Comment and uncomment this line as relevant -#define EXTERNAL_LOOPBACK_TEST +// #define EXTERNAL_LOOPBACK_TEST /* USER CODE END PD */ @@ -244,9 +244,10 @@ int main(void) /* USER CODE BEGIN 3 */ LOGOMATIC("Main loop iteration\n"); + sendMSG(); #ifdef EXTERNAL_LOOPBACK_TEST - LOGOMATIC("Sending CAN message in external loopback mode\n"); + LOGOMATIC("Sending CAN message in external loopback mode\n"); FDCANTxMessage sendECUMsg; sendECUMsg.tx_header.Identifier = 0x12345678; sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; @@ -260,6 +261,7 @@ int main(void) sendECUMsg.data[1] = 0xCD; sendECUMsg.data[2] = 0xEF; can_send(can1, &sendECUMsg); + #endif LL_mDelay(750); @@ -267,6 +269,16 @@ int main(void) /* USER CODE END 3 */ } +void sendMSG(){ + LOGOMATIC("Sending CAN message in external loopback mode\n"); + GRCAN_GPS_QY_MSG testDashConfig; + testDashConfig.theta = "hi"; + testDashConfig.acc = "yo"; + testDashConfig.acc = "cora"; + can_send(can1, &testDashConfig); + + } + /** * @brief System Clock Configuration * @retval None From 9c597e9a3a73be3d2f1c57d1ce12ce6dc94f0bf9 Mon Sep 17 00:00:00 2001 From: krai19 Date: Mon, 13 Apr 2026 23:28:53 -0700 Subject: [PATCH 26/34] sendMSG implementation working better --- CANine/Core/Src/main.c | 67 ++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 8a24d8e69..43817f5b3 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -40,7 +40,7 @@ /* USER CODE BEGIN PD */ // TODO Comment and uncomment this line as relevant -// #define EXTERNAL_LOOPBACK_TEST +#define EXTERNAL_LOOPBACK_TEST /* USER CODE END PD */ @@ -95,6 +95,27 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) #endif } +void sendMSG(){ + FDCANTxMessage sendECUMsg; + + sendECUMsg.tx_header.Identifier = (0x000FFF00 & GRCAN_GPS_RZ) >> 8; + sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; + sendECUMsg.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendECUMsg.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendECUMsg.tx_header.DataLength = FDCAN_DLC_BYTES_8; + sendECUMsg.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendECUMsg.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendECUMsg.tx_header.MessageMarker = 0; + + GRCAN_GPS_RZ_MSG message = {.theta = 0xABCD, .acc = 0x1234, .status = 0x12345678}; + + memcpy(sendECUMsg.data, &message, sizeof(message)); + + can_send(can1, &sendECUMsg); + + + } + // CANConfig cfg1; void CAN_Configure() { @@ -246,38 +267,34 @@ int main(void) LOGOMATIC("Main loop iteration\n"); sendMSG(); -#ifdef EXTERNAL_LOOPBACK_TEST - LOGOMATIC("Sending CAN message in external loopback mode\n"); - FDCANTxMessage sendECUMsg; - sendECUMsg.tx_header.Identifier = 0x12345678; - sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; - sendECUMsg.tx_header.TxFrameType = FDCAN_DATA_FRAME; - sendECUMsg.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; - sendECUMsg.tx_header.DataLength = FDCAN_DLC_BYTES_3; - sendECUMsg.tx_header.BitRateSwitch = FDCAN_BRS_OFF; - sendECUMsg.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; - sendECUMsg.tx_header.MessageMarker = 0; - sendECUMsg.data[0] = 0xAB; - sendECUMsg.data[1] = 0xCD; - sendECUMsg.data[2] = 0xEF; - can_send(can1, &sendECUMsg); +// #ifdef EXTERNAL_LOOPBACK_TEST +// LOGOMATIC("Sending CAN message in external loopback mode\n"); +// FDCANTxMessage sendECUMsg; -#endif +// sendECUMsg.tx_header.Identifier = (0x000FFF00 & GRCAN_GPS_RZ) >> 8; +// sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; +// sendECUMsg.tx_header.TxFrameType = FDCAN_DATA_FRAME; +// sendECUMsg.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; +// sendECUMsg.tx_header.DataLength = FDCAN_DLC_BYTES_8; +// sendECUMsg.tx_header.BitRateSwitch = FDCAN_BRS_OFF; +// sendECUMsg.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; +// sendECUMsg.tx_header.MessageMarker = 0; + +// GRCAN_GPS_RZ_MSG message = {.theta = 0xABCD, .acc = 0x1234, .status = 0x12345678}; + +// memcpy(sendECUMsg.data, &message, sizeof(message)); + +// can_send(can1, &sendECUMsg); + +// #endif LL_mDelay(750); } + /* USER CODE END 3 */ } -void sendMSG(){ - LOGOMATIC("Sending CAN message in external loopback mode\n"); - GRCAN_GPS_QY_MSG testDashConfig; - testDashConfig.theta = "hi"; - testDashConfig.acc = "yo"; - testDashConfig.acc = "cora"; - can_send(can1, &testDashConfig); - } /** * @brief System Clock Configuration From 774561bda4c75de81fa6da640ade8afb3431c644 Mon Sep 17 00:00:00 2001 From: Nandini Date: Thu, 16 Apr 2026 22:50:12 -0700 Subject: [PATCH 27/34] make some changes so that internal loopback testing works now --- .vscode/launch.json | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e51ff0935..992411427 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,7 +19,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -50,7 +50,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -81,7 +81,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -112,7 +112,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -132,6 +132,7 @@ "request": "launch", "type": "cortex-debug", "servertype": "openocd", + "runToEntryPoint": "main", "configFiles": [ "interface/stlink.cfg", "target/stm32g4x.cfg" @@ -143,7 +144,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -174,7 +175,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 160000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -205,7 +206,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -236,7 +237,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -267,7 +268,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -329,7 +330,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 80000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -393,7 +394,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -424,7 +425,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -455,7 +456,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -486,7 +487,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -517,7 +518,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -548,7 +549,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -579,7 +580,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -610,7 +611,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -641,7 +642,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -672,7 +673,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { @@ -703,7 +704,7 @@ "swoConfig": { "enabled": true, "cpuFrequency": 170000000, - "swoFrequency": 2000000, + "swoFrequency": 500000, "source": "probe", "decoders": [ { From 69fe9c46748cdf72ad55c76514d9008e941edccb Mon Sep 17 00:00:00 2001 From: krai19 Date: Thu, 30 Apr 2026 20:34:39 -0700 Subject: [PATCH 28/34] working version --- .vscode/settings.json | 3 ++- CANine/Core/Src/main.c | 24 +++++++----------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2370caa0c..5e71e685a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,5 +23,6 @@ "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true, "files.eol": "\n", - "cmake.useCMakePresets": "always" + "cmake.useCMakePresets": "always", + "C_Cpp.errorSquiggles": "disabled" } diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 43817f5b3..86e5b1118 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -1,15 +1,5 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file + + /* This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * @@ -88,17 +78,17 @@ static CANHandle *can1; void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) { -#ifdef EXTERNAL_LOOPBACK_TEST - LoopbackTest(ID, data, size); -#else +//#ifdef EXTERNAL_LOOPBACK_TEST +// LoopbackTest(ID, data, size); +//#else CAN_MessageHandler(GRCAN_BUS_PRIMARY, (0x000FFF00 & ID) >> 8, (0xFF00000 & ID) >> 20, (uint8_t*)data, size); -#endif +//#endif } void sendMSG(){ FDCANTxMessage sendECUMsg; - sendECUMsg.tx_header.Identifier = (0x000FFF00 & GRCAN_GPS_RZ) >> 8; + sendECUMsg.tx_header.Identifier = (GRCAN_DGPS << 20) | (GRCAN_GPS_RZ << 8) | GRCAN_Debugger; sendECUMsg.tx_header.IdType = FDCAN_EXTENDED_ID; sendECUMsg.tx_header.TxFrameType = FDCAN_DATA_FRAME; sendECUMsg.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; From 3316be305a7573032dbd138907d092fab46adb62 Mon Sep 17 00:00:00 2001 From: krai19 Date: Thu, 7 May 2026 20:45:03 -0700 Subject: [PATCH 29/34] candler completed draft 1 --- CANine/Application/Src/CANdler.c | 264 ++++++++++++++++++++++++++++++- CANine/Core/Src/main.c | 33 +++- 2 files changed, 287 insertions(+), 10 deletions(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index eae260afa..0aae99884 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -1,5 +1,5 @@ #include "CANdler.h" - +#include "StateMachine.h" #include #include "GRCAN_MSG_DATA.h" #include "GRCAN_BUS_ID.h" @@ -18,7 +18,7 @@ void ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE void ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) { // Filtering likely needs to be adjusted if this is happening often - LOGOMATIC("Unhandled ECU CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); + LOGOMATIC("Unhandled CANine CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); } @@ -35,22 +35,273 @@ void LoopbackTest(uint32_t ID, void *data, uint32_t size) void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) { switch (msg_id) { case GRCAN_DEBUG_2_0: - if (data_length > sizeof(GRCAN_DEBUG_2_0)) { + if (data_length > sizeof(GRCAN_DEBUG_2_0_MSG)) { ReportBadMessageLength(bus_id, msg_id, sender_id); break; } LOGOMATIC("Received from %02X on bus %d: %.*s\n", sender_id, bus_id, (int)data_length, data); break; - case GRCAN_DEBUG_FD: - if (data_length > sizeof(GRCAN_DEBUG_FD)) { + if (data_length > sizeof(GRCAN_DEBUG_FD_MSG)) { ReportBadMessageLength(bus_id, msg_id, sender_id); break; } LOGOMATIC("Received from %02X on bus %d: %.*s\n", sender_id, bus_id, (int)data_length, data); break; + case GRCAN_PING: + if (data_length > sizeof(GRCAN_PING_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_PING_MSG * grcan_ping_msg = (GRCAN_PING_MSG *) data; + LOGOMATIC("Time in millis: %u", grcan_ping_msg->timestamp); + break; + case GRCAN_ECU_STATUS_1: + if (data_length > sizeof(GRCAN_ECU_STATUS_1_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_ECU_STATUS_1_MSG * grcan_ecu_status_1_msg = (GRCAN_ECU_STATUS_1_MSG *) data; + switch (grcan_ecu_status_1_msg->ecu_state) { + case GR_GLV_OFF: + LOGOMATIC("Current ECU State: GR_GLV_OFF \n"); + break; + case GR_GLV_ON: + LOGOMATIC("Current ECU State: GR_GLV_ON \n"); + break; + case GR_PRECHARGE_ENGAGED: + LOGOMATIC("Current ECU State: GR_PRECHARGE_ENGAGED \n"); + break; + case GR_PRECHARGE_COMPLETE: + LOGOMATIC("Current ECU State: GR_PRECHARGE_COMPLETE \n"); + break; + case GR_DRIVE_ACTIVE: + LOGOMATIC("Current ECU State: GR_DRIVE_ACTIVE \n"); + break; + case GR_TS_DISCHARGE: + LOGOMATIC("Current ECU State: GR_TS_DISCHARGE \n"); + break; + default: + LOGOMATIC("Current ECU State: None found \n"); + break; + } + + LOGOMATIC("BCU Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 0) ? "OK" : "Timeout"); + LOGOMATIC("GR Inverter Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 1) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 1 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 2) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 2 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 3) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 3 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 4) ? "OK" : "Timeout"); + LOGOMATIC("Dash Panel Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 5) ? "OK" : "Timeout"); + LOGOMATIC("TCM Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 6) ? "OK" : "Timeout"); + + //What is this value????? + LOGOMATIC("Power Level Torque Map: \n"); + + LOGOMATIC("Max Cell Temperature: %u\n", grcan_ecu_status_1_msg->max_cell_temp); + LOGOMATIC("Percent of accumlator charged: %u\n", grcan_ecu_status_1_msg->accumulator_state_of_charge); + LOGOMATIC("Percent of Low Voltage Bat charged: %u\n", grcan_ecu_status_1_msg->glv_state_of_charge); + LOGOMATIC("Output terminal voltage of accumulator: %u\n", grcan_ecu_status_1_msg->tractive_system_voltage); + break; + case GRCAN_ECU_STATUS_2: + if (data_length > sizeof(GRCAN_ECU_STATUS_2_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_ECU_STATUS_2_MSG * grcan_ecu_status_2_msg = (GRCAN_ECU_STATUS_2_MSG *)data; + LOGOMATIC("Absolute value of speed: %u\n", grcan_ecu_status_2_msg->vehicle_speed); + LOGOMATIC("FR Wheel RPM: %u\n", grcan_ecu_status_2_msg->fr_wheel_rpm); + LOGOMATIC("FL Wheel RPM: %u\n", grcan_ecu_status_2_msg->fl_wheel_rpm); + LOGOMATIC("RR Wheel RPM: %u\n", grcan_ecu_status_2_msg->rr_wheel_rpm); + break; + + + + + + + + // case GRCAN_ECU_STATUS_3: + // if (data_length > sizeof(GRCAN_ECU_STATUS_3_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_ECU_STATUS_3_MSG * grcan_ecu_status_3 = (GRCAN_ECU_STATUS_3_MSG *)data; + // LOGOMATIC("Wheel RPM: %u\n", grcan_ecu_status_3->rl_wheel_rpm); + // break; + // //what to do about this? + // case GRCAN_ECU_CONFIG: + // if (data_length > sizeof(GRCAN_ECU_CONFIG_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_ECU_CONFIG_MSG * grcan_ecu_config = (GRCAN_ECU_CONFIG_MSG *)data; + // break; + // case GRCAN_BCU_CELL_DATA_1: + // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_BCU_CELL_DATA_1_MSG * grcan_bcu_cell_data_1_msg = (GRCAN_BCU_CELL_DATA_1_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 1, grcan_bcu_cell_data_1_msg->cells[i].voltage, grcan_bcu_cell_data_1_msg->cells[i].temperature); + // } + // break; + + // case GRCAN_BCU_CELL_DATA_2: + // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_2_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_BCU_CELL_DATA_2_MSG * grcan_bcu_cell_data_2_msg = (GRCAN_BCU_CELL_DATA_2_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 33, grcan_bcu_cell_data_2_msg->cells[i].voltage, grcan_bcu_cell_data_2_msg->cells[i].temperature); + // } + // break; + + // case GRCAN_BCU_CELL_DATA_3: + // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_3_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_BCU_CELL_DATA_3_MSG * grcan_bcu_cell_data_3_msg = (GRCAN_BCU_CELL_DATA_3_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 65, grcan_bcu_cell_data_3_msg->cells[i].voltage, grcan_bcu_cell_data_3_msg->cells[i].temperature); + // } + // break; + + // case GRCAN_BCU_CELL_DATA_4: + // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_4_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_BCU_CELL_DATA_4_MSG * grcan_bcu_cell_data_4_msg = (GRCAN_BCU_CELL_DATA_4_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 97, grcan_bcu_cell_data_4_msg->cells[i].voltage, grcan_bcu_cell_data_4_msg->cells[i].temperature); + // } + // break; + + // case GRCAN_BCU_CELL_DATA_5: + // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_5_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_BCU_CELL_DATA_5_MSG * grcan_bcu_cell_data_5_msg = (GRCAN_BCU_CELL_DATA_5_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 129, grcan_bcu_cell_data_5_msg->cells[i].voltage, grcan_bcu_cell_data_5_msg->cells[i].temperature); + // } + // break; + + // case GRCAN_INVERTER_STATUS_1: + // if (data_length > sizeof(GRCAN_INVERTER_STATUS_1_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_INVERTER_STATUS_1_MSG * grcan_inverter_status_1_msg = (GRCAN_INVERTER_STATUS_1_MSG *)data; + // LOGOMATIC("AC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->ac_current); + // LOGOMATIC("DC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->dc_current); + // LOGOMATIC("Motor RPM: %u (RPM)\n", grcan_inverter_status_1_msg->motor_rpm); + // break; + + // case GRCAN_INVERTER_STATUS_2: + // if (data_length > sizeof(GRCAN_INVERTER_STATUS_2_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_INVERTER_STATUS_2_MSG * grcan_inverter_status_2_msg = (GRCAN_INVERTER_STATUS_2_MSG *)data; + // LOGOMATIC("U MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->u_mosfet_temperature); + // LOGOMATIC("V MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->v_mosfet_temperature); + // LOGOMATIC("W MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->w_mosfet_temperature); + // break; + + // case GRCAN_INVERTER_STATUS_3: + // if (data_length > sizeof(GRCAN_INVERTER_STATUS_3_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_INVERTER_STATUS_3_MSG * grcan_inverter_status_3_msg = (GRCAN_INVERTER_STATUS_3_MSG *)data; + // LOGOMATIC("Motor Temp: %u (Celsius + 40)\n", grcan_inverter_status_3_msg->motor_temperature); + // LOGOMATIC("TS Over Max: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 0) ? "FAIL" : "OK"); + // LOGOMATIC("TS Under Min: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 1) ? "FAIL" : "OK"); + // LOGOMATIC("Inverter Over Temp: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 2) ? "FAIL" : "OK"); + // LOGOMATIC("Motor Over Temp: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 3) ? "FAIL" : "OK"); + // LOGOMATIC("Mosfet Drive Error: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 4) ? "FAIL" : "OK"); + // LOGOMATIC("Encoder Error: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 5) ? "FAIL" : "OK"); + // LOGOMATIC("CAN Error/Timeout: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 6) ? "FAIL" : "OK"); + // break; + + // case GRCAN_INVERTER_CONFIG: + // if (data_length > sizeof(GRCAN_INVERTER_CONFIG_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_INVERTER_CONFIG_MSG * grcan_inverter_config_msg = (GRCAN_INVERTER_CONFIG_MSG *)data; + // LOGOMATIC("Max AC Current: %u\n", grcan_inverter_config_msg->max_ac_current); + // LOGOMATIC("Max DC Current: %u\n", grcan_inverter_config_msg->max_dc_current); + // LOGOMATIC("RPM Limit: %u (0: No limit)\n", grcan_inverter_config_msg->absolute_max_rpm_limit); + // LOGOMATIC("Motor Direction: %s\n", (grcan_inverter_config_msg->motor_direction == 1) ? "Inverted" : "Normal"); + // break; + + // case GRCAN_INVERTER_COMMAND: + // if (data_length > sizeof(GRCAN_INVERTER_COMMAND_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_INVERTER_COMMAND_MSG * grcan_inverter_command_msg = (GRCAN_INVERTER_COMMAND_MSG *)data; + // LOGOMATIC("Set AC Current: %u\n", grcan_inverter_command_msg->set_ac_current); + // LOGOMATIC("Set DC Current: %u\n", grcan_inverter_command_msg->set_dc_current); + // LOGOMATIC("RPM Limit: %u\n", grcan_inverter_command_msg->rpm_limit); + // LOGOMATIC("Field Weakening: %u\n", grcan_inverter_command_msg->field_weakening); + // LOGOMATIC("Drive Enable: %s\n", (grcan_inverter_command_msg->drive_enable == 1) ? "ENABLED" : "DISABLED"); + // break; + + // case GRCAN_FAN_STATUS: + // if (data_length > sizeof(GRCAN_FAN_STATUS_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_FAN_STATUS_MSG * grcan_fan_status_msg = (GRCAN_FAN_STATUS_MSG *)data; + // LOGOMATIC("Fan Speed: %u RPM\n", grcan_fan_status_msg->fan_speed); + // LOGOMATIC("Input Voltage: %u (0-22)\n", grcan_fan_status_msg->input_voltage); + // LOGOMATIC("Input Current: %u (0-10)\n", grcan_fan_status_msg->input_current); + // break; + + // case GRCAN_FAN_COMMAND: + // if (data_length > sizeof(GRCAN_FAN_COMMAND_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_FAN_COMMAND_MSG * grcan_fan_command_msg = (GRCAN_FAN_COMMAND_MSG *)data; + // LOGOMATIC("Fan Command: %u Percent\n", grcan_fan_command_msg->fan_command); + // break; + + // //is this correct + // case GRCAN_DASH_STATUS: + // if (data_length > sizeof(GRCAN_DASH_STATUS_MSG)) { + // ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_DASH_STATUS_MSG * grcan_dash_status_msg = (GRCAN_DASH_STATUS_MSG *)data; + // LOGOMATIC("TS Active: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 0) ? "YES" : "NO"); + // LOGOMATIC("RTD: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 1) ? "YES" : "NO"); + // LOGOMATIC("LED BMS: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 0) ? "ON" : "OFF"); + // LOGOMATIC("LED IMD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 1) ? "ON" : "OFF"); + // LOGOMATIC("LED BSPD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 2) ? "ON" : "OFF"); + // break; + + + + + + + + + + + + + case GRCAN_DASH_CONFIG: - if (data_length > sizeof(GRCAN_DASH_CONFIG)) { + if (data_length > sizeof(GRCAN_DASH_CONFIG_MSG)) { ReportBadMessageLength(bus_id, msg_id, sender_id); break; } @@ -141,7 +392,6 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID break; } GRCAN_GPS_LON_MSG * grcan_gps_lon_msg = (GRCAN_GPS_LON_MSG *)data; - LOGOMATIC("Longitude: %u \n", grcan_gps_lon_msg->lon); break; case GRCAN_GPS_ALT: diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 86e5b1118..2db015e89 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -12,7 +12,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include - +#include "StateMachine.h" #include "CANdler.h" #include "GRCAN_MSG_DATA.h" #include "GRCAN_MSG_ID.h" @@ -86,6 +86,35 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) } void sendMSG(){ + FDCANTxMessage sendECUStatus1; + + sendECUStatus1.tx_header.Identifier = (GRCAN_ECU << 20) | (GRCAN_ECU_STATUS_1 << 8) | GRCAN_Debugger; + sendECUStatus1.tx_header.IdType = FDCAN_EXTENDED_ID; + sendECUStatus1.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendECUStatus1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendECUStatus1.tx_header.DataLength = FDCAN_DLC_BYTES_8; + sendECUStatus1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendECUStatus1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendECUStatus1.tx_header.MessageMarker = 0; + + GRCAN_ECU_STATUS_1_MSG ecu_status1_msg = { + .ecu_state = GR_DRIVE_ACTIVE, + + .status_flags = 0x67, + + .power_level_torque_map = 3, + .max_cell_temp = 35, + .accumulator_state_of_charge = 90, + .glv_state_of_charge = 95, + .tractive_system_voltage = 560 + + }; + + memcpy(sendECUStatus1.data, &ecu_status1_msg, sizeof(ecu_status1_msg)); + + can_send(can1, &sendECUStatus1); + + FDCANTxMessage sendECUMsg; sendECUMsg.tx_header.Identifier = (GRCAN_DGPS << 20) | (GRCAN_GPS_RZ << 8) | GRCAN_Debugger; @@ -102,8 +131,6 @@ void sendMSG(){ memcpy(sendECUMsg.data, &message, sizeof(message)); can_send(can1, &sendECUMsg); - - } // CANConfig cfg1; From ff8a05452e9162e6e858a9a1cbd7587ac316efa7 Mon Sep 17 00:00:00 2001 From: krai19 Date: Mon, 11 May 2026 22:24:34 -0700 Subject: [PATCH 30/34] commented file BE CAREFUL --- CANine/Application/Src/CANdler.c | 365 +++++++++++++++++-------------- CANine/Core/Src/main.c | 65 ++++-- 2 files changed, 241 insertions(+), 189 deletions(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index 0aae99884..2db36e204 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -8,6 +8,8 @@ #include "Logomatic.h" #include "bitManipulations.h" + + void ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) { // TODO Ideally change some state data to note a bad message, ie if BCU @@ -54,7 +56,9 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID break; } GRCAN_PING_MSG * grcan_ping_msg = (GRCAN_PING_MSG *) data; - LOGOMATIC("Time in millis: %u", grcan_ping_msg->timestamp); + + //comment 1 + //LOGOMATIC("Time in millis: %u", grcan_ping_msg->timestamp); break; case GRCAN_ECU_STATUS_1: if (data_length > sizeof(GRCAN_ECU_STATUS_1_MSG)) { @@ -95,7 +99,8 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID LOGOMATIC("TCM Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 6) ? "OK" : "Timeout"); //What is this value????? - LOGOMATIC("Power Level Torque Map: \n"); + // LOGOMATIC("Power Level (in hex, Controls the AC current limits): 0x%X\n", GETBITS(grcan_ecu_status_1_msg->power_level_torque_map, 0, 4)); + // LOGOMATIC("Torque Map (in hex): 0x%X\n", GETBITS(grcan_ecu_status_1_msg->power_level_torque_map, 4, 4)); LOGOMATIC("Max Cell Temperature: %u\n", grcan_ecu_status_1_msg->max_cell_temp); LOGOMATIC("Percent of accumlator charged: %u\n", grcan_ecu_status_1_msg->accumulator_state_of_charge); @@ -120,173 +125,195 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID - // case GRCAN_ECU_STATUS_3: - // if (data_length > sizeof(GRCAN_ECU_STATUS_3_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_ECU_STATUS_3_MSG * grcan_ecu_status_3 = (GRCAN_ECU_STATUS_3_MSG *)data; - // LOGOMATIC("Wheel RPM: %u\n", grcan_ecu_status_3->rl_wheel_rpm); - // break; - // //what to do about this? - // case GRCAN_ECU_CONFIG: - // if (data_length > sizeof(GRCAN_ECU_CONFIG_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_ECU_CONFIG_MSG * grcan_ecu_config = (GRCAN_ECU_CONFIG_MSG *)data; - // break; - // case GRCAN_BCU_CELL_DATA_1: - // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_BCU_CELL_DATA_1_MSG * grcan_bcu_cell_data_1_msg = (GRCAN_BCU_CELL_DATA_1_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 1, grcan_bcu_cell_data_1_msg->cells[i].voltage, grcan_bcu_cell_data_1_msg->cells[i].temperature); - // } - // break; - - // case GRCAN_BCU_CELL_DATA_2: - // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_2_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_BCU_CELL_DATA_2_MSG * grcan_bcu_cell_data_2_msg = (GRCAN_BCU_CELL_DATA_2_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 33, grcan_bcu_cell_data_2_msg->cells[i].voltage, grcan_bcu_cell_data_2_msg->cells[i].temperature); - // } - // break; - - // case GRCAN_BCU_CELL_DATA_3: - // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_3_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_BCU_CELL_DATA_3_MSG * grcan_bcu_cell_data_3_msg = (GRCAN_BCU_CELL_DATA_3_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 65, grcan_bcu_cell_data_3_msg->cells[i].voltage, grcan_bcu_cell_data_3_msg->cells[i].temperature); - // } - // break; - - // case GRCAN_BCU_CELL_DATA_4: - // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_4_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_BCU_CELL_DATA_4_MSG * grcan_bcu_cell_data_4_msg = (GRCAN_BCU_CELL_DATA_4_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 97, grcan_bcu_cell_data_4_msg->cells[i].voltage, grcan_bcu_cell_data_4_msg->cells[i].temperature); - // } - // break; - - // case GRCAN_BCU_CELL_DATA_5: - // if (data_length > sizeof(GRCAN_BCU_CELL_DATA_5_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_BCU_CELL_DATA_5_MSG * grcan_bcu_cell_data_5_msg = (GRCAN_BCU_CELL_DATA_5_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 129, grcan_bcu_cell_data_5_msg->cells[i].voltage, grcan_bcu_cell_data_5_msg->cells[i].temperature); - // } - // break; - - // case GRCAN_INVERTER_STATUS_1: - // if (data_length > sizeof(GRCAN_INVERTER_STATUS_1_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_INVERTER_STATUS_1_MSG * grcan_inverter_status_1_msg = (GRCAN_INVERTER_STATUS_1_MSG *)data; - // LOGOMATIC("AC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->ac_current); - // LOGOMATIC("DC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->dc_current); - // LOGOMATIC("Motor RPM: %u (RPM)\n", grcan_inverter_status_1_msg->motor_rpm); - // break; - - // case GRCAN_INVERTER_STATUS_2: - // if (data_length > sizeof(GRCAN_INVERTER_STATUS_2_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_INVERTER_STATUS_2_MSG * grcan_inverter_status_2_msg = (GRCAN_INVERTER_STATUS_2_MSG *)data; - // LOGOMATIC("U MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->u_mosfet_temperature); - // LOGOMATIC("V MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->v_mosfet_temperature); - // LOGOMATIC("W MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->w_mosfet_temperature); - // break; - - // case GRCAN_INVERTER_STATUS_3: - // if (data_length > sizeof(GRCAN_INVERTER_STATUS_3_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_INVERTER_STATUS_3_MSG * grcan_inverter_status_3_msg = (GRCAN_INVERTER_STATUS_3_MSG *)data; - // LOGOMATIC("Motor Temp: %u (Celsius + 40)\n", grcan_inverter_status_3_msg->motor_temperature); - // LOGOMATIC("TS Over Max: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 0) ? "FAIL" : "OK"); - // LOGOMATIC("TS Under Min: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 1) ? "FAIL" : "OK"); - // LOGOMATIC("Inverter Over Temp: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 2) ? "FAIL" : "OK"); - // LOGOMATIC("Motor Over Temp: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 3) ? "FAIL" : "OK"); - // LOGOMATIC("Mosfet Drive Error: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 4) ? "FAIL" : "OK"); - // LOGOMATIC("Encoder Error: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 5) ? "FAIL" : "OK"); - // LOGOMATIC("CAN Error/Timeout: %s\n", GETBIT(grcan_inverter_status_3_msg->fault_bits, 6) ? "FAIL" : "OK"); - // break; - - // case GRCAN_INVERTER_CONFIG: - // if (data_length > sizeof(GRCAN_INVERTER_CONFIG_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_INVERTER_CONFIG_MSG * grcan_inverter_config_msg = (GRCAN_INVERTER_CONFIG_MSG *)data; - // LOGOMATIC("Max AC Current: %u\n", grcan_inverter_config_msg->max_ac_current); - // LOGOMATIC("Max DC Current: %u\n", grcan_inverter_config_msg->max_dc_current); - // LOGOMATIC("RPM Limit: %u (0: No limit)\n", grcan_inverter_config_msg->absolute_max_rpm_limit); - // LOGOMATIC("Motor Direction: %s\n", (grcan_inverter_config_msg->motor_direction == 1) ? "Inverted" : "Normal"); - // break; - - // case GRCAN_INVERTER_COMMAND: - // if (data_length > sizeof(GRCAN_INVERTER_COMMAND_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_INVERTER_COMMAND_MSG * grcan_inverter_command_msg = (GRCAN_INVERTER_COMMAND_MSG *)data; - // LOGOMATIC("Set AC Current: %u\n", grcan_inverter_command_msg->set_ac_current); - // LOGOMATIC("Set DC Current: %u\n", grcan_inverter_command_msg->set_dc_current); - // LOGOMATIC("RPM Limit: %u\n", grcan_inverter_command_msg->rpm_limit); - // LOGOMATIC("Field Weakening: %u\n", grcan_inverter_command_msg->field_weakening); - // LOGOMATIC("Drive Enable: %s\n", (grcan_inverter_command_msg->drive_enable == 1) ? "ENABLED" : "DISABLED"); - // break; - - // case GRCAN_FAN_STATUS: - // if (data_length > sizeof(GRCAN_FAN_STATUS_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_FAN_STATUS_MSG * grcan_fan_status_msg = (GRCAN_FAN_STATUS_MSG *)data; - // LOGOMATIC("Fan Speed: %u RPM\n", grcan_fan_status_msg->fan_speed); - // LOGOMATIC("Input Voltage: %u (0-22)\n", grcan_fan_status_msg->input_voltage); - // LOGOMATIC("Input Current: %u (0-10)\n", grcan_fan_status_msg->input_current); - // break; - - // case GRCAN_FAN_COMMAND: - // if (data_length > sizeof(GRCAN_FAN_COMMAND_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_FAN_COMMAND_MSG * grcan_fan_command_msg = (GRCAN_FAN_COMMAND_MSG *)data; - // LOGOMATIC("Fan Command: %u Percent\n", grcan_fan_command_msg->fan_command); - // break; - - // //is this correct - // case GRCAN_DASH_STATUS: - // if (data_length > sizeof(GRCAN_DASH_STATUS_MSG)) { - // ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_DASH_STATUS_MSG * grcan_dash_status_msg = (GRCAN_DASH_STATUS_MSG *)data; - // LOGOMATIC("TS Active: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 0) ? "YES" : "NO"); - // LOGOMATIC("RTD: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 1) ? "YES" : "NO"); - // LOGOMATIC("LED BMS: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 0) ? "ON" : "OFF"); - // LOGOMATIC("LED IMD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 1) ? "ON" : "OFF"); - // LOGOMATIC("LED BSPD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 2) ? "ON" : "OFF"); - // break; + case GRCAN_ECU_STATUS_3: + if (data_length > sizeof(GRCAN_ECU_STATUS_3_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_ECU_STATUS_3_MSG * grcan_ecu_status_3 = (GRCAN_ECU_STATUS_3_MSG *)data; + LOGOMATIC("Wheel RPM: %u\n", grcan_ecu_status_3->rl_wheel_rpm); + break; + case GRCAN_BCU_CELL_DATA_1: + if (data_length > sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + // GRCAN_BCU_CELL_DATA_1_MSG * grcan_bcu_cell_data_1_msg = (GRCAN_BCU_CELL_DATA_1_MSG *)data; + // for (int i = 0; i < 32; i++) { + // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 1, grcan_bcu_cell_data_1_msg->cells[i].voltage, grcan_bcu_cell_data_1_msg->cells[i].temperature); + // } + // break; + + for (int i = 0; i < 32; i++) { + // 1. Voltage Conversion (mV to V) + // We use %u.%03u to simulate a float: 3500mV -> "3.500 V" + // uint32_t v_mv = msg->cells[i].voltage; + // uint32_t v_whole = v_mv / 1000; + // uint32_t v_frac = v_mv % 1000; + + //comment #2 + + // // 2. Temp Conversion (Offset of -40) + // int32_t temp_c = (int32_t)msg->cells[i].temperature - 40; + + // LOGOMATIC("Cell %d | %u.%03u V | %ld C\n", i + 1, v_whole, v_frac, temp_c); + } + break; + case GRCAN_BCU_CELL_DATA_2: + if (data_length > sizeof(GRCAN_BCU_CELL_DATA_2_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_BCU_CELL_DATA_2_MSG * grcan_bcu_cell_data_2_msg = (GRCAN_BCU_CELL_DATA_2_MSG *)data; + for (int i = 0; i < 32; i++) { + LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 33, grcan_bcu_cell_data_2_msg->cells[i].voltage, grcan_bcu_cell_data_2_msg->cells[i].temperature); + } + break; + + case GRCAN_BCU_CELL_DATA_3: + if (data_length > sizeof(GRCAN_BCU_CELL_DATA_3_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_BCU_CELL_DATA_3_MSG * grcan_bcu_cell_data_3_msg = (GRCAN_BCU_CELL_DATA_3_MSG *)data; + for (int i = 0; i < 32; i++) { + LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 65, grcan_bcu_cell_data_3_msg->cells[i].voltage, grcan_bcu_cell_data_3_msg->cells[i].temperature); + } + break; + + case GRCAN_BCU_CELL_DATA_4: + if (data_length > sizeof(GRCAN_BCU_CELL_DATA_4_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_BCU_CELL_DATA_4_MSG * grcan_bcu_cell_data_4_msg = (GRCAN_BCU_CELL_DATA_4_MSG *)data; + for (int i = 0; i < 32; i++) { + LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 97, grcan_bcu_cell_data_4_msg->cells[i].voltage, grcan_bcu_cell_data_4_msg->cells[i].temperature); + } + break; + + case GRCAN_BCU_CELL_DATA_5: + if (data_length > sizeof(GRCAN_BCU_CELL_DATA_5_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_BCU_CELL_DATA_5_MSG * grcan_bcu_cell_data_5_msg = (GRCAN_BCU_CELL_DATA_5_MSG *)data; + for (int i = 0; i < 32; i++) { + LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 129, grcan_bcu_cell_data_5_msg->cells[i].voltage, grcan_bcu_cell_data_5_msg->cells[i].temperature); + } + break; + //convert to celsius + case GRCAN_INVERTER_STATUS_1: + if (data_length > sizeof(GRCAN_INVERTER_STATUS_1_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_INVERTER_STATUS_1_MSG * grcan_inverter_status_1_msg = (GRCAN_INVERTER_STATUS_1_MSG *)data; + LOGOMATIC("AC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->ac_current); + LOGOMATIC("DC Current: %u (0.01 * current)\n", grcan_inverter_status_1_msg->dc_current); + LOGOMATIC("Motor RPM: %u (RPM)\n", grcan_inverter_status_1_msg->motor_rpm); + break; + + case GRCAN_INVERTER_STATUS_2: + if (data_length > sizeof(GRCAN_INVERTER_STATUS_2_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_INVERTER_STATUS_2_MSG * grcan_inverter_status_2_msg = (GRCAN_INVERTER_STATUS_2_MSG *)data; + LOGOMATIC("U MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->u_mosfet_temperature); + LOGOMATIC("V MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->v_mosfet_temperature); + LOGOMATIC("W MOSFET Temp: %u (Celsius + 40)\n", grcan_inverter_status_2_msg->w_mosfet_temperature); + break; + + case GRCAN_INVERTER_STATUS_3: + if (data_length > sizeof(GRCAN_INVERTER_STATUS_3_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_INVERTER_STATUS_3_MSG * grcan_inverter_status_3_msg = (GRCAN_INVERTER_STATUS_3_MSG *)data; + int32_t motor_temp_c = (int32_t)grcan_inverter_status_3_msg->motor_temperature - 40; + LOGOMATIC("Motor Temp: %ld C\n", motor_temp_c); + + const char *fault_msgs[] = { + "TS Over Max", + "TS Under Min", + "Inverter Over Temp", + "Motor Over Temp", + "Mosfet Drive Error", + "Encoder Error", + "CAN Error/Timeout", + "Reserved/Unknown Fault" + }; + + if (grcan_inverter_status_3_msg->fault_bits == 0) { + LOGOMATIC("System Status: OK\n"); + } else { + for (int i = 0; i < 8; i++) { + if (GETBIT(grcan_inverter_status_3_msg->fault_bits, i)) { + LOGOMATIC("FAULT DETECTED: %s\n", fault_msgs[i]); + } + } + } + break; + + case GRCAN_INVERTER_CONFIG: + if (data_length > sizeof(GRCAN_INVERTER_CONFIG_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_INVERTER_CONFIG_MSG * grcan_inverter_config_msg = (GRCAN_INVERTER_CONFIG_MSG *)data; + LOGOMATIC("Max AC Current: %u\n", grcan_inverter_config_msg->max_ac_current); + LOGOMATIC("Max DC Current: %u\n", grcan_inverter_config_msg->max_dc_current); + LOGOMATIC("RPM Limit: %u (0: No limit)\n", grcan_inverter_config_msg->absolute_max_rpm_limit); + LOGOMATIC("Motor Direction: %s\n", (grcan_inverter_config_msg->motor_direction == 1) ? "Inverted" : "Normal"); + break; + + case GRCAN_INVERTER_COMMAND: + if (data_length > sizeof(GRCAN_INVERTER_COMMAND_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_INVERTER_COMMAND_MSG * grcan_inverter_command_msg = (GRCAN_INVERTER_COMMAND_MSG *)data; + LOGOMATIC("Set AC Current: %u\n", grcan_inverter_command_msg->set_ac_current); + LOGOMATIC("Set DC Current: %u\n", grcan_inverter_command_msg->set_dc_current); + LOGOMATIC("RPM Limit: %u\n", grcan_inverter_command_msg->rpm_limit); + LOGOMATIC("Field Weakening: %u\n", grcan_inverter_command_msg->field_weakening); + LOGOMATIC("Drive Enable: %s\n", (grcan_inverter_command_msg->drive_enable == 1) ? "ENABLED" : "DISABLED"); + break; + + case GRCAN_FAN_STATUS: + if (data_length > sizeof(GRCAN_FAN_STATUS_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_FAN_STATUS_MSG * grcan_fan_status_msg = (GRCAN_FAN_STATUS_MSG *)data; + LOGOMATIC("Fan Speed: %u RPM\n", grcan_fan_status_msg->fan_speed); + LOGOMATIC("Input Voltage: %u (0-22)\n", grcan_fan_status_msg->input_voltage); + LOGOMATIC("Input Current: %u (0-10)\n", grcan_fan_status_msg->input_current); + break; + + case GRCAN_FAN_COMMAND: + if (data_length > sizeof(GRCAN_FAN_COMMAND_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_FAN_COMMAND_MSG * grcan_fan_command_msg = (GRCAN_FAN_COMMAND_MSG *)data; + LOGOMATIC("Fan Command: %u Percent\n", grcan_fan_command_msg->fan_command); + break; + + //is this correct + case GRCAN_DASH_STATUS: + if (data_length > sizeof(GRCAN_DASH_STATUS_MSG)) { + ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + GRCAN_DASH_STATUS_MSG * grcan_dash_status_msg = (GRCAN_DASH_STATUS_MSG *)data; + LOGOMATIC("TS Active: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 0) ? "YES" : "NO"); + LOGOMATIC("RTD: %s\n", GETBIT(grcan_dash_status_msg->button_flags, 1) ? "YES" : "NO"); + LOGOMATIC("LED BMS: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 0) ? "ON" : "OFF"); + LOGOMATIC("LED IMD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 1) ? "ON" : "OFF"); + LOGOMATIC("LED BSPD: %s\n", GETBIT(grcan_dash_status_msg->led_bits, 2) ? "ON" : "OFF"); + break; diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 2db015e89..866ea36ef 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -86,33 +86,58 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) } void sendMSG(){ - FDCANTxMessage sendECUStatus1; - sendECUStatus1.tx_header.Identifier = (GRCAN_ECU << 20) | (GRCAN_ECU_STATUS_1 << 8) | GRCAN_Debugger; - sendECUStatus1.tx_header.IdType = FDCAN_EXTENDED_ID; - sendECUStatus1.tx_header.TxFrameType = FDCAN_DATA_FRAME; - sendECUStatus1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; - sendECUStatus1.tx_header.DataLength = FDCAN_DLC_BYTES_8; - sendECUStatus1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; - sendECUStatus1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; - sendECUStatus1.tx_header.MessageMarker = 0; + FDCANTxMessage sendInverterStatus3; - GRCAN_ECU_STATUS_1_MSG ecu_status1_msg = { - .ecu_state = GR_DRIVE_ACTIVE, + sendInverterStatus3.tx_header.Identifier = (GRCAN_GR_Inverter << 20) | (GRCAN_INVERTER_STATUS_3 << 8) | GRCAN_Debugger; + sendInverterStatus3.tx_header.IdType = FDCAN_EXTENDED_ID; + sendInverterStatus3.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendInverterStatus3.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendInverterStatus3.tx_header.DataLength = FDCAN_DLC_BYTES_8; + sendInverterStatus3.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendInverterStatus3.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendInverterStatus3.tx_header.MessageMarker = 0; - .status_flags = 0x67, + GRCAN_INVERTER_STATUS_3_MSG sendInverterStatus3_msg = { + .motor_temperature = 105, + .fault_bits = 0x24 + }; - .power_level_torque_map = 3, - .max_cell_temp = 35, - .accumulator_state_of_charge = 90, - .glv_state_of_charge = 95, - .tractive_system_voltage = 560 + memcpy(sendInverterStatus3.data, &sendInverterStatus3_msg, sizeof(sendInverterStatus3_msg)); + + can_send(can1, &sendInverterStatus3); + + + // FDCANTxMessage sendECUStatus1; + + // sendECUStatus1.tx_header.Identifier = (GRCAN_ECU << 20) | (GRCAN_ECU_STATUS_1 << 8) | GRCAN_Debugger; + // sendECUStatus1.tx_header.IdType = FDCAN_EXTENDED_ID; + // sendECUStatus1.tx_header.TxFrameType = FDCAN_DATA_FRAME; + // sendECUStatus1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + // sendECUStatus1.tx_header.DataLength = FDCAN_DLC_BYTES_8; + // sendECUStatus1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + // sendECUStatus1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + // sendECUStatus1.tx_header.MessageMarker = 0; + + // GRCAN_ECU_STATUS_1_MSG ecu_status1_msg = { + // .ecu_state = GR_DRIVE_ACTIVE, + + // .status_flags = 0x67, + + // .power_level_torque_map = (0xA << 4) | 0x3, + // .max_cell_temp = 35, + // .accumulator_state_of_charge = 90, + // .glv_state_of_charge = 95, + // .tractive_system_voltage = 560 + // }; + + // LOGOMATIC("Power Level (in hex, Controls the AC current limits): 0x%X\n", GETBITS(ecu_status1_msg.power_level_torque_map, 0, 4)); + // LOGOMATIC("Torque Map (in hex): 0x%X\n", GETBITS(ecu_status1_msg.power_level_torque_map, 4, 4)); - }; - memcpy(sendECUStatus1.data, &ecu_status1_msg, sizeof(ecu_status1_msg)); + // memcpy(sendECUStatus1.data, &ecu_status1_msg, sizeof(ecu_status1_msg)); - can_send(can1, &sendECUStatus1); + // can_send(can1, &sendECUStatus1); FDCANTxMessage sendECUMsg; From 1aeed6b996be048a1ba2ba09ee365b6cf60e1541 Mon Sep 17 00:00:00 2001 From: krai19 Date: Tue, 12 May 2026 22:49:06 -0700 Subject: [PATCH 31/34] idk --- CANine/Application/Src/CANdler.c | 51 +++++++++++--------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/CANine/Application/Src/CANdler.c b/CANine/Application/Src/CANdler.c index 2db36e204..e6aa0f538 100644 --- a/CANine/Application/Src/CANdler.c +++ b/CANine/Application/Src/CANdler.c @@ -57,8 +57,7 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID } GRCAN_PING_MSG * grcan_ping_msg = (GRCAN_PING_MSG *) data; - //comment 1 - //LOGOMATIC("Time in millis: %u", grcan_ping_msg->timestamp); + LOGOMATIC("Time in millis: %lu", grcan_ping_msg->timestamp); break; case GRCAN_ECU_STATUS_1: if (data_length > sizeof(GRCAN_ECU_STATUS_1_MSG)) { @@ -90,17 +89,19 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID break; } - LOGOMATIC("BCU Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 0) ? "OK" : "Timeout"); - LOGOMATIC("GR Inverter Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 1) ? "OK" : "Timeout"); - LOGOMATIC("Fan Controller 1 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 2) ? "OK" : "Timeout"); - LOGOMATIC("Fan Controller 2 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 3) ? "OK" : "Timeout"); - LOGOMATIC("Fan Controller 3 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 4) ? "OK" : "Timeout"); - LOGOMATIC("Dash Panel Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 5) ? "OK" : "Timeout"); - LOGOMATIC("TCM Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 6) ? "OK" : "Timeout"); + LOGOMATIC("BCU Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 7) ? "OK" : "Timeout"); + LOGOMATIC("GR Inverter Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 6) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 1 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 5) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 2 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 4) ? "OK" : "Timeout"); + LOGOMATIC("Fan Controller 3 Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 3) ? "OK" : "Timeout"); + LOGOMATIC("Dash Panel Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 2) ? "OK" : "Timeout"); + LOGOMATIC("TCM Node Status: %s\n", GETBIT(grcan_ecu_status_1_msg->status_flags, 1) ? "OK" : "Timeout"); - //What is this value????? - // LOGOMATIC("Power Level (in hex, Controls the AC current limits): 0x%X\n", GETBITS(grcan_ecu_status_1_msg->power_level_torque_map, 0, 4)); - // LOGOMATIC("Torque Map (in hex): 0x%X\n", GETBITS(grcan_ecu_status_1_msg->power_level_torque_map, 4, 4)); + uint8_t torque_map = grcan_ecu_status_1_msg->power_level_torque_map & 0x0F; + uint8_t power_lvl = (grcan_ecu_status_1_msg->power_level_torque_map >> 4) & 0x0F; + + LOGOMATIC("Power Level (hex value, controls the AC current limits): 0x%X\n", power_lvl); + LOGOMATIC("Torque Map (hex value): 0x%X\n", torque_map); LOGOMATIC("Max Cell Temperature: %u\n", grcan_ecu_status_1_msg->max_cell_temp); LOGOMATIC("Percent of accumlator charged: %u\n", grcan_ecu_status_1_msg->accumulator_state_of_charge); @@ -138,27 +139,11 @@ void CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID ReportBadMessageLength(bus_id, msg_id, sender_id); break; } - // GRCAN_BCU_CELL_DATA_1_MSG * grcan_bcu_cell_data_1_msg = (GRCAN_BCU_CELL_DATA_1_MSG *)data; - // for (int i = 0; i < 32; i++) { - // LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 1, grcan_bcu_cell_data_1_msg->cells[i].voltage, grcan_bcu_cell_data_1_msg->cells[i].temperature); - // } - // break; - - for (int i = 0; i < 32; i++) { - // 1. Voltage Conversion (mV to V) - // We use %u.%03u to simulate a float: 3500mV -> "3.500 V" - // uint32_t v_mv = msg->cells[i].voltage; - // uint32_t v_whole = v_mv / 1000; - // uint32_t v_frac = v_mv % 1000; - - //comment #2 - - // // 2. Temp Conversion (Offset of -40) - // int32_t temp_c = (int32_t)msg->cells[i].temperature - 40; - - // LOGOMATIC("Cell %d | %u.%03u V | %ld C\n", i + 1, v_whole, v_frac, temp_c); - } - break; + GRCAN_BCU_CELL_DATA_1_MSG * grcan_bcu_cell_data_1_msg = (GRCAN_BCU_CELL_DATA_1_MSG *)data; + for (int i = 0; i < 32; i++) { + LOGOMATIC("Cell %d - Voltage: %u, Temp: %u\n", i + 1, grcan_bcu_cell_data_1_msg->cells[i].voltage, grcan_bcu_cell_data_1_msg->cells[i].temperature); + } + break; case GRCAN_BCU_CELL_DATA_2: if (data_length > sizeof(GRCAN_BCU_CELL_DATA_2_MSG)) { ReportBadMessageLength(bus_id, msg_id, sender_id); From 1a29cb63a41c479058ce1516f853f65f27c26d5b Mon Sep 17 00:00:00 2001 From: krai19 Date: Tue, 12 May 2026 22:51:52 -0700 Subject: [PATCH 32/34] yay --- CANine/Core/Src/main.c | 90 ++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index 866ea36ef..e94fac0d9 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -87,13 +87,57 @@ void CAN1_rx_callback(uint32_t ID, void *data, uint32_t size) void sendMSG(){ + FDCANTxMessage sendBCUCellData1; + + sendBCUCellData1.tx_header.Identifier = (GRCAN_BCU << 20) | (GRCAN_BCU_CELL_DATA_1 << 8) | GRCAN_Debugger; + sendBCUCellData1.tx_header.IdType = FDCAN_EXTENDED_ID; + sendBCUCellData1.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendBCUCellData1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendBCUCellData1.tx_header.DataLength = FDCAN_DLC_BYTES_64; + sendBCUCellData1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendBCUCellData1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendBCUCellData1.tx_header.MessageMarker = 0; + + GRCAN_BCU_CELL_DATA_1_MSG grcan_bcu_cell_data_1_msg = { + .cells[0].voltage = 0xAF, + .cells[0].temperature = 45, + .cells[1].voltage = 0xBE, + .cells[1].temperature = 48, + .cells[2].voltage = 0xFF, + .cells[2].temperature = 60, + .cells[3].voltage = 0xAF, + .cells[3].temperature = 45, + .cells[4].voltage = 0xBE, + .cells[4].temperature = 48, + .cells[5].voltage = 0xFF, + .cells[5].temperature = 60, + .cells[6].voltage = 0xAF, + .cells[6].temperature = 45, + .cells[7].voltage = 0xBE, + .cells[7].temperature = 48, + .cells[8].voltage = 0xFF, + .cells[8].temperature = 60, + .cells[9].voltage = 0xAF, + .cells[9].temperature = 45, + .cells[10].voltage = 0xBE, + .cells[10].temperature = 48, + .cells[11].voltage = 0xFF, + .cells[11].temperature = 60 + + + }; + + memcpy(sendBCUCellData1.data, &grcan_bcu_cell_data_1_msg, sizeof(grcan_bcu_cell_data_1_msg)); + + can_send(can1, &sendBCUCellData1); + FDCANTxMessage sendInverterStatus3; sendInverterStatus3.tx_header.Identifier = (GRCAN_GR_Inverter << 20) | (GRCAN_INVERTER_STATUS_3 << 8) | GRCAN_Debugger; sendInverterStatus3.tx_header.IdType = FDCAN_EXTENDED_ID; sendInverterStatus3.tx_header.TxFrameType = FDCAN_DATA_FRAME; sendInverterStatus3.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; - sendInverterStatus3.tx_header.DataLength = FDCAN_DLC_BYTES_8; + sendInverterStatus3.tx_header.DataLength = FDCAN_DLC_BYTES_2; sendInverterStatus3.tx_header.BitRateSwitch = FDCAN_BRS_OFF; sendInverterStatus3.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; sendInverterStatus3.tx_header.MessageMarker = 0; @@ -108,36 +152,32 @@ void sendMSG(){ can_send(can1, &sendInverterStatus3); - // FDCANTxMessage sendECUStatus1; - - // sendECUStatus1.tx_header.Identifier = (GRCAN_ECU << 20) | (GRCAN_ECU_STATUS_1 << 8) | GRCAN_Debugger; - // sendECUStatus1.tx_header.IdType = FDCAN_EXTENDED_ID; - // sendECUStatus1.tx_header.TxFrameType = FDCAN_DATA_FRAME; - // sendECUStatus1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; - // sendECUStatus1.tx_header.DataLength = FDCAN_DLC_BYTES_8; - // sendECUStatus1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; - // sendECUStatus1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; - // sendECUStatus1.tx_header.MessageMarker = 0; + FDCANTxMessage sendECUStatus1; - // GRCAN_ECU_STATUS_1_MSG ecu_status1_msg = { - // .ecu_state = GR_DRIVE_ACTIVE, + sendECUStatus1.tx_header.Identifier = (GRCAN_ECU << 20) | (GRCAN_ECU_STATUS_1 << 8) | GRCAN_Debugger; + sendECUStatus1.tx_header.IdType = FDCAN_EXTENDED_ID; + sendECUStatus1.tx_header.TxFrameType = FDCAN_DATA_FRAME; + sendECUStatus1.tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + sendECUStatus1.tx_header.DataLength = FDCAN_DLC_BYTES_8; + sendECUStatus1.tx_header.BitRateSwitch = FDCAN_BRS_OFF; + sendECUStatus1.tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + sendECUStatus1.tx_header.MessageMarker = 0; - // .status_flags = 0x67, + GRCAN_ECU_STATUS_1_MSG ecu_status1_msg = { + .ecu_state = GR_DRIVE_ACTIVE, - // .power_level_torque_map = (0xA << 4) | 0x3, - // .max_cell_temp = 35, - // .accumulator_state_of_charge = 90, - // .glv_state_of_charge = 95, - // .tractive_system_voltage = 560 - // }; - - // LOGOMATIC("Power Level (in hex, Controls the AC current limits): 0x%X\n", GETBITS(ecu_status1_msg.power_level_torque_map, 0, 4)); - // LOGOMATIC("Torque Map (in hex): 0x%X\n", GETBITS(ecu_status1_msg.power_level_torque_map, 4, 4)); + .status_flags = 0x65, + .power_level_torque_map = (0xA << 4) | 0x3, + .max_cell_temp = 35, + .accumulator_state_of_charge = 90, + .glv_state_of_charge = 95, + .tractive_system_voltage = 560 + }; - // memcpy(sendECUStatus1.data, &ecu_status1_msg, sizeof(ecu_status1_msg)); + memcpy(sendECUStatus1.data, &ecu_status1_msg, sizeof(ecu_status1_msg)); - // can_send(can1, &sendECUStatus1); + can_send(can1, &sendECUStatus1); FDCANTxMessage sendECUMsg; From c710bfa28c117ecdbd3f72e38a7e2f7e2d38f31a Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 12 May 2026 23:00:57 -0700 Subject: [PATCH 33/34] Fill all fields Signed-off-by: Daniel Hansen --- CANine/Core/Src/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index e94fac0d9..c7c7c91dc 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -123,10 +123,13 @@ void sendMSG(){ .cells[10].temperature = 48, .cells[11].voltage = 0xFF, .cells[11].temperature = 60 - - }; + for (int i = 12; i < 32;) { + grcan_bcu_cell_data_1_msg.cells[i].voltage = i++; + grcan_bcu_cell_data_1_msg.cells[i].temperature = i++; + } + memcpy(sendBCUCellData1.data, &grcan_bcu_cell_data_1_msg, sizeof(grcan_bcu_cell_data_1_msg)); can_send(can1, &sendBCUCellData1); From c371db24276b44247bffac54d01b18d38d94d3ba Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 12 May 2026 23:07:14 -0700 Subject: [PATCH 34/34] Fill all fields but not breaking things Signed-off-by: Daniel Hansen --- CANine/Core/Src/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CANine/Core/Src/main.c b/CANine/Core/Src/main.c index c7c7c91dc..00be7408d 100644 --- a/CANine/Core/Src/main.c +++ b/CANine/Core/Src/main.c @@ -125,9 +125,9 @@ void sendMSG(){ .cells[11].temperature = 60 }; - for (int i = 12; i < 32;) { - grcan_bcu_cell_data_1_msg.cells[i].voltage = i++; - grcan_bcu_cell_data_1_msg.cells[i].temperature = i++; + for (int i = 12; i < 32; i++) { + grcan_bcu_cell_data_1_msg.cells[i].voltage = i * 2; + grcan_bcu_cell_data_1_msg.cells[i].temperature = i * 2 + 1; } memcpy(sendBCUCellData1.data, &grcan_bcu_cell_data_1_msg, sizeof(grcan_bcu_cell_data_1_msg));