From eb75a6d2b6d9ba944aa1f9eb89477dca090ef204 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Mon, 2 Mar 2026 21:07:38 -0800 Subject: [PATCH 01/24] Updated WDT task for lib dependencies and global link --- fsae-vehicle-fw/platformio.ini | 1 + fsae-vehicle-fw/src/main.cpp | 3 + fsae-vehicle-fw/src/peripherals/wdt.cpp | 85 +++++++++++++++++++++++++ fsae-vehicle-fw/src/peripherals/wdt.h | 9 +++ fsae-vehicle-fw/src/vehicle/apps.cpp | 9 +++ fsae-vehicle-fw/src/vehicle/bse.cpp | 6 ++ 6 files changed, 113 insertions(+) create mode 100644 fsae-vehicle-fw/src/peripherals/wdt.cpp create mode 100644 fsae-vehicle-fw/src/peripherals/wdt.h diff --git a/fsae-vehicle-fw/platformio.ini b/fsae-vehicle-fw/platformio.ini index 21c5fa5..ee0e55d 100644 --- a/fsae-vehicle-fw/platformio.ini +++ b/fsae-vehicle-fw/platformio.ini @@ -14,3 +14,4 @@ board = teensy41 framework = arduino lib_deps = https://github.com/tsandmann/freertos-teensy.git@^11.0.0 + https://github.com/tonton81/WDT_T4.git diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index bd4137b..8164003 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -5,6 +5,7 @@ #include "peripherals/adc.h" #include "peripherals/can.h" +#include "peripherals/wdt.h" #include "vehicle/apps.h" #include "vehicle/bse.h" @@ -13,6 +14,7 @@ #include "vehicle/telemetry.h" #include "vehicle/ifl100-36.h" + #include #include #include "utils/utils.h" @@ -33,6 +35,7 @@ void setup() { // runs once on bootup Telemetry_Init(); Motor_Init(); MCU_Init(); + WDT_Init(); xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, THREAD_MOTOR_PRIORITY, NULL); diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp new file mode 100644 index 0000000..7637574 --- /dev/null +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -0,0 +1,85 @@ +#include "wdt.h" + +#include "utils/utils.h" + +#include "vehicle/apps.h" +#include "vehicle/bse.h" + +#include +#include +#include + +// Bitmask flag definition +static uint8_t WDT_BIT_BSE = 0b01; +static uint8_t WDT_BIT_APPS = 0b10; + +static uint8_t WDT_REQUIRED_MASK = 0b00; // 0b00 represents no flags + +static constexpr uint32_t WDT_CHECK_PERIOD_MS = 100; + +static WDT_T4 WDT; + +void WDT_Init() { + TickType_t now = xTaskGetTickCount(); + bse_last_run_tick = now; + apps_last_run_tick = now; + + WDT_timings_t config; + + config.timeout = 1.0; // second before reset + config.trigger = 0.0; + config.callback = nullptr; + + WDT.begin(config); + + Serial.println("Watchdog initialized (1 second timeout)"); + +} + + +void WDT_Update_Task(void* arg) +{ + TickType_t now; + + TickType_t bse_ageTicks; + uint32_t bse_ageMs; + + TickType_t apps_ageTicks; + uint32_t apps_ageMs; + + uint8_t mask; + + for (;;) + { + now = xTaskGetTickCount(); + + bse_ageTicks = now - bse_last_run_tick; + bse_ageMs = bse_ageTicks * portTICK_PERIOD_MS; + + apps_ageTicks = now - apps_last_run_tick; + apps_ageMs = apps_ageTicks * portTICK_PERIOD_MS; + + mask = 0b00; + + // Fault time are both 100 ms + if (bse_ageMs > BSE_FAULT_TIME_THRESHOLD_MS) mask |= WDT_BIT_BSE; // x |= y ==> x = x | y + if (apps_ageMs > APPS_FAULT_TIME_THRESHOLD_MS) mask |= WDT_BIT_APPS; + + // pet if 0b00 + if (mask == WDT_REQUIRED_MASK) + { + WDT.feed(); // pet hardware watchdog + } + else if (mask == WDT_BIT_BSE) { + Serial.println("WDT: BSE update overdue"); + } + else if (mask == WDT_BIT_APPS) { + Serial.println("WDT: APPS update overdue"); + } + else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 + Serial.println("WDT: BSE and APPS updates overdue"); + } + + vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay + } +} diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h new file mode 100644 index 0000000..30b053b --- /dev/null +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +extern TickType_t bse_last_run_tick; +extern TickType_t apps_last_run_tick; + +void WDT_Init(); +void WDT_Task(); diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index fac83e8..4b7a4d6 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,10 +1,16 @@ // Anteater Electric Racing, 2025 #include + #include "utils/utils.h" + +#include "peripherals/wdt.h" + #include "apps.h" + #include "vehicle/faults.h" #include "vehicle/telemetry.h" + #include typedef struct { @@ -40,6 +46,9 @@ void APPS_Init() { } void APPS_UpdateData(uint32_t rawReading1, uint32_t rawReading2) { + // update clock for WDT + apps_last_run_tick = xTaskGetTickCount(); + // Filter incoming values LOWPASS_FILTER(rawReading1, appsData.apps1RawReading, appsAlpha); LOWPASS_FILTER(rawReading2, appsData.apps2RawReading, appsAlpha); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index 637d5ec..2fbb9d0 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -4,9 +4,12 @@ #include "utils/utils.h" +#include "peripherals/wdt.h" + #include "bse.h" #include "vehicle/faults.h" + #include typedef struct{ @@ -31,6 +34,9 @@ void BSE_Init() { } void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2){ + // update clock for WDT + bse_last_run_tick = xTaskGetTickCount(); + // Filter incoming values LOWPASS_FILTER(bseReading1, bseRawData.bseRawFront, bseAlpha); LOWPASS_FILTER(bseReading2, bseRawData.bseRawRear, bseAlpha); From 059bda71660db00b99ca8e4a4deb8273be9947ba Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 21:59:37 -0700 Subject: [PATCH 02/24] Fixed cpp linter issue for WDT.cpp and WDT.h Fixed clang formatting for WDT.cpp Merged main and kd-ag/mz_wdt2 branches to resolve merge conflicts for apps, bse, main.cpp --- fsae-vehicle-fw/src/main.cpp | 1 + fsae-vehicle-fw/src/peripherals/wdt.cpp | 42 +++++++++++-------------- fsae-vehicle-fw/src/peripherals/wdt.h | 4 +-- fsae-vehicle-fw/src/vehicle/apps.cpp | 11 ++----- 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index efc5b18..960cb40 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -40,6 +40,7 @@ void setup() { // runs once on bootup Telemetry_Init(); Motor_Init(); MCU_Init(); + WDT_Init(); xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 7637574..aabd430 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -10,7 +10,7 @@ #include // Bitmask flag definition -static uint8_t WDT_BIT_BSE = 0b01; +static uint8_t WDT_BIT_BSE = 0b01; static uint8_t WDT_BIT_APPS = 0b10; static uint8_t WDT_REQUIRED_MASK = 0b00; // 0b00 represents no flags @@ -21,24 +21,21 @@ static WDT_T4 WDT; void WDT_Init() { TickType_t now = xTaskGetTickCount(); - bse_last_run_tick = now; + bse_last_run_tick = now; apps_last_run_tick = now; WDT_timings_t config; - config.timeout = 1.0; // second before reset - config.trigger = 0.0; + config.timeout = 1.0; // second before reset + config.trigger = 0.0; config.callback = nullptr; WDT.begin(config); Serial.println("Watchdog initialized (1 second timeout)"); - } - -void WDT_Update_Task(void* arg) -{ +void WDT_Update_Task() { TickType_t now; TickType_t bse_ageTicks; @@ -49,8 +46,7 @@ void WDT_Update_Task(void* arg) uint8_t mask; - for (;;) - { + for (;;) { now = xTaskGetTickCount(); bse_ageTicks = now - bse_last_run_tick; @@ -62,24 +58,24 @@ void WDT_Update_Task(void* arg) mask = 0b00; // Fault time are both 100 ms - if (bse_ageMs > BSE_FAULT_TIME_THRESHOLD_MS) mask |= WDT_BIT_BSE; // x |= y ==> x = x | y - if (apps_ageMs > APPS_FAULT_TIME_THRESHOLD_MS) mask |= WDT_BIT_APPS; + if (bse_ageMs > BSE_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_BSE; // x |= y ==> x = x | y + } + if (apps_ageMs > APPS_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_APPS; + } // pet if 0b00 - if (mask == WDT_REQUIRED_MASK) - { - WDT.feed(); // pet hardware watchdog - } - else if (mask == WDT_BIT_BSE) { + if (mask == WDT_REQUIRED_MASK) { + WDT.feed(); // pet hardware watchdog + } else if (mask == WDT_BIT_BSE) { Serial.println("WDT: BSE update overdue"); - } - else if (mask == WDT_BIT_APPS) { + } else if (mask == WDT_BIT_APPS) { Serial.println("WDT: APPS update overdue"); - } - else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 + } else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 Serial.println("WDT: BSE and APPS updates overdue"); } - vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay + vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay } -} +} \ No newline at end of file diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h index 30b053b..84a6591 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.h +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -1,9 +1,7 @@ #pragma once -#include - extern TickType_t bse_last_run_tick; extern TickType_t apps_last_run_tick; void WDT_Init(); -void WDT_Task(); +void WDT_Update_Task(); diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index a12a63c..3bc193c 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -41,15 +41,11 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -<<<<<<< HEAD -void APPS_UpdateData(uint32_t rawReading1, uint32_t rawReading2) { - // update clock for WDT - apps_last_run_tick = xTaskGetTickCount(); - - // Filter incoming values -======= void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 + // update clock for WDT + apps_last_run_tick = xTaskGetTickCount(); + // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); // Serial.print("Raw APPS2: "); @@ -61,7 +57,6 @@ void APPS_UpdateData(uint16_t rawReading1, // if (rawReading2 > APPS2_20PCT_ADC) // rawReading2 = APPS2_20PCT_ADC; ->>>>>>> main LOWPASS_FILTER(rawReading1, appsData.apps1RawReading, appsAlpha); LOWPASS_FILTER(rawReading2, appsData.apps2RawReading, appsAlpha); From 59a8202f789812f7f6223b18f7c7d1e7ec1ffb74 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 22:10:33 -0700 Subject: [PATCH 03/24] Undo random deletes of include paths --- fsae-vehicle-fw/src/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index 960cb40..45ecf67 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -17,7 +17,7 @@ #include "vehicle/rtm_button.h" #include "vehicle/shockTravel.h" #include "vehicle/telemetry.h" -#include "vehicle/ifl100-36.h" +#include "vehicle/thermal.h" #include "utils/utils.h" #include @@ -40,6 +40,9 @@ void setup() { // runs once on bootup Telemetry_Init(); Motor_Init(); MCU_Init(); + GPIO_Init(); + PCC_Init(); + thermal_Init(); WDT_Init(); xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, From 7adc100f8a51e4a0ff88eddaa3e90572b756164f Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 22:53:57 -0700 Subject: [PATCH 04/24] test cpp linter changes --- fsae-vehicle-fw/src/peripherals/wdt.cpp | 20 ++++++++++---------- fsae-vehicle-fw/src/vehicle/apps.cpp | 4 +++- fsae-vehicle-fw/src/vehicle/bse.cpp | 3 ++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index aabd430..3fd8d8c 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -1,13 +1,13 @@ -#include "wdt.h" +#include +#include +#include +#include "wdt.h" #include "utils/utils.h" - #include "vehicle/apps.h" #include "vehicle/bse.h" -#include -#include -#include + // Bitmask flag definition static uint8_t WDT_BIT_BSE = 0b01; @@ -26,7 +26,7 @@ void WDT_Init() { WDT_timings_t config; - config.timeout = 1.0; // second before reset + config.timeout = 1.0; // second before reset config.trigger = 0.0; config.callback = nullptr; @@ -59,7 +59,7 @@ void WDT_Update_Task() { // Fault time are both 100 ms if (bse_ageMs > BSE_FAULT_TIME_THRESHOLD_MS) { - mask |= WDT_BIT_BSE; // x |= y ==> x = x | y + mask |= WDT_BIT_BSE; // x |= y ==> x = x | y } if (apps_ageMs > APPS_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_APPS; @@ -67,15 +67,15 @@ void WDT_Update_Task() { // pet if 0b00 if (mask == WDT_REQUIRED_MASK) { - WDT.feed(); // pet hardware watchdog + WDT.feed(); // pet hardware watchdog } else if (mask == WDT_BIT_BSE) { Serial.println("WDT: BSE update overdue"); } else if (mask == WDT_BIT_APPS) { Serial.println("WDT: APPS update overdue"); - } else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 + } else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 Serial.println("WDT: BSE and APPS updates overdue"); } - vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay + vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay } } \ No newline at end of file diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 3bc193c..c1f63d3 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -42,7 +42,9 @@ void APPS_Init() { } void APPS_UpdateData(uint16_t rawReading1, - uint16_t rawReading2) { // changed uint16 from 32 + uint16_t rawReading2) { + // changed uint16 from 32 + // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index b720059..e5bd3cc 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -34,7 +34,8 @@ void BSE_Init() { BSE_CUTOFF_HZ); // 10Hz cutoff frequency, 0.01s sample time } -void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2){ +void BSE_UpdateData(uint32_t bseReading1, + uint32_t bseReading2) { // update clock for WDT bse_last_run_tick = xTaskGetTickCount(); From ed27ae14dd4dfb492f33fb0727c632e8904e61d0 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 22:58:18 -0700 Subject: [PATCH 05/24] test cpp linter changes --- fsae-vehicle-fw/src/peripherals/wdt.cpp | 4 +--- fsae-vehicle-fw/src/vehicle/apps.cpp | 3 +-- fsae-vehicle-fw/src/vehicle/bse.cpp | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 3fd8d8c..0e42c81 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -2,13 +2,11 @@ #include #include -#include "wdt.h" +#include "peripherals/wdt.h" #include "utils/utils.h" #include "vehicle/apps.h" #include "vehicle/bse.h" - - // Bitmask flag definition static uint8_t WDT_BIT_BSE = 0b01; static uint8_t WDT_BIT_APPS = 0b10; diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index c1f63d3..4b38738 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -42,8 +42,7 @@ void APPS_Init() { } void APPS_UpdateData(uint16_t rawReading1, - uint16_t rawReading2) { - // changed uint16 from 32 + uint16_t rawReading2) { // changed uint16 from 32 // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index e5bd3cc..fbabb97 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -34,8 +34,7 @@ void BSE_Init() { BSE_CUTOFF_HZ); // 10Hz cutoff frequency, 0.01s sample time } -void BSE_UpdateData(uint32_t bseReading1, - uint32_t bseReading2) { +void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { // update clock for WDT bse_last_run_tick = xTaskGetTickCount(); From 22ab55110b39fff086c22510c380eba50f1721e0 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:00:51 -0700 Subject: [PATCH 06/24] test cpp linter issues --- fsae-vehicle-fw/src/vehicle/apps.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 4b38738..5c55589 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,13 +1,15 @@ // Anteater Electric Racing, 2025 -#include "apps.h" +#include +#include + +#include "vehicle/apps.h" #include "utils/utils.h" #include "peripherals/wdt.h" #include "vehicle/faults.h" #include "vehicle/telemetry.h" -#include -#include + typedef struct { float appsReading1_Percentage; // Percentage of pedal travel (0 to 1) @@ -41,9 +43,7 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -void APPS_UpdateData(uint16_t rawReading1, - uint16_t rawReading2) { // changed uint16 from 32 - +void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); From fca897733be8dcf9d479161f56fa78e72e8d97cc Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:02:42 -0700 Subject: [PATCH 07/24] fix cpp linter issues --- fsae-vehicle-fw/src/vehicle/apps.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 5c55589..6e2507a 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -2,10 +2,9 @@ #include #include - -#include "vehicle/apps.h" #include "utils/utils.h" #include "peripherals/wdt.h" +#include "vehicle/apps.h" #include "vehicle/faults.h" #include "vehicle/telemetry.h" @@ -43,7 +42,8 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 +void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { + // changed uint16 from 32 // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); From 4b339782911ac0e6080e7e1dedacdab06167256b Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:07:49 -0700 Subject: [PATCH 08/24] test linter --- fsae-vehicle-fw/src/vehicle/apps.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 6e2507a..4b421d8 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,7 +1,7 @@ // Anteater Electric Racing, 2025 - -#include #include +#include + #include "utils/utils.h" #include "peripherals/wdt.h" #include "vehicle/apps.h" @@ -42,7 +42,7 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { +void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); From 52e403554752a30a9685332f5daeadc10368c45e Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:12:48 -0700 Subject: [PATCH 09/24] test cpp linter --- fsae-vehicle-fw/src/vehicle/apps.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 4b421d8..865da4e 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,7 +1,6 @@ // Anteater Electric Racing, 2025 -#include #include - +#include #include "utils/utils.h" #include "peripherals/wdt.h" #include "vehicle/apps.h" @@ -46,7 +45,7 @@ void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 // update clock for WDT apps_last_run_tick = xTaskGetTickCount(); - + // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); // Serial.print("Raw APPS2: "); From 35b49108f80f453cb2322efea0d4f43737e0d9b0 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:14:56 -0700 Subject: [PATCH 10/24] fix cpp linter --- fsae-vehicle-fw/src/vehicle/apps.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 865da4e..d357fa0 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,6 +1,8 @@ // Anteater Electric Racing, 2025 + #include #include + #include "utils/utils.h" #include "peripherals/wdt.h" #include "vehicle/apps.h" From d05dbb438bdca80935073c9c67a993ef7f5b3f0b Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:18:27 -0700 Subject: [PATCH 11/24] test cpp linter issue #8 --- fsae-vehicle-fw/src/vehicle/apps.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index d357fa0..ccadf2b 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -1,11 +1,12 @@ // Anteater Electric Racing, 2025 +#include "apps.h" + #include #include #include "utils/utils.h" #include "peripherals/wdt.h" -#include "vehicle/apps.h" #include "vehicle/faults.h" #include "vehicle/telemetry.h" From 5918db994b2723c6ce67e5ea3d204dae896d9f62 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:20:46 -0700 Subject: [PATCH 12/24] test cpp linter #9 --- fsae-vehicle-fw/src/vehicle/apps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index ccadf2b..4a1df9d 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -5,8 +5,8 @@ #include #include -#include "utils/utils.h" #include "peripherals/wdt.h" +#include "utils/utils.h" #include "vehicle/faults.h" #include "vehicle/telemetry.h" From fd34a063552503e438997c78a53deeca64415052 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Tue, 31 Mar 2026 23:22:02 -0700 Subject: [PATCH 13/24] test cpp linter issues #11 --- fsae-vehicle-fw/src/vehicle/apps.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 4a1df9d..09890b4 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -10,8 +10,6 @@ #include "vehicle/faults.h" #include "vehicle/telemetry.h" - - typedef struct { float appsReading1_Percentage; // Percentage of pedal travel (0 to 1) float appsReading2_Percentage; // Percentage of pedal travel (0 to 1) From 7ceb141bbd6b5760df3fbd995cef905eb3ab8b1e Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Thu, 2 Apr 2026 20:48:19 -0700 Subject: [PATCH 14/24] fixed lib dependency by forking WDT_T4 --- fsae-vehicle-fw/platformio.ini | 2 +- fsae-vehicle-fw/src/peripherals/wdt.cpp | 6 +++++- fsae-vehicle-fw/src/peripherals/wdt.h | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fsae-vehicle-fw/platformio.ini b/fsae-vehicle-fw/platformio.ini index 121fd1a..47a514a 100644 --- a/fsae-vehicle-fw/platformio.ini +++ b/fsae-vehicle-fw/platformio.ini @@ -15,4 +15,4 @@ framework = arduino lib_deps = https://github.com/tsandmann/freertos-teensy.git@^11.0.0 - https://github.com/tonton81/WDT_T4.git + https://github.com/kdao18/WDT_T4.git diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 0e42c81..49796d2 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -7,6 +7,10 @@ #include "vehicle/apps.h" #include "vehicle/bse.h" +// Global watchdog tick tracking variables +TickType_t bse_last_run_tick = 0; +TickType_t apps_last_run_tick = 0; + // Bitmask flag definition static uint8_t WDT_BIT_BSE = 0b01; static uint8_t WDT_BIT_APPS = 0b10; @@ -76,4 +80,4 @@ void WDT_Update_Task() { vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay } -} \ No newline at end of file +} diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h index 84a6591..4b1c578 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.h +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -1,5 +1,7 @@ #pragma once +#include + extern TickType_t bse_last_run_tick; extern TickType_t apps_last_run_tick; From 24b122670890f9139acd04bdca8bd17c3c0233c9 Mon Sep 17 00:00:00 2001 From: kdao18 Date: Mon, 6 Apr 2026 20:34:50 -0700 Subject: [PATCH 15/24] testing changes in ELF --- fsae-vehicle-fw/src/main.cpp | 38 ++++++++++++++----------- fsae-vehicle-fw/src/peripherals/wdt.cpp | 9 +++--- fsae-vehicle-fw/src/peripherals/wdt.h | 2 +- fsae-vehicle-fw/src/vehicle/bse.cpp | 15 ++++++++-- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index 45ecf67..19a5550 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -31,35 +31,39 @@ static TickType_t xLastWakeTime; void threadMain(void *pvParameters); void setup() { // runs once on bootup + Serial.begin(9600); + Serial.println("Teensy Booted"); //statement to check reboot ADC_Init(); - CAN_Init(); + // CAN_Init(); APPS_Init(); - Shock_Init(); + // Shock_Init(); BSE_Init(); - Faults_Init(); - Telemetry_Init(); - Motor_Init(); - MCU_Init(); - GPIO_Init(); - PCC_Init(); - thermal_Init(); + // Faults_Init(); + // Telemetry_Init(); + // Motor_Init(); + // MCU_Init(); + // GPIO_Init(); + // PCC_Init(); + // thermal_Init(); WDT_Init(); + xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); - xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, - THREAD_MOTOR_PRIORITY, NULL); - xTaskCreate(threadTelemetry, "threadTelemetryCAN", - THREAD_CAN_TELEMETRY_STACK_SIZE, NULL, - THREAD_CAN_TELEMETRY_PRIORITY, NULL); - xTaskCreate(threadMain, "threadMain", THREAD_MAIN_STACK_SIZE, NULL, - THREAD_MAIN_PRIORITY, NULL); + xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 3, NULL); // runs wdt update task + // xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, + // THREAD_MOTOR_PRIORITY, NULL); + // xTaskCreate(threadTelemetry, "threadTelemetryCAN", + // THREAD_CAN_TELEMETRY_STACK_SIZE, NULL, + // THREAD_CAN_TELEMETRY_PRIORITY, NULL); + // xTaskCreate(threadMain, "threadMain", THREAD_MAIN_STACK_SIZE, NULL, + // THREAD_MAIN_PRIORITY, NULL); vTaskStartScheduler(); } void threadMain(void *pvParameters) { Serial.begin(9600); - + // Serial.print("Teensy Booted"); //statement to check reboot xLastWakeTime = xTaskGetTickCount(); // Initialize the last wake time #if HIMAC_FLAG diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 49796d2..84dfc58 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -37,7 +37,7 @@ void WDT_Init() { Serial.println("Watchdog initialized (1 second timeout)"); } -void WDT_Update_Task() { +void WDT_Update_Task(void *pvParameters) { TickType_t now; TickType_t bse_ageTicks; @@ -60,16 +60,17 @@ void WDT_Update_Task() { mask = 0b00; // Fault time are both 100 ms - if (bse_ageMs > BSE_FAULT_TIME_THRESHOLD_MS) { + if (bse_ageMs >= BSE_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_BSE; // x |= y ==> x = x | y } - if (apps_ageMs > APPS_FAULT_TIME_THRESHOLD_MS) { + if (apps_ageMs >= APPS_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_APPS; } // pet if 0b00 if (mask == WDT_REQUIRED_MASK) { WDT.feed(); // pet hardware watchdog + Serial.println("WDT fed successfully"); } else if (mask == WDT_BIT_BSE) { Serial.println("WDT: BSE update overdue"); } else if (mask == WDT_BIT_APPS) { @@ -78,6 +79,6 @@ void WDT_Update_Task() { Serial.println("WDT: BSE and APPS updates overdue"); } - vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay + vTaskDelay(pdMS_TO_TICKS(25)); // 100ms delay } } diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h index 4b1c578..2eefaa1 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.h +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -6,4 +6,4 @@ extern TickType_t bse_last_run_tick; extern TickType_t apps_last_run_tick; void WDT_Init(); -void WDT_Update_Task(); +void WDT_Update_Task(void *pvParameters); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index fbabb97..7b22cfc 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -35,9 +35,6 @@ void BSE_Init() { } void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { - // update clock for WDT - bse_last_run_tick = xTaskGetTickCount(); - // Filter incoming values LOWPASS_FILTER(bseReading1, bseRawData.bseRawFront, bseAlpha); LOWPASS_FILTER(bseReading2, bseRawData.bseRawRear, bseAlpha); @@ -45,6 +42,18 @@ void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { float bseVoltage1 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawFront); float bseVoltage2 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawRear); + // update clock for WDT + if (bseVoltage1 < BSE_LOWER_THRESHOLD || + bseVoltage1 > BSE_UPPER_THRESHOLD || + bseVoltage2 < BSE_LOWER_THRESHOLD || + bseVoltage2 > BSE_UPPER_THRESHOLD) { + // Don't update the WDT tick if the reading is zero, which likely indicates a disconnected sensor rather than a stalled task + Serial.println("BSE reading is zero, not updating WDT tick"); + } else { + bse_last_run_tick = xTaskGetTickCount(); + } + //used same conditions to only update BSE when voltage is 0 + // // #if HIMACBSE_FLAG // Serial.print("bseRawData.bseRawFront: "); // Serial.print(bseVoltage1); From f70ed6840c687e167744494797b00be70cdef227 Mon Sep 17 00:00:00 2001 From: kdao18 Date: Mon, 6 Apr 2026 20:35:19 -0700 Subject: [PATCH 16/24] testing changes in ELF for apps --- fsae-vehicle-fw/src/vehicle/apps.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 09890b4..23e034c 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -45,7 +45,7 @@ void APPS_Init() { void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 // update clock for WDT - apps_last_run_tick = xTaskGetTickCount(); + // apps_last_run_tick = xTaskGetTickCount(); // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); @@ -117,12 +117,16 @@ void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { appsData.appsReading1_Voltage = APPS_3V3_MIN; } else if (appsData.appsReading1_Voltage > APPS_3V3_MAX) { appsData.appsReading1_Voltage = APPS_3V3_MAX; + } else { + apps_last_run_tick = xTaskGetTickCount(); // update if WDT has normal values } if (appsData.appsReading2_Voltage < APPS_5V_MIN) { appsData.appsReading2_Voltage = APPS_5V_MIN; } else if (appsData.appsReading2_Voltage > APPS_5V_MAX) { appsData.appsReading2_Voltage = APPS_5V_MAX; + } else { + apps_last_run_tick = xTaskGetTickCount(); // update if WDT has normal values } // Serial.print("APPS1 RAW Voltage: "); From f7f0425da412a3f74d38c3051b4504f7525f2e0c Mon Sep 17 00:00:00 2001 From: kdao18 Date: Wed, 8 Apr 2026 18:59:59 -0700 Subject: [PATCH 17/24] testing different WDT force failures --- fsae-vehicle-fw/src/peripherals/adc.cpp | 11 ++++++++--- fsae-vehicle-fw/src/peripherals/wdt.cpp | 2 +- fsae-vehicle-fw/src/vehicle/apps.cpp | 11 +++++------ fsae-vehicle-fw/src/vehicle/bse.cpp | 18 +++++++----------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/fsae-vehicle-fw/src/peripherals/adc.cpp b/fsae-vehicle-fw/src/peripherals/adc.cpp index 2a3688e..e08d304 100644 --- a/fsae-vehicle-fw/src/peripherals/adc.cpp +++ b/fsae-vehicle-fw/src/peripherals/adc.cpp @@ -74,7 +74,7 @@ void ADC_Init() { ADC_CONVERSION_SPEED::LOW_SPEED); // change the conversion speed adc->adc1->setSamplingSpeed( ADC_SAMPLING_SPEED::LOW_SPEED); // change the sampling speed - + // for testing change LOW_SPEED to VERY_HIGH_SPEED to see if ADC crashes #if DEBUG_FLAG Serial.println("Done initializing ADCs"); #endif @@ -87,7 +87,8 @@ void threadADC(void *pvParameters) { lastWakeTime = xTaskGetTickCount(); while (true) { - vTaskDelayUntil(&lastWakeTime, TICKTYPE_FREQUENCY); + // vTaskDelayUntil(&lastWakeTime, TICKTYPE_FREQUENCY); + vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(2000)); // 2 second update delay to force wdt for (uint16_t currentIndexADC0 = 0; currentIndexADC0 < SENSOR_PIN_AMT_ADC0; ++currentIndexADC0) { uint16_t currentPinADC0 = adc0Pins[currentIndexADC0]; @@ -104,7 +105,11 @@ void threadADC(void *pvParameters) { ShockTravelUpdateData( adc0Reads[SUSP_TRAV_LINPOT1], adc0Reads[SUSP_TRAV_LINPOT2], adc0Reads[SUSP_TRAV_LINPOT3], adc0Reads[SUSP_TRAV_LINPOT4]); - APPS_UpdateData(adc0Reads[APPS_1_INDEX], adc0Reads[APPS_2_INDEX]); + while (true) { + APPS_UpdateData(adc0Reads[APPS_1_INDEX], adc0Reads[APPS_2_INDEX]); + vTaskDelay(1); + } + BSE_UpdateData(adc0Reads[BSE_1_INDEX], adc0Reads[BSE_2_INDEX]); } } diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 84dfc58..e74f08d 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -79,6 +79,6 @@ void WDT_Update_Task(void *pvParameters) { Serial.println("WDT: BSE and APPS updates overdue"); } - vTaskDelay(pdMS_TO_TICKS(25)); // 100ms delay + vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay } } diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 23e034c..dea56b4 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -44,8 +44,11 @@ void APPS_Init() { void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 - // update clock for WDT - // apps_last_run_tick = xTaskGetTickCount(); + // Update clock for WDT + if (apps_last_run_tick = xTaskGetTickCount()) { + } else { + Serial.println("APPS reading not updating WDT tick"); + } // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); @@ -117,16 +120,12 @@ void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { appsData.appsReading1_Voltage = APPS_3V3_MIN; } else if (appsData.appsReading1_Voltage > APPS_3V3_MAX) { appsData.appsReading1_Voltage = APPS_3V3_MAX; - } else { - apps_last_run_tick = xTaskGetTickCount(); // update if WDT has normal values } if (appsData.appsReading2_Voltage < APPS_5V_MIN) { appsData.appsReading2_Voltage = APPS_5V_MIN; } else if (appsData.appsReading2_Voltage > APPS_5V_MAX) { appsData.appsReading2_Voltage = APPS_5V_MAX; - } else { - apps_last_run_tick = xTaskGetTickCount(); // update if WDT has normal values } // Serial.print("APPS1 RAW Voltage: "); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index 7b22cfc..61257dc 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -35,6 +35,12 @@ void BSE_Init() { } void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { + // Update clock for WDT + if (bse_last_run_tick = xTaskGetTickCount()) { + } else { + Serial.println("BSE reading not updating WDT tick"); + } + // Filter incoming values LOWPASS_FILTER(bseReading1, bseRawData.bseRawFront, bseAlpha); LOWPASS_FILTER(bseReading2, bseRawData.bseRawRear, bseAlpha); @@ -42,17 +48,7 @@ void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { float bseVoltage1 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawFront); float bseVoltage2 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawRear); - // update clock for WDT - if (bseVoltage1 < BSE_LOWER_THRESHOLD || - bseVoltage1 > BSE_UPPER_THRESHOLD || - bseVoltage2 < BSE_LOWER_THRESHOLD || - bseVoltage2 > BSE_UPPER_THRESHOLD) { - // Don't update the WDT tick if the reading is zero, which likely indicates a disconnected sensor rather than a stalled task - Serial.println("BSE reading is zero, not updating WDT tick"); - } else { - bse_last_run_tick = xTaskGetTickCount(); - } - //used same conditions to only update BSE when voltage is 0 + // // #if HIMACBSE_FLAG // Serial.print("bseRawData.bseRawFront: "); From 9399096eef234821b58d281240fed52ee25b70a5 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Thu, 9 Apr 2026 22:10:03 -0700 Subject: [PATCH 18/24] added WDT to thread ADC Motor Telemetry --- fsae-vehicle-fw/src/main.cpp | 35 +++++----- fsae-vehicle-fw/src/peripherals/adc.cpp | 13 ++-- fsae-vehicle-fw/src/peripherals/wdt.cpp | 78 ++++++++++++++--------- fsae-vehicle-fw/src/peripherals/wdt.h | 5 +- fsae-vehicle-fw/src/vehicle/apps.cpp | 10 +-- fsae-vehicle-fw/src/vehicle/bse.cpp | 6 -- fsae-vehicle-fw/src/vehicle/motor.cpp | 2 + fsae-vehicle-fw/src/vehicle/telemetry.cpp | 2 + 8 files changed, 78 insertions(+), 73 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index 19a5550..fe5b0a0 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -31,39 +31,36 @@ static TickType_t xLastWakeTime; void threadMain(void *pvParameters); void setup() { // runs once on bootup - Serial.begin(9600); - Serial.println("Teensy Booted"); //statement to check reboot ADC_Init(); - // CAN_Init(); + CAN_Init(); APPS_Init(); - // Shock_Init(); + Shock_Init(); BSE_Init(); - // Faults_Init(); - // Telemetry_Init(); - // Motor_Init(); - // MCU_Init(); - // GPIO_Init(); - // PCC_Init(); - // thermal_Init(); + Faults_Init(); + Telemetry_Init(); + Motor_Init(); + MCU_Init(); + GPIO_Init(); + PCC_Init(); + thermal_Init(); WDT_Init(); xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 3, NULL); // runs wdt update task - // xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, - // THREAD_MOTOR_PRIORITY, NULL); - // xTaskCreate(threadTelemetry, "threadTelemetryCAN", - // THREAD_CAN_TELEMETRY_STACK_SIZE, NULL, - // THREAD_CAN_TELEMETRY_PRIORITY, NULL); - // xTaskCreate(threadMain, "threadMain", THREAD_MAIN_STACK_SIZE, NULL, - // THREAD_MAIN_PRIORITY, NULL); + xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, + THREAD_MOTOR_PRIORITY, NULL); + xTaskCreate(threadTelemetry, "threadTelemetryCAN", + THREAD_CAN_TELEMETRY_STACK_SIZE, NULL, + THREAD_CAN_TELEMETRY_PRIORITY, NULL); + xTaskCreate(threadMain, "threadMain", THREAD_MAIN_STACK_SIZE, NULL, + THREAD_MAIN_PRIORITY, NULL); vTaskStartScheduler(); } void threadMain(void *pvParameters) { Serial.begin(9600); - // Serial.print("Teensy Booted"); //statement to check reboot xLastWakeTime = xTaskGetTickCount(); // Initialize the last wake time #if HIMAC_FLAG diff --git a/fsae-vehicle-fw/src/peripherals/adc.cpp b/fsae-vehicle-fw/src/peripherals/adc.cpp index e08d304..daaefa5 100644 --- a/fsae-vehicle-fw/src/peripherals/adc.cpp +++ b/fsae-vehicle-fw/src/peripherals/adc.cpp @@ -1,6 +1,7 @@ // Anteater Electric Racing, 2025 #include "adc.h" +#include "peripherals/wdt.h" #include "./vehicle/telemetry.h" #include "utils/utils.h" #include "vehicle/apps.h" @@ -87,8 +88,9 @@ void threadADC(void *pvParameters) { lastWakeTime = xTaskGetTickCount(); while (true) { - // vTaskDelayUntil(&lastWakeTime, TICKTYPE_FREQUENCY); - vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(2000)); // 2 second update delay to force wdt + adc_last_run_tick = xTaskGetTickCount(); // Update WDT tick + vTaskDelayUntil(&lastWakeTime, TICKTYPE_FREQUENCY); + for (uint16_t currentIndexADC0 = 0; currentIndexADC0 < SENSOR_PIN_AMT_ADC0; ++currentIndexADC0) { uint16_t currentPinADC0 = adc0Pins[currentIndexADC0]; @@ -105,11 +107,8 @@ void threadADC(void *pvParameters) { ShockTravelUpdateData( adc0Reads[SUSP_TRAV_LINPOT1], adc0Reads[SUSP_TRAV_LINPOT2], adc0Reads[SUSP_TRAV_LINPOT3], adc0Reads[SUSP_TRAV_LINPOT4]); - while (true) { - APPS_UpdateData(adc0Reads[APPS_1_INDEX], adc0Reads[APPS_2_INDEX]); - vTaskDelay(1); - } - + + APPS_UpdateData(adc0Reads[APPS_1_INDEX], adc0Reads[APPS_2_INDEX]); BSE_UpdateData(adc0Reads[BSE_1_INDEX], adc0Reads[BSE_2_INDEX]); } } diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index e74f08d..f41d7fe 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -4,18 +4,22 @@ #include "peripherals/wdt.h" #include "utils/utils.h" -#include "vehicle/apps.h" -#include "vehicle/bse.h" // Global watchdog tick tracking variables -TickType_t bse_last_run_tick = 0; -TickType_t apps_last_run_tick = 0; +TickType_t adc_last_run_tick = 0; +TickType_t motor_last_run_tick = 0; +TickType_t telemetry_last_run_tick = 0; // Bitmask flag definition -static uint8_t WDT_BIT_BSE = 0b01; -static uint8_t WDT_BIT_APPS = 0b10; +static uint8_t WDT_BIT_ADC = 0b001; +static uint8_t WDT_BIT_MOTOR = 0b010; +static uint8_t WDT_BIT_TELEMETRY = 0b100; -static uint8_t WDT_REQUIRED_MASK = 0b00; // 0b00 represents no flags +static uint8_t WDT_REQUIRED_MASK = 0b000; // 0b000 represents no flags + +#define ADC_FAULT_TIME_THRESHOLD_MS 1000 +#define MOTOR_FAULT_TIME_THRESHOLD_MS 1000 +#define TELEMETRY_FAULT_TIME_THRESHOLD_MS 1000 static constexpr uint32_t WDT_CHECK_PERIOD_MS = 100; @@ -23,8 +27,9 @@ static WDT_T4 WDT; void WDT_Init() { TickType_t now = xTaskGetTickCount(); - bse_last_run_tick = now; - apps_last_run_tick = now; + adc_last_run_tick = now; + motor_last_run_tick = now; + telemetry_last_run_tick = now; WDT_timings_t config; @@ -40,45 +45,56 @@ void WDT_Init() { void WDT_Update_Task(void *pvParameters) { TickType_t now; - TickType_t bse_ageTicks; - uint32_t bse_ageMs; + TickType_t adc_ageTicks; + uint32_t adc_ageMs; + + TickType_t motor_ageTicks; + uint32_t motor_ageMs; - TickType_t apps_ageTicks; - uint32_t apps_ageMs; + TickType_t telemetry_ageTicks; + uint32_t telemetry_ageMs; uint8_t mask; for (;;) { now = xTaskGetTickCount(); - bse_ageTicks = now - bse_last_run_tick; - bse_ageMs = bse_ageTicks * portTICK_PERIOD_MS; + adc_ageTicks = now - adc_last_run_tick; + adc_ageMs = adc_ageTicks * portTICK_PERIOD_MS; + + motor_ageTicks = now - motor_last_run_tick; + motor_ageMs = motor_ageTicks * portTICK_PERIOD_MS; - apps_ageTicks = now - apps_last_run_tick; - apps_ageMs = apps_ageTicks * portTICK_PERIOD_MS; + telemetry_ageTicks = now - telemetry_last_run_tick; + telemetry_ageMs = telemetry_ageTicks * portTICK_PERIOD_MS; - mask = 0b00; + mask = 0b000; - // Fault time are both 100 ms - if (bse_ageMs >= BSE_FAULT_TIME_THRESHOLD_MS) { - mask |= WDT_BIT_BSE; // x |= y ==> x = x | y + if (adc_ageMs >= ADC_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_ADC; } - if (apps_ageMs >= APPS_FAULT_TIME_THRESHOLD_MS) { - mask |= WDT_BIT_APPS; + if (motor_ageMs >= MOTOR_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_MOTOR; + } + if (telemetry_ageMs >= TELEMETRY_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_TELEMETRY; } - // pet if 0b00 + // pet if 0b000 if (mask == WDT_REQUIRED_MASK) { WDT.feed(); // pet hardware watchdog Serial.println("WDT fed successfully"); - } else if (mask == WDT_BIT_BSE) { - Serial.println("WDT: BSE update overdue"); - } else if (mask == WDT_BIT_APPS) { - Serial.println("WDT: APPS update overdue"); - } else if (mask == (WDT_BIT_BSE | WDT_BIT_APPS)) { // mask = 0b11 - Serial.println("WDT: BSE and APPS updates overdue"); + } else { + if (mask & WDT_BIT_ADC) { + Serial.println("WDT: ADC thread overdue"); + } + if (mask & WDT_BIT_MOTOR) { + Serial.println("WDT: Motor thread overdue"); + } + if (mask & WDT_BIT_TELEMETRY) { + Serial.println("WDT: Telemetry thread overdue"); + } } - vTaskDelay(pdMS_TO_TICKS(WDT_CHECK_PERIOD_MS)); // 100ms delay } } diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h index 2eefaa1..da2d86f 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.h +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -2,8 +2,9 @@ #include -extern TickType_t bse_last_run_tick; -extern TickType_t apps_last_run_tick; +extern TickType_t adc_last_run_tick; +extern TickType_t motor_last_run_tick; +extern TickType_t telemetry_last_run_tick; void WDT_Init(); void WDT_Update_Task(void *pvParameters); diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index dea56b4..2630ab6 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -42,14 +42,8 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { - // changed uint16 from 32 - // Update clock for WDT - if (apps_last_run_tick = xTaskGetTickCount()) { - } else { - Serial.println("APPS reading not updating WDT tick"); - } - +void APPS_UpdateData(uint16_t rawReading1, + uint16_t rawReading2) { // changed uint16 from 32 // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); // Serial.print("Raw APPS2: "); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index 61257dc..cc4133a 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -35,12 +35,6 @@ void BSE_Init() { } void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { - // Update clock for WDT - if (bse_last_run_tick = xTaskGetTickCount()) { - } else { - Serial.println("BSE reading not updating WDT tick"); - } - // Filter incoming values LOWPASS_FILTER(bseReading1, bseRawData.bseRawFront, bseAlpha); LOWPASS_FILTER(bseReading2, bseRawData.bseRawRear, bseAlpha); diff --git a/fsae-vehicle-fw/src/vehicle/motor.cpp b/fsae-vehicle-fw/src/vehicle/motor.cpp index c7c5d3e..79f7b40 100644 --- a/fsae-vehicle-fw/src/vehicle/motor.cpp +++ b/fsae-vehicle-fw/src/vehicle/motor.cpp @@ -8,6 +8,7 @@ #include "peripherals/can.h" #include "peripherals/gpio.h" +#include "peripherals/wdt.h" #include "utils/utils.h" #include @@ -64,6 +65,7 @@ void Motor_Init() { void threadMotor(void *pvParameters) { xLastWakeTime = xTaskGetTickCount(); while (true) { + motor_last_run_tick = xTaskGetTickCount(); // Update WDT tick // Clear packet contents vcu1 = {0}; bms1 = {0}; diff --git a/fsae-vehicle-fw/src/vehicle/telemetry.cpp b/fsae-vehicle-fw/src/vehicle/telemetry.cpp index 853a561..226409b 100644 --- a/fsae-vehicle-fw/src/vehicle/telemetry.cpp +++ b/fsae-vehicle-fw/src/vehicle/telemetry.cpp @@ -5,6 +5,7 @@ #include "vehicle/telemetry.h" #include +#include "peripherals/wdt.h" TelemetryData telemetryData; @@ -77,6 +78,7 @@ void threadTelemetry(void *pvParameters) { static TickType_t lastWakeTime = xTaskGetTickCount(); // Initialize the last wake time while (true) { + telemetry_last_run_tick = xTaskGetTickCount(); // Update WDT tick taskENTER_CRITICAL(); // Enter critical section telemetryData = { .APPS_Travel = APPS_GetAPPSReading(), From c74ded5e03ac5cac1fd144706c6458fe2ba786f8 Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Thu, 9 Apr 2026 22:32:56 -0700 Subject: [PATCH 19/24] added wdt to watch Threads and fixed linter issues --- fsae-vehicle-fw/src/main.cpp | 4 ++-- fsae-vehicle-fw/src/peripherals/adc.cpp | 6 +++--- fsae-vehicle-fw/src/vehicle/apps.cpp | 2 +- fsae-vehicle-fw/src/vehicle/bse.cpp | 2 -- fsae-vehicle-fw/src/vehicle/telemetry.cpp | 4 ++-- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index fe5b0a0..9036df0 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -45,10 +45,10 @@ void setup() { // runs once on bootup thermal_Init(); WDT_Init(); - xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); - xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 3, NULL); // runs wdt update task + xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 3, + NULL); // runs wdt update task xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, THREAD_MOTOR_PRIORITY, NULL); xTaskCreate(threadTelemetry, "threadTelemetryCAN", diff --git a/fsae-vehicle-fw/src/peripherals/adc.cpp b/fsae-vehicle-fw/src/peripherals/adc.cpp index daaefa5..468c8ae 100644 --- a/fsae-vehicle-fw/src/peripherals/adc.cpp +++ b/fsae-vehicle-fw/src/peripherals/adc.cpp @@ -1,8 +1,8 @@ // Anteater Electric Racing, 2025 #include "adc.h" -#include "peripherals/wdt.h" #include "./vehicle/telemetry.h" +#include "peripherals/wdt.h" #include "utils/utils.h" #include "vehicle/apps.h" #include "vehicle/bse.h" @@ -90,7 +90,7 @@ void threadADC(void *pvParameters) { while (true) { adc_last_run_tick = xTaskGetTickCount(); // Update WDT tick vTaskDelayUntil(&lastWakeTime, TICKTYPE_FREQUENCY); - + for (uint16_t currentIndexADC0 = 0; currentIndexADC0 < SENSOR_PIN_AMT_ADC0; ++currentIndexADC0) { uint16_t currentPinADC0 = adc0Pins[currentIndexADC0]; @@ -107,7 +107,7 @@ void threadADC(void *pvParameters) { ShockTravelUpdateData( adc0Reads[SUSP_TRAV_LINPOT1], adc0Reads[SUSP_TRAV_LINPOT2], adc0Reads[SUSP_TRAV_LINPOT3], adc0Reads[SUSP_TRAV_LINPOT4]); - + APPS_UpdateData(adc0Reads[APPS_1_INDEX], adc0Reads[APPS_2_INDEX]); BSE_UpdateData(adc0Reads[BSE_1_INDEX], adc0Reads[BSE_2_INDEX]); } diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index 2630ab6..e4c23d7 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -42,7 +42,7 @@ void APPS_Init() { appsAlpha = COMPUTE_ALPHA(100.0F); } -void APPS_UpdateData(uint16_t rawReading1, +void APPS_UpdateData(uint16_t rawReading1, uint16_t rawReading2) { // changed uint16 from 32 // Serial.print("Raw APPS1: "); // Serial.println(rawReading1); diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index cc4133a..ed97ef5 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -42,8 +42,6 @@ void BSE_UpdateData(uint32_t bseReading1, uint32_t bseReading2) { float bseVoltage1 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawFront); float bseVoltage2 = ADC_VALUE_TO_VOLTAGE(bseRawData.bseRawRear); - - // // #if HIMACBSE_FLAG // Serial.print("bseRawData.bseRawFront: "); // Serial.print(bseVoltage1); diff --git a/fsae-vehicle-fw/src/vehicle/telemetry.cpp b/fsae-vehicle-fw/src/vehicle/telemetry.cpp index 226409b..84666d2 100644 --- a/fsae-vehicle-fw/src/vehicle/telemetry.cpp +++ b/fsae-vehicle-fw/src/vehicle/telemetry.cpp @@ -4,8 +4,8 @@ #include "vehicle/telemetry.h" -#include #include "peripherals/wdt.h" +#include TelemetryData telemetryData; @@ -79,7 +79,7 @@ void threadTelemetry(void *pvParameters) { xTaskGetTickCount(); // Initialize the last wake time while (true) { telemetry_last_run_tick = xTaskGetTickCount(); // Update WDT tick - taskENTER_CRITICAL(); // Enter critical section + taskENTER_CRITICAL(); // Enter critical section telemetryData = { .APPS_Travel = APPS_GetAPPSReading(), From 02e520ddf6e764f689cb393128b5384d7c5fd6cd Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Thu, 9 Apr 2026 23:38:25 -0700 Subject: [PATCH 20/24] added wdt to main thread --- fsae-vehicle-fw/src/main.cpp | 4 ++-- fsae-vehicle-fw/src/peripherals/wdt.cpp | 32 ++++++++++++++++++------- fsae-vehicle-fw/src/peripherals/wdt.h | 1 + 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index 9036df0..c5876df 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -47,7 +47,7 @@ void setup() { // runs once on bootup xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); - xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 3, + xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 10, NULL); // runs wdt update task xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, THREAD_MOTOR_PRIORITY, NULL); @@ -75,7 +75,7 @@ void threadMain(void *pvParameters) { int toggle = 0; #endif while (true) { - + main_last_run_tick = xTaskGetTickCount(); // Update WDT tick /*============LOW PRIORITY GPIO UPDATES============*/ digitalWrite(13, HIGH); // orange led on teensy diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index f41d7fe..f0892b1 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -5,21 +5,24 @@ #include "peripherals/wdt.h" #include "utils/utils.h" +#define ADC_FAULT_TIME_THRESHOLD_MS 100 +#define MAIN_FAULT_TIME_THRESHOLD_MS 100 +#define MOTOR_FAULT_TIME_THRESHOLD_MS 100 +#define TELEMETRY_FAULT_TIME_THRESHOLD_MS 100 + // Global watchdog tick tracking variables TickType_t adc_last_run_tick = 0; +TickType_t main_last_run_tick = 0; TickType_t motor_last_run_tick = 0; TickType_t telemetry_last_run_tick = 0; // Bitmask flag definition -static uint8_t WDT_BIT_ADC = 0b001; -static uint8_t WDT_BIT_MOTOR = 0b010; -static uint8_t WDT_BIT_TELEMETRY = 0b100; - -static uint8_t WDT_REQUIRED_MASK = 0b000; // 0b000 represents no flags +static uint8_t WDT_BIT_ADC = 0b0001; +static uint8_t WDT_BIT_MAIN = 0b0010; +static uint8_t WDT_BIT_MOTOR = 0b0100; +static uint8_t WDT_BIT_TELEMETRY = 0b1000; -#define ADC_FAULT_TIME_THRESHOLD_MS 1000 -#define MOTOR_FAULT_TIME_THRESHOLD_MS 1000 -#define TELEMETRY_FAULT_TIME_THRESHOLD_MS 1000 +static uint8_t WDT_REQUIRED_MASK = 0b0000; // 0b000 represents no flags static constexpr uint32_t WDT_CHECK_PERIOD_MS = 100; @@ -28,6 +31,7 @@ static WDT_T4 WDT; void WDT_Init() { TickType_t now = xTaskGetTickCount(); adc_last_run_tick = now; + main_last_run_tick = now; motor_last_run_tick = now; telemetry_last_run_tick = now; @@ -48,6 +52,9 @@ void WDT_Update_Task(void *pvParameters) { TickType_t adc_ageTicks; uint32_t adc_ageMs; + TickType_t main_ageTicks; + uint32_t main_ageMs; + TickType_t motor_ageTicks; uint32_t motor_ageMs; @@ -62,6 +69,9 @@ void WDT_Update_Task(void *pvParameters) { adc_ageTicks = now - adc_last_run_tick; adc_ageMs = adc_ageTicks * portTICK_PERIOD_MS; + main_ageTicks = now - main_last_run_tick; + main_ageMs = main_ageTicks * portTICK_PERIOD_MS; + motor_ageTicks = now - motor_last_run_tick; motor_ageMs = motor_ageTicks * portTICK_PERIOD_MS; @@ -73,6 +83,9 @@ void WDT_Update_Task(void *pvParameters) { if (adc_ageMs >= ADC_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_ADC; } + if (main_ageMs >= MAIN_FAULT_TIME_THRESHOLD_MS) { + mask |= WDT_BIT_MAIN; + } if (motor_ageMs >= MOTOR_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_MOTOR; } @@ -88,6 +101,9 @@ void WDT_Update_Task(void *pvParameters) { if (mask & WDT_BIT_ADC) { Serial.println("WDT: ADC thread overdue"); } + if (mask & WDT_BIT_MAIN) { + Serial.println("WDT: Main thread overdue"); + } if (mask & WDT_BIT_MOTOR) { Serial.println("WDT: Motor thread overdue"); } diff --git a/fsae-vehicle-fw/src/peripherals/wdt.h b/fsae-vehicle-fw/src/peripherals/wdt.h index da2d86f..970c0dc 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.h +++ b/fsae-vehicle-fw/src/peripherals/wdt.h @@ -3,6 +3,7 @@ #include extern TickType_t adc_last_run_tick; +extern TickType_t main_last_run_tick; extern TickType_t motor_last_run_tick; extern TickType_t telemetry_last_run_tick; From 250ed1ff41d4afbbe8514a81d52f7c2f64475f0f Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Fri, 10 Apr 2026 03:31:52 -0700 Subject: [PATCH 21/24] cleaned up code --- fsae-vehicle-fw/src/peripherals/adc.cpp | 2 +- fsae-vehicle-fw/src/vehicle/apps.cpp | 1 - fsae-vehicle-fw/src/vehicle/bse.cpp | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/fsae-vehicle-fw/src/peripherals/adc.cpp b/fsae-vehicle-fw/src/peripherals/adc.cpp index 468c8ae..84fbe81 100644 --- a/fsae-vehicle-fw/src/peripherals/adc.cpp +++ b/fsae-vehicle-fw/src/peripherals/adc.cpp @@ -75,7 +75,7 @@ void ADC_Init() { ADC_CONVERSION_SPEED::LOW_SPEED); // change the conversion speed adc->adc1->setSamplingSpeed( ADC_SAMPLING_SPEED::LOW_SPEED); // change the sampling speed - // for testing change LOW_SPEED to VERY_HIGH_SPEED to see if ADC crashes + #if DEBUG_FLAG Serial.println("Done initializing ADCs"); #endif diff --git a/fsae-vehicle-fw/src/vehicle/apps.cpp b/fsae-vehicle-fw/src/vehicle/apps.cpp index e4c23d7..8bc2643 100644 --- a/fsae-vehicle-fw/src/vehicle/apps.cpp +++ b/fsae-vehicle-fw/src/vehicle/apps.cpp @@ -5,7 +5,6 @@ #include #include -#include "peripherals/wdt.h" #include "utils/utils.h" #include "vehicle/faults.h" #include "vehicle/telemetry.h" diff --git a/fsae-vehicle-fw/src/vehicle/bse.cpp b/fsae-vehicle-fw/src/vehicle/bse.cpp index ed97ef5..5cfa93e 100644 --- a/fsae-vehicle-fw/src/vehicle/bse.cpp +++ b/fsae-vehicle-fw/src/vehicle/bse.cpp @@ -4,8 +4,6 @@ #include "utils/utils.h" -#include "peripherals/wdt.h" - #include "bse.h" #include "vehicle/faults.h" From 5f6b4173a5fde6bae1a91c5d0440be9dc67dee9a Mon Sep 17 00:00:00 2001 From: kenneth dao Date: Fri, 10 Apr 2026 03:34:51 -0700 Subject: [PATCH 22/24] fixed masking error --- fsae-vehicle-fw/src/peripherals/wdt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index f0892b1..19d0bd7 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -78,7 +78,7 @@ void WDT_Update_Task(void *pvParameters) { telemetry_ageTicks = now - telemetry_last_run_tick; telemetry_ageMs = telemetry_ageTicks * portTICK_PERIOD_MS; - mask = 0b000; + mask = 0b0000; if (adc_ageMs >= ADC_FAULT_TIME_THRESHOLD_MS) { mask |= WDT_BIT_ADC; @@ -93,7 +93,7 @@ void WDT_Update_Task(void *pvParameters) { mask |= WDT_BIT_TELEMETRY; } - // pet if 0b000 + // pet if 0b0000 if (mask == WDT_REQUIRED_MASK) { WDT.feed(); // pet hardware watchdog Serial.println("WDT fed successfully"); From 268dda0528dfa7e1fca78567ac06e5af11285849 Mon Sep 17 00:00:00 2001 From: kdao18 Date: Fri, 10 Apr 2026 14:30:38 -0700 Subject: [PATCH 23/24] changed wdt priority to 9 --- fsae-vehicle-fw/src/main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fsae-vehicle-fw/src/main.cpp b/fsae-vehicle-fw/src/main.cpp index c5876df..dcba770 100644 --- a/fsae-vehicle-fw/src/main.cpp +++ b/fsae-vehicle-fw/src/main.cpp @@ -45,10 +45,11 @@ void setup() { // runs once on bootup thermal_Init(); WDT_Init(); + xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 9, + NULL); // runs wdt update task xTaskCreate(threadADC, "threadADC", THREAD_ADC_STACK_SIZE, NULL, THREAD_ADC_PRIORITY, NULL); - xTaskCreate(WDT_Update_Task, "threadWDT", 128, NULL, 10, - NULL); // runs wdt update task + xTaskCreate(threadMotor, "threadMotor", THREAD_MOTOR_STACK_SIZE, NULL, THREAD_MOTOR_PRIORITY, NULL); xTaskCreate(threadTelemetry, "threadTelemetryCAN", From 018e0f4970da147f2c65c0db4eb565fbfd4b7663 Mon Sep 17 00:00:00 2001 From: kdao18 Date: Fri, 10 Apr 2026 14:45:41 -0700 Subject: [PATCH 24/24] changed if else statements to bitwise operator --- fsae-vehicle-fw/src/peripherals/wdt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsae-vehicle-fw/src/peripherals/wdt.cpp b/fsae-vehicle-fw/src/peripherals/wdt.cpp index 19d0bd7..5208dc3 100644 --- a/fsae-vehicle-fw/src/peripherals/wdt.cpp +++ b/fsae-vehicle-fw/src/peripherals/wdt.cpp @@ -94,7 +94,7 @@ void WDT_Update_Task(void *pvParameters) { } // pet if 0b0000 - if (mask == WDT_REQUIRED_MASK) { + if (mask & WDT_REQUIRED_MASK) { WDT.feed(); // pet hardware watchdog Serial.println("WDT fed successfully"); } else {