From df74f46ed04f5d5b4479bc318369557a36d19865 Mon Sep 17 00:00:00 2001 From: MacKante Date: Wed, 30 Oct 2024 13:58:20 -0600 Subject: [PATCH 01/38] Update Cube++ to latest commit --- .settings/language.settings.xml | 4 ++-- Cube++ | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 5c5b015..ff14484 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Cube++ b/Cube++ index 2440272..0a71ec6 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d +Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 From adfc050a01d202744af7c96ac4553210483a2158 Mon Sep 17 00:00:00 2001 From: MacKante Date: Thu, 31 Oct 2024 20:22:43 -0600 Subject: [PATCH 02/38] added base implentation of GPIO task --- .vscode/settings.json | 5 +- Components/Drivers/IOExpander.cpp | 39 ++++++- Components/Drivers/IOExpander.hpp | 16 ++- Components/GPIO/GPIOTask.cpp | 168 ++++++++++++++++++++++++++++++ Components/GPIO/GPIOTask.hpp | 42 ++++++++ Components/SystemDefines.hpp | 4 + Components/main_system.cpp | 2 + 7 files changed, 273 insertions(+), 3 deletions(-) create mode 100644 Components/GPIO/GPIOTask.cpp create mode 100644 Components/GPIO/GPIOTask.hpp diff --git a/.vscode/settings.json b/.vscode/settings.json index 758a33e..4b38763 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,9 @@ "files.associations": { "cstring": "cpp", "__config": "cpp", - "typeinfo": "cpp" + "typeinfo": "cpp", + "array": "cpp", + "xstring": "cpp", + "xlocinfo": "cpp" } } \ No newline at end of file diff --git a/Components/Drivers/IOExpander.cpp b/Components/Drivers/IOExpander.cpp index e25bb5c..8215e4b 100644 --- a/Components/Drivers/IOExpander.cpp +++ b/Components/Drivers/IOExpander.cpp @@ -134,4 +134,41 @@ IOState IOExpander::GetPinStateNow(IOExpanderPin pin) { return GetPinState(pin); } return IOState::ERROR; -} \ No newline at end of file +} + +/** + * @brief Get pin state of all pins + * + * @return array of IOState, each index corresponding to each pin + */ +std::array IOExpander::GetExpanderState() { + std::array expanderState; + + for(uint8_t i = 0; i < 8; i++) { + IOPin pin = static_cast(i); + expanderState[i] = GetPinState(pin); + } + + for(uint8_t i = 10; i < 18; i++) { + IOPin pin = static_cast(i); + expanderState[i - 2] = GetPinState(pin); + } + + return expanderState; +} + +/** + * @brief Get pin in state of all pins with Update + * + * @return array of IOState, each index corresponding to a pin + */ +std::array IOExpander::GetExpanderStateNow() { + if(Update()) { + return GetExpanderState(); + } + // Initialize and return an array filled with ERROR state for failure + std::array errorState; + errorState.fill(IOState::ERROR); + return errorState; +} + diff --git a/Components/Drivers/IOExpander.hpp b/Components/Drivers/IOExpander.hpp index 3f39bdc..1ae9702 100644 --- a/Components/Drivers/IOExpander.hpp +++ b/Components/Drivers/IOExpander.hpp @@ -30,6 +30,8 @@ // -- Includes ------------------------------------------------------------------ #include "main_system.hpp" // This should have the platform specific HAL included #include +#include +#include // -- Macros -------------------------------------------------------------------- #define I2C_TIMEOUT_MS 1000 @@ -63,7 +65,7 @@ enum class IOState { HIGH = 1, HI = HIGH, - INPUT = 1, + INPUT = 2, ERROR }; @@ -93,6 +95,8 @@ class IOExpander { bool Update(); // Update IO Expander Read State IOState GetPinState(IOPin pin); // Get pin state (note. last read state) IOState GetPinStateNow(IOPin pin); // Get pin state with update + std::array GetExpanderState(); // Get exapnder state + std::array GetExpanderStateNow(); // Get expander state with update static inline const uint8_t CalculateAddress(uint8_t ad0, uint8_t ad1, uint8_t ad2); @@ -137,4 +141,14 @@ inline bool IOExpander::I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len) { return false; } +std::string IOStateToString(IOState state) { + switch (state) { + case IOState::LOW: return "LOW"; + case IOState::HIGH: return "HIGH"; + case IOState::INPUT: return "HIGH"; + case IOState::ERROR: return "ERROR"; + default: return "Unknown State"; + } +} + #endif // PCA8575_IO_EXPANDER_HPP_ diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp new file mode 100644 index 0000000..fe1ce71 --- /dev/null +++ b/Components/GPIO/GPIOTask.cpp @@ -0,0 +1,168 @@ +/** + ****************************************************************************** + * File Name : GPIOTask.cpp + * Description : Primary GPIO task. Handles writes and reads to PCA8575PW IO Expanders + ****************************************************************************** +*/ +#include "SystemDefines.hpp" +#include "GPIOTask.hpp" +#include "IOExpander.hpp" + +/*----------------------- Macros -----------------------*/ +#define TASK_FREQUENCY 2 +constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; + +/** + * @brief Constructor for GPIOTask + */ +GPIOTask::GPIOTask() : Task(GPIO_TASK_QUEUE_DEPTH_OBJS) +{ +} + +/** + * @brief Initialize the GPIOTask + */ +void GPIOTask::InitTask() +{ + // Make sure the task is not already initialized + CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize GPIO task twice"); + + BaseType_t rtValue = + xTaskCreate((TaskFunction_t)GPIOTask::RunTask, + (const char*)"GPIOTask", + (uint16_t)GPIO_TASK_STACK_DEPTH_WORDS, + (void*)this, + (UBaseType_t)GPIO_TASK_RTOS_PRIORITY, + (TaskHandle_t*)&rtTaskHandle); + + CUBE_ASSERT(rtValue == pdPASS, "GPIOTask::InitTask() - xTaskCreate() failed"); +} + +/** + * @brief Instance Run loop for the GPIO Task, runs on scheduler start as long as the task is initialized. + * @param pvParams RTOS Passed void parameters, contains a pointer to the object instance, should not be used + */ +void GPIOTask::Run(void * pvParams) +{ + + // Initialize Expander Objects + IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0 ,0)); + IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); + + while (1) { + Command cm; + + // Poll GPIO State of driver controls + std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + + // Do Something to power board >_< based on driver control state + // Print for Now + CUBE_PRINT("Driver Control State...\n"); + for (uint8_t i = 0; i < 18; i++) { + switch (static_cast(i)) + { + case IOPin::P00: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P01: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P02: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P03: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P04: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P05: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P06: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P07: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P10: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P11: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P12: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P13: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P14: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P15: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P16: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + case IOPin::P17: + CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + if (driverControlState[i] == IOState::HIGH) { + + } + break; + default: + break; + } + } + + // Operate task at specified TASK_FREQUENCY + osDelay(TASK_DELAY); + } +} diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp new file mode 100644 index 0000000..40ab440 --- /dev/null +++ b/Components/GPIO/GPIOTask.hpp @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * File Name : GPIOTask.hpp + * Description : Polls and updates I2C GPIO expander in B3. + ****************************************************************************** +*/ +#ifndef HELIOS_GPIOTASK_HPP_ +#define HELIOS_GPIOTASK_HPP_ + +#include "Task.hpp" +#include "SystemDefines.hpp" +#include "Timer.hpp" + +/*---------------------------------- Macros/Enums ----------------------------------*/ +enum GPIO_COMMANDS { + GPIO_STATE = 0, + GPIO_RESET +}; + +/*---------------------------------- Task Implementation ----------------------------------*/ +class GPIOTask : public Task +{ +public: + static GPIOTask& Inst() { + static GPIOTask inst; + return inst; + } + + void InitTask(); + +protected: + static void RunTask(void* pvParams) { GPIOTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void * pvParams); // Main run code + +private: + // Private Functions + GPIOTask(); // Private constructor + GPIOTask(const GPIOTask&); // Prevent copy-construction + GPIOTask& operator=(const GPIOTask&); // Prevent assignment +} + +#endif \ No newline at end of file diff --git a/Components/SystemDefines.hpp b/Components/SystemDefines.hpp index cf5801a..58641b6 100644 --- a/Components/SystemDefines.hpp +++ b/Components/SystemDefines.hpp @@ -54,5 +54,9 @@ constexpr uint8_t TASK_DEBUG_PRIORITY = 2; // Priority of the debug t constexpr uint8_t TASK_DEBUG_QUEUE_DEPTH_OBJS = 10; // Size of the debug task queue constexpr uint16_t TASK_DEBUG_STACK_DEPTH_WORDS = 512; // Size of the debug task stack +// GPIO TASK +constexpr uint8_t GPIO_TASK_PRIORITY = 2; // Priority of the GPIO task +constexpr uint8_t GPIO_TASK_QUEUE_DEPTH_OBJS = 10; // Size of the GPIO task queue +constexpr uint16_t GPIO_TASK_STACK_DEPTH_WORDS = 512; // Size of the GPIO task stack #endif // CUBE_MAIN_SYSTEM_DEFINES_H diff --git a/Components/main_system.cpp b/Components/main_system.cpp index 7290170..8b4b8fd 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -13,6 +13,7 @@ #include "WatchdogTask.hpp" #include "CubeTask.hpp" #include "DebugTask.hpp" +#include "GPIOTask.hpp" /* Drivers ------------------------------------------------------------------*/ namespace Driver { @@ -28,6 +29,7 @@ void run_main() { WatchdogTask::Inst().InitTask(); CubeTask::Inst().InitTask(); DebugTask::Inst().InitTask(); + GPIOTask::Inst().InitTask(); // Print System Boot Info : Warning, don't queue more than 10 prints before scheduler starts CUBE_PRINT("\n-- CUBE SYSTEM --\n"); From a1abdd36109ca14c992e7549e68a6a578d5a3c7a Mon Sep 17 00:00:00 2001 From: MacKante Date: Thu, 31 Oct 2024 20:25:33 -0600 Subject: [PATCH 03/38] fixed CUBE_PRINT for gpio pin states --- Components/GPIO/GPIOTask.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index fe1ce71..2169239 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -68,91 +68,91 @@ void GPIOTask::Run(void * pvParams) } break; case IOPin::P01: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P01: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P02: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P02: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P03: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P03: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P04: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P04: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P05: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P05: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P06: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P06: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P07: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P07: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P10: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P10: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P11: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P11: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P12: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P12: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P13: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P13: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P14: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P14: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P15: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P15: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P16: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P16: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P17: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P17: %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } From 7501d6903e284b022682b518e52f78693101e1d0 Mon Sep 17 00:00:00 2001 From: MacKante Date: Thu, 31 Oct 2024 20:39:33 -0600 Subject: [PATCH 04/38] modified CUBE_PRINT of GPIO status --- Components/GPIO/GPIOTask.cpp | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 2169239..27adaae 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -44,7 +44,6 @@ void GPIOTask::InitTask() */ void GPIOTask::Run(void * pvParams) { - // Initialize Expander Objects IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0 ,0)); IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); @@ -62,97 +61,97 @@ void GPIOTask::Run(void * pvParams) switch (static_cast(i)) { case IOPin::P00: - CUBE_PRINT(" - P00: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P01: - CUBE_PRINT(" - P01: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P02: - CUBE_PRINT(" - P02: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P02 (Array Disconnect): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P03: - CUBE_PRINT(" - P03: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P03 (Race Mode Enable): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P04: - CUBE_PRINT(" - P04: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P04 (Headlights Enable): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P05: - CUBE_PRINT(" - P05: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P05 (Display Screen Rotate): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P06: - CUBE_PRINT(" - P06: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P06 (Proximity Sensor Mute): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P07: - CUBE_PRINT(" - P07: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P07 (Lap Button): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P10: - CUBE_PRINT(" - P10: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P10 (Horn Enable): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P11: - CUBE_PRINT(" - P11: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P11 (Left Signal Enable): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P12: - CUBE_PRINT(" - P12: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P12 (Right Signal Enable): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P13: - CUBE_PRINT(" - P13: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P13 (Emergency Hazard): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P14: - CUBE_PRINT(" - P14: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P14 (Motor Reset): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P15: - CUBE_PRINT(" - P15: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P15 (Parking Break Detect): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P16: - CUBE_PRINT(" - P16: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P16 (Mechanical Break): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P17: - CUBE_PRINT(" - P17: %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P17 (Green LED): %s", IOStateToString(driverControlState[i]).c_str()); if (driverControlState[i] == IOState::HIGH) { } From 3ddb0ff5bc2e6af5b0d36d5ca2d22e451ab0463e Mon Sep 17 00:00:00 2001 From: MacKante Date: Sat, 2 Nov 2024 22:01:41 -0600 Subject: [PATCH 05/38] Added base functionality for driver control --- BCubed.launch | 2 +- Components/Drivers/IOExpander.cpp | 2 +- Components/Drivers/IOExpander.hpp | 3 +- Components/GPIO/GPIOTask.cpp | 131 ++++++++++++++++-------------- Components/GPIO/GPIOTask.hpp | 4 +- Components/main_system.cpp | 2 +- 6 files changed, 77 insertions(+), 67 deletions(-) diff --git a/BCubed.launch b/BCubed.launch index cc84246..27362a2 100644 --- a/BCubed.launch +++ b/BCubed.launch @@ -40,7 +40,7 @@ - + diff --git a/Components/Drivers/IOExpander.cpp b/Components/Drivers/IOExpander.cpp index 8215e4b..941ef65 100644 --- a/Components/Drivers/IOExpander.cpp +++ b/Components/Drivers/IOExpander.cpp @@ -142,7 +142,7 @@ IOState IOExpander::GetPinStateNow(IOExpanderPin pin) { * @return array of IOState, each index corresponding to each pin */ std::array IOExpander::GetExpanderState() { - std::array expanderState; + std::array expanderState; for(uint8_t i = 0; i < 8; i++) { IOPin pin = static_cast(i); diff --git a/Components/Drivers/IOExpander.hpp b/Components/Drivers/IOExpander.hpp index 1ae9702..4ea129e 100644 --- a/Components/Drivers/IOExpander.hpp +++ b/Components/Drivers/IOExpander.hpp @@ -113,6 +113,7 @@ class IOExpander { // -- Platform specific functions ------------------------------------------- bool I2C_Write(uint8_t dev, uint8_t* data, uint8_t len); bool I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len); + std::string IOStateToStringTest(IOState state); }; // -- Static Functions ----------------------------------------------------------- @@ -141,7 +142,7 @@ inline bool IOExpander::I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len) { return false; } -std::string IOStateToString(IOState state) { +inline std::string IOExpander::IOStateToStringTest(IOState state) { switch (state) { case IOState::LOW: return "LOW"; case IOState::HIGH: return "HIGH"; diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 27adaae..16274f7 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -9,7 +9,7 @@ #include "IOExpander.hpp" /*----------------------- Macros -----------------------*/ -#define TASK_FREQUENCY 2 +#define TASK_FREQUENCY 1 constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; /** @@ -32,7 +32,7 @@ void GPIOTask::InitTask() (const char*)"GPIOTask", (uint16_t)GPIO_TASK_STACK_DEPTH_WORDS, (void*)this, - (UBaseType_t)GPIO_TASK_RTOS_PRIORITY, + (UBaseType_t)GPIO_TASK_PRIORITY, (TaskHandle_t*)&rtTaskHandle); CUBE_ASSERT(rtValue == pdPASS, "GPIOTask::InitTask() - xTaskCreate() failed"); @@ -57,110 +57,119 @@ void GPIOTask::Run(void * pvParams) // Do Something to power board >_< based on driver control state // Print for Now CUBE_PRINT("Driver Control State...\n"); - for (uint8_t i = 0; i < 18; i++) { + for (uint8_t i = 0; i < 8; i++) { switch (static_cast(i)) { case IOPin::P00: - CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P01: - CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P02: - CUBE_PRINT(" - P02 (Array Disconnect): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P03: - CUBE_PRINT(" - P03 (Race Mode Enable): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P04: - CUBE_PRINT(" - P04 (Headlights Enable): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P05: - CUBE_PRINT(" - P05 (Display Screen Rotate): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P06: - CUBE_PRINT(" - P06 (Proximity Sensor Mute): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; case IOPin::P07: - CUBE_PRINT(" - P07 (Lap Button): %s", IOStateToString(driverControlState[i]).c_str()); + CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } break; - case IOPin::P10: - CUBE_PRINT(" - P10 (Horn Enable): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P11: - CUBE_PRINT(" - P11 (Left Signal Enable): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P12: - CUBE_PRINT(" - P12 (Right Signal Enable): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P13: - CUBE_PRINT(" - P13 (Emergency Hazard): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P14: - CUBE_PRINT(" - P14 (Motor Reset): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P15: - CUBE_PRINT(" - P15 (Parking Break Detect): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P16: - CUBE_PRINT(" - P16 (Mechanical Break): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - case IOPin::P17: - CUBE_PRINT(" - P17 (Green LED): %s", IOStateToString(driverControlState[i]).c_str()); - if (driverControlState[i] == IOState::HIGH) { - - } - break; - default: - break; + default: + break; } } + for (uint8_t i = 10; i < 18; i++) { + switch (static_cast(i)) + { + case IOPin::P10: + CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P11: + CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P12: + CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P13: + CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P14: + CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P15: + CUBE_PRINT(" - P15 (Parking Break Detect): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P16: + CUBE_PRINT(" - P16 (Mechanical Break): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + case IOPin::P17: + CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + break; + default: + break; + } + } + + // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 40ab440..ca15b61 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -37,6 +37,6 @@ class GPIOTask : public Task GPIOTask(); // Private constructor GPIOTask(const GPIOTask&); // Prevent copy-construction GPIOTask& operator=(const GPIOTask&); // Prevent assignment -} +}; -#endif \ No newline at end of file +#endif diff --git a/Components/main_system.cpp b/Components/main_system.cpp index 8b4b8fd..258ea4d 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -13,7 +13,7 @@ #include "WatchdogTask.hpp" #include "CubeTask.hpp" #include "DebugTask.hpp" -#include "GPIOTask.hpp" +#include "GPIO/GPIOTask.hpp" /* Drivers ------------------------------------------------------------------*/ namespace Driver { From 0ff967f507a37c2bb5ee7164833fb03bb4685496 Mon Sep 17 00:00:00 2001 From: MacKante Date: Sun, 3 Nov 2024 00:07:20 -0600 Subject: [PATCH 06/38] fixed IO expander debug message --- .settings/language.settings.xml | 4 ++-- .settings/stm32cubeide.project.prefs | 5 +++-- Components/GPIO/GPIOTask.cpp | 16 ++++++++-------- Cube++ | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index ff14484..4db3786 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index 2e01358..9e0da0d 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,5 +1,6 @@ +2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 -DC22A860405A8BF2F2C095E5B6529F12=05328855C4E51ECDCD46876FE3491C71 +8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 +DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 eclipse.preferences.version=1 diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 16274f7..c33b3ed 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -117,49 +117,49 @@ void GPIOTask::Run(void * pvParams) switch (static_cast(i)) { case IOPin::P10: - CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i]); + CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P11: - CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i]); + CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P12: - CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i]); + CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P13: - CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i]); + CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P14: - CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i]); + CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P15: - CUBE_PRINT(" - P15 (Parking Break Detect): %d\n", driverControlState[i]); + CUBE_PRINT(" - P15 (Parking Break Detect): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P16: - CUBE_PRINT(" - P16 (Mechanical Break): %d\n", driverControlState[i]); + CUBE_PRINT(" - P16 (Mechanical Break): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } break; case IOPin::P17: - CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i]); + CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } diff --git a/Cube++ b/Cube++ index 0a71ec6..2440272 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 +Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d From 7dc0967205ec124a14e42c07f2f6df850d8db44c Mon Sep 17 00:00:00 2001 From: MacKante Date: Sun, 3 Nov 2024 23:47:57 -0700 Subject: [PATCH 07/38] added namespaces for IO expander pin names --- Components/Drivers/IOExpander.cpp | 14 +- Components/Drivers/IOExpander.hpp | 49 +++++-- Components/GPIO/GPIOTask.cpp | 226 ++++++++++++++++++++++-------- 3 files changed, 208 insertions(+), 81 deletions(-) diff --git a/Components/Drivers/IOExpander.cpp b/Components/Drivers/IOExpander.cpp index 941ef65..4bc080d 100644 --- a/Components/Drivers/IOExpander.cpp +++ b/Components/Drivers/IOExpander.cpp @@ -26,7 +26,7 @@ bool IOExpander::Commit() { * * @return true on success, false on failure (invalid arguments) */ -bool IOExpander::SetPin(IOExpanderPin pin, IOState state) { +bool IOExpander::SetPin(IOPin pin, IOState state) { // Check for invalid arguments if(pin >= IOExpanderPin::IO_NUM_PINS || state >= IOState::ERROR) return false; @@ -47,7 +47,7 @@ bool IOExpander::SetPin(IOExpanderPin pin, IOState state) { * * @return true on success, false on failure */ -bool IOExpander::SetPinNow(IOExpanderPin pin, IOState state) { +bool IOExpander::SetPinNow(IOPin pin, IOState state) { if (SetPin(pin, state)) { return Commit(); } @@ -62,7 +62,7 @@ bool IOExpander::SetPinNow(IOExpanderPin pin, IOState state) { * @param pin Pin to toggle * @return true on success, false on failure (invalid arguments) */ -bool IOExpander::TogglePin(IOExpanderPin pin) { +bool IOExpander::TogglePin(IOPin pin) { // Check for invalid arguments if(pin >= IOExpanderPin::IO_NUM_PINS) return false; @@ -80,7 +80,7 @@ bool IOExpander::TogglePin(IOExpanderPin pin) { * @param pin Pin to toggle * @return true on success, false on failure */ -bool IOExpander::TogglePinNow(IOExpanderPin pin) { +bool IOExpander::TogglePinNow(IOPin pin) { if (TogglePin(pin)) { Commit(); } @@ -106,7 +106,7 @@ bool IOExpander::Update() { * ERROR if pin is not set as an input * or if pin is invalid */ -IOState IOExpander::GetPinState(IOExpanderPin pin) { +IOState IOExpander::GetPinState(IOPin pin) { // Check for invalid arguments if(pin >= IOExpanderPin::IO_NUM_PINS) return IOState::ERROR; @@ -129,7 +129,7 @@ IOState IOExpander::GetPinState(IOExpanderPin pin) { * or if pin is invalid * or if I2C read fails */ -IOState IOExpander::GetPinStateNow(IOExpanderPin pin) { +IOState IOExpander::GetPinStateNow(IOPin pin) { if (Update()) { return GetPinState(pin); } @@ -144,7 +144,7 @@ IOState IOExpander::GetPinStateNow(IOExpanderPin pin) { std::array IOExpander::GetExpanderState() { std::array expanderState; - for(uint8_t i = 0; i < 8; i++) { + for(uint8_t i = 1; i < 8; i++) { IOPin pin = static_cast(i); expanderState[i] = GetPinState(pin); } diff --git a/Components/Drivers/IOExpander.hpp b/Components/Drivers/IOExpander.hpp index 4ea129e..04dab9b 100644 --- a/Components/Drivers/IOExpander.hpp +++ b/Components/Drivers/IOExpander.hpp @@ -31,7 +31,6 @@ #include "main_system.hpp" // This should have the platform specific HAL included #include #include -#include // -- Macros -------------------------------------------------------------------- #define I2C_TIMEOUT_MS 1000 @@ -69,6 +68,43 @@ enum class IOState { ERROR }; +/* ------------------------------- Namespace for Alternative IOPin names -------------------------------*/ +namespace DriverControls { + constexpr IOPin FORWARD_NEUTRAL_REVERSE_H = IOPin::P00; + constexpr IOPin FORWARD_NEUTRAL_REVERSE_L = IOPin::P01; + constexpr IOPin ARRAYS_DISCONNECT = IOPin::P02; + constexpr IOPin RACE_MODE_ENABLE = IOPin::P03; + constexpr IOPin HEADLIGHTS_ENABLE = IOPin::P04; + constexpr IOPin DISPLAY_SCREEN_ROTATE = IOPin::P05; + constexpr IOPin PROXIMITY_SENSOR_ENABLE = IOPin::P06; + constexpr IOPin LAP_BUTTON = IOPin::P07; + constexpr IOPin HORN_ENABLE = IOPin::P10; + constexpr IOPin LEFT_SIGNAL_ENABLE = IOPin::P11; + constexpr IOPin RIGHT_SIGNAL_ENABLE = IOPin::P12; + constexpr IOPin EMERGENCY_HAZARD = IOPin::P13; + constexpr IOPin MOTOR_RESET = IOPin::P14; + constexpr IOPin PARKING_BRAKE_DETECT = IOPin::P15; + constexpr IOPin MECHANICAL_BRAKE = IOPin::P16; + constexpr IOPin GREEN_LED = IOPin::P17; +} + +namespace PowerBoard { + constexpr IOPin RIGHT_TURN_LIGHT_SIGNAL = IOPin::P00; + constexpr IOPin LEFT_TURN_LIGHT_SIGNAL = IOPin::P01; + constexpr IOPin DAYTIME_RUNNING_LIGHT_SIGNAL = IOPin::P02; + constexpr IOPin HEADLIGHT_SIGNAL = IOPin::P03; + constexpr IOPin BRAKE_LIGHT_SIGNAL = IOPin::P04; + constexpr IOPin HORN_SIGNAL = IOPin::P05; + constexpr IOPin ORANGE_LED = IOPin::P06; + constexpr IOPin GREEN_LED = IOPin::P07; + + constexpr IOPin P13 = IOPin::P13; + constexpr IOPin P14 = IOPin::P14; + constexpr IOPin P15 = IOPin::P15; + constexpr IOPin P16 = IOPin::P16; + constexpr IOPin P17 = IOPin::P17; +} + // -- Typedefs ------------------------------------------------------------------ typedef IOPin IOExpanderPin; // In case we want to change the name of IOPin @@ -113,7 +149,6 @@ class IOExpander { // -- Platform specific functions ------------------------------------------- bool I2C_Write(uint8_t dev, uint8_t* data, uint8_t len); bool I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len); - std::string IOStateToStringTest(IOState state); }; // -- Static Functions ----------------------------------------------------------- @@ -142,14 +177,4 @@ inline bool IOExpander::I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len) { return false; } -inline std::string IOExpander::IOStateToStringTest(IOState state) { - switch (state) { - case IOState::LOW: return "LOW"; - case IOState::HIGH: return "HIGH"; - case IOState::INPUT: return "HIGH"; - case IOState::ERROR: return "ERROR"; - default: return "Unknown State"; - } -} - #endif // PCA8575_IO_EXPANDER_HPP_ diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index c33b3ed..125a520 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -52,60 +52,109 @@ void GPIOTask::Run(void * pvParams) Command cm; // Poll GPIO State of driver controls + // Note on IOState array: index 0-7 are pins 0-7, index 8-15 are pins 10-17 std::array driverControlState = driverControlExpander.GetExpanderStateNow(); - // Do Something to power board >_< based on driver control state + // TODO: Do Something to power board >_< based on driver control state or something... // Print for Now CUBE_PRINT("Driver Control State...\n"); - for (uint8_t i = 0; i < 8; i++) { + for (uint8_t i = 1; i < 8; i++) { switch (static_cast(i)) { - case IOPin::P00: - CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo): %d\n", driverControlState[i]); + case DriverControls::FORWARD_NEUTRAL_REVERSE_H: + CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); + } + else if (driverControlState[i] == IOState::LOW) { + powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); + } + else if (driverControlState[i] == IOState::ERROR) { } break; - case IOPin::P01: - CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo): %d\n", driverControlState[i]); + case DriverControls::FORWARD_NEUTRAL_REVERSE_L: + CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; - case IOPin::P02: + case DriverControls::ARRAYS_DISCONNECT: CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; - case IOPin::P03: + case DriverControls::RACE_MODE_ENABLE: CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; - case IOPin::P04: + case DriverControls::HEADLIGHTS_ENABLE: CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + } + else if (driverControlState[i] == IOState::LOW) { + powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); + } + else if (driverControlState[i] == IOState::ERROR) { } break; - case IOPin::P05: + case DriverControls::DISPLAY_SCREEN_ROTATE: CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; - case IOPin::P06: + case DriverControls::PROXIMITY_SENSOR_ENABLE: CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; - case IOPin::P07: + case DriverControls::LAP_BUTTON: CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { + } + else if (driverControlState[i] == IOState::LOW) { + + } + else if (driverControlState[i] == IOState::ERROR) { + } break; default: @@ -113,62 +162,115 @@ void GPIOTask::Run(void * pvParams) } } + // Pins 10 - 17 for (uint8_t i = 10; i < 18; i++) { switch (static_cast(i)) { - case IOPin::P10: - CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P11: - CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P12: - CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P13: - CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P14: - CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P15: - CUBE_PRINT(" - P15 (Parking Break Detect): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P16: - CUBE_PRINT(" - P16 (Mechanical Break): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - case IOPin::P17: - CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - - } - break; - default: - break; + case DriverControls::HORN_ENABLE: + CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); + } + else if (driverControlState[i-2] == IOState::LOW) { + powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::LEFT_SIGNAL_ENABLE: + CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); + } + else if (driverControlState[i-2] == IOState::LOW) { + powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::RIGHT_SIGNAL_ENABLE: + CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + } + else if (driverControlState[i-2] == IOState::LOW) { + powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::EMERGENCY_HAZARD: + CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + else if (driverControlState[i-2] == IOState::LOW) { + + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::MOTOR_RESET: + CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + else if (driverControlState[i-2] == IOState::LOW) { + + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::PARKING_BRAKE_DETECT: + CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + else if (driverControlState[i-2] == IOState::LOW) { + + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::MECHANICAL_BRAKE: + CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + else if (driverControlState[i-2] == IOState::LOW) { + + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + case DriverControls::GREEN_LED: + CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); + if (driverControlState[i-2] == IOState::HIGH) { + + } + else if (driverControlState[i-2] == IOState::LOW) { + + } + else if (driverControlState[i-2] == IOState::ERROR) { + + } + break; + default: + break; } } + driverControlExpander.TogglePinNow(DriverControls::FORWARD_NEUTRAL_REVERSE_H); + + // Commit changes to Power board + // powerBoardExpander.Commit(); // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); From 9d26284dec903a16f39b20e5dfc97ac7d5b65dc1 Mon Sep 17 00:00:00 2001 From: MacKante Date: Tue, 5 Nov 2024 19:25:26 -0700 Subject: [PATCH 08/38] completed io expander drivers --- .settings/language.settings.xml | 4 ++-- .settings/stm32cubeide.project.prefs | 4 ++-- Components/Drivers/IOExpander.cpp | 2 +- Components/GPIO/GPIOTask.cpp | 5 +++-- Cube++ | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 4db3786..ff14484 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index 9e0da0d..e0969c7 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 +2F62501ED4689FB349E356AB974DBE57=05328855C4E51ECDCD46876FE3491C71 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 +8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 eclipse.preferences.version=1 diff --git a/Components/Drivers/IOExpander.cpp b/Components/Drivers/IOExpander.cpp index 4bc080d..29c61fa 100644 --- a/Components/Drivers/IOExpander.cpp +++ b/Components/Drivers/IOExpander.cpp @@ -144,7 +144,7 @@ IOState IOExpander::GetPinStateNow(IOPin pin) { std::array IOExpander::GetExpanderState() { std::array expanderState; - for(uint8_t i = 1; i < 8; i++) { + for(uint8_t i = 0; i < 8; i++) { IOPin pin = static_cast(i); expanderState[i] = GetPinState(pin); } diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 125a520..d75d37b 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -58,7 +58,7 @@ void GPIOTask::Run(void * pvParams) // TODO: Do Something to power board >_< based on driver control state or something... // Print for Now CUBE_PRINT("Driver Control State...\n"); - for (uint8_t i = 1; i < 8; i++) { + for (uint8_t i = 0; i < 8; i++) { switch (static_cast(i)) { case DriverControls::FORWARD_NEUTRAL_REVERSE_H: @@ -268,9 +268,10 @@ void GPIOTask::Run(void * pvParams) } driverControlExpander.TogglePinNow(DriverControls::FORWARD_NEUTRAL_REVERSE_H); + // powerBoardExpander.GetPinStateNow(PowerBoard::P13); // Commit changes to Power board - // powerBoardExpander.Commit(); + powerBoardExpander.Commit(); // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); diff --git a/Cube++ b/Cube++ index 2440272..0a71ec6 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d +Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 From 4c62218a87240c4b4c3e95d5e3e81d4b5443b24f Mon Sep 17 00:00:00 2001 From: MacKante <114007326+MacKante@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:09:18 -0700 Subject: [PATCH 09/38] Heinz/spi task (#7) * init: SPI Task Object created * feat: init logic to read SPI input * fix: refactor to test debug and pass in hspi_ * fix: decouple pedal reading from print statement * feat: Add dedicated SPI_TASK_DELAY * fix: add while(1) loop in task * fix: Nathan fixes. Read data scaled wrong * fix: readData bit masking * feat: print pedal percentage --------- Co-authored-by: Heinzino --- .mxproject | 30 ++--- .settings/language.settings.xml | 4 +- BCubed.ioc | 11 +- Components/Debug/DebugTask.cpp | 7 ++ Components/GPIO.hpp | 20 +++ Components/SPI/SPI_Task.cpp | 207 ++++++++++++++++++++++++++++++++ Components/SPI/SPI_Task.hpp | 76 ++++++++++++ Components/SystemDefines.hpp | 5 + Components/main_system.cpp | 2 + Components/main_system.hpp | 5 +- Core/Src/main.c | 8 +- 11 files changed, 347 insertions(+), 28 deletions(-) create mode 100644 Components/SPI/SPI_Task.cpp create mode 100644 Components/SPI/SPI_Task.hpp diff --git a/.mxproject b/.mxproject index 2c7fe7f..474fcb2 100644 --- a/.mxproject +++ b/.mxproject @@ -1,29 +1,29 @@ [PreviousLibFiles] -LibFiles=Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_crc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_crc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h;Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_bus.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_crs.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_system.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_utils.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_exti.h;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_utils.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_exti.c;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_i2c.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_i2c.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_usart.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pcd.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pcd_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_usb.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_crc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_i2c.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usb.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_crc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_crc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h;Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_bus.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_crs.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_system.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_utils.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_exti.h;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_utils.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_exti.c;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_i2c.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_i2c.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_usart.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pcd.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pcd_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_ll_usb.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h;Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_armv8mbl.h; +LibFiles=Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_crc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_crc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal.h;Drivers\STM32L1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_def.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_rcc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_rcc_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_bus.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_rcc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_crs.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_system.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_utils.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash_ramfunc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_gpio.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_gpio_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_gpio.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_dma_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_dma.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_dma.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pwr.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pwr_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_pwr.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_cortex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_cortex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_exti.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_exti.h;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_utils.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_exti.c;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_i2c.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_i2c.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_spi.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_spi.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_tim.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_tim_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_uart.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_usart.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pcd.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pcd_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_usb.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\portmacro.h;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_crc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ramfunc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_cortex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_exti.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_i2c.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_spi.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_uart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usb.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\port.c;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_crc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_crc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal.h;Drivers\STM32L1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_def.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_rcc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_rcc_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_bus.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_rcc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_crs.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_system.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_utils.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_flash_ramfunc.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_gpio.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_gpio_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_gpio.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_dma_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_dma.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_dma.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pwr.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pwr_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_pwr.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_cortex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_cortex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_exti.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_exti.h;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_utils.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_exti.c;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_i2c.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_i2c.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_spi.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_spi.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_tim.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_tim_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_uart.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_usart.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pcd.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_hal_pcd_ex.h;Drivers\STM32L1xx_HAL_Driver\Inc\stm32l1xx_ll_usb.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\portmacro.h;Drivers\CMSIS\Device\ST\STM32L1xx\Include\stm32l152xe.h;Drivers\CMSIS\Device\ST\STM32L1xx\Include\stm32l1xx.h;Drivers\CMSIS\Device\ST\STM32L1xx\Include\system_stm32l1xx.h;Drivers\CMSIS\Device\ST\STM32L1xx\Include\system_stm32l1xx.h;Drivers\CMSIS\Device\ST\STM32L1xx\Source\Templates\system_stm32l1xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; [PreviousUsedCubeIDEFiles] -SourceFiles=Core/Src/main.c;Core/Src/freertos.c;Core/Src/stm32l1xx_it.c;Core/Src/stm32l1xx_hal_msp.c;Core/Src/stm32l1xx_hal_timebase_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_utils.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_crc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_i2c.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usb.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c;Core/Src/system_stm32l1xx.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_utils.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_crc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_i2c.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usart.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pcd_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_ll_usb.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c;Core/Src/system_stm32l1xx.c;;;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c; -HeaderPath=Drivers/STM32L1xx_HAL_Driver/Inc;Drivers/STM32L1xx_HAL_Driver/Inc/Legacy;Middlewares/Third_Party/FreeRTOS/Source/include;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3;Drivers/CMSIS/Device/ST/STM32L1xx/Include;Drivers/CMSIS/Include;Core/Inc; +SourceFiles=Core\Src\main.c;Core\Src\freertos.c;Core\Src\stm32l1xx_it.c;Core\Src\stm32l1xx_hal_msp.c;Core\Src\stm32l1xx_hal_timebase_tim.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_utils.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_exti.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_crc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ramfunc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_cortex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_exti.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_i2c.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_spi.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_uart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usb.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\port.c;Drivers\CMSIS\Device\ST\STM32L1xx\Source\Templates\system_stm32l1xx.c;Core\Src\system_stm32l1xx.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_utils.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_exti.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_crc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_rcc_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_flash_ramfunc.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pwr_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_cortex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_exti.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_i2c.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_spi.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_tim_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_uart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usart.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_gpio.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_dma.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_pcd_ex.c;Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_ll_usb.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\port.c;Drivers\CMSIS\Device\ST\STM32L1xx\Source\Templates\system_stm32l1xx.c;Core\Src\system_stm32l1xx.c;;;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3\port.c; +HeaderPath=Drivers\STM32L1xx_HAL_Driver\Inc;Drivers\STM32L1xx_HAL_Driver\Inc\Legacy;Middlewares\Third_Party\FreeRTOS\Source\include;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3;Drivers\CMSIS\Device\ST\STM32L1xx\Include;Drivers\CMSIS\Include;Core\Inc; CDefines=USE_FULL_LL_DRIVER;USE_HAL_DRIVER;STM32L152xE;USE_FULL_LL_DRIVER;USE_HAL_DRIVER;USE_HAL_DRIVER; [PreviousGenFiles] AdvancedFolderStructure=true HeaderFileListSize=5 -HeaderFiles#0=../Core/Inc/FreeRTOSConfig.h -HeaderFiles#1=../Core/Inc/stm32l1xx_it.h -HeaderFiles#2=../Core/Inc/stm32_assert.h -HeaderFiles#3=../Core/Inc/stm32l1xx_hal_conf.h -HeaderFiles#4=../Core/Inc/main.h +HeaderFiles#0=..\Core\Inc\FreeRTOSConfig.h +HeaderFiles#1=..\Core\Inc\stm32l1xx_it.h +HeaderFiles#2=..\Core\Inc\stm32_assert.h +HeaderFiles#3=..\Core\Inc\stm32l1xx_hal_conf.h +HeaderFiles#4=..\Core\Inc\main.h HeaderFolderListSize=1 -HeaderPath#0=../Core/Inc +HeaderPath#0=..\Core\Inc HeaderFiles=; SourceFileListSize=5 -SourceFiles#0=../Core/Src/freertos.c -SourceFiles#1=../Core/Src/stm32l1xx_it.c -SourceFiles#2=../Core/Src/stm32l1xx_hal_msp.c -SourceFiles#3=../Core/Src/stm32l1xx_hal_timebase_tim.c -SourceFiles#4=../Core/Src/main.c +SourceFiles#0=..\Core\Src\freertos.c +SourceFiles#1=..\Core\Src\stm32l1xx_it.c +SourceFiles#2=..\Core\Src\stm32l1xx_hal_msp.c +SourceFiles#3=..\Core\Src\stm32l1xx_hal_timebase_tim.c +SourceFiles#4=..\Core\Src\main.c SourceFolderListSize=1 -SourcePath#0=../Core/Src +SourcePath#0=..\Core\Src SourceFiles=; diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index ff14484..20928fa 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -2,7 +2,7 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/BCubed.ioc b/BCubed.ioc index e19beb8..f45342a 100644 --- a/BCubed.ioc +++ b/BCubed.ioc @@ -9,7 +9,7 @@ FREERTOS.configTOTAL_HEAP_SIZE=65536 FREERTOS.configUSE_NEWLIB_REENTRANT=1 FREERTOS.configUSE_TIMERS=1 File.Version=6 -GPIO.groupedBy= +GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false Mcu.CPN=STM32L152RET6 Mcu.Family=STM32L1 @@ -227,7 +227,7 @@ PC9.Signal=GPXTI9 PD2.GPIOParameters=GPIO_Label PD2.GPIO_Label=Board_SLCT_0 PD2.Locked=true -PD2.Signal=GPXTI2 +PD2.Signal=GPIO_Output PH0-OSC_IN.Locked=true PH0-OSC_IN.Mode=HSE-External-Oscillator PH0-OSC_IN.Signal=RCC_OSC_IN @@ -298,16 +298,14 @@ SH.GPXTI0.0=GPIO_EXTI0 SH.GPXTI0.ConfNb=1 SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.ConfNb=1 -SH.GPXTI2.0=GPIO_EXTI2 -SH.GPXTI2.ConfNb=1 SH.GPXTI6.0=GPIO_EXTI6 SH.GPXTI6.ConfNb=1 SH.GPXTI7.0=GPIO_EXTI7 SH.GPXTI7.ConfNb=1 SH.GPXTI9.0=GPIO_EXTI9 SH.GPXTI9.ConfNb=1 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 -SPI1.CalculateBaudRate=16.0 MBits/s +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 +SPI1.CalculateBaudRate=1000.0 KBits/s SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler SPI1.Mode=SPI_MODE_MASTER @@ -330,4 +328,3 @@ VP_SYS_VS_tim2.Mode=TIM2 VP_SYS_VS_tim2.Signal=SYS_VS_tim2 board=custom rtos.0.ip=FREERTOS -isbadioc=false diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 9575bcf..0c82a7a 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -13,6 +13,7 @@ #include #include "IOExpander.hpp" +#include "SPI/SPI_Task.hpp" // External Tasks (to send debug commands to) @@ -96,6 +97,12 @@ void DebugTask::HandleDebugMessage(const char* msg) // Echo the message (without the 'echo') CUBE_PRINT("\n%s", &msg[5]); } + else if (strncmp(msg, "readAccel ", 5) == 0) { + // test_SPI_Pedals.readAccelerationPedal(); + } + else if (strncmp(msg, "readBrake ", 5) == 0) { + // test_SPI_Pedals.readBrakingPedal(); + } else if (strncmp(msg, "iecho ", 6) == 0) { // Int echo the message (echo an int parameter) int32_t val = Utils::ExtractIntParameter(msg, 6); diff --git a/Components/GPIO.hpp b/Components/GPIO.hpp index 8c89a1c..4061e1e 100644 --- a/Components/GPIO.hpp +++ b/Components/GPIO.hpp @@ -44,6 +44,26 @@ namespace GPIO inline bool IsOn() { return HAL_GPIO_ReadPin(LED_GREEN_GPIO_Port, LED_GREEN_Pin) == GPIO_PIN_SET; } } + namespace BOARD_SELECT_0 + { + inline void On() {HAL_GPIO_WritePin(Board_SLCT_0_GPIO_Port, Board_SLCT_0_Pin, GPIO_PIN_SET); } + inline void Off() {HAL_GPIO_WritePin(Board_SLCT_0_GPIO_Port, Board_SLCT_0_Pin, GPIO_PIN_RESET); } + } + namespace BOARD_SELECT_1 + { + inline void On() {HAL_GPIO_WritePin(Board_SLCT_1_GPIO_Port, Board_SLCT_1_Pin, GPIO_PIN_SET); } + inline void Off() {HAL_GPIO_WritePin(Board_SLCT_1_GPIO_Port, Board_SLCT_1_Pin, GPIO_PIN_RESET); } + } + namespace SPI_DATA_CS0 + { + inline void On() {HAL_GPIO_WritePin(SPI_Data_CS0_GPIO_Port, SPI_Data_CS0_Pin, GPIO_PIN_SET); } + inline void Off() {HAL_GPIO_WritePin(SPI_Data_CS0_GPIO_Port, SPI_Data_CS0_Pin, GPIO_PIN_RESET); } + } + namespace SPI_DATA_CS1 + { + inline void On() {HAL_GPIO_WritePin(SPI_Data_CS1_GPIO_Port, SPI_Data_CS1_Pin, GPIO_PIN_SET); } + inline void Off() {HAL_GPIO_WritePin(SPI_Data_CS1_GPIO_Port, SPI_Data_CS1_Pin, GPIO_PIN_RESET); } + } } #endif /* HELIOS_INCLUDE_SC_CORE_GPIO_H */ diff --git a/Components/SPI/SPI_Task.cpp b/Components/SPI/SPI_Task.cpp new file mode 100644 index 0000000..8edb6d3 --- /dev/null +++ b/Components/SPI/SPI_Task.cpp @@ -0,0 +1,207 @@ +/** +****************************************************************************** +* File Name : SPI_Task.cpp +* Description : Primary SPI task, reads data from pedals. +****************************************************************************** +*/ +#include "SystemDefines.hpp" +#include "SPI_Task.hpp" +#include "GPIO.hpp" + +/** +* @brief Constructor for SPI Task +*/ +SPI_Task::SPI_Task() : Task(SPI_TAK_QUEUE_DEPTH_OBJS) +{ + hspi_ = SystemHandles::SPI1_Handle; +} + +/** +* @brief Initialize the SPI Task +*/ +void SPI_Task::InitTask() +{ + CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize SPI task twice"); + + BaseType_t rtValue = + xTaskCreate((TaskFunction_t)SPI_Task::RunTask, + (const char*)"SPI Task", + (uint16_t)SPI_TASK_STACK_DEPTH_WORDS, + (void*)this, + (UBaseType_t)SPI_TASK_PRIORITY, + &rtTaskHandle); + + CUBE_ASSERT(rtValue == pdPASS, "SPI_Task::InitTask() - xTaskCreate() failed"); +} + +/** +* @brief Handles a command. +* @param cm Command reference to handle +*/ +void SPI_Task::HandleCommand(Command& cm){ + + switch (cm.GetCommand()) { + case TASK_SPECIFIC_COMMAND: { + break; + } + default: + CUBE_PRINT("SPI Task - Received Unsupported Command {%d}\n", cm.GetCommand()); + break; + } + + //No matter what we happens, we must reset allocated data + cm.Reset(); +} + +void SPI_Task::BoardSelectLow(){ + GPIO::BOARD_SELECT_0::Off(); + GPIO::BOARD_SELECT_1::Off(); +} + +void SPI_Task::BoardSelectHigh(){ + GPIO::BOARD_SELECT_0::On(); + GPIO::BOARD_SELECT_1::On(); +} + +uint16_t SPI_Task::reverseBits(uint16_t bitsToReverse){ + uint16_t reversedBits = 0; + for(int i = 0; i < 16; i++){ + + if(bitsToReverse & (1 << i)){ + reversedBits |= (1 << (15-i)); + } + + } + return reversedBits; +} + + +bool SPI_Task::SPI_Read(uint16_t sizeInBytes){ + HAL_StatusTypeDef status = HAL_SPI_Receive(hspi_,last_read_,sizeInBytes,SPI1_TIMEOUT_MS); + if(status == HAL_OK){ + return true; + }else{ + last_read_[0] = 0xFF; + last_read_[1] = 0xFF; //Reset to indicate an error + return false; + } +} + +/** + * @brief Reads serial data output with bits properly reversed + */ +uint16_t SPI_Task::readData(void){ + + bool failedToRead = !SPI_Read(2); + if(failedToRead){ + return 0xFFFF; + } + + // Combine the two bytes into a 16-bit raw data value + uint16_t rawData = (last_read_[0] << 8) | last_read_[1]; + + // Mask out the leading 4 bits (which should be zeros) and any trailing bits beyond 10 + // 0000_MXXX_XXXX_XL00 & 0b0000_1111_1111_1100 + rawData = (rawData & 0x0FFC) >> 2; //0000_00_MXXX_XXXX_XL + return rawData; +} + +uint16_t SPI_Task::readAccelerationPedal_P(){ + GPIO::SPI_DATA_CS0::Off(); + GPIO::SPI_DATA_CS1::Off(); + BoardSelectLow(); + uint16_t accelerationPedalReading = readData(); +// CUBE_PRINT("Acceleration P reading: %u\n", accelerationPedalReading); + BoardSelectHigh(); + return accelerationPedalReading; +} + +uint16_t SPI_Task::readAccelerationPedal_N(){ + GPIO::SPI_DATA_CS0::On(); + GPIO::SPI_DATA_CS1::Off(); + BoardSelectLow(); + uint16_t accelerationPedalReading = readData(); +// CUBE_PRINT("Acceleration N reading: %u\n", accelerationPedalReading); + BoardSelectHigh(); + return accelerationPedalReading; +} + +uint16_t SPI_Task::readBrakingPedal_P(){ + GPIO::SPI_DATA_CS0::Off(); + GPIO::SPI_DATA_CS1::On(); + //Delay here + BoardSelectLow(); + uint16_t breakPedalReading = readData(); +// CUBE_PRINT("Braking P reading: %u\n", breakPedalReading); + BoardSelectHigh(); + return breakPedalReading; +} + +uint16_t SPI_Task::readBrakingPedal_N(){ + GPIO::SPI_DATA_CS0::On(); + GPIO::SPI_DATA_CS1::On(); + BoardSelectLow(); + uint16_t breakPedalReading = readData(); +// CUBE_PRINT("Braking N reading: %u\n", breakPedalReading); + BoardSelectHigh(); + return breakPedalReading; +} + +float SPI_Task::calculatePedalPosition(uint16_t pedalReading) { + // Ensure pedalReading is within the valid ADC range + if (pedalReading < ADC_MIN) { + pedalReading = ADC_MIN; + } else if (pedalReading > ADC_MAX) { + pedalReading = ADC_MAX; + } + + // Calculate the position percentage + return ((float)(pedalReading - ADC_MIN) / (ADC_MAX - ADC_MIN)) * 100.0f; +} + +float SPI_Task::getAccelerationPedalPercent() { + uint16_t accelPedalReadingP = readAccelerationPedal_P(); + uint16_t accelPedalReadingN = readAccelerationPedal_N(); + + //Optional check accelPedalReadingP + accelPedalReadingN != ADC_MAX + ADC_MIN roughly equal + + return calculatePedalPosition(accelPedalReadingP); +} + +float SPI_Task::getBrakePedalPercent() { + uint16_t brakePedalReadingP = readBrakingPedal_P(); + uint16_t brakePedalReadingN = readBrakingPedal_N(); + + //Optional check: if (brakePedalReadingP + brakePedalReadingN != ADC_MAX + ADC_MIN) { + + return calculatePedalPosition(brakePedalReadingP); +} + +/** +* @brief Instance Run loop for the SPI Task, runs on scheduler start as long as the task is initialized. +* @param pvParams RTOS Passed void parameters, contains a pointer to the object instance (from InitTask), should not be used +*/ +void SPI_Task::Run(void * pvParams){ + + + /** + * 1. First decoder selects Y0 as low to enable SPI Select on 2nd decoder + * -> Board Select 0 and 1 = LOW + * + * 2. SPI Chip Select to select which analog to receive + * For Acceleration_P -> CSb00 -> SPI CS0 = 0 && SPI CS1 = 0 + * For Acceleration_N -> CSb01 -> SPI CS0 = 0 && SPI CS1 = 1 + * For Braking_P -> CSb10 -> SPI CS0 = 1 && SPI CS1 = 0 + * For Braking_N -> CSb11 -> SPI CS0 = 1 && SPI CS1 = 1 + * + * 3. Read the ADC output on SPI MISO + */ + while(1){ + float accelerationPedalPercent = getAccelerationPedalPercent(); + CUBE_PRINT("Acceleration Pedal Position: %.2f%%\n", accelerationPedalPercent); + + float brakingPedalPercent = getBrakePedalPercent(); + CUBE_PRINT("Braking Pedal Position: %.2f%%\n", brakingPedalPercent); + osDelay(SPI_TASK_DELAY); //Delay to reach 100 readings/s + } +} diff --git a/Components/SPI/SPI_Task.hpp b/Components/SPI/SPI_Task.hpp new file mode 100644 index 0000000..5a543aa --- /dev/null +++ b/Components/SPI/SPI_Task.hpp @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * File Name : SPI_Task.hpp + * Description : Primary SPI task, reads data from pedals. + ****************************************************************************** +*/ +#ifndef HELIOS_SPITASK_HPP_ +#define HELIOS_SPITASK_HPP_ + +#include "Task.hpp" +#include "main_system.hpp" //Has specific SPI HAL function included +#include +#include "SystemDefines.hpp" + +/* Macros/Enums ------------------------------------------------------------*/ +#define SPI1_TIMEOUT_MS 1000 +#define SPI_TASK_FREQUENCY 1 +#define ADC_MIN 102 // Corresponds to 10% of V_in +#define ADC_MAX 921 // Corresponds to 90% of V_in +#define SPI_TASK_DELAY 1000/SPI_TASK_FREQUENCY + +enum SPI_COMMANDS { + SPI_NONE = 0, /** TODO: Add commands */ +}; + +class SPI_Task: public Task +{ +public: + /** + * @brief Singleton Constructor + * TODO: Add &hspx as input for portability + */ + static SPI_Task& Inst(){ //Singleton Design Pattern + static SPI_Task inst; + return inst; + } + + SPI_Task(); // Public Constructor for testing. Converting to private after + + void InitTask(); + + /** Debug Functions Change to private later */ + uint16_t readAccelerationPedal_P(); + uint16_t readAccelerationPedal_N(); + uint16_t readBrakingPedal_P(); + uint16_t readBrakingPedal_N(); + +protected: + static void RunTask(void* pvParams) { SPI_Task::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void * pvParams); //Main run code + + SPI_HandleTypeDef* hspi_ = nullptr; + + void HandleCommand(Command& cm); + uint8_t last_read_[2] = {0xFF, 0xFF}; + +private: + // SPI_Task(SPI_HandleTypeDef* hspi); // Private constructor. PRODUCTION + SPI_Task(const SPI_Task&); // Prevent copy-construction + SPI_Task& operator=(const SPI_Task&); // Prevent assignment + + //** Helper Functions */ + void BoardSelectLow(); //Set board select GPIO pins low + void BoardSelectHigh(); //Set board select GPIO pins high + uint16_t reverseBits(uint16_t bitsToReverse); //Reverses bits of ADC reading as MSB is read first + uint16_t readData(void); //Reads serial data output of the conversion result + bool SPI_Read(uint16_t sizeInBytes); //Reads SPI with HAL command onto protected last_read_ + float calculatePedalPosition(uint16_t pedalReading); //calculate the pedal position as a percentage + float getAccelerationPedalPercent(); + float getBrakePedalPercent(); + +}; + + +#endif // HELIOS_SPITASK_HPP_ + diff --git a/Components/SystemDefines.hpp b/Components/SystemDefines.hpp index 58641b6..12c9af4 100644 --- a/Components/SystemDefines.hpp +++ b/Components/SystemDefines.hpp @@ -54,6 +54,11 @@ constexpr uint8_t TASK_DEBUG_PRIORITY = 2; // Priority of the debug t constexpr uint8_t TASK_DEBUG_QUEUE_DEPTH_OBJS = 10; // Size of the debug task queue constexpr uint16_t TASK_DEBUG_STACK_DEPTH_WORDS = 512; // Size of the debug task stack +//SPI Task +constexpr uint8_t SPI_TASK_PRIORITY = 2; // Priority of the SPI task +constexpr uint8_t SPI_TAK_QUEUE_DEPTH_OBJS = 10; // Size of the SPI task queue +constexpr uint16_t SPI_TASK_STACK_DEPTH_WORDS = 512; // Size of the SPI task stack + // GPIO TASK constexpr uint8_t GPIO_TASK_PRIORITY = 2; // Priority of the GPIO task constexpr uint8_t GPIO_TASK_QUEUE_DEPTH_OBJS = 10; // Size of the GPIO task queue diff --git a/Components/main_system.cpp b/Components/main_system.cpp index 258ea4d..cb53bfa 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -13,6 +13,7 @@ #include "WatchdogTask.hpp" #include "CubeTask.hpp" #include "DebugTask.hpp" +#include "SPI/SPI_Task.hpp" #include "GPIO/GPIOTask.hpp" /* Drivers ------------------------------------------------------------------*/ @@ -29,6 +30,7 @@ void run_main() { WatchdogTask::Inst().InitTask(); CubeTask::Inst().InitTask(); DebugTask::Inst().InitTask(); + SPI_Task::Inst().InitTask(); GPIOTask::Inst().InitTask(); // Print System Boot Info : Warning, don't queue more than 10 prints before scheduler starts diff --git a/Components/main_system.hpp b/Components/main_system.hpp index 4fb28b1..bfb1b61 100644 --- a/Components/main_system.hpp +++ b/Components/main_system.hpp @@ -15,6 +15,7 @@ #include "stm32l1xx_ll_usart.h" #include "stm32l1xx_hal_rcc.h" #include "stm32l1xx_ll_dma.h" +#include "stm32l1xx_hal_spi.h" @@ -45,11 +46,11 @@ extern CRC_HandleTypeDef hcrc; // CRC - Hardware CRC System Handle extern I2C_HandleTypeDef hi2c2; // I2C - IO Expander System Handle +extern SPI_HandleTypeDef hspi1; // SPI - SPI 1 System Handler namespace SystemHandles { constexpr CRC_HandleTypeDef* CRC_Handle = &hcrc; constexpr I2C_HandleTypeDef* I2C_Expander = &hi2c2; + constexpr SPI_HandleTypeDef* SPI1_Handle = &hspi1; } - - #endif /* MAIN_SYSTEM_HPP_ */ diff --git a/Core/Src/main.c b/Core/Src/main.c index 64b397a..ffec117 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -321,7 +321,7 @@ static void MX_SPI1_Init(void) hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; @@ -524,6 +524,9 @@ static void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOC, LED_RED_Pin|LED_BLUE_Pin|LED_GREEN_Pin|CS_CAN_N_Pin |SPI_Data_CS1_Pin|SPI_Data_CS0_Pin|Board_SLCT_1_Pin, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(Board_SLCT_0_GPIO_Port, Board_SLCT_0_Pin, GPIO_PIN_RESET); + /*Configure GPIO pins : board_int_1_Pin CAN_RX1BF_Pin CAN_RX0BF_Pin CAN_INT_Pin */ GPIO_InitStruct.Pin = board_int_1_Pin|CAN_RX1BF_Pin|CAN_RX0BF_Pin|CAN_INT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; @@ -553,8 +556,9 @@ static void MX_GPIO_Init(void) /*Configure GPIO pin : Board_SLCT_0_Pin */ GPIO_InitStruct.Pin = Board_SLCT_0_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(Board_SLCT_0_GPIO_Port, &GPIO_InitStruct); /* USER CODE BEGIN MX_GPIO_Init_2 */ From 1111089887dd54909e3506e2fc2de8205ae28b5a Mon Sep 17 00:00:00 2001 From: MacKante Date: Sat, 9 Nov 2024 01:54:01 -0700 Subject: [PATCH 10/38] refactoring code, added getter functions for IOExpander last read/write --- .settings/language.settings.xml | 4 ++-- .settings/stm32cubeide.project.prefs | 4 ++-- Components/Drivers/IOExpander.hpp | 14 +++++++++++++- Components/GPIO.hpp | 1 + Components/GPIO/GPIOTask.cpp | 9 ++++----- Cube++ | 2 +- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 20928fa..affcdb8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index e0969c7..9e0da0d 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=05328855C4E51ECDCD46876FE3491C71 +2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 +8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 eclipse.preferences.version=1 diff --git a/Components/Drivers/IOExpander.hpp b/Components/Drivers/IOExpander.hpp index 04dab9b..b3ef6d8 100644 --- a/Components/Drivers/IOExpander.hpp +++ b/Components/Drivers/IOExpander.hpp @@ -134,6 +134,10 @@ class IOExpander { std::array GetExpanderState(); // Get exapnder state std::array GetExpanderStateNow(); // Get expander state with update + // -- Getter Functions ------------------------------------------------------ + inline uint16_t GetLastRead(); // Get last read + inline uint16_t GetLastWrite(); // Get last read + static inline const uint8_t CalculateAddress(uint8_t ad0, uint8_t ad1, uint8_t ad2); protected: @@ -144,7 +148,6 @@ class IOExpander { uint8_t last_write_[2] = {0xFF, 0xFF}; uint8_t pending_write_[2] = {0xFF, 0xFF}; uint8_t last_read_[2] = {0xFF, 0xFF}; - protected: // -- Platform specific functions ------------------------------------------- bool I2C_Write(uint8_t dev, uint8_t* data, uint8_t len); @@ -177,4 +180,13 @@ inline bool IOExpander::I2C_Read(uint8_t dev, uint8_t* dest, uint8_t len) { return false; } +// -- Getter Function ------------------------------------------------------------ +inline uint16_t IOExpander::GetLastRead() { + return IOExpander::last_read_[0] | (IOExpander::last_read_[1] << 8); +} + +inline uint16_t IOExpander::GetLastWrite() { + return IOExpander::last_write_[0] | (IOExpander::last_write_[1] << 8); +} + #endif // PCA8575_IO_EXPANDER_HPP_ diff --git a/Components/GPIO.hpp b/Components/GPIO.hpp index 4061e1e..f7f2985 100644 --- a/Components/GPIO.hpp +++ b/Components/GPIO.hpp @@ -44,6 +44,7 @@ namespace GPIO inline bool IsOn() { return HAL_GPIO_ReadPin(LED_GREEN_GPIO_Port, LED_GREEN_Pin) == GPIO_PIN_SET; } } + namespace BOARD_SELECT_0 { inline void On() {HAL_GPIO_WritePin(Board_SLCT_0_GPIO_Port, Board_SLCT_0_Pin, GPIO_PIN_SET); } diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index d75d37b..1687bc7 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -48,9 +48,11 @@ void GPIOTask::Run(void * pvParams) IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0 ,0)); IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); - while (1) { - Command cm; + // Expander status for CAN messages + uint16_t powerBoardStatus = 0; + uint16_t driverControlStatus = 0; + while (1) { // Poll GPIO State of driver controls // Note on IOState array: index 0-7 are pins 0-7, index 8-15 are pins 10-17 std::array driverControlState = driverControlExpander.GetExpanderStateNow(); @@ -267,9 +269,6 @@ void GPIOTask::Run(void * pvParams) } } - driverControlExpander.TogglePinNow(DriverControls::FORWARD_NEUTRAL_REVERSE_H); - // powerBoardExpander.GetPinStateNow(PowerBoard::P13); - // Commit changes to Power board powerBoardExpander.Commit(); diff --git a/Cube++ b/Cube++ index 0a71ec6..2440272 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 +Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d From e694adf526e9b247a4816eda19e92a1c73f978a9 Mon Sep 17 00:00:00 2001 From: MacKante Date: Sat, 16 Nov 2024 21:13:08 -0700 Subject: [PATCH 11/38] added base code for CAN Tx Task --- .settings/language.settings.xml | 4 +- .settings/stm32cubeide.project.prefs | 4 +- BCubed.ioc | 5 +- Components/CAN/CANTxTask.cpp | 111 ++++++++ Components/CAN/CANTxTask.hpp | 53 ++++ Components/Debug/DebugTask.cpp | 19 ++ Components/Drivers/CAN.c | 373 +++++++++++++++++++++++++++ Components/Drivers/CAN.h | 58 +++++ Components/Drivers/CANRegisters.h | 90 +++++++ Components/GPIO/GPIOTask.cpp | 65 +++-- Components/SystemDefines.hpp | 10 + Components/main_system.cpp | 2 + Components/main_system.hpp | 4 + Core/Src/main.c | 2 +- Cube++ | 2 +- 15 files changed, 767 insertions(+), 35 deletions(-) create mode 100644 Components/CAN/CANTxTask.cpp create mode 100644 Components/CAN/CANTxTask.hpp create mode 100644 Components/Drivers/CAN.c create mode 100644 Components/Drivers/CAN.h create mode 100644 Components/Drivers/CANRegisters.h diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index affcdb8..20928fa 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index 9e0da0d..e0969c7 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 +2F62501ED4689FB349E356AB974DBE57=05328855C4E51ECDCD46876FE3491C71 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 +8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 eclipse.preferences.version=1 diff --git a/BCubed.ioc b/BCubed.ioc index f45342a..fa1ccbc 100644 --- a/BCubed.ioc +++ b/BCubed.ioc @@ -310,8 +310,8 @@ SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler SPI1.Mode=SPI_MODE_MASTER SPI1.VirtualType=VM_MASTER -SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 -SPI2.CalculateBaudRate=16.0 MBits/s +SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 +SPI2.CalculateBaudRate=2.0 MBits/s SPI2.Direction=SPI_DIRECTION_2LINES SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler SPI2.Mode=SPI_MODE_MASTER @@ -328,3 +328,4 @@ VP_SYS_VS_tim2.Mode=TIM2 VP_SYS_VS_tim2.Signal=SYS_VS_tim2 board=custom rtos.0.ip=FREERTOS +isbadioc=false diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp new file mode 100644 index 0000000..bff0e59 --- /dev/null +++ b/Components/CAN/CANTxTask.cpp @@ -0,0 +1,111 @@ +/** + ****************************************************************************** + * File Name : CANTxTask.cpp + * Description : Task for transmitting CAN messages + ****************************************************************************** +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include + +#include "CANTxTask.hpp" + +#include "CAN.h" +#include "CANRegisters.h" + + +CANPeripheral peripheral1 = { + .CS_PORT = CS_CAN_N_GPIO_Port, + .CS_PIN = CS_CAN_N_Pin, + .hspi = SystemHandles::CAN_SPI +}; + +/** + * @brief Constructor for CANTxTask + */ +CANTxTask::CANTxTask() : Task(CAN_TX_TASK_QUEUE_DEPTH_OBJS) +{ +} + +/** + * @brief Initialize the CANTxTask + */ +void CANTxTask::InitTask() +{ + // Make sure the task is not already initialized + CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize GPIO task twice"); + + BaseType_t rtValue = + xTaskCreate((TaskFunction_t)CANTxTask::RunTask, + (const char*)"CANTxTask", + (uint16_t)CAN_TX_TASK_STACK_DEPTH_WORDS, + (void*)this, + (UBaseType_t)CAN_TX_TASK_PRIORITY, + (TaskHandle_t*)&rtTaskHandle); + + CUBE_ASSERT(rtValue == pdPASS, "CANTxTask::InitTask() - xTaskCreate() failed"); +} + +/** + * @brief Instance Run loop for the CAN_TX Task, runs on scheduler start as long as the task is initialized. + * @param pvParams RTOS Passed void parameters, contains a pointer to the object instance, should not be used + */ +void CANTxTask::Run(void * pvParams) +{ + ConfigureCANSPI(&peripheral1); + while(1) { + + // Wait forever for a command + Command cm; + qEvtQueue->ReceiveWait(cm); + + // Process the command + HandleCommand(cm); + + cm.Reset(); + } +} + +/** + * @brief Handle a command + * @param cm Command to handle + */ +void CANTxTask::HandleCommand(Command& cm) +{ + CANMsg msg; + msg.ID = 0; + msg.DLC = 1; // Assuming DLC of 1 for each command; adjust as needed. + // msg.data[0] = 1; // Example data; set according to command specifics. + + // Handle command based on address/type + switch (static_cast(cm.GetTaskCommand())) { + case LIGHTS_INPUT_BASE: + msg.extendedID = 0x701; + msg.data[0] = 0xAA; + CUBE_PRINT("Sent Lights Input command\n"); + break; + + case DRIVER_BASE: + msg.extendedID = 0x703; + msg.data[0] = 0xBB; + CUBE_PRINT("Sent Driver command\n"); + break; + + case LIGHTS_STATUS_BASE: + msg.extendedID = 0x711; + msg.data[0] = 0xCC; + CUBE_PRINT("Sent Lights Status command\n"); + break; + + default: + CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); + break; + } + + if (msg.extendedID != 0) { + sendExtendedCANMessage(&msg, &peripheral1); + } + + cm.Reset(); // Clear command data after processing +} diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp new file mode 100644 index 0000000..0479418 --- /dev/null +++ b/Components/CAN/CANTxTask.hpp @@ -0,0 +1,53 @@ +/** + ****************************************************************************** + * File Name : CANTxTask.hpp + * Description : + ****************************************************************************** +*/ +#ifndef CUBE_SYSTEM_CAN_TX_TASK_HPP_ +#define CUBE_SYSTEM_CAN_TX_TASK_HPP_ + +/* Includes ------------------------------------------------------------------*/ +#include "main_system.hpp" +#include "Task.hpp" +#include "Command.hpp" +#include "CubeUtils.hpp" +#include + +#include "SystemDefines.hpp" +#include "CubeDefines.hpp" + +/* Enums ------------------------------------------------------------------*/ +enum CAN_TX_COMMANDS { + LIGHTS_INPUT_BASE, // Command for lights input + DRIVER_BASE, // Command for driver data + LIGHTS_STATUS_BASE // Command for lights status +}; + +/* Macros ------------------------------------------------------------------*/ + + +/* Class ------------------------------------------------------------------*/ +class CANTxTask : public Task +{ +public: + static CANTxTask& Inst() { + static CANTxTask inst; + return inst; + } + + void InitTask(); + +protected: + static void RunTask(void* pvParams) { CANTxTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void * pvParams); // Main run code + void HandleCommand(Command& cm); + +private: + // Private Functions + CANTxTask(); // Private constructor + CANTxTask(const CANTxTask&); // Prevent copy-construction + CANTxTask& operator=(const CANTxTask&); // Prevent assignment +}; + +#endif diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 0c82a7a..8452f64 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -15,6 +15,9 @@ #include "IOExpander.hpp" #include "SPI/SPI_Task.hpp" +#include "CAN/CANTxTask.hpp" +#include "CAN.h" + // External Tasks (to send debug commands to) /* Macros --------------------------------------------------------------------*/ @@ -149,6 +152,22 @@ void DebugTask::HandleDebugMessage(const char* msg) } } + //-- CAN Commands -- + else if (strcmp(msg, "can_lights_input") == 0) { + Command cmd(DATA_COMMAND, LIGHTS_INPUT_BASE); + Queue* evtQ = CANTxTask::Inst().GetEventQueue(); + bool res = evtQ->Send(cmd); + } + else if (strcmp(msg, "can_driver_base") == 0) { + Command cmd(DATA_COMMAND, DRIVER_BASE); + Queue* evtQ = CANTxTask::Inst().GetEventQueue(); + bool res = evtQ->Send(cmd); + } + else if (strcmp(msg, "light_status_base") == 0) { + Command cmd(DATA_COMMAND, LIGHTS_STATUS_BASE); + Queue* evtQ = CANTxTask::Inst().GetEventQueue(); + bool res = evtQ->Send(cmd); + } //-- SYSTEM / CHAR COMMANDS -- (Must be last) else if (strncmp(msg, "iox_upd", 7) == 0) { diff --git a/Components/Drivers/CAN.c b/Components/Drivers/CAN.c new file mode 100644 index 0000000..56ee32c --- /dev/null +++ b/Components/Drivers/CAN.c @@ -0,0 +1,373 @@ +#include "CAN.h" + +// defined this so I could say "for ever" in an infinite for loop +#define ever (;;) + +/*-------------------------------SPI interface instructions-------------------------------*/ + +/** + * @brief write to registry in CAN IC //FIXME: is this read or write... + * @param address: hex address of the register + * bufffer: to store value read + * @retval None + */ +void CAN_IC_READ_REGISTER(uint8_t address, uint8_t* buffer, CANPeripheral *peripheral) +{ + // Packet includes 3 bytes + // 1st byte: 0x03 (specifies as read instruction) + // 2nd byte: address of register to read + uint8_t packet[2] = {0x03, address}; + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); // Initialize instruction by setting CS pin low + status = HAL_SPI_Transmit(peripheral->hspi, packet, 2, 100U); //transmit + status = HAL_SPI_Receive(peripheral->hspi, buffer, 1, 100U); //receive register contents + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); // Terminate instruction by setting CS pin high +} + +/** + * @brief write to registry in CAN IC + * @param address: hex address of the register + * value: value to be written to the register + * @retval None + */ +void CAN_IC_WRITE_REGISTER(uint8_t address, uint8_t value, CANPeripheral *peripheral) +{ + // Packet includes 3 bytes + // 1st byte: 0x02 (specifies as write instruction) + // 2nd byte: address of register to write to + // 3rd byte: value to write + uint8_t packet[3] = {0x02, address, value}; + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); //set CS pin low + status = HAL_SPI_Transmit(peripheral->hspi, packet, 3, 100U); //transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); //set CS pin high +} + +/** + * @brief write to a specific series of bits in a register in CAN IC + * @param address: hex address of the register + * mask: bit mask + * value: value to be written to the register + * @retval None + */ +void CAN_IC_WRITE_REGISTER_BITWISE(uint8_t address, uint8_t mask, uint8_t value, CANPeripheral *peripheral) +{ + // 0x05 specifies bit-write instruction + // mask specifies which bits can be modified (1 means bit can be modified) + uint8_t packet[4] = {0x05, address, mask, value}; + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); //set CS pin low + status = HAL_SPI_Transmit(peripheral->hspi, packet, 4, 100U); //transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); //set CS pin high +} + +/** + * @brief read status of CAN IC + * @param buffer: buffer to write status + * @retval None + */ +void CAN_IC_READ_STATUS(uint8_t* buffer, CANPeripheral *peripheral) +{ + // Packet includes read status instruction + uint8_t packet[1] = {0xA0}; + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); // Initialize instruction by setting CS pin low + status = HAL_SPI_Transmit(peripheral->hspi, packet, 1, 100U); //transmit + status = HAL_SPI_Receive(peripheral->hspi, buffer, 1, 100U); //receive register contents + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); // Terminate instruction by setting CS pin high +} + +/** + * @brief Reset the CAN IC + * @param None + * @retval None + */ +void CAN_IC_RESET(CANPeripheral *peripheral) { + // Packet includes reset instruction + uint8_t packet[1] = {0xC0}; + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); + status = HAL_SPI_Transmit(peripheral->hspi, packet, 1, 100U); //reset IC to default + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); +} + +/** + * @brief Request to send transmit buffer + * @param channel: which buffer to send + * @retval None + */ +void CAN_IC_REQUEST_TO_SEND(uint8_t channel, CANPeripheral *peripheral) { + // T0: 0x01 + // T1: 0x02 + // T2: 0x04 + uint8_t packet = (1 << channel); + + HAL_StatusTypeDef status; + + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); + status = HAL_SPI_Transmit(peripheral->hspi, &packet, 1, 100U); //reset IC to default + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); +} + + +/** + * @brief configure CAN IC through SPI + * @param None + * @retval None + * Configuration is as close to Elysia's CAN configuration whenever possible + * TODO: add configuration verification and return value accordingly + */ +void ConfigureCANSPI(CANPeripheral *peripheral) +{ + // TODO: ENSURE THAT THE IC IS IN CONFIG MODE............... + + // oof this is a mind fook + // TODO: ask violet of this settings + + // Ensure IC is out of reset state (128 clock cycles) + // HAL_Delay(100); + + // Tq = (2 x (BRP + 1)) / Fosc + uint8_t CONFIG_CNF1 = 0x01; //BRP = 1 to make tq = 250ns and a SJW of 1Tq + uint8_t CONFIG_CNF2 = 0x98; //PRSEG = 0, PHSEG1 = 3, SAM = 0, BTLMODE = 1 + uint8_t CONFIG_CNF3 = 0x01; //WAFKIL disabled, PHSEG2 = 2 (BTL enabled) but PHSEG = 1 makes it backwards compatible???? wat + + // uint8_t CONFIG_CNF1 = 0x07; // BRP = 8 (baud rate prescaler), SJW = 1 TQ + // uint8_t CONFIG_CNF2 = 0x90; // PRSEG = 1 TQ, PHSEG1 = 5 TQ, sample point at 75% + // uint8_t CONFIG_CNF3 = 0x02; // PHSEG2 = 2 TQ + + HAL_StatusTypeDef status; + + // Reset CAN IC + CAN_IC_RESET(peripheral); + // HAL_Delay(100); + + // CANSTAT.OPMOD must read as config mode to be able to write to the registers (0x80) + uint8_t CANSTAT_STATUS = 0; + CAN_IC_READ_REGISTER(CANSTAT, &CANSTAT_STATUS, peripheral); + + // Ensure IC is in configuration mode + if ((CANSTAT_STATUS & 0xE0) != 0x80) { + CAN_IC_WRITE_REGISTER_BITWISE(CANCTRL, 0xE0, 0x80, peripheral); + // HAL_Delay(100); + } + + // Base IC Configuration Registers + CAN_IC_WRITE_REGISTER_BITWISE(CNF1, 0xFF, CONFIG_CNF1, peripheral); //configure CNF1 + CAN_IC_WRITE_REGISTER_BITWISE(CNF2, 0xFF, CONFIG_CNF2, peripheral); //configure CNF2 + CAN_IC_WRITE_REGISTER_BITWISE(CNF3, 0x47, CONFIG_CNF3, peripheral); //configure CNF3 + + // Receive Buffer Configurations + // Recieve valid standard and extended message frames + // Enable rollover: RXBnCTRL.BUKT = 1 + CAN_IC_WRITE_REGISTER_BITWISE(BFPCTRL, 0x0F, 0x0F, peripheral); + CAN_IC_WRITE_REGISTER_BITWISE(RXB0CTRL, 0x64, 0x64, peripheral); + CAN_IC_WRITE_REGISTER_BITWISE(RXB1CTRL, 0x60, 0x60, peripheral); + + CANSTAT_STATUS = 0; + + // Toggle CAN_TEST_SETUP to 1 for loopback mode, 0 for normal mode + #if 0 + CAN_IC_WRITE_REGISTER_BITWISE(CANCTRL, 0xE7, 0x44, peripheral); // Put IC in loop-back mode for testing as well as enable CLKOUT pin with 1:1 prescaler + // HAL_Delay(100); + CAN_IC_READ_REGISTER(CANSTAT, &CANSTAT_STATUS, peripheral); // 0x44 + #else + CAN_IC_WRITE_REGISTER_BITWISE(CANCTRL, 0xE7, 0x04, peripheral); //Put IC in normal operation mode with CLKOUT pin enable and 1:1 prescaler + // HAL_Delay(100); + CAN_IC_READ_REGISTER(CANSTAT, &CANSTAT_STATUS, peripheral); + #endif + + // Reset and configure interrupts + CAN_IC_WRITE_REGISTER(CANINTE, 0xA0, peripheral); //configure interrupts, currently enable ERRIF + CAN_IC_WRITE_REGISTER(CANINTF, 0x00, peripheral); //clear INTE flags + CAN_IC_WRITE_REGISTER(EFLG, 0x00, peripheral); +} + +/*-------------------------------------------------------------------------------------------*/ + +uint8_t checkAvailableTXChannel(CANPeripheral *peripheral) +{ + // uint32_t prevWakeTime = xTaskGetTickCount(); //Delay is fine if we have a CanTxGatekeeperTask + + // Check if TXBnCTRL.TXREQ is set, if not then buffer is available to use + for ever + { + /* + TODO: REMOVE THIS STUFF + When CANINTF.TXn is cleared, it indicates that "n" buffer is clear and can be used to put a message in... + Use flags instead as it will be easier and faster... + */ + + // Use "Read Status" command from IC to retrieve status of TXBnCTRL.TXREQ bits (remember to use mask, check datasheet for byte structure) + uint8_t CANStatus; + CAN_IC_READ_STATUS(&CANStatus, peripheral); + + uint8_t TXB0Status = CANStatus & 0b00000100; + uint8_t TXB1Status = CANStatus & 0b00010000; + uint8_t TXB2Status = CANStatus & 0b01000000; + + // CAN_IC_READ_REGISTER(TXB0CTRL, &TXB0Status, peripheral); + // TXB0Status = TXB0Status & 0x08; //Not masking out bits + if (!TXB0Status) { + return 0; + } + + // CAN_IC_READ_REGISTER(TXB1CTRL, &TXB1Status, peripheral); + // TXB1Status = TXB1Status & 0x08; //Not masking out bits + if (!TXB1Status) { + return 1; + } + + // CAN_IC_READ_REGISTER(TXB2CTRL, &TXB2Status, peripheral); + // TXB2Status = TXB2Status & 0x08; //Not masking out bits + if (!TXB2Status) { + return 2; + } + + osDelay(50); + // prevWakeTime += TX_CHANNEL_CHECK_DELAY; + // osDelayUntil(prevWakeTime); + } +} + +//TODO: make sendtxtask and a queue for it like the old mcu +/** + * @brief send CAN message + * @param None + * @retval None + */ +void sendCANMessage(CANMsg *msg, CANPeripheral *peripheral) +{ + // Find TxBuffer to use + uint8_t channel = checkAvailableTXChannel(peripheral); + uint8_t initialBufferAddress = TXB0CTRL + 16*(channel); + + // Initializations + uint8_t sendCommand = 0x80 + (0x01 < channel); //instruction to send CAN message on buffer 1 + uint8_t TXBNSIDH = (msg->ID & 0b11111111000) >> 3; // mask upper ID register (SD 10-3) + uint8_t TXBNSIDL = (msg->ID & 0b111) << 5; // mask lower ID register (SD 2-0) + uint8_t TXBNDLC = msg->DLC & 0x0F; // mask DLC + + // Set Standard Identifier and DLC + CAN_IC_WRITE_REGISTER(initialBufferAddress + 1, TXBNSIDH, peripheral); // SD 10-3 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 2, TXBNSIDL, peripheral); // SD 2-0 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 5, TXBNDLC, peripheral); // DLC + + // Set data to registers + uint8_t initialDataBufferAddress = initialBufferAddress + 6; + for(int i = 0; i < msg->DLC; i++) + { + CAN_IC_WRITE_REGISTER(initialDataBufferAddress + i, msg->data[i], peripheral); //write to relevant data registers + } + + // set transmit buffer priority to 3 (max) + // write to TXBNCTRL<1:0> + CAN_IC_WRITE_REGISTER_BITWISE(initialBufferAddress, 0x03, 0x03, peripheral); + + // Initiate message transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); + HAL_SPI_Transmit(peripheral->hspi, &sendCommand, 1, 100U); // Send command to transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); +} + +/** + * @brief send CAN message with extended identifier + * @param None + * @retval None + */ +void sendExtendedCANMessage(CANMsg *msg, CANPeripheral *peripheral) +{ + // Find TxBuffer to use + // uint8_t initialBufferAddress = TXB0CTRL + 16*(channel); //TXB0CTRL for channel 1, TXB1CTRL for channel 2, TXB2CTRL for channel 3 + uint8_t channel = checkAvailableTXChannel(peripheral); + uint8_t initialBufferAddress = TXB0CTRL + 16*(channel); + + // Initializations + uint8_t sendCommand = 0x80 + (1 << channel); //instruction to send CAN message on channel + uint8_t TXBNSIDH = (msg->extendedID >> 21) & 0xFF; + uint8_t TXBNSIDL = (((msg->extendedID >> 18) & 0x07) << 5) | 0x08 | ((msg->extendedID >> 16) & 0x03); + uint8_t TXBNEID8 = (msg->extendedID >> 8) & 0xFF; + uint8_t TXBNEID0 = msg->extendedID & 0xFF; + uint8_t TXBNDLC = msg->DLC & 0x0F; + + // Set Extended Identifier and DLC + CAN_IC_WRITE_REGISTER(initialBufferAddress + 1, TXBNSIDH, peripheral); // SD 10-3 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 2, TXBNSIDL, peripheral); // SD 2-0, ED 17-16 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 3, TXBNEID8, peripheral); // ED 15-8 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 4, TXBNEID0, peripheral); // ED 7-0 + CAN_IC_WRITE_REGISTER(initialBufferAddress + 5, TXBNDLC, peripheral); // DLC + + uint8_t initialDataBufferAddress = initialBufferAddress + 6; + for(int i = 0; i < msg->DLC; i++) + { + CAN_IC_WRITE_REGISTER(initialDataBufferAddress + i, msg->data[i], peripheral); //write to relevant data registers + } + + CAN_IC_WRITE_REGISTER_BITWISE(initialBufferAddress, 0x03, 0x03, peripheral); //set transmit buffer priority to 3 (max) + + // Initiate message transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_RESET); + HAL_SPI_Transmit(peripheral->hspi, &sendCommand, 1, 100U); //Send command to transmit + HAL_GPIO_WritePin(peripheral->CS_PORT, peripheral->CS_PIN, GPIO_PIN_SET); +} + +/** + * @brief Receive CAN message + * @param None + * @retval None + */ +void receiveCANMessage(uint8_t channel, uint32_t* ID, uint8_t* DLC, uint8_t* data, CANPeripheral *peripheral) +{ + // Check if channel is valid, should never go in with wrong channel + if (channel > 1) { + return; + } + + uint8_t initialBufferAddress = RXB0CTRL + 16*(channel); //RXB0CTRL for channel 0, RXB1CTRL for channel 1 + + uint8_t RXBNSIDH = 0; + uint8_t RXBNSIDL = 0; + uint8_t RXBDLC = 0; + + CAN_IC_READ_REGISTER(initialBufferAddress + 1, &RXBNSIDH, peripheral); // SD 10-3 + CAN_IC_READ_REGISTER(initialBufferAddress + 2, &RXBNSIDL, peripheral); //SD 2-0, IDE, ED 17-16 + CAN_IC_READ_REGISTER(initialBufferAddress + 5, &RXBDLC, peripheral); //DLC + + if(RXBNSIDL & 0x08) // Check RXBmSIDL.IDE to verify if CAN message has extended identifier + { + uint8_t RXBNEID8 = 0; + uint8_t RXBNEID0 = 0; + CAN_IC_READ_REGISTER(initialBufferAddress + 3, &RXBNEID8, peripheral); // ED 15-8 + CAN_IC_READ_REGISTER(initialBufferAddress + 4, &RXBNEID0, peripheral); // ED 7-0 + *ID = (RXBNSIDH << 21) | (((RXBNSIDL >> 5) & 0x07) << 18) | ((RXBNSIDL & 0x03) << 16) | (RXBNEID8 << 8) | (RXBNEID0); + } else // CAN message is standard + { + *ID = (RXBNSIDH << 3) | (RXBNSIDL >> 5); + } + + // Check data length of CAN message + *DLC = RXBDLC & 0x0F; + if(*DLC > 8){ + *DLC = 0; + } + + uint8_t initialDataBufferAddress = initialBufferAddress + 6; + for(int i = 0; i < *DLC; i++) + { + CAN_IC_READ_REGISTER(initialDataBufferAddress + i, &data[i], peripheral); //read from relevant data registers + } + + CAN_IC_WRITE_REGISTER_BITWISE(CANINTF, channel + 1, 0, peripheral); //clear interrupts + return; +} + diff --git a/Components/Drivers/CAN.h b/Components/Drivers/CAN.h new file mode 100644 index 0000000..66d9020 --- /dev/null +++ b/Components/Drivers/CAN.h @@ -0,0 +1,58 @@ +#pragma once + +#include "main.h" +#include +#include "cmsis_os.h" +#include "CANRegisters.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint16_t ID; + uint32_t extendedID; + uint8_t DLC; + uint8_t data[8]; +} CANMsg; + +typedef struct { + uint32_t ID; + uint8_t DLC; + uint8_t data; +} ReceiveMsg; + +typedef struct { + GPIO_TypeDef *CS_PORT; + uint16_t CS_PIN; + SPI_HandleTypeDef *hspi; +} CANPeripheral; + + +#define TX_CHANNEL_CHECK_DELAY 1 +#define CAN_TEST_SETUP 1 + +// CAN SPI Interface Functions +void CAN_IC_READ_REGISTER(uint8_t address, uint8_t* buffer, CANPeripheral *peripheral); +void CAN_IC_WRITE_REGISTER_BITWISE(uint8_t address, uint8_t mask, uint8_t value, CANPeripheral *peripheral); +void CAN_IC_WRITE_REGISTER(uint8_t address, uint8_t value, CANPeripheral *peripheral); +void CAN_IC_READ_STATUS(uint8_t* buffer, CANPeripheral *peripheral); +void CAN_IC_RESET(CANPeripheral *peripheral); +void CAN_IC_REQUEST_TO_SEND(uint8_t channel, CANPeripheral *peripheral); + +// CAN Operation Functions +void ConfigureCANSPI(CANPeripheral *peripheral); +void sendCANMessage(CANMsg *msg, CANPeripheral *peripheral); +void sendExtendedCANMessage(CANMsg *msg, CANPeripheral *peripheral); +void receiveCANMessage(uint8_t channel, uint32_t* ID, uint8_t* DLC, uint8_t* data, CANPeripheral *peripheral); +uint8_t checkAvailableTXChannel(CANPeripheral *peripheral); + +extern uint8_t blueStatus; +extern uint8_t greenStatus; + +void pollCanSetup(); + +#ifdef __cplusplus +} +#endif +// https://www.codesdope.com/blog/article/making-a-queue-using-linked-list-in-c/ diff --git a/Components/Drivers/CANRegisters.h b/Components/Drivers/CANRegisters.h new file mode 100644 index 0000000..c213ad1 --- /dev/null +++ b/Components/Drivers/CANRegisters.h @@ -0,0 +1,90 @@ +#pragma once + +// Transmit message channels +#define TX_CHANNEL0 0 +#define TX_CHANNEL1 1 +#define TX_CHANNEL2 2 + +// Receive message channels +#define RX_CHANNEL0 0 +#define RX_CHANNEL1 1 +// CAN register definitions +#define CNF1 0x2A +#define CNF2 0x29 +#define CNF3 0x28 +#define CANINTE 0x2B +#define CANINTF 0x2C +#define TEC 0x1C +#define REC 0x1D +#define EFLG 0x2D +#define CANCTRL 0x0F // 0xXF +#define CANSTAT 0x0E // 0xXE +#define TXRTSCTRL 0x0D +#define BFPCTRL 0x0C +#define TXB0CTRL 0x30 //these are the three trasmit channels +#define TXB1CTRL 0x40 +#define TXB2CTRL 0x50 +#define RXB0CTRL 0x60 //two receive buffers +#define RXB1CTRL 0x70 +#define TXB0SIDH 0x31 +#define TXB1SIDH 0x41 +#define TXB2SIDH 0x51 +#define TXB0SIDL 0x32 +#define TXB1SIDL 0x42 +#define TXB2SIDL 0x52 +#define TXB0EID8 0x33 +#define TXB1EID8 0x43 +#define TXB2EID8 0x53 +#define TXB0EID0 0x34 +#define TXB1EID0 0x44 +#define TXB2EID0 0x54 +#define TXB0DLC 0x35 +#define TXB1DLC 0x45 +#define TXB2DLC 0x55 +#define TXB0Dm 0x36-0x3D //todo +#define TXB1Dm 0x46-0x4D //todo +#define TXB2Dm 0x56-0x5D +#define RXB0SIDH 0x61 +#define RXB1SIDH 0x71 +#define RXB0SIDL 0x62 +#define RXB1SIDL 0x72 +#define RXB0EID8 0x63 +#define RXB1EID8 0x73 +#define RXB0EID0 0x64 +#define RXB1EID0 0x74 +#define RXB0DLC 0x65 +#define RXB1DLC 0x75 +#define RXB0DM 0x66-0x6D //todo +#define RXB1DM 0x76-0x7D //todo +#define RXF0SIDH 0x00 +#define RXF1SIDH 0x04 +#define RXF2SIDH 0x08 +#define RXF3SIDH 0x10 +#define RXF4SIDH 0x14 +#define RXF5SIDH 0x18 +#define RXF0SIDL 0x01 +#define RXF1SIDL 0x05 +#define RXF2SIDL 0x09 +#define RXF3SIDL 0x11 +#define RXF4SIDL 0x15 +#define RXF5SIDL 0x19 +#define RXF0EID8 0x02 +#define RXF1EID8 0x06 +#define RXF2EID8 0x0A +#define RXF3EID8 0x12 +#define RXF4EID8 0x16 +#define RXF5EID8 0x1A +#define RXF0EID0 0x03 +#define RXF1EID0 0x07 +#define RXF2EID0 0x0B +#define RXF3EID0 0x13 +#define RXF4EID0 0x17 +#define RXF5EID0 0x1B +#define RXM0SIDH 0x20 +#define RXM1SIDH 0x24 +#define RXM0SIDL 0x21 +#define RXM1SIDL 0x25 +#define RXM0EID8 0x22 +#define RXM1EID8 0x26 +#define RXM0EID0 0x23 +#define RXM1EID0 0x27 diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 1687bc7..935f72d 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -64,19 +64,19 @@ void GPIOTask::Run(void * pvParams) switch (static_cast(i)) { case DriverControls::FORWARD_NEUTRAL_REVERSE_H: - CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { - powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); + //powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); } else if (driverControlState[i] == IOState::LOW) { - powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); + //powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); } else if (driverControlState[i] == IOState::ERROR) { } break; case DriverControls::FORWARD_NEUTRAL_REVERSE_L: - CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -88,7 +88,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::ARRAYS_DISCONNECT: - CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -100,7 +100,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::RACE_MODE_ENABLE: - CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -112,19 +112,19 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::HEADLIGHTS_ENABLE: - CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { - powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + //powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i] == IOState::LOW) { - powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); + //powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); } else if (driverControlState[i] == IOState::ERROR) { } break; case DriverControls::DISPLAY_SCREEN_ROTATE: - CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -136,7 +136,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::PROXIMITY_SENSOR_ENABLE: - CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -148,7 +148,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::LAP_BUTTON: - CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); + //CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -169,43 +169,43 @@ void GPIOTask::Run(void * pvParams) switch (static_cast(i)) { case DriverControls::HORN_ENABLE: - CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { - powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); + //powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); } else if (driverControlState[i-2] == IOState::LOW) { - powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + //powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); } else if (driverControlState[i-2] == IOState::ERROR) { } break; case DriverControls::LEFT_SIGNAL_ENABLE: - CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { - powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i-2] == IOState::LOW) { - powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); } else if (driverControlState[i-2] == IOState::ERROR) { } break; case DriverControls::RIGHT_SIGNAL_ENABLE: - CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { - powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + //powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i-2] == IOState::LOW) { - powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + //powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i-2] == IOState::ERROR) { } break; case DriverControls::EMERGENCY_HAZARD: - CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } @@ -217,7 +217,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::MOTOR_RESET: - CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } @@ -229,7 +229,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::PARKING_BRAKE_DETECT: - CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } @@ -241,7 +241,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::MECHANICAL_BRAKE: - CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } @@ -253,7 +253,7 @@ void GPIOTask::Run(void * pvParams) } break; case DriverControls::GREEN_LED: - CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); + //CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); if (driverControlState[i-2] == IOState::HIGH) { } @@ -269,8 +269,19 @@ void GPIOTask::Run(void * pvParams) } } + powerBoardExpander.TogglePin(PowerBoard::BRAKE_LIGHT_SIGNAL); + powerBoardExpander.TogglePin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL); + powerBoardExpander.TogglePin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL); + powerBoardExpander.TogglePin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL); + powerBoardExpander.TogglePin(PowerBoard::HEADLIGHT_SIGNAL); + powerBoardExpander.TogglePin(PowerBoard::HORN_SIGNAL); + + + powerBoardExpander.TogglePin(PowerBoard::ORANGE_LED); + powerBoardExpander.TogglePin(PowerBoard::GREEN_LED); + // Commit changes to Power board - powerBoardExpander.Commit(); + //powerBoardExpander.Commit(); // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); diff --git a/Components/SystemDefines.hpp b/Components/SystemDefines.hpp index 12c9af4..c56d503 100644 --- a/Components/SystemDefines.hpp +++ b/Components/SystemDefines.hpp @@ -64,4 +64,14 @@ constexpr uint8_t GPIO_TASK_PRIORITY = 2; // Priority of the GPIO tas constexpr uint8_t GPIO_TASK_QUEUE_DEPTH_OBJS = 10; // Size of the GPIO task queue constexpr uint16_t GPIO_TASK_STACK_DEPTH_WORDS = 512; // Size of the GPIO task stack +// CAN TX TASK +constexpr uint8_t CAN_TX_TASK_PRIORITY = 2; // Priority of the CAN_TX task +constexpr uint8_t CAN_TX_TASK_QUEUE_DEPTH_OBJS = 10; // Size of the CAN_TX task queue +constexpr uint16_t CAN_TX_TASK_STACK_DEPTH_WORDS = 512; // Size of the CAN_TX task stack + +// CAN RX TASK +constexpr uint8_t CAN_RX_TASK_PRIORITY = 2; // Priority of the CAN_RX task +constexpr uint8_t CAN_RX_TASK_QUEUE_DEPTH_OBJS = 10; // Size of the CAN_RX task queue +constexpr uint16_t CAN_RX_TASK_STACK_DEPTH_WORDS = 512; // Size of the CAN_RX task stack + #endif // CUBE_MAIN_SYSTEM_DEFINES_H diff --git a/Components/main_system.cpp b/Components/main_system.cpp index cb53bfa..710e284 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -15,6 +15,7 @@ #include "DebugTask.hpp" #include "SPI/SPI_Task.hpp" #include "GPIO/GPIOTask.hpp" +#include "CAN/CANTxTask.hpp" /* Drivers ------------------------------------------------------------------*/ namespace Driver { @@ -32,6 +33,7 @@ void run_main() { DebugTask::Inst().InitTask(); SPI_Task::Inst().InitTask(); GPIOTask::Inst().InitTask(); + CANTxTask::Inst().InitTask(); // Print System Boot Info : Warning, don't queue more than 10 prints before scheduler starts CUBE_PRINT("\n-- CUBE SYSTEM --\n"); diff --git a/Components/main_system.hpp b/Components/main_system.hpp index bfb1b61..f7a8ea9 100644 --- a/Components/main_system.hpp +++ b/Components/main_system.hpp @@ -47,10 +47,14 @@ extern CRC_HandleTypeDef hcrc; // CRC - Hardware CRC System Handle extern I2C_HandleTypeDef hi2c2; // I2C - IO Expander System Handle extern SPI_HandleTypeDef hspi1; // SPI - SPI 1 System Handler + +extern SPI_HandleTypeDef hspi2; // SPI - SPI 2 System Handler + namespace SystemHandles { constexpr CRC_HandleTypeDef* CRC_Handle = &hcrc; constexpr I2C_HandleTypeDef* I2C_Expander = &hi2c2; constexpr SPI_HandleTypeDef* SPI1_Handle = &hspi1; + constexpr SPI_HandleTypeDef* CAN_SPI = &hspi2; } #endif /* MAIN_SYSTEM_HPP_ */ diff --git a/Core/Src/main.c b/Core/Src/main.c index ffec117..70b61a9 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -359,7 +359,7 @@ static void MX_SPI2_Init(void) hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; diff --git a/Cube++ b/Cube++ index 2440272..0a71ec6 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d +Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 From db58935f9a3e7878465be5d481564968ec24ba57 Mon Sep 17 00:00:00 2001 From: MacKante Date: Sat, 23 Nov 2024 11:13:22 -0700 Subject: [PATCH 12/38] reformating code --- Components/GPIO/GPIOTask.cpp | 29 +++++++++++++++++++++-------- Components/main_system.cpp | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 935f72d..4ad2f8d 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -269,19 +269,32 @@ void GPIOTask::Run(void * pvParams) } } - powerBoardExpander.TogglePin(PowerBoard::BRAKE_LIGHT_SIGNAL); - powerBoardExpander.TogglePin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL); - powerBoardExpander.TogglePin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL); - powerBoardExpander.TogglePin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL); - powerBoardExpander.TogglePin(PowerBoard::HEADLIGHT_SIGNAL); - powerBoardExpander.TogglePin(PowerBoard::HORN_SIGNAL); - +// powerBoardExpander.TogglePin(PowerBoard::BRAKE_LIGHT_SIGNAL); +// powerBoardExpander.TogglePin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL); +// powerBoardExpander.TogglePin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL); +// powerBoardExpander.TogglePin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL); +// powerBoardExpander.TogglePin(PowerBoard::HEADLIGHT_SIGNAL); +// powerBoardExpander.TogglePin(PowerBoard::HORN_SIGNAL); + +// powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::LOW); +// powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::LOW); +// powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); +// powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::LOW); +// powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); +// powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + + powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); powerBoardExpander.TogglePin(PowerBoard::ORANGE_LED); powerBoardExpander.TogglePin(PowerBoard::GREEN_LED); // Commit changes to Power board - //powerBoardExpander.Commit(); + // powerBoardExpander.Commit(); // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); diff --git a/Components/main_system.cpp b/Components/main_system.cpp index 710e284..feb9395 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -33,7 +33,7 @@ void run_main() { DebugTask::Inst().InitTask(); SPI_Task::Inst().InitTask(); GPIOTask::Inst().InitTask(); - CANTxTask::Inst().InitTask(); + // CANTxTask::Inst().InitTask(); // Print System Boot Info : Warning, don't queue more than 10 prints before scheduler starts CUBE_PRINT("\n-- CUBE SYSTEM --\n"); From ef5d2b0c0dee7ecc9fc838c486a32e4df24c4ad7 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 23 Nov 2024 15:25:00 -0700 Subject: [PATCH 13/38] feat: set DLC and command Free Data() --- .settings/language.settings.xml | 4 ++-- .settings/stm32cubeide.project.prefs | 4 ++-- Components/CAN/CANTxTask.cpp | 10 +++++++++- Cube++ | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 20928fa..530b338 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index e0969c7..9e0da0d 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=05328855C4E51ECDCD46876FE3491C71 +2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 +8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 eclipse.preferences.version=1 diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index bff0e59..6352637 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -82,18 +82,26 @@ void CANTxTask::HandleCommand(Command& cm) switch (static_cast(cm.GetTaskCommand())) { case LIGHTS_INPUT_BASE: msg.extendedID = 0x701; - msg.data[0] = 0xAA; + // Dynamically allocate memory + msg.DLC = 1; //Dynamically allocate memory? + // cm.AllocateData(msg.DLC); + // uint8_t* commandDataPointer = cm.GetDataPointer(); + // commandDataPointer[0] = 0xAA; //... + // cm.FreeData(); + msg.data[0] = 0xAA; //Dummy Data, TODO: Replace with actual data CUBE_PRINT("Sent Lights Input command\n"); break; case DRIVER_BASE: msg.extendedID = 0x703; + msg.DLC = 4; msg.data[0] = 0xBB; CUBE_PRINT("Sent Driver command\n"); break; case LIGHTS_STATUS_BASE: msg.extendedID = 0x711; + msg.DLC = 1; msg.data[0] = 0xCC; CUBE_PRINT("Sent Lights Status command\n"); break; diff --git a/Cube++ b/Cube++ index 0a71ec6..2440272 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 0a71ec6a1d53f92590320c5ee482ad393b6d72d2 +Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d From deb61015a7882eb31026e8e1a6ccefedaf8bd0a2 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 23 Nov 2024 15:25:54 -0700 Subject: [PATCH 14/38] feat: Free Data on Command --- Cube++ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cube++ b/Cube++ index 2440272..2742128 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d +Subproject commit 2742128a15836068dff9fe5d7c94bba6cda5f928 From d318224d5839e943a3e391e36ccb1b4552e62114 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 23 Nov 2024 15:40:52 -0700 Subject: [PATCH 15/38] feat: globalize SPI pedal reading for CAN task --- Components/CAN/CANTxTask.cpp | 15 ++++++++++++++- Components/SPI/SPI_Task.cpp | 4 ++++ Components/SPI/SPI_Task.hpp | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index 6352637..adbac5d 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -14,6 +14,7 @@ #include "CAN.h" #include "CANRegisters.h" +#include "SPI_Task.hpp" CANPeripheral peripheral1 = { .CS_PORT = CS_CAN_N_GPIO_Port, @@ -95,7 +96,19 @@ void CANTxTask::HandleCommand(Command& cm) case DRIVER_BASE: msg.extendedID = 0x703; msg.DLC = 4; - msg.data[0] = 0xBB; + + // msg.data[0] = (g_accelerationReading_P & 0xFF); //LSB + // msg.data[1] = ((g_accelerationReading_P>>8) & 0xFF); //MSB + + // msg.data[2] = (g_accelerationReading_N & 0xFF); //LSB + // msg.data[3] = ((g_accelerationReading_N>>8) & 0xFF); //MSB + + // msg.data[4] = (g_brakeReading_P & 0xFF); //LSB + // msg.data[5] = ((g_brakeReading_P>>8) & 0xFF); //MSB + + // msg.data[6] = (g_brakeReading_N & 0xFF); //LSB + // msg.data[7] = ((g_brakeReading_N>>8) & 0xFF); //MSB + CUBE_PRINT("Sent Driver command\n"); break; diff --git a/Components/SPI/SPI_Task.cpp b/Components/SPI/SPI_Task.cpp index 8edb6d3..e7cf6cc 100644 --- a/Components/SPI/SPI_Task.cpp +++ b/Components/SPI/SPI_Task.cpp @@ -113,6 +113,7 @@ uint16_t SPI_Task::readAccelerationPedal_P(){ uint16_t accelerationPedalReading = readData(); // CUBE_PRINT("Acceleration P reading: %u\n", accelerationPedalReading); BoardSelectHigh(); + g_accelerationReading_P = accelerationPedalReading; return accelerationPedalReading; } @@ -123,6 +124,7 @@ uint16_t SPI_Task::readAccelerationPedal_N(){ uint16_t accelerationPedalReading = readData(); // CUBE_PRINT("Acceleration N reading: %u\n", accelerationPedalReading); BoardSelectHigh(); + g_accelerationReading_N = accelerationPedalReading; return accelerationPedalReading; } @@ -134,6 +136,7 @@ uint16_t SPI_Task::readBrakingPedal_P(){ uint16_t breakPedalReading = readData(); // CUBE_PRINT("Braking P reading: %u\n", breakPedalReading); BoardSelectHigh(); + g_brakeReading_P = breakPedalReading; return breakPedalReading; } @@ -144,6 +147,7 @@ uint16_t SPI_Task::readBrakingPedal_N(){ uint16_t breakPedalReading = readData(); // CUBE_PRINT("Braking N reading: %u\n", breakPedalReading); BoardSelectHigh(); + g_brakeReading_N = breakPedalReading; return breakPedalReading; } diff --git a/Components/SPI/SPI_Task.hpp b/Components/SPI/SPI_Task.hpp index 5a543aa..6788de6 100644 --- a/Components/SPI/SPI_Task.hpp +++ b/Components/SPI/SPI_Task.hpp @@ -19,6 +19,11 @@ #define ADC_MAX 921 // Corresponds to 90% of V_in #define SPI_TASK_DELAY 1000/SPI_TASK_FREQUENCY +extern volatile uint16_t g_accelerationReading_P; +extern volatile uint16_t g_accelerationReading_N; +extern volatile uint16_t g_brakeReading_P; +extern volatile uint16_t g_brakeReading_N; + enum SPI_COMMANDS { SPI_NONE = 0, /** TODO: Add commands */ }; From 614cea28c390c96e314edfe5ffb45b05778aecbd Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 30 Nov 2024 15:38:55 -0700 Subject: [PATCH 16/38] feat: GPIO CAN data formatted --- .vscode/settings.json | 5 +- Components/CAN/CANTxTask.cpp | 37 ++-- Components/GPIO/GPIOTask.cpp | 388 ++++++++++++++++++++++------------- Components/GPIO/GPIOTask.hpp | 10 + Components/SPI/SPI_Task.cpp | 265 +++++++++++++----------- Components/SPI/SPI_Task.hpp | 64 +++--- 6 files changed, 459 insertions(+), 310 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4b38763..4085d67 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,9 @@ "typeinfo": "cpp", "array": "cpp", "xstring": "cpp", - "xlocinfo": "cpp" + "xlocinfo": "cpp", + "algorithm": "cpp", + "list": "cpp", + "xutility": "cpp" } } \ No newline at end of file diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index adbac5d..c522531 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -14,7 +14,13 @@ #include "CAN.h" #include "CANRegisters.h" -#include "SPI_Task.hpp" +#include "GPIO/GPIOTask.hpp" +#include "SPI/SPI_Task.hpp" + + +//Example +uint16_t accelerationReading = SPI_Task::Inst().getAccelerationReading_P(); + CANPeripheral peripheral1 = { .CS_PORT = CS_CAN_N_GPIO_Port, @@ -79,17 +85,15 @@ void CANTxTask::HandleCommand(Command& cm) msg.DLC = 1; // Assuming DLC of 1 for each command; adjust as needed. // msg.data[0] = 1; // Example data; set according to command specifics. + uint8_t u8_data = 0; + uint32_t u32_data = 0; // Handle command based on address/type switch (static_cast(cm.GetTaskCommand())) { - case LIGHTS_INPUT_BASE: + case LIGHTS_INPUT_BASE: msg.extendedID = 0x701; - // Dynamically allocate memory - msg.DLC = 1; //Dynamically allocate memory? - // cm.AllocateData(msg.DLC); - // uint8_t* commandDataPointer = cm.GetDataPointer(); - // commandDataPointer[0] = 0xAA; //... - // cm.FreeData(); - msg.data[0] = 0xAA; //Dummy Data, TODO: Replace with actual data + msg.DLC = 1; + u8_data = GPIOTask::Inst().LightsInputsBase(); + msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); break; @@ -97,25 +101,14 @@ void CANTxTask::HandleCommand(Command& cm) msg.extendedID = 0x703; msg.DLC = 4; - // msg.data[0] = (g_accelerationReading_P & 0xFF); //LSB - // msg.data[1] = ((g_accelerationReading_P>>8) & 0xFF); //MSB - - // msg.data[2] = (g_accelerationReading_N & 0xFF); //LSB - // msg.data[3] = ((g_accelerationReading_N>>8) & 0xFF); //MSB - - // msg.data[4] = (g_brakeReading_P & 0xFF); //LSB - // msg.data[5] = ((g_brakeReading_P>>8) & 0xFF); //MSB - - // msg.data[6] = (g_brakeReading_N & 0xFF); //LSB - // msg.data[7] = ((g_brakeReading_N>>8) & 0xFF); //MSB - CUBE_PRINT("Sent Driver command\n"); break; case LIGHTS_STATUS_BASE: msg.extendedID = 0x711; msg.DLC = 1; - msg.data[0] = 0xCC; + u8_data = GPIOTask::Inst().LightStatus(); + msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); break; diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 4ad2f8d..b59964a 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -3,7 +3,7 @@ * File Name : GPIOTask.cpp * Description : Primary GPIO task. Handles writes and reads to PCA8575PW IO Expanders ****************************************************************************** -*/ + */ #include "SystemDefines.hpp" #include "GPIOTask.hpp" #include "IOExpander.hpp" @@ -29,259 +29,365 @@ void GPIOTask::InitTask() BaseType_t rtValue = xTaskCreate((TaskFunction_t)GPIOTask::RunTask, - (const char*)"GPIOTask", - (uint16_t)GPIO_TASK_STACK_DEPTH_WORDS, - (void*)this, - (UBaseType_t)GPIO_TASK_PRIORITY, - (TaskHandle_t*)&rtTaskHandle); + (const char *)"GPIOTask", + (uint16_t)GPIO_TASK_STACK_DEPTH_WORDS, + (void *)this, + (UBaseType_t)GPIO_TASK_PRIORITY, + (TaskHandle_t *)&rtTaskHandle); CUBE_ASSERT(rtValue == pdPASS, "GPIOTask::InitTask() - xTaskCreate() failed"); } +uint8_t GPIOTask::LightsInputsBase() +{ + + // Initialize Expander Objects + IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); + std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + + uint8_t output = 0; + + uint8_t headlightsOff = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::LOW; // True if headlights are off + uint8_t signalRight = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; + uint8_t signalLeft = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; + uint8_t hazard = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD) - 2] == IOState::HIGH; + + /** Commented out are from Elysia, not implemented in Helios */ + + output |= (headlightsOff ? 1 : 0) << 0; // Bit 0 + // output |= (headlightsLow ? 1 : 0) << 1; // Bit 1 + // output |= (headlightsHigh ? 1 : 0) << 2; // Bit 2 + output |= (signalRight ? 1 : 0) << 3; // Bit 3 + output |= (signalLeft ? 1 : 0) << 4; // Bit 4 + output |= (hazard ? 1 : 0) << 5; // Bit 5 + // output |= (interior ? 1 : 0) << 6; // Bit 6 + + return output; +} + +uint8_t GPIOTask::DriverBase() +{ + IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); + std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + + // DriverControls::FORWARD_NEUTRAL_REVERSE_H ?? + uint8_t output = 0; + + uint8_t lap = driverControlState[static_cast(DriverControls::LAP_BUTTON)] == IOState::HIGH; + uint8_t horn = driverControlState[static_cast(DriverControls::HORN_ENABLE) - 2] == IOState::HIGH; + uint8_t reset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; // Assumed reset is motor_reset + uint8_t brakes = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH + || driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; + + uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH + && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + + uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH + && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; + + /**Forward and Reverse Encoding from Electrical Team */ + /* 10 forward + * 11 reverse + * 01 not implemented + */ + + /** Commented out are from Elysia, not implemented in Helios */ + + //** Sending bits 24-31, beginning of the data is from the SPI task */ + output |= (brakes ? 1 : 0) << 0; // Bit 24 + output |= (forward ? 1 : 0) << 1; // Bit 25 + output |= (reverse ? 1 : 0) << 2; // Bit 26 + // output |= (pushToTalk ? 1 : 0) << 3; // Bit 27 + output |= (horn ? 1 : 0) << 4; // Bit 28 + output |= (reset ? 1 : 0) << 5; // Bit 29 + // output |= (aux ? 1 : 0) << 6; // Bit 30 + output |= (lap ? 1 : 0) << 7; // Bit 31 + + return output; +} + +uint8_t GPIOTask::LightStatus() +{ + //Potential Refactor, use driverControlExpander as a private class variable + IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); + std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + + uint8_t output = 0; + + uint8_t leftSignal = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; + uint8_t rightSignal = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; + uint8_t brakeLights = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH + || driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; + + /** Commented out are from Elysia, not implemented in Helios */ + + // output |= (lowBeams ? 1 : 0) << 0; // Bit 0 + // output |= (highBeams ? 1 : 0) << 1; // Bit 1 + output |= (brakeLights ? 1 : 0) << 2; // Bit 2 + output |= (leftSignal ? 1 : 0) << 3; // Bit 3 + output |= (rightSignal ? 1 : 0) << 4; // Bit 4 + // output |= (BMS_StrobeLight ? 1 : 0) << 5; // Bit 5 + + return output; +} + /** * @brief Instance Run loop for the GPIO Task, runs on scheduler start as long as the task is initialized. * @param pvParams RTOS Passed void parameters, contains a pointer to the object instance, should not be used */ -void GPIOTask::Run(void * pvParams) +void GPIOTask::Run(void *pvParams) { // Initialize Expander Objects - IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0 ,0)); + IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); // Expander status for CAN messages uint16_t powerBoardStatus = 0; uint16_t driverControlStatus = 0; - while (1) { + while (1) + { // Poll GPIO State of driver controls // Note on IOState array: index 0-7 are pins 0-7, index 8-15 are pins 10-17 - std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + std::array driverControlState = driverControlExpander.GetExpanderStateNow(); // TODO: Do Something to power board >_< based on driver control state or something... // Print for Now CUBE_PRINT("Driver Control State...\n"); - for (uint8_t i = 0; i < 8; i++) { + for (uint8_t i = 0; i < 8; i++) + { switch (static_cast(i)) { case DriverControls::FORWARD_NEUTRAL_REVERSE_H: - //CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - //powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); - } - else if (driverControlState[i] == IOState::LOW) { - //powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); + // CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { + // powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::LOW) + { + // powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); + } + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::FORWARD_NEUTRAL_REVERSE_L: - //CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::ARRAYS_DISCONNECT: - //CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::RACE_MODE_ENABLE: - //CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::HEADLIGHTS_ENABLE: - //CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - //powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + // CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { + // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); } - else if (driverControlState[i] == IOState::LOW) { - //powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); + else if (driverControlState[i] == IOState::LOW) + { + // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::DISPLAY_SCREEN_ROTATE: - //CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::PROXIMITY_SENSOR_ENABLE: - //CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; case DriverControls::LAP_BUTTON: - //CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); - if (driverControlState[i] == IOState::HIGH) { - + // CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); + if (driverControlState[i] == IOState::HIGH) + { } - else if (driverControlState[i] == IOState::LOW) { - + else if (driverControlState[i] == IOState::LOW) + { } - else if (driverControlState[i] == IOState::ERROR) { - + else if (driverControlState[i] == IOState::ERROR) + { } break; - default: - break; + default: + break; } } // Pins 10 - 17 - for (uint8_t i = 10; i < 18; i++) { - switch (static_cast(i)) - { + for (uint8_t i = 10; i < 18; i++) + { + switch (static_cast(i)) + { case DriverControls::HORN_ENABLE: - //CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - //powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); + // CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { + // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); } - else if (driverControlState[i-2] == IOState::LOW) { - //powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + else if (driverControlState[i - 2] == IOState::LOW) + { + // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::LEFT_SIGNAL_ENABLE: - //CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { + // CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); } - else if (driverControlState[i-2] == IOState::LOW) { + else if (driverControlState[i - 2] == IOState::LOW) + { // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::RIGHT_SIGNAL_ENABLE: - //CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - //powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + // CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { + // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } - else if (driverControlState[i-2] == IOState::LOW) { - //powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + else if (driverControlState[i - 2] == IOState::LOW) + { + // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::EMERGENCY_HAZARD: - //CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - + // CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { } - else if (driverControlState[i-2] == IOState::LOW) { - + else if (driverControlState[i - 2] == IOState::LOW) + { } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::MOTOR_RESET: - //CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - + // CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { } - else if (driverControlState[i-2] == IOState::LOW) { - + else if (driverControlState[i - 2] == IOState::LOW) + { } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::PARKING_BRAKE_DETECT: - //CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - + // CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { } - else if (driverControlState[i-2] == IOState::LOW) { - + else if (driverControlState[i - 2] == IOState::LOW) + { } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::MECHANICAL_BRAKE: - //CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - + // CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { } - else if (driverControlState[i-2] == IOState::LOW) { - + else if (driverControlState[i - 2] == IOState::LOW) + { } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; case DriverControls::GREEN_LED: - //CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); - if (driverControlState[i-2] == IOState::HIGH) { - + // CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); + if (driverControlState[i - 2] == IOState::HIGH) + { } - else if (driverControlState[i-2] == IOState::LOW) { - + else if (driverControlState[i - 2] == IOState::LOW) + { } - else if (driverControlState[i-2] == IOState::ERROR) { - + else if (driverControlState[i - 2] == IOState::ERROR) + { } break; default: break; - } + } } -// powerBoardExpander.TogglePin(PowerBoard::BRAKE_LIGHT_SIGNAL); -// powerBoardExpander.TogglePin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL); -// powerBoardExpander.TogglePin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL); -// powerBoardExpander.TogglePin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL); -// powerBoardExpander.TogglePin(PowerBoard::HEADLIGHT_SIGNAL); -// powerBoardExpander.TogglePin(PowerBoard::HORN_SIGNAL); - -// powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::LOW); -// powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::LOW); -// powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); -// powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::LOW); -// powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); -// powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + // powerBoardExpander.TogglePin(PowerBoard::BRAKE_LIGHT_SIGNAL); + // powerBoardExpander.TogglePin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL); + // powerBoardExpander.TogglePin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL); + // powerBoardExpander.TogglePin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL); + // powerBoardExpander.TogglePin(PowerBoard::HEADLIGHT_SIGNAL); + // powerBoardExpander.TogglePin(PowerBoard::HORN_SIGNAL); + + // powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); + // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::HIGH); powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::HIGH); diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index ca15b61..f145c81 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -27,6 +27,11 @@ class GPIOTask : public Task } void InitTask(); + + /**Getters for CAN formatting */ + uint8_t LightsInputsBase(); + uint8_t DriverBase(); + uint8_t LightStatus(); protected: static void RunTask(void* pvParams) { GPIOTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); @@ -37,6 +42,11 @@ class GPIOTask : public Task GPIOTask(); // Private constructor GPIOTask(const GPIOTask&); // Prevent copy-construction GPIOTask& operator=(const GPIOTask&); // Prevent assignment + + + //** Potential private variable for refactoring code + // IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); */ + }; #endif diff --git a/Components/SPI/SPI_Task.cpp b/Components/SPI/SPI_Task.cpp index e7cf6cc..70fc2a5 100644 --- a/Components/SPI/SPI_Task.cpp +++ b/Components/SPI/SPI_Task.cpp @@ -4,208 +4,237 @@ * Description : Primary SPI task, reads data from pedals. ****************************************************************************** */ -#include "SystemDefines.hpp" #include "SPI_Task.hpp" + #include "GPIO.hpp" +#include "SystemDefines.hpp" /** -* @brief Constructor for SPI Task -*/ + * @brief Constructor for SPI Task + */ SPI_Task::SPI_Task() : Task(SPI_TAK_QUEUE_DEPTH_OBJS) { - hspi_ = SystemHandles::SPI1_Handle; + hspi_ = SystemHandles::SPI1_Handle; } /** -* @brief Initialize the SPI Task -*/ + * @brief Initialize the SPI Task + */ void SPI_Task::InitTask() { - CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize SPI task twice"); + CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize SPI task twice"); - BaseType_t rtValue = - xTaskCreate((TaskFunction_t)SPI_Task::RunTask, - (const char*)"SPI Task", - (uint16_t)SPI_TASK_STACK_DEPTH_WORDS, - (void*)this, - (UBaseType_t)SPI_TASK_PRIORITY, - &rtTaskHandle); + BaseType_t rtValue = + xTaskCreate((TaskFunction_t)SPI_Task::RunTask, (const char *)"SPI Task", + (uint16_t)SPI_TASK_STACK_DEPTH_WORDS, (void *)this, + (UBaseType_t)SPI_TASK_PRIORITY, &rtTaskHandle); - CUBE_ASSERT(rtValue == pdPASS, "SPI_Task::InitTask() - xTaskCreate() failed"); + CUBE_ASSERT(rtValue == pdPASS, "SPI_Task::InitTask() - xTaskCreate() failed"); } /** -* @brief Handles a command. -* @param cm Command reference to handle -*/ -void SPI_Task::HandleCommand(Command& cm){ - - switch (cm.GetCommand()) { - case TASK_SPECIFIC_COMMAND: { - break; - } - default: - CUBE_PRINT("SPI Task - Received Unsupported Command {%d}\n", cm.GetCommand()); - break; - } - - //No matter what we happens, we must reset allocated data - cm.Reset(); -} + * @brief Handles a command. + * @param cm Command reference to handle + */ +void SPI_Task::HandleCommand(Command &cm) +{ + switch (cm.GetCommand()) + { + case TASK_SPECIFIC_COMMAND: + { + break; + } + default: + CUBE_PRINT("SPI Task - Received Unsupported Command {%d}\n", + cm.GetCommand()); + break; + } -void SPI_Task::BoardSelectLow(){ - GPIO::BOARD_SELECT_0::Off(); - GPIO::BOARD_SELECT_1::Off(); + // No matter what we happens, we must reset allocated data + cm.Reset(); } -void SPI_Task::BoardSelectHigh(){ - GPIO::BOARD_SELECT_0::On(); - GPIO::BOARD_SELECT_1::On(); +void SPI_Task::BoardSelectLow() +{ + GPIO::BOARD_SELECT_0::Off(); + GPIO::BOARD_SELECT_1::Off(); } -uint16_t SPI_Task::reverseBits(uint16_t bitsToReverse){ - uint16_t reversedBits = 0; - for(int i = 0; i < 16; i++){ - - if(bitsToReverse & (1 << i)){ - reversedBits |= (1 << (15-i)); - } - - } - return reversedBits; +void SPI_Task::BoardSelectHigh() +{ + GPIO::BOARD_SELECT_0::On(); + GPIO::BOARD_SELECT_1::On(); } - -bool SPI_Task::SPI_Read(uint16_t sizeInBytes){ - HAL_StatusTypeDef status = HAL_SPI_Receive(hspi_,last_read_,sizeInBytes,SPI1_TIMEOUT_MS); - if(status == HAL_OK){ - return true; - }else{ - last_read_[0] = 0xFF; - last_read_[1] = 0xFF; //Reset to indicate an error - return false; - } +bool SPI_Task::SPI_Read(uint16_t sizeInBytes) +{ + HAL_StatusTypeDef status = + HAL_SPI_Receive(hspi_, last_read_, sizeInBytes, SPI1_TIMEOUT_MS); + if (status == HAL_OK) + { + return true; + } + else + { + last_read_[0] = 0xFF; + last_read_[1] = 0xFF; // Reset to indicate an error + return false; + } } /** * @brief Reads serial data output with bits properly reversed */ -uint16_t SPI_Task::readData(void){ - - bool failedToRead = !SPI_Read(2); - if(failedToRead){ - return 0xFFFF; - } +uint16_t SPI_Task::readData(void) +{ + bool failedToRead = !SPI_Read(2); + if (failedToRead) + { + return 0xFFFF; + } - // Combine the two bytes into a 16-bit raw data value - uint16_t rawData = (last_read_[0] << 8) | last_read_[1]; + // Combine the two bytes into a 16-bit raw data value + uint16_t rawData = (last_read_[0] << 8) | last_read_[1]; - // Mask out the leading 4 bits (which should be zeros) and any trailing bits beyond 10 - // 0000_MXXX_XXXX_XL00 & 0b0000_1111_1111_1100 - rawData = (rawData & 0x0FFC) >> 2; //0000_00_MXXX_XXXX_XL - return rawData; + // Mask out the leading 4 bits (which should be zeros) and any trailing bits + // beyond 10 0000_MXXX_XXXX_XL00 & 0b0000_1111_1111_1100 + rawData = (rawData & 0x0FFC) >> 2; // 0000_00_MXXX_XXXX_XL + return rawData; } -uint16_t SPI_Task::readAccelerationPedal_P(){ +uint16_t SPI_Task::readAccelerationPedal_P() +{ GPIO::SPI_DATA_CS0::Off(); GPIO::SPI_DATA_CS1::Off(); BoardSelectLow(); uint16_t accelerationPedalReading = readData(); -// CUBE_PRINT("Acceleration P reading: %u\n", accelerationPedalReading); + // CUBE_PRINT("Acceleration P reading: %u\n", accelerationPedalReading); BoardSelectHigh(); g_accelerationReading_P = accelerationPedalReading; return accelerationPedalReading; } -uint16_t SPI_Task::readAccelerationPedal_N(){ +uint16_t SPI_Task::readAccelerationPedal_N() +{ GPIO::SPI_DATA_CS0::On(); GPIO::SPI_DATA_CS1::Off(); BoardSelectLow(); uint16_t accelerationPedalReading = readData(); -// CUBE_PRINT("Acceleration N reading: %u\n", accelerationPedalReading); + // CUBE_PRINT("Acceleration N reading: %u\n", accelerationPedalReading); BoardSelectHigh(); g_accelerationReading_N = accelerationPedalReading; return accelerationPedalReading; } -uint16_t SPI_Task::readBrakingPedal_P(){ +uint16_t SPI_Task::readBrakingPedal_P() +{ GPIO::SPI_DATA_CS0::Off(); GPIO::SPI_DATA_CS1::On(); - //Delay here + // Delay here BoardSelectLow(); uint16_t breakPedalReading = readData(); -// CUBE_PRINT("Braking P reading: %u\n", breakPedalReading); + // CUBE_PRINT("Braking P reading: %u\n", breakPedalReading); BoardSelectHigh(); g_brakeReading_P = breakPedalReading; return breakPedalReading; } -uint16_t SPI_Task::readBrakingPedal_N(){ +uint16_t SPI_Task::readBrakingPedal_N() +{ GPIO::SPI_DATA_CS0::On(); GPIO::SPI_DATA_CS1::On(); BoardSelectLow(); uint16_t breakPedalReading = readData(); -// CUBE_PRINT("Braking N reading: %u\n", breakPedalReading); + // CUBE_PRINT("Braking N reading: %u\n", breakPedalReading); BoardSelectHigh(); g_brakeReading_N = breakPedalReading; return breakPedalReading; } -float SPI_Task::calculatePedalPosition(uint16_t pedalReading) { - // Ensure pedalReading is within the valid ADC range - if (pedalReading < ADC_MIN) { - pedalReading = ADC_MIN; - } else if (pedalReading > ADC_MAX) { - pedalReading = ADC_MAX; - } +uint16_t SPI_Task::getAccelerationReading_P() +{ + return g_accelerationReading_P; +} + +uint16_t SPI_Task::getAccelerationReading_N() +{ + return g_accelerationReading_N; +} + +uint16_t SPI_Task::getBrakingReading_N() { return g_brakeReading_N; } - // Calculate the position percentage - return ((float)(pedalReading - ADC_MIN) / (ADC_MAX - ADC_MIN)) * 100.0f; +uint16_t SPI_Task::getBrakingReading_P() { return g_brakeReading_P; } + +uint32_t SPI_Task::DriverBase(){ + +} + +float SPI_Task::calculatePedalPosition(uint16_t pedalReading) +{ + // Ensure pedalReading is within the valid ADC range + if (pedalReading < ADC_MIN) + { + pedalReading = ADC_MIN; + } + else if (pedalReading > ADC_MAX) + { + pedalReading = ADC_MAX; + } + + // Calculate the position percentage + return ((float)(pedalReading - ADC_MIN) / (ADC_MAX - ADC_MIN)) * 100.0f; } -float SPI_Task::getAccelerationPedalPercent() { - uint16_t accelPedalReadingP = readAccelerationPedal_P(); - uint16_t accelPedalReadingN = readAccelerationPedal_N(); +float SPI_Task::getAccelerationPedalPercent() +{ + uint16_t accelPedalReadingP = readAccelerationPedal_P(); + uint16_t accelPedalReadingN = readAccelerationPedal_N(); - //Optional check accelPedalReadingP + accelPedalReadingN != ADC_MAX + ADC_MIN roughly equal + // Optional check accelPedalReadingP + accelPedalReadingN != ADC_MAX + + // ADC_MIN roughly equal - return calculatePedalPosition(accelPedalReadingP); + return calculatePedalPosition(accelPedalReadingP); } -float SPI_Task::getBrakePedalPercent() { - uint16_t brakePedalReadingP = readBrakingPedal_P(); - uint16_t brakePedalReadingN = readBrakingPedal_N(); +float SPI_Task::getBrakePedalPercent() +{ + uint16_t brakePedalReadingP = readBrakingPedal_P(); + uint16_t brakePedalReadingN = readBrakingPedal_N(); - //Optional check: if (brakePedalReadingP + brakePedalReadingN != ADC_MAX + ADC_MIN) { + // Optional check: if (brakePedalReadingP + brakePedalReadingN != ADC_MAX + + // ADC_MIN) { - return calculatePedalPosition(brakePedalReadingP); + return calculatePedalPosition(brakePedalReadingP); } /** -* @brief Instance Run loop for the SPI Task, runs on scheduler start as long as the task is initialized. -* @param pvParams RTOS Passed void parameters, contains a pointer to the object instance (from InitTask), should not be used -*/ -void SPI_Task::Run(void * pvParams){ - - - /** - * 1. First decoder selects Y0 as low to enable SPI Select on 2nd decoder - * -> Board Select 0 and 1 = LOW - * - * 2. SPI Chip Select to select which analog to receive - * For Acceleration_P -> CSb00 -> SPI CS0 = 0 && SPI CS1 = 0 - * For Acceleration_N -> CSb01 -> SPI CS0 = 0 && SPI CS1 = 1 - * For Braking_P -> CSb10 -> SPI CS0 = 1 && SPI CS1 = 0 - * For Braking_N -> CSb11 -> SPI CS0 = 1 && SPI CS1 = 1 - * - * 3. Read the ADC output on SPI MISO + * @brief Instance Run loop for the SPI Task, runs on scheduler start as long as + * the task is initialized. + * @param pvParams RTOS Passed void parameters, contains a pointer to the object + * instance (from InitTask), should not be used + */ +void SPI_Task::Run(void *pvParams) +{ + /** + * 1. First decoder selects Y0 as low to enable SPI Select on 2nd decoder + * -> Board Select 0 and 1 = LOW + * + * 2. SPI Chip Select to select which analog to receive + * For Acceleration_P -> CSb00 -> SPI CS0 = 0 && SPI CS1 = 0 + * For Acceleration_N -> CSb01 -> SPI CS0 = 1 && SPI CS1 = 0 + * For Braking_P -> CSb10 -> SPI CS0 = 0 && SPI CS1 = 1 + * For Braking_N -> CSb11 -> SPI CS0 = 1 && SPI CS1 = 1 + * + * 3. Read the ADC output on SPI MISO */ - while(1){ + while (1) + { float accelerationPedalPercent = getAccelerationPedalPercent(); - CUBE_PRINT("Acceleration Pedal Position: %.2f%%\n", accelerationPedalPercent); + CUBE_PRINT("Acceleration Pedal Position: %.2f%%\n", + accelerationPedalPercent); float brakingPedalPercent = getBrakePedalPercent(); CUBE_PRINT("Braking Pedal Position: %.2f%%\n", brakingPedalPercent); - osDelay(SPI_TASK_DELAY); //Delay to reach 100 readings/s + osDelay(SPI_TASK_DELAY); // Delay to reach 100 readings/s } } diff --git a/Components/SPI/SPI_Task.hpp b/Components/SPI/SPI_Task.hpp index 6788de6..8b8e28c 100644 --- a/Components/SPI/SPI_Task.hpp +++ b/Components/SPI/SPI_Task.hpp @@ -15,32 +15,29 @@ /* Macros/Enums ------------------------------------------------------------*/ #define SPI1_TIMEOUT_MS 1000 #define SPI_TASK_FREQUENCY 1 -#define ADC_MIN 102 // Corresponds to 10% of V_in -#define ADC_MAX 921 // Corresponds to 90% of V_in -#define SPI_TASK_DELAY 1000/SPI_TASK_FREQUENCY +#define ADC_MIN 102 // Corresponds to 10% of V_in +#define ADC_MAX 921 // Corresponds to 90% of V_in +#define SPI_TASK_DELAY 1000 / SPI_TASK_FREQUENCY -extern volatile uint16_t g_accelerationReading_P; -extern volatile uint16_t g_accelerationReading_N; -extern volatile uint16_t g_brakeReading_P; -extern volatile uint16_t g_brakeReading_N; - -enum SPI_COMMANDS { +enum SPI_COMMANDS +{ SPI_NONE = 0, /** TODO: Add commands */ }; -class SPI_Task: public Task +class SPI_Task : public Task { public: /** * @brief Singleton Constructor * TODO: Add &hspx as input for portability */ - static SPI_Task& Inst(){ //Singleton Design Pattern + static SPI_Task &Inst() + { // Singleton Design Pattern static SPI_Task inst; return inst; } - SPI_Task(); // Public Constructor for testing. Converting to private after + SPI_Task(); // Public Constructor for testing. Converting to private after void InitTask(); @@ -50,32 +47,43 @@ class SPI_Task: public Task uint16_t readBrakingPedal_P(); uint16_t readBrakingPedal_N(); + /** Getters */ + uint16_t getAccelerationReading_P(); + uint16_t getAccelerationReading_N(); + uint16_t getBrakingReading_P(); + uint16_t getBrakingReading_N(); + + /** Data Formatter for CAN Task */ + uint32_t DriverBase(); + protected: - static void RunTask(void* pvParams) { SPI_Task::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); - void Run(void * pvParams); //Main run code + static void RunTask(void *pvParams) { SPI_Task::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void *pvParams); // Main run code - SPI_HandleTypeDef* hspi_ = nullptr; + SPI_HandleTypeDef *hspi_ = nullptr; - void HandleCommand(Command& cm); + void HandleCommand(Command &cm); uint8_t last_read_[2] = {0xFF, 0xFF}; private: // SPI_Task(SPI_HandleTypeDef* hspi); // Private constructor. PRODUCTION - SPI_Task(const SPI_Task&); // Prevent copy-construction - SPI_Task& operator=(const SPI_Task&); // Prevent assignment + SPI_Task(const SPI_Task &); // Prevent copy-construction + SPI_Task &operator=(const SPI_Task &); // Prevent assignment //** Helper Functions */ - void BoardSelectLow(); //Set board select GPIO pins low - void BoardSelectHigh(); //Set board select GPIO pins high - uint16_t reverseBits(uint16_t bitsToReverse); //Reverses bits of ADC reading as MSB is read first - uint16_t readData(void); //Reads serial data output of the conversion result - bool SPI_Read(uint16_t sizeInBytes); //Reads SPI with HAL command onto protected last_read_ - float calculatePedalPosition(uint16_t pedalReading); //calculate the pedal position as a percentage - float getAccelerationPedalPercent(); + void BoardSelectLow(); // Set board select GPIO pins low + void BoardSelectHigh(); // Set board select GPIO pins high + uint16_t readData(void); // Reads serial data output of the conversion result + bool SPI_Read(uint16_t sizeInBytes); // Reads SPI with HAL command onto protected last_read_ + float calculatePedalPosition(uint16_t pedalReading); // calculate the pedal position as a percentage + float getAccelerationPedalPercent(); float getBrakePedalPercent(); + // Getter Variables for CAN Task Communication + uint16_t g_accelerationReading_P; + uint16_t g_accelerationReading_N; + uint16_t g_brakeReading_N; + uint16_t g_brakeReading_P; }; - -#endif // HELIOS_SPITASK_HPP_ - +#endif // HELIOS_SPITASK_HPP_ From bc0665217707028b4bdc0af5a64c4440c65f8c58 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 30 Nov 2024 15:54:18 -0700 Subject: [PATCH 17/38] feat: Driver_Base with SPI Task formatted --- Components/CAN/CANTxTask.cpp | 121 ++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 52 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index c522531..11e4a16 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -1,9 +1,9 @@ /** - ****************************************************************************** - * File Name : CANTxTask.cpp - * Description : Task for transmitting CAN messages - ****************************************************************************** -*/ + ****************************************************************************** + * File Name : CANTxTask.cpp + * Description : Task for transmitting CAN messages + ****************************************************************************** + */ /* Includes ------------------------------------------------------------------*/ #include "main.h" @@ -17,16 +17,10 @@ #include "GPIO/GPIOTask.hpp" #include "SPI/SPI_Task.hpp" - -//Example -uint16_t accelerationReading = SPI_Task::Inst().getAccelerationReading_P(); - - CANPeripheral peripheral1 = { - .CS_PORT = CS_CAN_N_GPIO_Port, - .CS_PIN = CS_CAN_N_Pin, - .hspi = SystemHandles::CAN_SPI -}; + .CS_PORT = CS_CAN_N_GPIO_Port, + .CS_PIN = CS_CAN_N_Pin, + .hspi = SystemHandles::CAN_SPI}; /** * @brief Constructor for CANTxTask @@ -45,11 +39,11 @@ void CANTxTask::InitTask() BaseType_t rtValue = xTaskCreate((TaskFunction_t)CANTxTask::RunTask, - (const char*)"CANTxTask", - (uint16_t)CAN_TX_TASK_STACK_DEPTH_WORDS, - (void*)this, - (UBaseType_t)CAN_TX_TASK_PRIORITY, - (TaskHandle_t*)&rtTaskHandle); + (const char *)"CANTxTask", + (uint16_t)CAN_TX_TASK_STACK_DEPTH_WORDS, + (void *)this, + (UBaseType_t)CAN_TX_TASK_PRIORITY, + (TaskHandle_t *)&rtTaskHandle); CUBE_ASSERT(rtValue == pdPASS, "CANTxTask::InitTask() - xTaskCreate() failed"); } @@ -58,10 +52,11 @@ void CANTxTask::InitTask() * @brief Instance Run loop for the CAN_TX Task, runs on scheduler start as long as the task is initialized. * @param pvParams RTOS Passed void parameters, contains a pointer to the object instance, should not be used */ -void CANTxTask::Run(void * pvParams) +void CANTxTask::Run(void *pvParams) { - ConfigureCANSPI(&peripheral1); - while(1) { + ConfigureCANSPI(&peripheral1); + while (1) + { // Wait forever for a command Command cm; @@ -78,7 +73,7 @@ void CANTxTask::Run(void * pvParams) * @brief Handle a command * @param cm Command to handle */ -void CANTxTask::HandleCommand(Command& cm) +void CANTxTask::HandleCommand(Command &cm) { CANMsg msg; msg.ID = 0; @@ -86,40 +81,62 @@ void CANTxTask::HandleCommand(Command& cm) // msg.data[0] = 1; // Example data; set according to command specifics. uint8_t u8_data = 0; + uint16_t u16_acceleration = 0; + uint16_t u16_braking = 0; uint32_t u32_data = 0; // Handle command based on address/type - switch (static_cast(cm.GetTaskCommand())) { - case LIGHTS_INPUT_BASE: - msg.extendedID = 0x701; - msg.DLC = 1; - u8_data = GPIOTask::Inst().LightsInputsBase(); - msg.data[0] = u8_data; - CUBE_PRINT("Sent Lights Input command\n"); - break; - - case DRIVER_BASE: - msg.extendedID = 0x703; - msg.DLC = 4; - - CUBE_PRINT("Sent Driver command\n"); - break; - - case LIGHTS_STATUS_BASE: - msg.extendedID = 0x711; - msg.DLC = 1; - u8_data = GPIOTask::Inst().LightStatus(); - msg.data[0] = u8_data; - CUBE_PRINT("Sent Lights Status command\n"); - break; - - default: - CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); - break; + switch (static_cast(cm.GetTaskCommand())) + { + case LIGHTS_INPUT_BASE: + msg.extendedID = 0x701; + msg.DLC = 1; + u8_data = GPIOTask::Inst().LightsInputsBase(); + msg.data[0] = u8_data; + CUBE_PRINT("Sent Lights Input command\n"); + break; + + case DRIVER_BASE: + msg.extendedID = 0x703; + msg.DLC = 4; + + // ASSUMPTION: Returning only the P of the pedal readings. 12 bits returned even though SPI IC returns 10, following the comm sheet + u16_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits + u16_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits + + // Combine the two 12-bit values into a 24-bit variable + u8_data = GPIOTask::Inst().DriverBase(); + + // Combine all values into a single 32-bit variable + u32_data = (static_cast(u16_braking) << 12) | // Shift braking to bits 12–23 + (static_cast(u8_data) << 24) | // Shift u8_data to bits 24–31 + u16_acceleration; // Place acceleration in bits 0–11 + + // Split u32_data into bytes and assign to msg.data[] + msg.data[0] = static_cast(u32_data & 0xFF); // Extract the first 8 bits (bits 0-7) + msg.data[1] = static_cast((u32_data >> 8) & 0xFF); // Extract the next 8 bits (bits 8-15) + msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) + msg.data[3] = static_cast((u32_data >> 24) & 0xFF); // Extract the last 8 bits (bits 24-31) + + CUBE_PRINT("Sent Driver command\n"); + break; + + case LIGHTS_STATUS_BASE: + msg.extendedID = 0x711; + msg.DLC = 1; + u8_data = GPIOTask::Inst().LightStatus(); + msg.data[0] = u8_data; + CUBE_PRINT("Sent Lights Status command\n"); + break; + + default: + CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); + break; } - if (msg.extendedID != 0) { + if (msg.extendedID != 0) + { sendExtendedCANMessage(&msg, &peripheral1); } - cm.Reset(); // Clear command data after processing + cm.Reset(); // Clear command data after processing } From bd7d7348bdf885c48c361faa932ac66cdcd608d4 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 17:18:51 -0700 Subject: [PATCH 18/38] fix: LightsInput follows Communication Protocol --- .settings/language.settings.xml | 4 ++-- Components/CAN/CANTxTask.cpp | 6 +++--- Components/CAN/CANTxTask.hpp | 2 +- Components/Debug/DebugTask.cpp | 2 +- Components/GPIO/GPIOTask.cpp | 19 +++++++++---------- Components/GPIO/GPIOTask.hpp | 2 +- 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 530b338..c7d270a 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index 11e4a16..0386f7c 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -87,10 +87,10 @@ void CANTxTask::HandleCommand(Command &cm) // Handle command based on address/type switch (static_cast(cm.GetTaskCommand())) { - case LIGHTS_INPUT_BASE: - msg.extendedID = 0x701; + case LIGHTS_INPUT: + msg.extendedID = 0x610; msg.DLC = 1; - u8_data = GPIOTask::Inst().LightsInputsBase(); + u8_data = GPIOTask::Inst().LightsInputs(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); break; diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index 0479418..56ab86d 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -19,7 +19,7 @@ /* Enums ------------------------------------------------------------------*/ enum CAN_TX_COMMANDS { - LIGHTS_INPUT_BASE, // Command for lights input + LIGHTS_INPUT, // Command for lights input DRIVER_BASE, // Command for driver data LIGHTS_STATUS_BASE // Command for lights status }; diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 8452f64..36dce83 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -154,7 +154,7 @@ void DebugTask::HandleDebugMessage(const char* msg) //-- CAN Commands -- else if (strcmp(msg, "can_lights_input") == 0) { - Command cmd(DATA_COMMAND, LIGHTS_INPUT_BASE); + Command cmd(DATA_COMMAND, LIGHTS_INPUT); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); } diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index b59964a..a2e91b3 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -38,7 +38,7 @@ void GPIOTask::InitTask() CUBE_ASSERT(rtValue == pdPASS, "GPIOTask::InitTask() - xTaskCreate() failed"); } -uint8_t GPIOTask::LightsInputsBase() +uint8_t GPIOTask::LightsInputs() { // Initialize Expander Objects @@ -50,17 +50,16 @@ uint8_t GPIOTask::LightsInputsBase() uint8_t headlightsOff = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::LOW; // True if headlights are off uint8_t signalRight = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; uint8_t signalLeft = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; - uint8_t hazard = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD) - 2] == IOState::HIGH; + uint8_t hazardLights = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD) - 2] == IOState::HIGH; - /** Commented out are from Elysia, not implemented in Helios */ - output |= (headlightsOff ? 1 : 0) << 0; // Bit 0 - // output |= (headlightsLow ? 1 : 0) << 1; // Bit 1 - // output |= (headlightsHigh ? 1 : 0) << 2; // Bit 2 - output |= (signalRight ? 1 : 0) << 3; // Bit 3 - output |= (signalLeft ? 1 : 0) << 4; // Bit 4 - output |= (hazard ? 1 : 0) << 5; // Bit 5 - // output |= (interior ? 1 : 0) << 6; // Bit 6 + // output |= (headlightsLow ? 1 : 0) << 1; + // output |= (headlightsHigh ? 1 : 0) << 2; + output |= (signalRight ? 1 : 0) << 0; // Bit 0 + output |= (signalLeft ? 1 : 0) << 1; // Bit 1 + output |= (hazardLights ? 1 : 0) << 2; // Bit 5 + output |= (headlightsOff ? 1 : 0) << 3; // Bit 3 , NOTE: True if headlights off + // output |= (interior ? 1 : 0) << 6; return output; } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index f145c81..d974932 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -29,7 +29,7 @@ class GPIOTask : public Task void InitTask(); /**Getters for CAN formatting */ - uint8_t LightsInputsBase(); + uint8_t LightsInputs(); uint8_t DriverBase(); uint8_t LightStatus(); From 30fdbc4e7b23eaa07bd3b6b4c4bca6b8bf154ea8 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 17:44:44 -0700 Subject: [PATCH 19/38] fix: Digital Inputs formatted to Helio Communication Board --- Components/CAN/CANTxTask.cpp | 12 ++++++++++- Components/CAN/CANTxTask.hpp | 1 + Components/GPIO/GPIOTask.cpp | 42 +++++++++++++++++++++--------------- Components/GPIO/GPIOTask.hpp | 2 +- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index 0386f7c..d9ca8f8 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -81,6 +81,7 @@ void CANTxTask::HandleCommand(Command &cm) // msg.data[0] = 1; // Example data; set according to command specifics. uint8_t u8_data = 0; + uint8_t u16_data = 0; uint16_t u16_acceleration = 0; uint16_t u16_braking = 0; uint32_t u32_data = 0; @@ -95,6 +96,15 @@ void CANTxTask::HandleCommand(Command &cm) CUBE_PRINT("Sent Lights Input command\n"); break; + case DIGITAL_INPUTS: + msg.extendedID = 0x611; + msg.DLC = 2; + u16_data = GPIOTask::Inst().DigitalInputs(); + msg.data[1] = (u16_data >> 8) & 0xFF; // High byte + msg.data[0] = u16_data & 0x0F; // Low byte + CUBE_PRINT("Sent Digital Inputs command\n"); + break; + case DRIVER_BASE: msg.extendedID = 0x703; msg.DLC = 4; @@ -104,7 +114,7 @@ void CANTxTask::HandleCommand(Command &cm) u16_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits // Combine the two 12-bit values into a 24-bit variable - u8_data = GPIOTask::Inst().DriverBase(); + // u8_data = GPIOTask::Inst().DigitalInputs(); // Combine all values into a single 32-bit variable u32_data = (static_cast(u16_braking) << 12) | // Shift braking to bits 12–23 diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index 56ab86d..f9746a4 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -20,6 +20,7 @@ /* Enums ------------------------------------------------------------------*/ enum CAN_TX_COMMANDS { LIGHTS_INPUT, // Command for lights input + DIGITAL_INPUTS, DRIVER_BASE, // Command for driver data LIGHTS_STATUS_BASE // Command for lights status }; diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index a2e91b3..38cd4ce 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -64,19 +64,21 @@ uint8_t GPIOTask::LightsInputs() return output; } -uint8_t GPIOTask::DriverBase() +uint16_t GPIOTask::DigitalInputs() { IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); std::array driverControlState = driverControlExpander.GetExpanderStateNow(); - // DriverControls::FORWARD_NEUTRAL_REVERSE_H ?? - uint8_t output = 0; + uint16_t output = 0; + uint8_t raceModeEnable = driverControlState[static_cast(DriverControls::RACE_MODE_ENABLE)] == IOState::HIGH; uint8_t lap = driverControlState[static_cast(DriverControls::LAP_BUTTON)] == IOState::HIGH; - uint8_t horn = driverControlState[static_cast(DriverControls::HORN_ENABLE) - 2] == IOState::HIGH; - uint8_t reset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; // Assumed reset is motor_reset - uint8_t brakes = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH - || driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; + uint8_t hornSwitch = driverControlState[static_cast(DriverControls::HORN_ENABLE) - 2] == IOState::HIGH; + uint8_t motorReset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; // Assumed motorReset is motor_reset + + uint8_t parkingBrake = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH; + uint8_t mechanicalBreak = driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; + uint8_t zoomZoom = driverControlState[static_cast(DriverControls::GREEN_LED) - 2] == IOState::HIGH; uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; @@ -84,23 +86,29 @@ uint8_t GPIOTask::DriverBase() uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; + uint8_t neutral = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW //Assumption + && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + /**Forward and Reverse Encoding from Electrical Team */ /* 10 forward * 11 reverse + * 00 TODO: CHECK ASSUMPTION THIS IS NEUTRAL * 01 not implemented */ - /** Commented out are from Elysia, not implemented in Helios */ - //** Sending bits 24-31, beginning of the data is from the SPI task */ - output |= (brakes ? 1 : 0) << 0; // Bit 24 - output |= (forward ? 1 : 0) << 1; // Bit 25 - output |= (reverse ? 1 : 0) << 2; // Bit 26 - // output |= (pushToTalk ? 1 : 0) << 3; // Bit 27 - output |= (horn ? 1 : 0) << 4; // Bit 28 - output |= (reset ? 1 : 0) << 5; // Bit 29 - // output |= (aux ? 1 : 0) << 6; // Bit 30 - output |= (lap ? 1 : 0) << 7; // Bit 31 + output |= (forward ? 1 : 0) << 0; // Bit 0 + output |= (neutral ? 1 : 0) << 1; // Bit 1 + output |= (reverse ? 1 : 0) << 2; // Bit 2 + output |= (hornSwitch ? 1 : 0) << 3; //Bit 3 + output |= (mechanicalBreak ? 1 : 0) << 4; // Bit 4 + output |= (parkingBrake ? 1 : 0) << 5; // Bit 5 + output |= (motorReset ? 1 : 0) << 6; // Bit 6 + output |= (raceModeEnable ? 1 : 0) << 7; // Bit 7 + output |= (lap ? 1 : 0) << 8; // Bit 8 + + //TODO: What is zoom zoom ? Assumed to be greenLed Bit 9 + output |= (zoomZoom ? 1 : 0) << 9; // Bit 9 return output; } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index d974932..8be3272 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -30,7 +30,7 @@ class GPIOTask : public Task /**Getters for CAN formatting */ uint8_t LightsInputs(); - uint8_t DriverBase(); + uint16_t DigitalInputs(); uint8_t LightStatus(); protected: From 04aaf29e7f655e5fc2a8bf07f37e14911c8fe8af Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:01:40 -0700 Subject: [PATCH 20/38] fix: Analog Inputs follows Communication Excel --- Components/CAN/CANTxTask.cpp | 28 +++++++++++----------------- Components/CAN/CANTxTask.hpp | 2 +- Components/Debug/DebugTask.cpp | 2 +- Components/SPI/SPI_Task.hpp | 2 +- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index d9ca8f8..2f0134d 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -82,8 +82,8 @@ void CANTxTask::HandleCommand(Command &cm) uint8_t u8_data = 0; uint8_t u16_data = 0; - uint16_t u16_acceleration = 0; - uint16_t u16_braking = 0; + uint16_t u12_acceleration = 0; + uint16_t u12_braking = 0; uint32_t u32_data = 0; // Handle command based on address/type switch (static_cast(cm.GetTaskCommand())) @@ -105,29 +105,23 @@ void CANTxTask::HandleCommand(Command &cm) CUBE_PRINT("Sent Digital Inputs command\n"); break; - case DRIVER_BASE: - msg.extendedID = 0x703; - msg.DLC = 4; + case ANALOG_INPUTS: + msg.extendedID = 0x612; + msg.DLC = 3; // ASSUMPTION: Returning only the P of the pedal readings. 12 bits returned even though SPI IC returns 10, following the comm sheet - u16_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits - u16_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits - - // Combine the two 12-bit values into a 24-bit variable - // u8_data = GPIOTask::Inst().DigitalInputs(); - - // Combine all values into a single 32-bit variable - u32_data = (static_cast(u16_braking) << 12) | // Shift braking to bits 12–23 - (static_cast(u8_data) << 24) | // Shift u8_data to bits 24–31 - u16_acceleration; // Place acceleration in bits 0–11 + u12_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits + u12_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits + // Pack the 12-bit acceleration and 12-bit braking into a 24-bit structure + u32_data = (u12_acceleration & 0x0FFF) | ((u12_braking & 0x0FFF) << 12); + // Split u32_data into bytes and assign to msg.data[] msg.data[0] = static_cast(u32_data & 0xFF); // Extract the first 8 bits (bits 0-7) msg.data[1] = static_cast((u32_data >> 8) & 0xFF); // Extract the next 8 bits (bits 8-15) msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) - msg.data[3] = static_cast((u32_data >> 24) & 0xFF); // Extract the last 8 bits (bits 24-31) - CUBE_PRINT("Sent Driver command\n"); + CUBE_PRINT("Sent Analog Inputs command\n"); break; case LIGHTS_STATUS_BASE: diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index f9746a4..3ef52c8 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -21,7 +21,7 @@ enum CAN_TX_COMMANDS { LIGHTS_INPUT, // Command for lights input DIGITAL_INPUTS, - DRIVER_BASE, // Command for driver data + ANALOG_INPUTS, // Command for driver data LIGHTS_STATUS_BASE // Command for lights status }; diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 36dce83..74ff64a 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -159,7 +159,7 @@ void DebugTask::HandleDebugMessage(const char* msg) bool res = evtQ->Send(cmd); } else if (strcmp(msg, "can_driver_base") == 0) { - Command cmd(DATA_COMMAND, DRIVER_BASE); + Command cmd(DATA_COMMAND, ANALOG_INPUTS); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); } diff --git a/Components/SPI/SPI_Task.hpp b/Components/SPI/SPI_Task.hpp index 8b8e28c..07283cd 100644 --- a/Components/SPI/SPI_Task.hpp +++ b/Components/SPI/SPI_Task.hpp @@ -14,7 +14,7 @@ /* Macros/Enums ------------------------------------------------------------*/ #define SPI1_TIMEOUT_MS 1000 -#define SPI_TASK_FREQUENCY 1 +#define SPI_TASK_FREQUENCY 1 //Every second #define ADC_MIN 102 // Corresponds to 10% of V_in #define ADC_MAX 921 // Corresponds to 90% of V_in #define SPI_TASK_DELAY 1000 / SPI_TASK_FREQUENCY From 3bdca0dfbb18d26dc013f7af1745e4a30414565e Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:16:00 -0700 Subject: [PATCH 21/38] fix: Lights Status so that it follows Communication standard --- Components/CAN/CANTxTask.cpp | 2 +- Components/Drivers/IOExpander.hpp | 1 - Components/GPIO/GPIOTask.cpp | 32 +++++++++++++++---------------- Components/GPIO/GPIOTask.hpp | 2 ++ 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index 2f0134d..d2b1fe4 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -125,7 +125,7 @@ void CANTxTask::HandleCommand(Command &cm) break; case LIGHTS_STATUS_BASE: - msg.extendedID = 0x711; + msg.extendedID = 0x620; msg.DLC = 1; u8_data = GPIOTask::Inst().LightStatus(); msg.data[0] = u8_data; diff --git a/Components/Drivers/IOExpander.hpp b/Components/Drivers/IOExpander.hpp index b3ef6d8..647b290 100644 --- a/Components/Drivers/IOExpander.hpp +++ b/Components/Drivers/IOExpander.hpp @@ -97,7 +97,6 @@ namespace PowerBoard { constexpr IOPin HORN_SIGNAL = IOPin::P05; constexpr IOPin ORANGE_LED = IOPin::P06; constexpr IOPin GREEN_LED = IOPin::P07; - constexpr IOPin P13 = IOPin::P13; constexpr IOPin P14 = IOPin::P14; constexpr IOPin P15 = IOPin::P15; diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 38cd4ce..998186f 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -115,25 +115,25 @@ uint16_t GPIOTask::DigitalInputs() uint8_t GPIOTask::LightStatus() { - //Potential Refactor, use driverControlExpander as a private class variable - IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); - std::array driverControlState = driverControlExpander.GetExpanderStateNow(); + IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); + std::array powerBoardState = powerBoardExpander.GetExpanderStateNow(); uint8_t output = 0; - uint8_t leftSignal = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; - uint8_t rightSignal = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; - uint8_t brakeLights = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH - || driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; - - /** Commented out are from Elysia, not implemented in Helios */ - - // output |= (lowBeams ? 1 : 0) << 0; // Bit 0 - // output |= (highBeams ? 1 : 0) << 1; // Bit 1 - output |= (brakeLights ? 1 : 0) << 2; // Bit 2 - output |= (leftSignal ? 1 : 0) << 3; // Bit 3 - output |= (rightSignal ? 1 : 0) << 4; // Bit 4 - // output |= (BMS_StrobeLight ? 1 : 0) << 5; // Bit 5 + //NOTE: Check if there's an offset like arr[X - 2]; Offset starts at P13 + uint8_t right_turn_light_signal = powerBoardState[static_cast(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; + uint8_t left_turn_light_signal = powerBoardState[static_cast(PowerBoard::LEFT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; + uint8_t daytime_running_light_signal = powerBoardState[static_cast(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL)] == IOState::HIGH; + uint8_t headlight_signal = powerBoardState[static_cast(PowerBoard::HEADLIGHT_SIGNAL)] == IOState::HIGH; + uint8_t brake_light_signal = powerBoardState[static_cast(PowerBoard::BRAKE_LIGHT_SIGNAL)] == IOState::HIGH; + uint8_t horn_signal = powerBoardState[static_cast(PowerBoard::HORN_SIGNAL)] == IOState::HIGH; + + output |= (right_turn_light_signal ? 1 : 0) << 0; // Bit 0 + output |= (left_turn_light_signal ? 1 : 0) << 1; // Bit 1 + output |= (daytime_running_light_signal ? 1 : 0) << 2; // Bit 2 + output |= (headlight_signal ? 1 : 0) << 3; // Bit 3 + output |= (brake_light_signal ? 1 : 0) << 4; // Bit 4 + output |= (horn_signal ? 1 : 0) << 5; // Bit 5 return output; } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 8be3272..3220e36 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -11,6 +11,8 @@ #include "SystemDefines.hpp" #include "Timer.hpp" +#define POWER_BOARD_LENGTH + /*---------------------------------- Macros/Enums ----------------------------------*/ enum GPIO_COMMANDS { GPIO_STATE = 0, From 7b012a00bac1a065ea93fb98ef5e278f5c444efe Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:22:36 -0700 Subject: [PATCH 22/38] fix: powerBoard State get Expander State Now size --- Components/CAN/CANTxTask.cpp | 1 + Components/GPIO/GPIOTask.cpp | 2 +- Components/GPIO/GPIOTask.hpp | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index d2b1fe4..dea27e8 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -66,6 +66,7 @@ void CANTxTask::Run(void *pvParams) HandleCommand(cm); cm.Reset(); + // osDelay((1000 / CAN_TX_FREQ)); } } diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 998186f..c0b43fb 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -116,7 +116,7 @@ uint16_t GPIOTask::DigitalInputs() uint8_t GPIOTask::LightStatus() { IOExpander powerBoardExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(0, 0, 1)); - std::array powerBoardState = powerBoardExpander.GetExpanderStateNow(); + std::array powerBoardState = powerBoardExpander.GetExpanderStateNow(); uint8_t output = 0; diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 3220e36..5d700a1 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -11,7 +11,6 @@ #include "SystemDefines.hpp" #include "Timer.hpp" -#define POWER_BOARD_LENGTH /*---------------------------------- Macros/Enums ----------------------------------*/ enum GPIO_COMMANDS { From e26405e269e5d904a1cedf3fab98294cb623e475 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:25:44 -0700 Subject: [PATCH 23/38] feat: Add CAN_TX_FREQ delays based on communication standard --- Components/CAN/CANTxTask.cpp | 7 ++++++- Components/CAN/CANTxTask.hpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index dea27e8..cd201cf 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -66,7 +66,7 @@ void CANTxTask::Run(void *pvParams) HandleCommand(cm); cm.Reset(); - // osDelay((1000 / CAN_TX_FREQ)); + osDelay((1000 / CAN_TX_FREQ)); } } @@ -95,6 +95,7 @@ void CANTxTask::HandleCommand(Command &cm) u8_data = GPIOTask::Inst().LightsInputs(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); + this->CAN_TX_FREQ = 10; break; case DIGITAL_INPUTS: @@ -104,6 +105,7 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[1] = (u16_data >> 8) & 0xFF; // High byte msg.data[0] = u16_data & 0x0F; // Low byte CUBE_PRINT("Sent Digital Inputs command\n"); + this->CAN_TX_FREQ = 20; break; case ANALOG_INPUTS: @@ -123,6 +125,7 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) CUBE_PRINT("Sent Analog Inputs command\n"); + this->CAN_TX_FREQ = 20; break; case LIGHTS_STATUS_BASE: @@ -131,10 +134,12 @@ void CANTxTask::HandleCommand(Command &cm) u8_data = GPIOTask::Inst().LightStatus(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); + this->CAN_TX_FREQ = 5; break; default: CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); + this->CAN_TX_FREQ = 10; break; } diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index 3ef52c8..3850f41 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -49,6 +49,7 @@ class CANTxTask : public Task CANTxTask(); // Private constructor CANTxTask(const CANTxTask&); // Prevent copy-construction CANTxTask& operator=(const CANTxTask&); // Prevent assignment + int CAN_TX_FREQ = 10; }; #endif From af3302695955d7f2b48cdee6988493fd2bfe2034 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:34:21 -0700 Subject: [PATCH 24/38] chore: Formatting for PR --- Components/CAN/CANTxTask.cpp | 2 +- Components/CAN/CANTxTask.hpp | 27 +++++++-------- Components/GPIO/GPIOTask.cpp | 65 ++++++++++++++++-------------------- Components/GPIO/GPIOTask.hpp | 27 ++++++++------- 4 files changed, 57 insertions(+), 64 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index cd201cf..c29c403 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -118,7 +118,7 @@ void CANTxTask::HandleCommand(Command &cm) // Pack the 12-bit acceleration and 12-bit braking into a 24-bit structure u32_data = (u12_acceleration & 0x0FFF) | ((u12_braking & 0x0FFF) << 12); - + // Split u32_data into bytes and assign to msg.data[] msg.data[0] = static_cast(u32_data & 0xFF); // Extract the first 8 bits (bits 0-7) msg.data[1] = static_cast((u32_data >> 8) & 0xFF); // Extract the next 8 bits (bits 8-15) diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index 3850f41..f4f410f 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -3,7 +3,7 @@ * File Name : CANTxTask.hpp * Description : ****************************************************************************** -*/ + */ #ifndef CUBE_SYSTEM_CAN_TX_TASK_HPP_ #define CUBE_SYSTEM_CAN_TX_TASK_HPP_ @@ -18,21 +18,22 @@ #include "CubeDefines.hpp" /* Enums ------------------------------------------------------------------*/ -enum CAN_TX_COMMANDS { - LIGHTS_INPUT, // Command for lights input +enum CAN_TX_COMMANDS +{ + LIGHTS_INPUT, // Command for lights input DIGITAL_INPUTS, - ANALOG_INPUTS, // Command for driver data - LIGHTS_STATUS_BASE // Command for lights status + ANALOG_INPUTS, // Command for driver data + LIGHTS_STATUS_BASE // Command for lights status }; /* Macros ------------------------------------------------------------------*/ - /* Class ------------------------------------------------------------------*/ class CANTxTask : public Task { public: - static CANTxTask& Inst() { + static CANTxTask &Inst() + { static CANTxTask inst; return inst; } @@ -40,15 +41,15 @@ class CANTxTask : public Task void InitTask(); protected: - static void RunTask(void* pvParams) { CANTxTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); - void Run(void * pvParams); // Main run code - void HandleCommand(Command& cm); + static void RunTask(void *pvParams) { CANTxTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void *pvParams); // Main run code + void HandleCommand(Command &cm); private: // Private Functions - CANTxTask(); // Private constructor - CANTxTask(const CANTxTask&); // Prevent copy-construction - CANTxTask& operator=(const CANTxTask&); // Prevent assignment + CANTxTask(); // Private constructor + CANTxTask(const CANTxTask &); // Prevent copy-construction + CANTxTask &operator=(const CANTxTask &); // Prevent assignment int CAN_TX_FREQ = 10; }; diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index c0b43fb..d73bdf1 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -47,21 +47,17 @@ uint8_t GPIOTask::LightsInputs() uint8_t output = 0; - uint8_t headlightsOff = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::LOW; // True if headlights are off + uint8_t headlightsSwitch = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::HIGH; uint8_t signalRight = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; uint8_t signalLeft = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; uint8_t hazardLights = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD) - 2] == IOState::HIGH; + output |= (signalRight ? 1 : 0) << 0; // Bit 0 + output |= (signalLeft ? 1 : 0) << 1; // Bit 1 + output |= (hazardLights ? 1 : 0) << 2; // Bit 2 + output |= (headlightsSwitch ? 1 : 0) << 3; // Bit 3 , NOTE: True if HEADLIGHTS_ENABLE is HIGH - // output |= (headlightsLow ? 1 : 0) << 1; - // output |= (headlightsHigh ? 1 : 0) << 2; - output |= (signalRight ? 1 : 0) << 0; // Bit 0 - output |= (signalLeft ? 1 : 0) << 1; // Bit 1 - output |= (hazardLights ? 1 : 0) << 2; // Bit 5 - output |= (headlightsOff ? 1 : 0) << 3; // Bit 3 , NOTE: True if headlights off - // output |= (interior ? 1 : 0) << 6; - - return output; + return output; } uint16_t GPIOTask::DigitalInputs() @@ -74,41 +70,38 @@ uint16_t GPIOTask::DigitalInputs() uint8_t raceModeEnable = driverControlState[static_cast(DriverControls::RACE_MODE_ENABLE)] == IOState::HIGH; uint8_t lap = driverControlState[static_cast(DriverControls::LAP_BUTTON)] == IOState::HIGH; uint8_t hornSwitch = driverControlState[static_cast(DriverControls::HORN_ENABLE) - 2] == IOState::HIGH; - uint8_t motorReset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; // Assumed motorReset is motor_reset + uint8_t motorReset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; uint8_t parkingBrake = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH; uint8_t mechanicalBreak = driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; uint8_t zoomZoom = driverControlState[static_cast(DriverControls::GREEN_LED) - 2] == IOState::HIGH; - uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH - && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; - uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH - && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; + uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; - uint8_t neutral = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW //Assumption + uint8_t neutral = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW // Assumption && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; /**Forward and Reverse Encoding from Electrical Team */ - /* 10 forward + /* 10 forward * 11 reverse * 00 TODO: CHECK ASSUMPTION THIS IS NEUTRAL - * 01 not implemented + * 01 not implemented */ - - output |= (forward ? 1 : 0) << 0; // Bit 0 - output |= (neutral ? 1 : 0) << 1; // Bit 1 - output |= (reverse ? 1 : 0) << 2; // Bit 2 - output |= (hornSwitch ? 1 : 0) << 3; //Bit 3 - output |= (mechanicalBreak ? 1 : 0) << 4; // Bit 4 - output |= (parkingBrake ? 1 : 0) << 5; // Bit 5 + output |= (forward ? 1 : 0) << 0; // Bit 0 + output |= (neutral ? 1 : 0) << 1; // Bit 1 + output |= (reverse ? 1 : 0) << 2; // Bit 2 + output |= (hornSwitch ? 1 : 0) << 3; // Bit 3 + output |= (mechanicalBreak ? 1 : 0) << 4; // Bit 4 + output |= (parkingBrake ? 1 : 0) << 5; // Bit 5 output |= (motorReset ? 1 : 0) << 6; // Bit 6 - output |= (raceModeEnable ? 1 : 0) << 7; // Bit 7 - output |= (lap ? 1 : 0) << 8; // Bit 8 + output |= (raceModeEnable ? 1 : 0) << 7; // Bit 7 + output |= (lap ? 1 : 0) << 8; // Bit 8 - //TODO: What is zoom zoom ? Assumed to be greenLed Bit 9 - output |= (zoomZoom ? 1 : 0) << 9; // Bit 9 + // TODO: What is zoom zoom ? Assumed to be greenLed Bit 9 + output |= (zoomZoom ? 1 : 0) << 9; // Bit 9 return output; } @@ -120,7 +113,7 @@ uint8_t GPIOTask::LightStatus() uint8_t output = 0; - //NOTE: Check if there's an offset like arr[X - 2]; Offset starts at P13 + // NOTE: Check if there's an offset like arr[X - 2]; Offset starts at P13 uint8_t right_turn_light_signal = powerBoardState[static_cast(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; uint8_t left_turn_light_signal = powerBoardState[static_cast(PowerBoard::LEFT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; uint8_t daytime_running_light_signal = powerBoardState[static_cast(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL)] == IOState::HIGH; @@ -128,12 +121,12 @@ uint8_t GPIOTask::LightStatus() uint8_t brake_light_signal = powerBoardState[static_cast(PowerBoard::BRAKE_LIGHT_SIGNAL)] == IOState::HIGH; uint8_t horn_signal = powerBoardState[static_cast(PowerBoard::HORN_SIGNAL)] == IOState::HIGH; - output |= (right_turn_light_signal ? 1 : 0) << 0; // Bit 0 - output |= (left_turn_light_signal ? 1 : 0) << 1; // Bit 1 - output |= (daytime_running_light_signal ? 1 : 0) << 2; // Bit 2 - output |= (headlight_signal ? 1 : 0) << 3; // Bit 3 - output |= (brake_light_signal ? 1 : 0) << 4; // Bit 4 - output |= (horn_signal ? 1 : 0) << 5; // Bit 5 + output |= (right_turn_light_signal ? 1 : 0) << 0; // Bit 0 + output |= (left_turn_light_signal ? 1 : 0) << 1; // Bit 1 + output |= (daytime_running_light_signal ? 1 : 0) << 2; // Bit 2 + output |= (headlight_signal ? 1 : 0) << 3; // Bit 3 + output |= (brake_light_signal ? 1 : 0) << 4; // Bit 4 + output |= (horn_signal ? 1 : 0) << 5; // Bit 5 return output; } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 5d700a1..612877e 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -3,7 +3,7 @@ * File Name : GPIOTask.hpp * Description : Polls and updates I2C GPIO expander in B3. ****************************************************************************** -*/ + */ #ifndef HELIOS_GPIOTASK_HPP_ #define HELIOS_GPIOTASK_HPP_ @@ -11,43 +11,42 @@ #include "SystemDefines.hpp" #include "Timer.hpp" - /*---------------------------------- Macros/Enums ----------------------------------*/ -enum GPIO_COMMANDS { +enum GPIO_COMMANDS +{ GPIO_STATE = 0, GPIO_RESET }; /*---------------------------------- Task Implementation ----------------------------------*/ -class GPIOTask : public Task +class GPIOTask : public Task { public: - static GPIOTask& Inst() { + static GPIOTask &Inst() + { static GPIOTask inst; return inst; } void InitTask(); - + /**Getters for CAN formatting */ uint8_t LightsInputs(); uint16_t DigitalInputs(); uint8_t LightStatus(); protected: - static void RunTask(void* pvParams) { GPIOTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); - void Run(void * pvParams); // Main run code + static void RunTask(void *pvParams) { GPIOTask::Inst().Run(pvParams); } // Static Task Interface, passes control to the instance Run(); + void Run(void *pvParams); // Main run code private: // Private Functions - GPIOTask(); // Private constructor - GPIOTask(const GPIOTask&); // Prevent copy-construction - GPIOTask& operator=(const GPIOTask&); // Prevent assignment + GPIOTask(); // Private constructor + GPIOTask(const GPIOTask &); // Prevent copy-construction + GPIOTask &operator=(const GPIOTask &); // Prevent assignment - - //** Potential private variable for refactoring code + //** Potential private variable for refactoring code // IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); */ - }; #endif From bf399f9f2e38b36397073c8524a9f4f66b085755 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 15 Jan 2025 18:41:45 -0700 Subject: [PATCH 25/38] feat: Update Debug Task with new CanTX commands for testing --- Components/Debug/DebugTask.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 74ff64a..6be5d4d 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -153,20 +153,38 @@ void DebugTask::HandleDebugMessage(const char* msg) } //-- CAN Commands -- - else if (strcmp(msg, "can_lights_input") == 0) { + else if (strcmp(msg, "can_lights_inputs") == 0) { Command cmd(DATA_COMMAND, LIGHTS_INPUT); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); + if(res){ + CUBE_PRINT("Sent CAN Lights INPUT Command"); + } + + } + else if (strcmp(msg, "can_digital_inputs") == 0) { + Command cmd(DATA_COMMAND, DIGITAL_INPUTS); + Queue* evtQ = CANTxTask::Inst().GetEventQueue(); + bool res = evtQ->Send(cmd); + if(res){ + CUBE_PRINT("Sent CAN Digital INPUT Command"); + } } - else if (strcmp(msg, "can_driver_base") == 0) { + else if (strcmp(msg, "can_analog_inputs") == 0) { Command cmd(DATA_COMMAND, ANALOG_INPUTS); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); + if(res){ + CUBE_PRINT("Sent CAN Analog INPUT Command"); + } } - else if (strcmp(msg, "light_status_base") == 0) { + else if (strcmp(msg, "can_lights_status") == 0) { Command cmd(DATA_COMMAND, LIGHTS_STATUS_BASE); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); + if(res){ + CUBE_PRINT("Sent CAN Lights Status Command"); + } } //-- SYSTEM / CHAR COMMANDS -- (Must be last) From 3fb475c648ae78dd8079bc2d83ef46f474a06c02 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 18 Jan 2025 11:14:12 -0700 Subject: [PATCH 26/38] feat: Send CAN TX Messages at intervals with counter tick in GPIO Task --- Components/CAN/CANTxTask.cpp | 6 ------ Components/CAN/CANTxTask.hpp | 1 - Components/GPIO/GPIOTask.cpp | 39 +++++++++++++++++++++++++++++++++++- Components/GPIO/GPIOTask.hpp | 3 +++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index c29c403..b77bd57 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -66,7 +66,6 @@ void CANTxTask::Run(void *pvParams) HandleCommand(cm); cm.Reset(); - osDelay((1000 / CAN_TX_FREQ)); } } @@ -95,7 +94,6 @@ void CANTxTask::HandleCommand(Command &cm) u8_data = GPIOTask::Inst().LightsInputs(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); - this->CAN_TX_FREQ = 10; break; case DIGITAL_INPUTS: @@ -105,7 +103,6 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[1] = (u16_data >> 8) & 0xFF; // High byte msg.data[0] = u16_data & 0x0F; // Low byte CUBE_PRINT("Sent Digital Inputs command\n"); - this->CAN_TX_FREQ = 20; break; case ANALOG_INPUTS: @@ -125,7 +122,6 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) CUBE_PRINT("Sent Analog Inputs command\n"); - this->CAN_TX_FREQ = 20; break; case LIGHTS_STATUS_BASE: @@ -134,12 +130,10 @@ void CANTxTask::HandleCommand(Command &cm) u8_data = GPIOTask::Inst().LightStatus(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); - this->CAN_TX_FREQ = 5; break; default: CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); - this->CAN_TX_FREQ = 10; break; } diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index f4f410f..ed6a23a 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -50,7 +50,6 @@ class CANTxTask : public Task CANTxTask(); // Private constructor CANTxTask(const CANTxTask &); // Prevent copy-construction CANTxTask &operator=(const CANTxTask &); // Prevent assignment - int CAN_TX_FREQ = 10; }; #endif diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index d73bdf1..eca9741 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -9,7 +9,8 @@ #include "IOExpander.hpp" /*----------------------- Macros -----------------------*/ -#define TASK_FREQUENCY 1 +static uint8_t counterTick = 0; +#define TASK_FREQUENCY 20 constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; /** @@ -402,7 +403,43 @@ void GPIOTask::Run(void *pvParams) // Commit changes to Power board // powerBoardExpander.Commit(); + counterTick++; + checkCounterTick(); + // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); } } + + +/** + * @brief Handles periodic tasks based on the `counterTick`. + * + * This function checks the `counterTick` value and triggers specific tasks + * according to the following schedule: + * - `Digital Inputs`: 20 Hz -> 50 ms (sent every execution cycle) + * - `Analog Inputs`: 20 Hz -> 50 ms (sent every execution cycle) + * - `Lights_Input`: 10 Hz -> 100 ms (`counterTick == 2`) + * - `Lights Status`: 5 Hz -> 200 ms (`counterTick == 4`) + * + * @details + * - A base delay of 50 ms is required to increment `counterTick` properly. + * - `Digital Inputs` and `Analog Inputs` are sent every 50 ms. + * - `Lights_Input` is sent every 100 ms. + * - `Lights Status` is sent every 200 ms along with `Lights_Input`. + * - After 200 ms (`counterTick == 4`), the counter is reset to 0 for the next cycle. + */ +void GPIOTask::checkCounterTick() { + // Always send every 50 ms + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, DIGITAL_INPUTS)); + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, ANALOG_INPUTS)); + + if (counterTick == 2) { // 100 ms passed send LIGHTS_INPUT + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); + } + if (counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_STATUS_BASE)); + counterTick = 0; // Reset the counter for the next cycle + } +} diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 612877e..8a1dd7d 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -9,6 +9,7 @@ #include "Task.hpp" #include "SystemDefines.hpp" +#include "CAN/CANTxTask.hpp" #include "Timer.hpp" /*---------------------------------- Macros/Enums ----------------------------------*/ @@ -45,6 +46,8 @@ class GPIOTask : public Task GPIOTask(const GPIOTask &); // Prevent copy-construction GPIOTask &operator=(const GPIOTask &); // Prevent assignment + void checkCounterTick(); + //** Potential private variable for refactoring code // IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); */ }; From 56048af5fc62f51dd87f1a29bead70c270b4bd99 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 18 Jan 2025 11:20:42 -0700 Subject: [PATCH 27/38] fix: counterTick not global --- Components/GPIO/GPIOTask.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index eca9741..742ee5f 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -9,7 +9,6 @@ #include "IOExpander.hpp" /*----------------------- Macros -----------------------*/ -static uint8_t counterTick = 0; #define TASK_FREQUENCY 20 constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; @@ -403,8 +402,9 @@ void GPIOTask::Run(void *pvParams) // Commit changes to Power board // powerBoardExpander.Commit(); + static uint8_t counterTick = 0; + checkCounterTick(counterTick); counterTick++; - checkCounterTick(); // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); @@ -429,7 +429,7 @@ void GPIOTask::Run(void *pvParams) * - `Lights Status` is sent every 200 ms along with `Lights_Input`. * - After 200 ms (`counterTick == 4`), the counter is reset to 0 for the next cycle. */ -void GPIOTask::checkCounterTick() { +void GPIOTask::checkCounterTick(uint8_t counterTick) { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, DIGITAL_INPUTS)); CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, ANALOG_INPUTS)); From c0f17b7374c9c5d2bc4e94db2e4e5ad042ae079a Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 18 Jan 2025 11:22:00 -0700 Subject: [PATCH 28/38] fix: Function signature of checkCounterTick --- Components/GPIO/GPIOTask.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 8a1dd7d..d32b1de 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -46,7 +46,7 @@ class GPIOTask : public Task GPIOTask(const GPIOTask &); // Prevent copy-construction GPIOTask &operator=(const GPIOTask &); // Prevent assignment - void checkCounterTick(); + void checkCounterTick(uint8_t counterTick); //** Potential private variable for refactoring code // IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); */ From dceebbfff23c8f977c5478b97030817f88f0f891 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 18 Jan 2025 11:26:07 -0700 Subject: [PATCH 29/38] fix: counterTick to be a field and not a static variable --- Components/GPIO/GPIOTask.cpp | 13 ++++++------- Components/GPIO/GPIOTask.hpp | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 742ee5f..fefb79d 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -402,9 +402,8 @@ void GPIOTask::Run(void *pvParams) // Commit changes to Power board // powerBoardExpander.Commit(); - static uint8_t counterTick = 0; - checkCounterTick(counterTick); - counterTick++; + checkCounterTick(); + this->counterTick++; // Operate task at specified TASK_FREQUENCY osDelay(TASK_DELAY); @@ -429,17 +428,17 @@ void GPIOTask::Run(void *pvParams) * - `Lights Status` is sent every 200 ms along with `Lights_Input`. * - After 200 ms (`counterTick == 4`), the counter is reset to 0 for the next cycle. */ -void GPIOTask::checkCounterTick(uint8_t counterTick) { +void GPIOTask::checkCounterTick() { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, DIGITAL_INPUTS)); CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, ANALOG_INPUTS)); - if (counterTick == 2) { // 100 ms passed send LIGHTS_INPUT + if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); } - if (counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE + if (this->counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_STATUS_BASE)); - counterTick = 0; // Reset the counter for the next cycle + this->counterTick = 0; // Reset the counter for the next cycle } } diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index d32b1de..982fb55 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -46,8 +46,8 @@ class GPIOTask : public Task GPIOTask(const GPIOTask &); // Prevent copy-construction GPIOTask &operator=(const GPIOTask &); // Prevent assignment - void checkCounterTick(uint8_t counterTick); - + void checkCounterTick(); + uint8_t counterTick = 0; //** Potential private variable for refactoring code // IOExpander driverControlExpander(SystemHandles::I2C_Expander, IOExpander::CalculateAddress(1, 0, 0)); */ }; From 89705e39ccccbb0b4da59c881858f9e933a3ed19 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 18 Jan 2025 14:28:37 -0700 Subject: [PATCH 30/38] fix: Change to send DATA_COMMAND --- Components/Debug/DebugTask.cpp | 8 ++++---- Components/GPIO/GPIOTask.cpp | 12 ++++++------ Components/main_system.cpp | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index 6be5d4d..d58a593 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -153,7 +153,7 @@ void DebugTask::HandleDebugMessage(const char* msg) } //-- CAN Commands -- - else if (strcmp(msg, "can_lights_inputs") == 0) { + else if (strcmp(msg, "can_li") == 0) { Command cmd(DATA_COMMAND, LIGHTS_INPUT); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); @@ -162,7 +162,7 @@ void DebugTask::HandleDebugMessage(const char* msg) } } - else if (strcmp(msg, "can_digital_inputs") == 0) { + else if (strcmp(msg, "can_di") == 0) { Command cmd(DATA_COMMAND, DIGITAL_INPUTS); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); @@ -170,7 +170,7 @@ void DebugTask::HandleDebugMessage(const char* msg) CUBE_PRINT("Sent CAN Digital INPUT Command"); } } - else if (strcmp(msg, "can_analog_inputs") == 0) { + else if (strcmp(msg, "can_ai") == 0) { Command cmd(DATA_COMMAND, ANALOG_INPUTS); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); @@ -178,7 +178,7 @@ void DebugTask::HandleDebugMessage(const char* msg) CUBE_PRINT("Sent CAN Analog INPUT Command"); } } - else if (strcmp(msg, "can_lights_status") == 0) { + else if (strcmp(msg, "can_ls") == 0) { Command cmd(DATA_COMMAND, LIGHTS_STATUS_BASE); Queue* evtQ = CANTxTask::Inst().GetEventQueue(); bool res = evtQ->Send(cmd); diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index fefb79d..b962e8b 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -153,7 +153,7 @@ void GPIOTask::Run(void *pvParams) // TODO: Do Something to power board >_< based on driver control state or something... // Print for Now - CUBE_PRINT("Driver Control State...\n"); + // CUBE_PRINT("Driver Control State...\n"); for (uint8_t i = 0; i < 8; i++) { switch (static_cast(i)) @@ -430,15 +430,15 @@ void GPIOTask::Run(void *pvParams) */ void GPIOTask::checkCounterTick() { // Always send every 50 ms - CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, DIGITAL_INPUTS)); - CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, ANALOG_INPUTS)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT - CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); } if (this->counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE - CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_INPUT)); - CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, LIGHTS_STATUS_BASE)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); this->counterTick = 0; // Reset the counter for the next cycle } } diff --git a/Components/main_system.cpp b/Components/main_system.cpp index feb9395..6086ebf 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -31,9 +31,9 @@ void run_main() { WatchdogTask::Inst().InitTask(); CubeTask::Inst().InitTask(); DebugTask::Inst().InitTask(); - SPI_Task::Inst().InitTask(); + // SPI_Task::Inst().InitTask(); GPIOTask::Inst().InitTask(); - // CANTxTask::Inst().InitTask(); + CANTxTask::Inst().InitTask(); // Print System Boot Info : Warning, don't queue more than 10 prints before scheduler starts CUBE_PRINT("\n-- CUBE SYSTEM --\n"); From 0f20d420307c88cb0ddef57ff181e93bb6a3964f Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 22 Jan 2025 19:23:43 -0700 Subject: [PATCH 31/38] fix: u16_t type , driverControl State on active Low, bit masking on 9 bit digital_inputs --- Components/CAN/CANTxTask.cpp | 8 +-- Components/GPIO/GPIOTask.cpp | 118 +++++++++++++++++------------------ 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index b77bd57..33ac240 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -81,7 +81,7 @@ void CANTxTask::HandleCommand(Command &cm) // msg.data[0] = 1; // Example data; set according to command specifics. uint8_t u8_data = 0; - uint8_t u16_data = 0; + uint16_t u16_data = 0; uint16_t u12_acceleration = 0; uint16_t u12_braking = 0; uint32_t u32_data = 0; @@ -100,9 +100,9 @@ void CANTxTask::HandleCommand(Command &cm) msg.extendedID = 0x611; msg.DLC = 2; u16_data = GPIOTask::Inst().DigitalInputs(); - msg.data[1] = (u16_data >> 8) & 0xFF; // High byte - msg.data[0] = u16_data & 0x0F; // Low byte - CUBE_PRINT("Sent Digital Inputs command\n"); + msg.data[1] = (u16_data >> 8) & 0x01; // High byte, only 9 bits + msg.data[0] = u16_data & 0xFF; // Low byte + // CUBE_PRINT("Sent Digital Inputs command\n"); break; case ANALOG_INPUTS: diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index b962e8b..0c3daff 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -9,7 +9,7 @@ #include "IOExpander.hpp" /*----------------------- Macros -----------------------*/ -#define TASK_FREQUENCY 20 +#define TASK_FREQUENCY 1 constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; /** @@ -47,10 +47,10 @@ uint8_t GPIOTask::LightsInputs() uint8_t output = 0; - uint8_t headlightsSwitch = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::HIGH; - uint8_t signalRight = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE) - 2] == IOState::HIGH; - uint8_t signalLeft = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE) - 2] == IOState::HIGH; - uint8_t hazardLights = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD) - 2] == IOState::HIGH; + uint8_t headlightsSwitch = driverControlState[static_cast(DriverControls::HEADLIGHTS_ENABLE)] == IOState::LOW; + uint8_t signalRight = driverControlState[static_cast(DriverControls::RIGHT_SIGNAL_ENABLE)] == IOState::LOW; + uint8_t signalLeft = driverControlState[static_cast(DriverControls::LEFT_SIGNAL_ENABLE)] == IOState::LOW; + uint8_t hazardLights = driverControlState[static_cast(DriverControls::EMERGENCY_HAZARD)] == IOState::LOW; output |= (signalRight ? 1 : 0) << 0; // Bit 0 output |= (signalLeft ? 1 : 0) << 1; // Bit 1 @@ -67,18 +67,18 @@ uint16_t GPIOTask::DigitalInputs() uint16_t output = 0; - uint8_t raceModeEnable = driverControlState[static_cast(DriverControls::RACE_MODE_ENABLE)] == IOState::HIGH; - uint8_t lap = driverControlState[static_cast(DriverControls::LAP_BUTTON)] == IOState::HIGH; - uint8_t hornSwitch = driverControlState[static_cast(DriverControls::HORN_ENABLE) - 2] == IOState::HIGH; - uint8_t motorReset = driverControlState[static_cast(DriverControls::MOTOR_RESET) - 2] == IOState::HIGH; + uint8_t raceModeEnable = driverControlState[static_cast(DriverControls::RACE_MODE_ENABLE)] == IOState::LOW; + uint8_t lap = driverControlState[static_cast(DriverControls::LAP_BUTTON)] == IOState::LOW; + uint8_t hornSwitch = driverControlState[static_cast(DriverControls::HORN_ENABLE)] == IOState::LOW; + uint8_t motorReset = driverControlState[static_cast(DriverControls::MOTOR_RESET)] == IOState::LOW; - uint8_t parkingBrake = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT) - 2] == IOState::HIGH; - uint8_t mechanicalBreak = driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE) - 2] == IOState::HIGH; - uint8_t zoomZoom = driverControlState[static_cast(DriverControls::GREEN_LED) - 2] == IOState::HIGH; + uint8_t parkingBrake = driverControlState[static_cast(DriverControls::PARKING_BRAKE_DETECT)] == IOState::LOW; + uint8_t mechanicalBreak = driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE)] == IOState::LOW; + uint8_t zoomZoom = driverControlState[static_cast(DriverControls::GREEN_LED)] == IOState::LOW; - uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; - uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; + uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; uint8_t neutral = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW // Assumption && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; @@ -114,12 +114,12 @@ uint8_t GPIOTask::LightStatus() uint8_t output = 0; // NOTE: Check if there's an offset like arr[X - 2]; Offset starts at P13 - uint8_t right_turn_light_signal = powerBoardState[static_cast(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; - uint8_t left_turn_light_signal = powerBoardState[static_cast(PowerBoard::LEFT_TURN_LIGHT_SIGNAL)] == IOState::HIGH; - uint8_t daytime_running_light_signal = powerBoardState[static_cast(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL)] == IOState::HIGH; - uint8_t headlight_signal = powerBoardState[static_cast(PowerBoard::HEADLIGHT_SIGNAL)] == IOState::HIGH; - uint8_t brake_light_signal = powerBoardState[static_cast(PowerBoard::BRAKE_LIGHT_SIGNAL)] == IOState::HIGH; - uint8_t horn_signal = powerBoardState[static_cast(PowerBoard::HORN_SIGNAL)] == IOState::HIGH; + uint8_t right_turn_light_signal = powerBoardState[static_cast(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL)] == IOState::LOW; + uint8_t left_turn_light_signal = powerBoardState[static_cast(PowerBoard::LEFT_TURN_LIGHT_SIGNAL)] == IOState::LOW; + uint8_t daytime_running_light_signal = powerBoardState[static_cast(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL)] == IOState::LOW; + uint8_t headlight_signal = powerBoardState[static_cast(PowerBoard::HEADLIGHT_SIGNAL)] == IOState::LOW; + uint8_t brake_light_signal = powerBoardState[static_cast(PowerBoard::BRAKE_LIGHT_SIGNAL)] == IOState::LOW; + uint8_t horn_signal = powerBoardState[static_cast(PowerBoard::HORN_SIGNAL)] == IOState::LOW; output |= (right_turn_light_signal ? 1 : 0) << 0; // Bit 0 output |= (left_turn_light_signal ? 1 : 0) << 1; // Bit 1 @@ -159,21 +159,21 @@ void GPIOTask::Run(void *pvParams) switch (static_cast(i)) { case DriverControls::FORWARD_NEUTRAL_REVERSE_H: - // CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); + CUBE_PRINT(" - P00 (Forward/Neutral/Reverse Combo High): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { - // powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::P13, IOState::HIGH); } else if (driverControlState[i] == IOState::LOW) { - // powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); + powerBoardExpander.SetPin(PowerBoard::P13, IOState::LOW); } else if (driverControlState[i] == IOState::ERROR) { } break; case DriverControls::FORWARD_NEUTRAL_REVERSE_L: - // CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); + CUBE_PRINT(" - P01 (Forward/Neutral/Reverse Combo Low): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -185,7 +185,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::ARRAYS_DISCONNECT: - // CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); + CUBE_PRINT(" - P02 (Array Disconnect): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -197,7 +197,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::RACE_MODE_ENABLE: - // CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); + CUBE_PRINT(" - P03 (Race Mode Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -209,21 +209,21 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::HEADLIGHTS_ENABLE: - // CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); + CUBE_PRINT(" - P04 (Headlights Enable): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { - // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i] == IOState::LOW) { - // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); + powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); } else if (driverControlState[i] == IOState::ERROR) { } break; case DriverControls::DISPLAY_SCREEN_ROTATE: - // CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); + CUBE_PRINT(" - P05 (Display Screen Rotate): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -235,7 +235,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::PROXIMITY_SENSOR_ENABLE: - // CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); + CUBE_PRINT(" - P06 (Proximity Sensor Mute): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -247,7 +247,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::LAP_BUTTON: - // CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); + CUBE_PRINT(" - P07 (Lap Button): %d\n", driverControlState[i]); if (driverControlState[i] == IOState::HIGH) { } @@ -269,49 +269,49 @@ void GPIOTask::Run(void *pvParams) switch (static_cast(i)) { case DriverControls::HORN_ENABLE: - // CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P10 (Horn Enable): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { - // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); } else if (driverControlState[i - 2] == IOState::LOW) { - // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); + powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); } else if (driverControlState[i - 2] == IOState::ERROR) { } break; case DriverControls::LEFT_SIGNAL_ENABLE: - // CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P11 (Left Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { - // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i - 2] == IOState::LOW) { - // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); + powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::LOW); } else if (driverControlState[i - 2] == IOState::ERROR) { } break; case DriverControls::RIGHT_SIGNAL_ENABLE: - // CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P12 (Right Signal Enable): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { - // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i - 2] == IOState::LOW) { - // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); } else if (driverControlState[i - 2] == IOState::ERROR) { } break; case DriverControls::EMERGENCY_HAZARD: - // CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P13 (Emergency Hazard): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { } @@ -323,7 +323,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::MOTOR_RESET: - // CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P14 (Motor Reset): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { } @@ -335,7 +335,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::PARKING_BRAKE_DETECT: - // CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P15 (Parking Brake Detect): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { } @@ -347,7 +347,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::MECHANICAL_BRAKE: - // CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P16 (Mechanical Brake): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { } @@ -359,7 +359,7 @@ void GPIOTask::Run(void *pvParams) } break; case DriverControls::GREEN_LED: - // CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); + CUBE_PRINT(" - P17 (Green LED): %d\n", driverControlState[i-2]); if (driverControlState[i - 2] == IOState::HIGH) { } @@ -389,18 +389,18 @@ void GPIOTask::Run(void *pvParams) // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::LOW); // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::LOW); - powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::HIGH); - powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::HIGH); - powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); - powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); - powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); - powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::BRAKE_LIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::DAYTIME_RUNNING_LIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::LEFT_TURN_LIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::RIGHT_TURN_LIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::HEADLIGHT_SIGNAL, IOState::HIGH); + // powerBoardExpander.SetPin(PowerBoard::HORN_SIGNAL, IOState::HIGH); - powerBoardExpander.TogglePin(PowerBoard::ORANGE_LED); - powerBoardExpander.TogglePin(PowerBoard::GREEN_LED); + // powerBoardExpander.TogglePin(PowerBoard::ORANGE_LED); + // powerBoardExpander.TogglePin(PowerBoard::GREEN_LED); // Commit changes to Power board - // powerBoardExpander.Commit(); + powerBoardExpander.Commit(); checkCounterTick(); this->counterTick++; @@ -431,14 +431,14 @@ void GPIOTask::Run(void *pvParams) void GPIOTask::checkCounterTick() { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); } if (this->counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); this->counterTick = 0; // Reset the counter for the next cycle } } From 143f5d66f9c3e94d9d6b16c830f4f9fe3c2f2b77 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 29 Jan 2025 18:39:36 -0700 Subject: [PATCH 32/38] fix: Forward Neutral Reverse L follows binary encoding --- .settings/language.settings.xml | 4 ++-- Components/GPIO/GPIOTask.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index c7d270a..44d50e5 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 0c3daff..828a9dd 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -76,9 +76,9 @@ uint16_t GPIOTask::DigitalInputs() uint8_t mechanicalBreak = driverControlState[static_cast(DriverControls::MECHANICAL_BRAKE)] == IOState::LOW; uint8_t zoomZoom = driverControlState[static_cast(DriverControls::GREEN_LED)] == IOState::LOW; - uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + uint8_t forward = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; - uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; + uint8_t reverse = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::HIGH && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::HIGH; uint8_t neutral = driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_H)] == IOState::LOW // Assumption && driverControlState[static_cast(DriverControls::FORWARD_NEUTRAL_REVERSE_L)] == IOState::LOW; From 1a89e68c4feec3ffc37d6a0f781a9f6987930340 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Wed, 5 Feb 2025 17:17:20 -0700 Subject: [PATCH 33/38] send all CAN TX commands --- Components/GPIO/GPIOTask.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 828a9dd..6749e57 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -431,14 +431,14 @@ void GPIOTask::Run(void *pvParams) void GPIOTask::checkCounterTick() { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); - // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT - // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); } if (this->counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE - // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); - // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); this->counterTick = 0; // Reset the counter for the next cycle } } From 75e64178858ad97322b1134892f25593d81da97f Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 22 Feb 2025 10:44:49 -0700 Subject: [PATCH 34/38] feat: Add heartbeat to TX commands --- Components/CAN/CANTxTask.cpp | 8 ++++++++ Components/CAN/CANTxTask.hpp | 3 ++- Components/GPIO/GPIOTask.cpp | 7 ++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index 33ac240..af6847e 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -131,6 +131,14 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); break; + + case HEARTBEAT: + msg.extendedID = 0x600; + msg.DLC = 1; + msg.data[0] = 1; + CUBE_PRINT("Sent Heartbeat \n"); + break; + default: CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); diff --git a/Components/CAN/CANTxTask.hpp b/Components/CAN/CANTxTask.hpp index ed6a23a..bd86ec7 100644 --- a/Components/CAN/CANTxTask.hpp +++ b/Components/CAN/CANTxTask.hpp @@ -23,7 +23,8 @@ enum CAN_TX_COMMANDS LIGHTS_INPUT, // Command for lights input DIGITAL_INPUTS, ANALOG_INPUTS, // Command for driver data - LIGHTS_STATUS_BASE // Command for lights status + LIGHTS_STATUS_BASE, // Command for lights status + HEARTBEAT, }; /* Macros ------------------------------------------------------------------*/ diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index 6749e57..ad38f17 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -420,6 +420,7 @@ void GPIOTask::Run(void *pvParams) * - `Analog Inputs`: 20 Hz -> 50 ms (sent every execution cycle) * - `Lights_Input`: 10 Hz -> 100 ms (`counterTick == 2`) * - `Lights Status`: 5 Hz -> 200 ms (`counterTick == 4`) + * - 'Heartbeat' : 1 Hz -> 1000 ms (`counterTick == 20`) * * @details * - A base delay of 50 ms is required to increment `counterTick` properly. @@ -431,7 +432,7 @@ void GPIOTask::Run(void *pvParams) void GPIOTask::checkCounterTick() { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); @@ -439,6 +440,10 @@ void GPIOTask::checkCounterTick() { if (this->counterTick == 4) { // 200 ms passed send LIGHTS_INPUT and LIGHTS_STATUS_BASE CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_STATUS_BASE)); + } + if(this->counterTick == 20){ + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND,HEARTBEAT)); this->counterTick = 0; // Reset the counter for the next cycle } + } From 38e9dd274698f799d5c8502a2086b9fac33ad279 Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 22 Feb 2025 15:12:39 -0700 Subject: [PATCH 35/38] feat: CanTX setup --- .settings/language.settings.xml | 4 +-- Components/CAN/CANTxTask.cpp | 43 +++++++++++++++++++++++++++------ Components/GPIO/GPIOTask.cpp | 4 +-- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 44d50e5..5b875f8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Components/CAN/CANTxTask.cpp b/Components/CAN/CANTxTask.cpp index af6847e..8f1f97f 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CAN/CANTxTask.cpp @@ -85,24 +85,42 @@ void CANTxTask::HandleCommand(Command &cm) uint16_t u12_acceleration = 0; uint16_t u12_braking = 0; uint32_t u32_data = 0; + static volatile uint8_t u8_randomTestData = 0; + static volatile uint16_t u16_randomTestData = 0; + static volatile uint32_t u32_randomTestData = 0; + // Handle command based on address/type switch (static_cast(cm.GetTaskCommand())) { case LIGHTS_INPUT: msg.extendedID = 0x610; msg.DLC = 1; - u8_data = GPIOTask::Inst().LightsInputs(); + // u8_data = GPIOTask::Inst().LightsInputs(); + // u8_data = 0xFF; + u8_data = u8_randomTestData; + u8_randomTestData++; + if(u8_randomTestData == 255){ + u8_randomTestData = 0; + } msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); + CUBE_PRINT("Sent Lights input data : %d\n", u8_data); break; case DIGITAL_INPUTS: msg.extendedID = 0x611; msg.DLC = 2; - u16_data = GPIOTask::Inst().DigitalInputs(); + // u16_data = GPIOTask::Inst().DigitalInputs(); + // u16_data = 0xFFFF; + u16_data = u16_randomTestData; + u16_randomTestData++; + if(u16_randomTestData == 65535){ + u16_randomTestData = 0; + } msg.data[1] = (u16_data >> 8) & 0x01; // High byte, only 9 bits msg.data[0] = u16_data & 0xFF; // Low byte - // CUBE_PRINT("Sent Digital Inputs command\n"); + CUBE_PRINT("Sent Digital Inputs command\n"); + CUBE_PRINT("Sent Digital input data : %d\n", u16_data); break; case ANALOG_INPUTS: @@ -110,11 +128,14 @@ void CANTxTask::HandleCommand(Command &cm) msg.DLC = 3; // ASSUMPTION: Returning only the P of the pedal readings. 12 bits returned even though SPI IC returns 10, following the comm sheet - u12_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits - u12_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits + // u12_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits + // u12_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits // Pack the 12-bit acceleration and 12-bit braking into a 24-bit structure - u32_data = (u12_acceleration & 0x0FFF) | ((u12_braking & 0x0FFF) << 12); + // u32_data = (u12_acceleration & 0x0FFF) | ((u12_braking & 0x0FFF) << 12); + u32_data = u32_randomTestData; + // u32_data = 0xFFFFFFFF; + u32_randomTestData++; // Split u32_data into bytes and assign to msg.data[] msg.data[0] = static_cast(u32_data & 0xFF); // Extract the first 8 bits (bits 0-7) @@ -122,14 +143,22 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) CUBE_PRINT("Sent Analog Inputs command\n"); + CUBE_PRINT("Sent Analog input data : %d\n", u32_data); break; case LIGHTS_STATUS_BASE: msg.extendedID = 0x620; msg.DLC = 1; - u8_data = GPIOTask::Inst().LightStatus(); + // u8_data = GPIOTask::Inst().LightStatus(); + // u8_data = 0xFF; + u8_data = u8_randomTestData; + u8_randomTestData++; + if(u8_randomTestData == 255){ + u8_randomTestData = 0; + } msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); + CUBE_PRINT("Sent Analog input data : %d\n", u8_data); break; case HEARTBEAT: diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index ad38f17..d335797 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -10,7 +10,7 @@ /*----------------------- Macros -----------------------*/ #define TASK_FREQUENCY 1 -constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY; +constexpr uint32_t TASK_DELAY = 10 / TASK_FREQUENCY; /** * @brief Constructor for GPIOTask @@ -432,7 +432,7 @@ void GPIOTask::Run(void *pvParams) void GPIOTask::checkCounterTick() { // Always send every 50 ms CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); - // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); + CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); From 5a64e0ffc5ac9e544ac080821f34eea7b9a3561e Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 22 Mar 2025 15:55:23 -0600 Subject: [PATCH 36/38] fix: CanTX with proper folder for mergability --- .settings/language.settings.xml | 4 +- Components/{CAN => CANTx}/CANTxTask.cpp | 58 +++++++------------------ Components/{CAN => CANTx}/CANTxTask.hpp | 0 Components/Debug/DebugTask.cpp | 2 +- Components/GPIO/GPIOTask.cpp | 9 ++-- Components/GPIO/GPIOTask.hpp | 2 +- Components/main_system.cpp | 2 +- Cube++ | 2 +- 8 files changed, 26 insertions(+), 53 deletions(-) rename Components/{CAN => CANTx}/CANTxTask.cpp (65%) rename Components/{CAN => CANTx}/CANTxTask.hpp (100%) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 5b875f8..6fe8ec8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Components/CAN/CANTxTask.cpp b/Components/CANTx/CANTxTask.cpp similarity index 65% rename from Components/CAN/CANTxTask.cpp rename to Components/CANTx/CANTxTask.cpp index 8f1f97f..d3a74a6 100644 --- a/Components/CAN/CANTxTask.cpp +++ b/Components/CANTx/CANTxTask.cpp @@ -35,7 +35,7 @@ CANTxTask::CANTxTask() : Task(CAN_TX_TASK_QUEUE_DEPTH_OBJS) void CANTxTask::InitTask() { // Make sure the task is not already initialized - CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize GPIO task twice"); + CUBE_ASSERT(rtTaskHandle == nullptr, "Cannot initialize CAN Tx task twice"); BaseType_t rtValue = xTaskCreate((TaskFunction_t)CANTxTask::RunTask, @@ -78,16 +78,12 @@ void CANTxTask::HandleCommand(Command &cm) CANMsg msg; msg.ID = 0; msg.DLC = 1; // Assuming DLC of 1 for each command; adjust as needed. - // msg.data[0] = 1; // Example data; set according to command specifics. uint8_t u8_data = 0; uint16_t u16_data = 0; - uint16_t u12_acceleration = 0; - uint16_t u12_braking = 0; + uint16_t u16_acceleration = 0; + uint16_t u16_braking = 0; uint32_t u32_data = 0; - static volatile uint8_t u8_randomTestData = 0; - static volatile uint16_t u16_randomTestData = 0; - static volatile uint32_t u32_randomTestData = 0; // Handle command based on address/type switch (static_cast(cm.GetTaskCommand())) @@ -95,47 +91,32 @@ void CANTxTask::HandleCommand(Command &cm) case LIGHTS_INPUT: msg.extendedID = 0x610; msg.DLC = 1; - // u8_data = GPIOTask::Inst().LightsInputs(); - // u8_data = 0xFF; - u8_data = u8_randomTestData; - u8_randomTestData++; - if(u8_randomTestData == 255){ - u8_randomTestData = 0; - } + u8_data = GPIOTask::Inst().LightsInputs(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Input command\n"); - CUBE_PRINT("Sent Lights input data : %d\n", u8_data); break; case DIGITAL_INPUTS: msg.extendedID = 0x611; msg.DLC = 2; - // u16_data = GPIOTask::Inst().DigitalInputs(); - // u16_data = 0xFFFF; - u16_data = u16_randomTestData; - u16_randomTestData++; - if(u16_randomTestData == 65535){ - u16_randomTestData = 0; - } + + u16_data = GPIOTask::Inst().DigitalInputs(); + msg.data[1] = (u16_data >> 8) & 0x01; // High byte, only 9 bits - msg.data[0] = u16_data & 0xFF; // Low byte - CUBE_PRINT("Sent Digital Inputs command\n"); - CUBE_PRINT("Sent Digital input data : %d\n", u16_data); + msg.data[0] = u16_data & 0xFF; // Low byte, 8 bits + + CUBE_PRINT("Sent DIGITAL INPUTS command\n"); break; case ANALOG_INPUTS: msg.extendedID = 0x612; msg.DLC = 3; - // ASSUMPTION: Returning only the P of the pedal readings. 12 bits returned even though SPI IC returns 10, following the comm sheet - // u12_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits - // u12_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits + u16_acceleration = SPI_Task::Inst().getAccelerationReading_P() & 0x0FFF; // Mask to ensure 12 bits + u16_braking = SPI_Task::Inst().getBrakingReading_P() & 0x0FFF; // Mask to ensure 12 bits // Pack the 12-bit acceleration and 12-bit braking into a 24-bit structure - // u32_data = (u12_acceleration & 0x0FFF) | ((u12_braking & 0x0FFF) << 12); - u32_data = u32_randomTestData; - // u32_data = 0xFFFFFFFF; - u32_randomTestData++; + u32_data = (u16_acceleration & 0x0FFF) | ((u16_braking & 0x0FFF) << 12); // Split u32_data into bytes and assign to msg.data[] msg.data[0] = static_cast(u32_data & 0xFF); // Extract the first 8 bits (bits 0-7) @@ -143,24 +124,16 @@ void CANTxTask::HandleCommand(Command &cm) msg.data[2] = static_cast((u32_data >> 16) & 0xFF); // Extract the next 8 bits (bits 16-23) CUBE_PRINT("Sent Analog Inputs command\n"); - CUBE_PRINT("Sent Analog input data : %d\n", u32_data); break; case LIGHTS_STATUS_BASE: msg.extendedID = 0x620; msg.DLC = 1; - // u8_data = GPIOTask::Inst().LightStatus(); - // u8_data = 0xFF; - u8_data = u8_randomTestData; - u8_randomTestData++; - if(u8_randomTestData == 255){ - u8_randomTestData = 0; - } + u8_data = GPIOTask::Inst().LightStatus(); msg.data[0] = u8_data; CUBE_PRINT("Sent Lights Status command\n"); - CUBE_PRINT("Sent Analog input data : %d\n", u8_data); break; - + case HEARTBEAT: msg.extendedID = 0x600; msg.DLC = 1; @@ -168,7 +141,6 @@ void CANTxTask::HandleCommand(Command &cm) CUBE_PRINT("Sent Heartbeat \n"); break; - default: CUBE_PRINT("CANRXTask - Received unsupported command: %d\n", cm.GetCommand()); break; diff --git a/Components/CAN/CANTxTask.hpp b/Components/CANTx/CANTxTask.hpp similarity index 100% rename from Components/CAN/CANTxTask.hpp rename to Components/CANTx/CANTxTask.hpp diff --git a/Components/Debug/DebugTask.cpp b/Components/Debug/DebugTask.cpp index d58a593..c80fcbc 100644 --- a/Components/Debug/DebugTask.cpp +++ b/Components/Debug/DebugTask.cpp @@ -15,7 +15,7 @@ #include "IOExpander.hpp" #include "SPI/SPI_Task.hpp" -#include "CAN/CANTxTask.hpp" +#include "CANTx/CANTxTask.hpp" #include "CAN.h" // External Tasks (to send debug commands to) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index d335797..b33998b 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -9,8 +9,8 @@ #include "IOExpander.hpp" /*----------------------- Macros -----------------------*/ -#define TASK_FREQUENCY 1 -constexpr uint32_t TASK_DELAY = 10 / TASK_FREQUENCY; +#define TASK_FREQUENCY_HZ 1 +constexpr uint32_t TASK_DELAY = 1000 / TASK_FREQUENCY_HZ; /** * @brief Constructor for GPIOTask @@ -431,8 +431,9 @@ void GPIOTask::Run(void *pvParams) */ void GPIOTask::checkCounterTick() { // Always send every 50 ms - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, DIGITAL_INPUTS)); - CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); + //NOTE: Currently not sending to queue + CANTxTask::Inst().SendCommand(Command(TASK_SPECIFIC_COMMAND, DIGITAL_INPUTS)); + // CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, ANALOG_INPUTS)); if (this->counterTick == 2) { // 100 ms passed send LIGHTS_INPUT CANTxTask::Inst().SendCommand(Command(DATA_COMMAND, LIGHTS_INPUT)); diff --git a/Components/GPIO/GPIOTask.hpp b/Components/GPIO/GPIOTask.hpp index 982fb55..f3eb73f 100644 --- a/Components/GPIO/GPIOTask.hpp +++ b/Components/GPIO/GPIOTask.hpp @@ -9,7 +9,7 @@ #include "Task.hpp" #include "SystemDefines.hpp" -#include "CAN/CANTxTask.hpp" +#include "CANTx/CANTxTask.hpp" #include "Timer.hpp" /*---------------------------------- Macros/Enums ----------------------------------*/ diff --git a/Components/main_system.cpp b/Components/main_system.cpp index 6086ebf..05d6f21 100644 --- a/Components/main_system.cpp +++ b/Components/main_system.cpp @@ -15,7 +15,7 @@ #include "DebugTask.hpp" #include "SPI/SPI_Task.hpp" #include "GPIO/GPIOTask.hpp" -#include "CAN/CANTxTask.hpp" +#include "CANTx/CANTxTask.hpp" /* Drivers ------------------------------------------------------------------*/ namespace Driver { diff --git a/Cube++ b/Cube++ index 2742128..2440272 160000 --- a/Cube++ +++ b/Cube++ @@ -1 +1 @@ -Subproject commit 2742128a15836068dff9fe5d7c94bba6cda5f928 +Subproject commit 2440272116c95f4bf8d48308b346b28533a3f62d From 2a2e950316776a6e6356b21678ba1046488ba0aa Mon Sep 17 00:00:00 2001 From: Heinzino Date: Sat, 3 May 2025 11:52:23 -0600 Subject: [PATCH 37/38] fix: Remove zoom zoom flag from Digital Inputs --- Components/GPIO/GPIOTask.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Components/GPIO/GPIOTask.cpp b/Components/GPIO/GPIOTask.cpp index b33998b..30c840f 100644 --- a/Components/GPIO/GPIOTask.cpp +++ b/Components/GPIO/GPIOTask.cpp @@ -100,9 +100,6 @@ uint16_t GPIOTask::DigitalInputs() output |= (raceModeEnable ? 1 : 0) << 7; // Bit 7 output |= (lap ? 1 : 0) << 8; // Bit 8 - // TODO: What is zoom zoom ? Assumed to be greenLed Bit 9 - output |= (zoomZoom ? 1 : 0) << 9; // Bit 9 - return output; } From c393cffe537ca6912fcd8d2c2d63d999d887fdbc Mon Sep 17 00:00:00 2001 From: MacKante Date: Fri, 9 May 2025 08:34:20 -0600 Subject: [PATCH 38/38] fixing git submodule error --- .settings/language.settings.xml | 4 ++-- .settings/stm32cubeide.project.prefs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 6fe8ec8..797d4c8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index 9e0da0d..833c8f2 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=2CE54FD71E149B997073596C6B0E9512 +2F62501ED4689FB349E356AB974DBE57=05328855C4E51ECDCD46876FE3491C71 635E684B79701B039C64EA45C3F84D30=06D51718D4F3D877E4CF008AE59E16BB 66BE74F758C12D739921AEA421D593D3=2 -8DF89ED150041C4CBC7CB9A9CAA90856=2CE54FD71E149B997073596C6B0E9512 -DC22A860405A8BF2F2C095E5B6529F12=D7B61603071EE7338842D45EDC3395F0 +8DF89ED150041C4CBC7CB9A9CAA90856=05328855C4E51ECDCD46876FE3491C71 +DC22A860405A8BF2F2C095E5B6529F12=787343FA0477F66DEA4B2B86368887F5 eclipse.preferences.version=1