From 0cd7da8dc6b90f0cebf6d6316aab64f427bd61a5 Mon Sep 17 00:00:00 2001 From: Nagatarun25 Date: Mon, 5 Jan 2026 15:57:41 -0500 Subject: [PATCH 1/3] Implemented the alert system for the front controller --- lib/alerts/alerts.cc | 58 ++++++++++++++++++- lib/alerts/alerts.hpp | 17 ++++-- lib/alerts/platformio.ini | 2 +- .../front_controller/lib/alerts/alerts.cc | 56 ++++++++++++++++++ .../front_controller/lib/alerts/alerts.hpp | 28 +++++++++ .../lib/alerts/platformio.ini | 9 +++ projects/front_controller/platformio.ini | 6 ++ .../src/accumulator/accumulator.cc | 24 +++++--- .../front_controller/src/alerts/alerts.cc | 24 ++++---- .../front_controller/src/alerts/alerts.hpp | 11 ++-- .../src/alerts/fc_alert_types.hpp | 24 ++++++++ .../src/driver_interface/driver_interface.cc | 6 +- projects/front_controller/src/main.cc | 9 ++- .../front_controller/src/motors/motors.cc | 20 ++++--- projects/veh.dbc | 17 +----- 15 files changed, 248 insertions(+), 63 deletions(-) create mode 100644 projects/front_controller/lib/alerts/alerts.cc create mode 100644 projects/front_controller/lib/alerts/alerts.hpp create mode 100644 projects/front_controller/lib/alerts/platformio.ini create mode 100644 projects/front_controller/src/alerts/fc_alert_types.hpp diff --git a/lib/alerts/alerts.cc b/lib/alerts/alerts.cc index c7cdd76bc..7c391191c 100644 --- a/lib/alerts/alerts.cc +++ b/lib/alerts/alerts.cc @@ -1,2 +1,56 @@ -// Implement the alerts system here -// It MUST be thread-/task- safe +#include "alerts.hpp" + +namespace macfe { + +// Convert an alert enum value into a single-bit mask +template +uint64_t MakeMask(T error_code) { + return 1ULL << static_cast(error_code); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::Set(T error_code) { + // Turn this alert on + uint64_t mask = MakeMask(error_code); + bitfield_.fetch_or(mask, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::Clear(T error_code) { + // Turn this alert off + uint64_t mask = MakeMask(error_code); + bitfield_.fetch_and(~mask, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::SetPresent(T error_code, bool present) { + // Set or clear based on the flag + present ? Set(error_code) : Clear(error_code); +} + +template + requires std::is_enum_v && std::is_integral_v> +bool Alerts::IsPresent(T error_code) const { + // Check if this alert is currently active + uint64_t mask = MakeMask(error_code); + return (bitfield_.load(std::memory_order_relaxed) & mask) != 0; +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::ClearAll() { + // Clear all active alerts + bitfield_.store(0, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +uint64_t Alerts::GetBitfield() const { + // Return the raw alert bitfield + return static_cast(bitfield_.load(std::memory_order_relaxed)); +} + +} // namespace macfe diff --git a/lib/alerts/alerts.hpp b/lib/alerts/alerts.hpp index f89de439f..c59ffa041 100644 --- a/lib/alerts/alerts.hpp +++ b/lib/alerts/alerts.hpp @@ -1,23 +1,28 @@ #pragma once +#include #include #include -#include namespace macfe { +template +concept underlying_type_t = + std::is_enum_v && std::is_integral_v>; + template requires std::is_enum_v && std::is_integral_v> class Alerts { +public: void Set(T error_code); void Clear(T error_code); void SetPresent(T error_code, bool present); - - bool IsPresent(T error_code); - + bool IsPresent(T error_code) const; void ClearAll(void); + uint64_t GetBitfield(void) const; private: - uint64_t bitfield; + std::atomic bitfield_{0}; }; -} // namespace macfe + +} // namespace macfe \ No newline at end of file diff --git a/lib/alerts/platformio.ini b/lib/alerts/platformio.ini index e5dea78ff..870c7dc96 100644 --- a/lib/alerts/platformio.ini +++ b/lib/alerts/platformio.ini @@ -5,5 +5,5 @@ include_dir = . [env:native] platform = native test_framework = googletest -build_flags = +build_flags = -std=c++20 \ No newline at end of file diff --git a/projects/front_controller/lib/alerts/alerts.cc b/projects/front_controller/lib/alerts/alerts.cc new file mode 100644 index 000000000..5d8792ef6 --- /dev/null +++ b/projects/front_controller/lib/alerts/alerts.cc @@ -0,0 +1,56 @@ +#include "alerts.hpp" + +namespace macfe { + +// Convert an alert enum value into a single bit mask +template +uint64_t MakeMask(T error_code) { + return 1ULL << static_cast(error_code); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::Set(T error_code) { + // Turn this alert on + uint64_t mask = MakeMask(error_code); + bitfield_.fetch_or(mask, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::Clear(T error_code) { + // Turn this alert off + uint64_t mask = MakeMask(error_code); + bitfield_.fetch_and(~mask, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::SetPresent(T error_code, bool present) { + // Set or clear based on the flag + present ? Set(error_code) : Clear(error_code); +} + +template + requires std::is_enum_v && std::is_integral_v> +bool Alerts::IsPresent(T error_code) const { + // Check if this alert is currently active + uint64_t mask = MakeMask(error_code); + return (bitfield_.load(std::memory_order_relaxed) & mask) != 0; +} + +template + requires std::is_enum_v && std::is_integral_v> +void Alerts::ClearAll() { + // Clear all active alerts + bitfield_.store(0, std::memory_order_relaxed); +} + +template + requires std::is_enum_v && std::is_integral_v> +uint64_t Alerts::GetBitfield() const { + // Return the raw alert bitfield + return static_cast(bitfield_.load(std::memory_order_relaxed)); +} + +} // namespace macfe diff --git a/projects/front_controller/lib/alerts/alerts.hpp b/projects/front_controller/lib/alerts/alerts.hpp new file mode 100644 index 000000000..c59ffa041 --- /dev/null +++ b/projects/front_controller/lib/alerts/alerts.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +namespace macfe { + +template +concept underlying_type_t = + std::is_enum_v && std::is_integral_v>; + +template + requires std::is_enum_v && std::is_integral_v> +class Alerts { +public: + void Set(T error_code); + void Clear(T error_code); + void SetPresent(T error_code, bool present); + bool IsPresent(T error_code) const; + void ClearAll(void); + uint64_t GetBitfield(void) const; + +private: + std::atomic bitfield_{0}; +}; + +} // namespace macfe \ No newline at end of file diff --git a/projects/front_controller/lib/alerts/platformio.ini b/projects/front_controller/lib/alerts/platformio.ini new file mode 100644 index 000000000..e5dea78ff --- /dev/null +++ b/projects/front_controller/lib/alerts/platformio.ini @@ -0,0 +1,9 @@ +[platformio] +name = "Alerts Test" +include_dir = . + +[env:native] +platform = native +test_framework = googletest +build_flags = + -std=c++20 \ No newline at end of file diff --git a/projects/front_controller/platformio.ini b/projects/front_controller/platformio.ini index 7e2db0497..a764a7bdd 100644 --- a/projects/front_controller/platformio.ini +++ b/projects/front_controller/platformio.ini @@ -45,5 +45,11 @@ build_src_filter = build_flags = ${common.flags} -Isrc/platforms/stm32-ev6/Inc + + +lib_ignore = + mcal + + board_build.ldscript = src/platforms/stm32-ev6/STM32F767ZITX_FLASH.ld diff --git a/projects/front_controller/src/accumulator/accumulator.cc b/projects/front_controller/src/accumulator/accumulator.cc index e362feb04..d8bd42848 100644 --- a/projects/front_controller/src/accumulator/accumulator.cc +++ b/projects/front_controller/src/accumulator/accumulator.cc @@ -151,7 +151,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = OPEN, .positive = OPEN, .negative = CLOSE}; if (fb.precharge == IS_CLOSED || fb.positive == IS_CLOSED) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (FeedbackMatchesCommand(cmd, fb)) { @@ -164,7 +165,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = OPEN, .positive = OPEN, .negative = CLOSE}; if (!FeedbackMatchesCommand(cmd, fb)) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (elapsed >= 100) { @@ -177,7 +179,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = CLOSE, .positive = OPEN, .negative = CLOSE}; if (fb.positive == IS_CLOSED || fb.negative == IS_OPEN) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (FeedbackMatchesCommand(cmd, fb)) { @@ -189,7 +192,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = CLOSE, .positive = OPEN, .negative = CLOSE}; if (!FeedbackMatchesCommand(cmd, fb)) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (IsPrechargeComplete() && @@ -203,7 +207,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = CLOSE, .positive = CLOSE, .negative = CLOSE}; if (fb.precharge == IS_OPEN || fb.negative == IS_OPEN) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (FeedbackMatchesCommand(cmd, fb)) { @@ -216,7 +221,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = CLOSE, .positive = CLOSE, .negative = CLOSE}; if (!FeedbackMatchesCommand(cmd, fb)) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (elapsed >= 100) { @@ -229,7 +235,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = OPEN, .positive = CLOSE, .negative = CLOSE}; if (fb.positive == IS_OPEN || fb.negative == IS_OPEN) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } else if (FeedbackMatchesCommand(cmd, fb)) { @@ -242,7 +249,8 @@ static void UpdateStateMachine(ContactorFeedbacks fb) { cmd = {.precharge = OPEN, .positive = CLOSE, .negative = CLOSE}; if (!FeedbackMatchesCommand(cmd, fb)) { - alerts::Get().accumulator_contactor_wrong_state = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::AccumulatorContactorWrongState); new_state = ERROR; } break; diff --git a/projects/front_controller/src/alerts/alerts.cc b/projects/front_controller/src/alerts/alerts.cc index 8ce3ce2a3..ea9e37798 100644 --- a/projects/front_controller/src/alerts/alerts.cc +++ b/projects/front_controller/src/alerts/alerts.cc @@ -1,24 +1,20 @@ #include "alerts.hpp" -#include "generated/can/veh_messages.hpp" +// Include the template implementation +#include namespace alerts { -using namespace generated::can; - -static TxFcAlerts msg; - -TxFcAlerts& Get(void) { - return msg; -} - -void Reset(void) { - msg = TxFcAlerts{}; +macfe::Alerts& GetAlertsManager(void) { + static macfe::Alerts instance; + return instance; } } // namespace alerts -// from macfe/perip/can +// forces compilation of all methods +template class macfe::Alerts; + void CanErrorHandler(void) { - alerts::Get().can_tx_error = true; -} + alerts::GetAlertsManager().Set(alerts::FcAlert::CanTxError); +} \ No newline at end of file diff --git a/projects/front_controller/src/alerts/alerts.hpp b/projects/front_controller/src/alerts/alerts.hpp index 65fc04f41..4063f7e84 100644 --- a/projects/front_controller/src/alerts/alerts.hpp +++ b/projects/front_controller/src/alerts/alerts.hpp @@ -1,11 +1,12 @@ + #pragma once -#include "generated/can/veh_messages.hpp" +#include -namespace alerts { +#include "fc_alert_types.hpp" -generated::can::TxFcAlerts& Get(void); +namespace alerts { -void Reset(void); +macfe::Alerts& GetAlertsManager(void); -} // namespace alerts \ No newline at end of file +} \ No newline at end of file diff --git a/projects/front_controller/src/alerts/fc_alert_types.hpp b/projects/front_controller/src/alerts/fc_alert_types.hpp new file mode 100644 index 000000000..a568c764b --- /dev/null +++ b/projects/front_controller/src/alerts/fc_alert_types.hpp @@ -0,0 +1,24 @@ + +#pragma once + +#include + +namespace alerts { + +enum class FcAlert : uint32_t { + AppsImplausible, + AccumulatorLowSoc, + AccumulatorContactorWrongState, + MotorRetriesExceeded, + LeftMotorStartingError, + RightMotorStartingError, + LeftMotorRunningError, + RightMotorRunningError, + DashboardBootTimeout, + CanTxError, + EV47Active, + NoInv1Can, + NoInv2Can, +}; + +} // namespace alerts diff --git a/projects/front_controller/src/driver_interface/driver_interface.cc b/projects/front_controller/src/driver_interface/driver_interface.cc index 6c39d9d3b..e7ed88ba7 100644 --- a/projects/front_controller/src/driver_interface/driver_interface.cc +++ b/projects/front_controller/src/driver_interface/driver_interface.cc @@ -27,8 +27,10 @@ void Update_100Hz(void) { } } - alerts::Get().apps_implausible = apps_implausible; - alerts::Get().ev47_active = pedal_needs_reset; + alerts::GetAlertsManager().SetPresent(alerts::FcAlert::AppsImplausible, + apps_implausible); + alerts::GetAlertsManager().SetPresent(alerts::FcAlert::EV47Active, + pedal_needs_reset); if (apps_implausible) { torque_request = 0.f; diff --git a/projects/front_controller/src/main.cc b/projects/front_controller/src/main.cc index d26ab8ad1..71662b57a 100644 --- a/projects/front_controller/src/main.cc +++ b/projects/front_controller/src/main.cc @@ -70,7 +70,8 @@ static void Update_100Hz(void) { if (msg.has_value() && msg->State() == DashState::LOGO) { new_state = WAIT_DRIVER_SELECT; } else if (elapsed > timeout::DASHBOARD_BOOT_TIME) { - alerts::Get().dashboard_boot_timeout = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::DashboardBootTimeout); } else { // keep waiting } @@ -308,7 +309,9 @@ void task_10hz(void* argument) { }); veh_can_bus.Send(accumulator::GetDebugMsg()); - veh_can_bus.Send(alerts::Get()); + generated::can::TxFcAlerts alert_msg; + alert_msg.alerts_bitfield = alerts::GetAlertsManager().GetBitfield(); + veh_can_bus.Send(alert_msg); veh_can_bus.Send(sensors::driver::GetAppsDebugMsg()); veh_can_bus.Send(sensors::driver::GetBppsSteerDebugMsg()); @@ -355,7 +358,7 @@ void task_100hz(void* argument) { int main(void) { bindings::Initialize(); - alerts::Reset(); + alerts::GetAlertsManager().ClearAll(); accumulator::Init(); motors::Init(); vehicle_dynamics::Init(); diff --git a/projects/front_controller/src/motors/motors.cc b/projects/front_controller/src/motors/motors.cc index fb78a5030..9f0f14f01 100644 --- a/projects/front_controller/src/motors/motors.cc +++ b/projects/front_controller/src/motors/motors.cc @@ -143,12 +143,14 @@ void Update_100Hz(PtBus& pt_can, VehBus& veh_can, amk::Request req_left, new_inverter_en = false; if (left_starter.HasErroredOut()) { - alerts::Get().left_motor_starting_error = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::LeftMotorStartingError); new_state = ERROR; } if (right_starter.HasErroredOut()) { - alerts::Get().right_motor_starting_error = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::RightMotorStartingError); new_state = ERROR; } @@ -179,11 +181,13 @@ void Update_100Hz(PtBus& pt_can, VehBus& veh_can, amk::Request req_left, new_inverter_en = true; if (amk_left.HasError()) { - alerts::Get().left_motor_running_error = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::LeftMotorRunningError); new_state = ERROR; } if (amk_right.HasError()) { - alerts::Get().right_motor_running_error = true; + alerts::GetAlertsManager().Set( + alerts::FcAlert::RightMotorRunningError); new_state = ERROR; } break; @@ -211,18 +215,18 @@ void Update_100Hz(PtBus& pt_can, VehBus& veh_can, amk::Request req_left, auto l_av2 = pt_can.GetRxInv1_ActualValues2(); if (l_av1.has_value() && l_av2.has_value()) { amk_left.Update_100Hz(l_av1.value(), l_av2.value()); - alerts::Get().no_inv1_can = false; + alerts::GetAlertsManager().Clear(alerts::FcAlert::NoInv1Can); } else { - alerts::Get().no_inv1_can = true; + alerts::GetAlertsManager().Set(alerts::FcAlert::NoInv1Can); } auto r_av1 = pt_can.GetRxInv2_ActualValues1(); auto r_av2 = pt_can.GetRxInv2_ActualValues2(); if (r_av1.has_value() && r_av2.has_value()) { amk_right.Update_100Hz(r_av1.value(), r_av2.value()); - alerts::Get().no_inv2_can = false; + alerts::GetAlertsManager().Clear(alerts::FcAlert::NoInv2Can); } else { - alerts::Get().no_inv2_can = true; + alerts::GetAlertsManager().Set(alerts::FcAlert::NoInv2Can); } if (new_state != state) { diff --git a/projects/veh.dbc b/projects/veh.dbc index 42efae436..1dca7b397 100644 --- a/projects/veh.dbc +++ b/projects/veh.dbc @@ -77,20 +77,9 @@ VAL_ 201 AccumulatorState 0 "IDLE" 1 "STARTUP_ENSURE_OPEN" 2 "STARTUP_CLOSE_NEG" VAL_ 201 Inv1State 0 "OFF" 1 "SYSTEM_READY" 2 "STARTUP_bDCON" 3 "STARTUP_bENABLE" 4 "STARTUP_bINVERTER" 5 "STARTUP_X140" 6 "RUNNING" 7 "ERROR" 8 "ERROR_RESET"; VAL_ 201 Inv2State 0 "OFF" 1 "SYSTEM_READY" 2 "STARTUP_bDCON" 3 "STARTUP_bENABLE" 4 "STARTUP_bINVERTER" 5 "STARTUP_X140" 6 "RUNNING" 7 "ERROR" 8 "ERROR_RESET"; -BO_ 202 FcAlerts: 2 FC - SG_ AppsImplausible : 0|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ AccumulatorLowSoc : 1|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ AccumulatorContactorWrongState : 2|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ MotorRetriesExceeded : 3|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ LeftMotorStartingError : 4|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ RightMotorStartingError : 5|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ LeftMotorRunningError : 6|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ RightMotorRunningError : 7|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ DashboardBootTimeout : 8|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ CanTxError : 9|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ EV47Active : 10|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ NoInv1Can : 11|1@1+ (1,0) [0|1] "" RPI, DASH - SG_ NoInv2Can : 12|1@1+ (1,0) [0|1] "" RPI, DASH +BO_ 202 FcAlerts: 8 FC + SG_ AlertsBitfield : 0|64@1+ (1,0) [0|0] "" RPI, DASH + BO_ 203 FcCounters: 8 FC SG_ Motor : 0|8@1+ (1,0) [0|1] "" RPI, DASH From ea1acc79d82fee122379bb278d28e0524f916fc9 Mon Sep 17 00:00:00 2001 From: Nagatarun25 Date: Tue, 6 Jan 2026 11:32:21 -0500 Subject: [PATCH 2/3] moved the implementation files into src --- projects/front_controller/lib/alerts/{ => src}/alerts.cc | 0 projects/front_controller/lib/alerts/{ => src}/alerts.hpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename projects/front_controller/lib/alerts/{ => src}/alerts.cc (100%) rename projects/front_controller/lib/alerts/{ => src}/alerts.hpp (100%) diff --git a/projects/front_controller/lib/alerts/alerts.cc b/projects/front_controller/lib/alerts/src/alerts.cc similarity index 100% rename from projects/front_controller/lib/alerts/alerts.cc rename to projects/front_controller/lib/alerts/src/alerts.cc diff --git a/projects/front_controller/lib/alerts/alerts.hpp b/projects/front_controller/lib/alerts/src/alerts.hpp similarity index 100% rename from projects/front_controller/lib/alerts/alerts.hpp rename to projects/front_controller/lib/alerts/src/alerts.hpp From 192b5169ed20272707570a407442f814b0abd694 Mon Sep 17 00:00:00 2001 From: Nagatarun25 Date: Tue, 6 Jan 2026 14:54:24 -0500 Subject: [PATCH 3/3] deleted projects/front_controller/lib/alerts/platformio.ini --- projects/front_controller/lib/alerts/{src => }/alerts.cc | 0 .../front_controller/lib/alerts/{src => }/alerts.hpp | 0 projects/front_controller/lib/alerts/platformio.ini | 9 --------- 3 files changed, 9 deletions(-) rename projects/front_controller/lib/alerts/{src => }/alerts.cc (100%) rename projects/front_controller/lib/alerts/{src => }/alerts.hpp (100%) delete mode 100644 projects/front_controller/lib/alerts/platformio.ini diff --git a/projects/front_controller/lib/alerts/src/alerts.cc b/projects/front_controller/lib/alerts/alerts.cc similarity index 100% rename from projects/front_controller/lib/alerts/src/alerts.cc rename to projects/front_controller/lib/alerts/alerts.cc diff --git a/projects/front_controller/lib/alerts/src/alerts.hpp b/projects/front_controller/lib/alerts/alerts.hpp similarity index 100% rename from projects/front_controller/lib/alerts/src/alerts.hpp rename to projects/front_controller/lib/alerts/alerts.hpp diff --git a/projects/front_controller/lib/alerts/platformio.ini b/projects/front_controller/lib/alerts/platformio.ini deleted file mode 100644 index e5dea78ff..000000000 --- a/projects/front_controller/lib/alerts/platformio.ini +++ /dev/null @@ -1,9 +0,0 @@ -[platformio] -name = "Alerts Test" -include_dir = . - -[env:native] -platform = native -test_framework = googletest -build_flags = - -std=c++20 \ No newline at end of file