feat: Safety Goals + Drive-Away-Assist + vollst. Traceability
Validate / build-test (macos-latest) (push) Failing after 4s
Validate / build-test (windows-latest) (push) Failing after 17s
Validate / build-test (ubuntu-latest) (push) Successful in 16s
Validate / reports (push) Has been skipped
Release / release (push) Successful in 48s
Validate / build-test (macos-latest) (push) Failing after 4s
Validate / build-test (windows-latest) (push) Failing after 17s
Validate / build-test (ubuntu-latest) (push) Successful in 16s
Validate / reports (push) Has been skipped
Release / release (push) Successful in 48s
Neue Layer: - safety/sg/SG-001..005 als eigene Doorstop-Items (ASIL D/D/A/C/B) - SYS-Reqs verlinken nach oben auf SG via frontmatter - Kette ist jetzt: SG -> SYS -> SA, SWE -> SWA -> Code (@arch) + Test (@reqs) Drive-Away-Assist im Safety Manager: - SWE-011 (Anfahrabsicht erkennen) implementiert - SWE-012 (Sicherheits-Check Tuer + Gurt) implementiert - Neuer State SAFETY_DRIVE_AWAY + safety_mgr_release_requested() - SafetyInputs erweitert um gas_pedal_percent, gear_in_drive, door_closed, seatbelt_fastened - 5 neue Tests (DRIVE_AWAY armed/blocked/end-conditions) - Test-Header @reqs erweitert auf SWE-007..012 traceability.py erweitert: - SG als neuer Top-Level - Code-Mapping-Check: @arch im Header von src/*.c muss SWA-id matchen - Test-Mapping-Check: @reqs im Header der Tests muss alle SWE der zugehoerigen SWA abdecken - HTML zeigt 7 Spalten: SG | SYS | SA | SWE | SWA | Code | Test - 2 zusaetzliche Tabellen: Code->Arch und Test->Reqs test_apply_controller.c: - @reqs Header um SWE-005 ergaenzt (war funktional drin, nur Tag fehlte) Counts: - 55 doorstop-Items (war 50) - 46 Unit-Tests (war 41) - Traceability vollstaendig in beide Richtungen
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
* @file test_safety_manager.c
|
||||
* @brief Unit-Tests fuer den Safety Manager (ASIL-D).
|
||||
*
|
||||
* @reqs SWE-007 SWE-008 SWE-009 SWE-010
|
||||
* @reqs SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012
|
||||
* @arch SWA-001
|
||||
*/
|
||||
#include "../unit_test_framework.h"
|
||||
@@ -207,6 +207,90 @@ static void test_hillhold_armed_to_idle_if_grade_drops(void)
|
||||
|
||||
/* ---- Mutually exclusive: nicht in beiden Modi gleichzeitig ---- */
|
||||
|
||||
/* ---- Drive-Away-Assist (SWE-011 + SWE-012) ---- */
|
||||
|
||||
static SafetyInputs make_applied_at_rest(void)
|
||||
{
|
||||
SafetyInputs in = {0};
|
||||
in.engine_running = true;
|
||||
in.brake_pedal_pressed = false;
|
||||
in.vehicle_speed_kmh = 0.0f;
|
||||
in.grade_percent = 0.0f;
|
||||
in.current_state = EPB_STATE_APPLIED;
|
||||
in.gas_pedal_percent = 0.0f;
|
||||
in.gear_in_drive = false;
|
||||
in.door_closed = true;
|
||||
in.seatbelt_fastened = true;
|
||||
return in;
|
||||
}
|
||||
|
||||
static void test_drive_away_armed_on_intent(void)
|
||||
{
|
||||
TEST_BEGIN("SWE-011 + SWE-012: Anfahrabsicht + Safety -> DRIVE_AWAY + Release-Request");
|
||||
(void)safety_mgr_init();
|
||||
SafetyInputs in = make_applied_at_rest();
|
||||
in.gas_pedal_percent = 25.0f;
|
||||
in.gear_in_drive = true;
|
||||
safety_mgr_step_50ms(&in);
|
||||
ASSERT_EQ(safety_mgr_get_state(), SAFETY_DRIVE_AWAY);
|
||||
ASSERT_TRUE(safety_mgr_release_requested());
|
||||
TEST_END();
|
||||
}
|
||||
|
||||
static void test_drive_away_blocked_without_safety(void)
|
||||
{
|
||||
TEST_BEGIN("SWE-012: Tuer offen blockiert Drive-Away");
|
||||
(void)safety_mgr_init();
|
||||
SafetyInputs in = make_applied_at_rest();
|
||||
in.gas_pedal_percent = 25.0f;
|
||||
in.gear_in_drive = true;
|
||||
in.door_closed = false; /* Tuer offen */
|
||||
safety_mgr_step_50ms(&in);
|
||||
ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE);
|
||||
ASSERT_TRUE(!safety_mgr_release_requested());
|
||||
TEST_END();
|
||||
}
|
||||
|
||||
static void test_drive_away_blocked_without_seatbelt(void)
|
||||
{
|
||||
TEST_BEGIN("SWE-012: Gurt nicht angelegt blockiert Drive-Away");
|
||||
(void)safety_mgr_init();
|
||||
SafetyInputs in = make_applied_at_rest();
|
||||
in.gas_pedal_percent = 25.0f;
|
||||
in.gear_in_drive = true;
|
||||
in.seatbelt_fastened = false;
|
||||
safety_mgr_step_50ms(&in);
|
||||
ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE);
|
||||
TEST_END();
|
||||
}
|
||||
|
||||
static void test_drive_away_blocked_below_gas_threshold(void)
|
||||
{
|
||||
TEST_BEGIN("SWE-011: Gas < 10% loest kein Drive-Away aus");
|
||||
(void)safety_mgr_init();
|
||||
SafetyInputs in = make_applied_at_rest();
|
||||
in.gas_pedal_percent = 5.0f;
|
||||
in.gear_in_drive = true;
|
||||
safety_mgr_step_50ms(&in);
|
||||
ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE);
|
||||
TEST_END();
|
||||
}
|
||||
|
||||
static void test_drive_away_ends_when_released(void)
|
||||
{
|
||||
TEST_BEGIN("DRIVE_AWAY -> IDLE wenn Apply Controller geloest hat");
|
||||
(void)safety_mgr_init();
|
||||
SafetyInputs in = make_applied_at_rest();
|
||||
in.gas_pedal_percent = 25.0f;
|
||||
in.gear_in_drive = true;
|
||||
safety_mgr_step_50ms(&in); /* -> DRIVE_AWAY */
|
||||
in.current_state = EPB_STATE_RELEASED;
|
||||
safety_mgr_step_50ms(&in);
|
||||
ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE);
|
||||
ASSERT_TRUE(!safety_mgr_release_requested());
|
||||
TEST_END();
|
||||
}
|
||||
|
||||
static void test_already_applied_does_not_arm_auto_apply(void)
|
||||
{
|
||||
TEST_BEGIN("Bereits Applied: kein Auto-Apply Arming");
|
||||
@@ -235,6 +319,11 @@ int main(void)
|
||||
test_hillhold_active_on_brake_release();
|
||||
test_hillhold_active_ends_on_vehicle_rolling();
|
||||
test_hillhold_armed_to_idle_if_grade_drops();
|
||||
test_drive_away_armed_on_intent();
|
||||
test_drive_away_blocked_without_safety();
|
||||
test_drive_away_blocked_without_seatbelt();
|
||||
test_drive_away_blocked_below_gas_threshold();
|
||||
test_drive_away_ends_when_released();
|
||||
test_already_applied_does_not_arm_auto_apply();
|
||||
TEST_SUMMARY();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user