feat(i18n): tools + landing page + doorstop generator in English
Validate / build-test (macos-latest) (push) Failing after 2s
Validate / build-test (windows-latest) (push) Failing after 16s
Validate / build-test (ubuntu-latest) (push) Successful in 18s
Validate / reports (push) Successful in 52s

Phase 1 of full English translation:
- generate_doorstop_items.py: all 55 items (SG/SYS/SWE/SA/SWA) rewritten in English
- generate_landing_page.py: full UI labels, KPI cards, section headings in English
- traceability.py: docstring, error messages, HTML headers in English
- generate_test_report.py: report content + table headers in English
- All 55 markdown items in safety/sg/, reqs/, arch/ regenerated in English

Still to come:
- demo-epb filled Word docs (PID, plans, safety, manuals, audit artefacts)
- Code comments + test names + CI workflow step names
- README + dev-process repo templates
This commit is contained in:
Stefan Lohmaier
2026-05-12 03:28:54 -07:00
parent 542a358abc
commit a47e0aed3e
61 changed files with 805 additions and 803 deletions
+15 -15
View File
@@ -17,12 +17,12 @@ asil: D
# SWA-001: Safety Manager
## Verantwortung
## Responsibility
Hoechste Sicherheitsschicht. Erkennt Motor-Aus, aktiviert Hill-Hold,
triggert Auto-Apply. Lebenswichtige Logik mit redundanter Pruefung.
Highest safety layer. Detects engine-off, activates hill-hold,
triggers auto-apply. Life-critical logic with redundant checks.
## Statische Sicht
## Static view
```plantuml
@startuml
@@ -31,20 +31,20 @@ package "Safety Manager" {
[Hill-Hold Logic]
[Auto-Apply Logic]
}
[Safety Manager] ..> [Apply Controller] : Apply-Anforderung
[Safety Manager] ..> [Apply Controller] : apply request
[Wheel Speed Plausi] --> [Safety Manager] : v_vehicle
[Inclinometer Filter] --> [Safety Manager] : grade
@enduml
```
## Schnittstellen (Provided)
## Provided interfaces
```c
Status safety_mgr_init(void);
void safety_mgr_step_50ms(const SafetyInputs* in);
```
## Dynamisches Verhalten
## Dynamic behaviour
```plantuml
@startuml
@@ -58,16 +58,16 @@ AutoApplyTriggered --> Idle : applied
@enduml
```
## Ressourcen
## Resources
- Stack: <= 256 B
- Worst-Case Timing: 200 us / Aufruf
- Worst-case timing: 200 us per call
## Mapping auf Anforderungen
## Mapping to requirements
| Anforderung | Wie abgedeckt |
|-------------|---------------|
| Requirement | How covered |
|-------------|-------------|
| SWE-007 | engine_off + v<0.5 in step_50ms |
| SWE-008 | 2s-Filter und Trigger |
| SWE-009 | Hill-Hold-Aktivierung |
| SWE-010 | Brake-Released-Detektion |
| SWE-008 | 2 s filter and trigger |
| SWE-009 | hill-hold activation |
| SWE-010 | brake-released detection |
+22 -21
View File
@@ -16,12 +16,13 @@ asil: D
# SWA-002: Apply Controller
## Verantwortung
## Responsibility
Zentraler Controller fuer Apply, Hold und Release der Parkbremse.
ASIL-D-Kern der EPB-Software. Implementiert in `src/apply_controller.c`.
Central controller for apply, hold and release of the parking brake.
ASIL-D core of the EPB software. Implemented in
`src/apply_controller.c`.
## Statische Sicht
## Static view
```plantuml
@startuml
@@ -34,7 +35,7 @@ ASIL-D-Kern der EPB-Software. Implementiert in `src/apply_controller.c`.
@enduml
```
## Schnittstellen (Provided)
## Provided interfaces
```c
Status apply_ctrl_init(void);
@@ -42,7 +43,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in);
EpbStatus apply_ctrl_get_status(void);
```
## Dynamisches Verhalten
## Dynamic behaviour
```plantuml
@startuml
@@ -58,24 +59,24 @@ Error --> Released : reset & no fault
@enduml
```
## Ressourcen
## Resources
- Stack: <= 384 B
- Worst-Case Timing: 350 us / Aufruf
- Worst-case timing: 350 us per call
## Designentscheidungen
## Design decisions
| Entscheidung | Begruendung |
|--------------|-------------|
| Statische Allokation, kein Heap | Determinismus, MISRA C 21.3 |
| State Machine | Einfacher zu verifizieren, deterministisch |
| 50ms Step-Funktion | Synchron zur Inclinometer-Abtastung |
| Decision | Rationale |
|----------|-----------|
| Static allocation, no heap | Determinism, MISRA C 21.3 |
| State machine | Easier to verify, deterministic |
| 50 ms step function | Synchronous with inclinometer sample rate |
## Mapping auf Anforderungen
## Mapping to requirements
| Anforderung | Wie abgedeckt |
|-------------|---------------|
| SWE-001 | Hold-Zustand mit periodischer Klemmkraft-Pruefung |
| SWE-002 | Watchdog-Pet im step_50ms |
| SWE-003 | sw_apply Input wird sofort ausgewertet |
| SWE-004 | Current-Target-Detektion via Actuator-Driver-Feedback |
| Requirement | How covered |
|-------------|-------------|
| SWE-001 | Hold state with periodic clamping-force check |
| SWE-002 | Watchdog pet in step_50ms |
| SWE-003 | sw_apply input is evaluated immediately |
| SWE-004 | current-target detection via actuator-driver feedback |
+16 -16
View File
@@ -15,13 +15,13 @@ asil: B
# SWA-003: Actuator Driver
## Verantwortung
## Responsibility
Low-Level-Ansteuerung der beiden Aktor-Motoren. PWM-Generierung,
Strom-Messung, Overcurrent-Cutoff, Klemmkraft-Schaetzung.
Implementiert in `src/actuator_driver.c`.
Low-level control of the two actuator motors. PWM generation,
current measurement, overcurrent cutoff, clamping-force estimation.
Implemented in `src/actuator_driver.c`.
## Statische Sicht
## Static view
```plantuml
@startuml
@@ -32,7 +32,7 @@ Implementiert in `src/actuator_driver.c`.
@enduml
```
## Schnittstellen (Provided)
## Provided interfaces
```c
Status actuator_init(void);
@@ -40,20 +40,20 @@ void actuator_apply(ActuatorId id, uint8_t pwm_percent);
void actuator_release(ActuatorId id, uint8_t pwm_percent);
void actuator_stop(ActuatorId id);
ActuatorStatus actuator_get_status(ActuatorId id);
void actuator_isr_1khz(void); // Strom-Sampling
void actuator_isr_1khz(void); // Current sampling
```
## Ressourcen
## Resources
- Stack: <= 256 B
- Worst-Case Timing: 50 us / ISR
- Static RAM: 64 B pro Aktor
- Worst-case timing: 50 us per ISR
- Static RAM: 64 B per actuator
## Mapping auf Anforderungen
## Mapping to requirements
| Anforderung | Wie abgedeckt |
|-------------|---------------|
| SWE-006 | actuator_release fuer beide Aktoren parallel |
| Requirement | How covered |
|-------------|-------------|
| SWE-006 | actuator_release for both actuators in parallel |
| SWE-013 | actuator_isr_1khz |
| SWE-014 | Overcurrent-Detektor in ISR |
| SWE-015 | Peak-Current-Tracking + lineare Klemmkraft-Schaetzung |
| SWE-014 | overcurrent detector in ISR |
| SWE-015 | peak-current tracking + linear clamping-force estimate |
+6 -6
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Wheel Speed Plausibilisierung'
header: 'Wheel Speed Plausibilisation'
level: 1.4
normative: true
reviewed: null
@@ -11,14 +11,14 @@ links:
asil: B
---
# SWA-004: Wheel Speed Plausibilisierung
# SWA-004: Wheel Speed Plausibilisation
## Verantwortung
## Responsibility
Aufbereitung und Plausibilisierung der 4 Wheel-Speed-Signale. Erkennt
Stillstand und plausibilisiert untereinander.
Conditioning and plausibilisation of the four wheel-speed signals.
Detects standstill and cross-checks the wheels.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status wheel_speed_init(void);
+4 -3
View File
@@ -12,11 +12,12 @@ asil: B
# SWA-005: Inclinometer Filter
## Verantwortung
## Responsibility
Tiefpass-Filterung des Inclinometer-Roh-Signals fuer die Hill-Hold-Bewertung.
Low-pass filtering of the raw inclinometer signal for hill-hold
evaluation.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status inclino_init(void);
+9 -8
View File
@@ -12,12 +12,13 @@ asil: QM
# SWA-006: Switch Debouncer
## Verantwortung
## Responsibility
Software-Entprellung des EPB-Schalters. Liefert stabiles Apply / Release
Signal an den Apply-Controller. Implementiert in `src/switch_debouncer.c`.
Software debouncing of the EPB switch. Provides a stable apply /
release signal to the apply controller. Implemented in
`src/switch_debouncer.c`.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status switch_init(void);
@@ -25,8 +26,8 @@ void switch_step_10ms(SwitchRaw raw);
SwitchState switch_get_state(void);
```
## Mapping auf Anforderungen
## Mapping to requirements
| Anforderung | Wie abgedeckt |
|-------------|---------------|
| SWE-025 | 50ms Debounce-Logik |
| Requirement | How covered |
|-------------|-------------|
| SWE-025 | 50 ms debounce logic |
+5 -5
View File
@@ -13,15 +13,15 @@ asil: QM
# SWA-007: Display Manager
## Verantwortung
## Responsibility
Steuert LED am EPB-Schalter und CAN-Status-Frame an das Kombi-Display.
Empfaengt Status vom Apply-Controller.
Drives the LED on the EPB switch and the CAN status frame to the
instrument cluster. Receives status from the apply controller.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status display_init(void);
void display_set_status(EpbStatus s);
void display_step_20ms(void); // 50 Hz CAN-Frame
void display_step_20ms(void); // 50 Hz CAN frame
```
+4 -3
View File
@@ -13,11 +13,12 @@ asil: QM
# SWA-008: Diagnostic Manager
## Verantwortung
## Responsibility
UDS-Diagnose nach ISO 14229: ReadDTC, ReadDataByIdentifier, RoutineControl.
UDS diagnostics per ISO 14229: ReadDTC, ReadDataByIdentifier,
RoutineControl.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status diag_init(void);
+4 -3
View File
@@ -13,7 +13,8 @@ asil: QM
# SWA-009: Service Mode
## Verantwortung
## Responsibility
Service-Modus fuer Werkstatt. Wird ueber UDS RoutineControl 0x31, Routine-ID
0x0301 aktiviert. Steuert Aktoren in Wartungsposition.
Service mode for the workshop. Activated via UDS RoutineControl
0x31, routine ID 0x0301. Drives the actuators into maintenance
position.
+4 -4
View File
@@ -13,12 +13,12 @@ asil: QM
# SWA-010: Logger
## Verantwortung
## Responsibility
Logging fuer Entwicklung und Service. Ringpuffer im RAM (1 KB) sowie
Persistenz im EEPROM bei kritischen Ereignissen.
Logging for development and service. Ring buffer in RAM (1 KB)
plus persistence in EEPROM on critical events.
## Schnittstellen (Provided)
## Provided interfaces
```c
Status log_init(void);
+30 -30
View File
@@ -21,28 +21,28 @@ asil: D
# SA-001: EPB ECU
## Verantwortung
## Responsibility
Zentrales Steuergeraet der elektrischen Parkbremse. Beinhaltet alle Software-
Komponenten und die elektronische Ansteuerung der Aktoren.
Central control unit of the electric parking brake. Contains all
software components and the electronic actuation of the actuators.
## System-Kontext
## System context
```plantuml
@startuml
node "EPB ECU" as ECU
node "Aktor links" as AL
node "Aktor rechts" as AR
node "Wheel Speed Sensoren (x4)" as WS
node "Actuator left" as AL
node "Actuator right" as AR
node "Wheel-speed sensors (x4)" as WS
node "Inclinometer" as IN
node "EPB-Schalter + LED" as SW
node "CAN-Bus" as CAN
node "Kombi-Display" as DI
node "OBD-Tester" as OBD
node "EPB switch + LED" as SW
node "CAN bus" as CAN
node "Instrument cluster" as DI
node "OBD tester" as OBD
ECU --> AL : PWM, I-Mess
ECU --> AR : PWM, I-Mess
WS --> ECU : Pulse
ECU --> AL : PWM, I-meas
ECU --> AR : PWM, I-meas
WS --> ECU : pulses
IN --> ECU : SPI
SW --> ECU : GPIO
ECU --> SW : LED
@@ -52,24 +52,24 @@ CAN <-> OBD
@enduml
```
## Schnittstellen
## Interfaces
| Schnittstelle | Typ | Richtung |
|---------------|----------------|----------|
| Aktor L/R | PWM + Shunt | I/O |
| Wheel Speed | Hall-Pulse | In |
| Inclinometer | SPI | In |
| Schalter | GPIO debounced | In |
| LED | GPIO | Out |
| CAN | ISO 11898 | I/O |
| Interface | Type | Direction |
|---------------|------------------|-----------|
| Actuator L/R | PWM + shunt | I/O |
| Wheel speed | Hall pulses | in |
| Inclinometer | SPI | in |
| Switch | GPIO debounced | in |
| LED | GPIO | out |
| CAN | ISO 11898 | I/O |
## Subkomponenten (Aufteilung auf SW)
## Subcomponents (allocated to software)
Realisiert in Software: alle SWA-Elemente SWA-001..SWA-010.
Realised in software: all SWA elements SWA-001..SWA-010.
## Nichtfunktionale Eigenschaften
## Non-functional properties
- Worst-Case Reaktionszeit (Schalter → Aktor-Bewegung): 250 ms
- Flash-Bedarf: < 256 KB
- RAM-Bedarf: < 32 KB
- Stromaufnahme: < 200 mA (Standby) / < 30 A (Aktor-Spitze)
- Worst-case reaction time (switch to actuator motion): 250 ms
- Flash demand: < 256 KB
- RAM demand: < 32 KB
- Current: < 200 mA (standby) / < 30 A (actuator peak)
+17 -17
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Aktoren (Caliper-Motoren)'
header: 'Actuators (calliper motors)'
level: 1.2
normative: true
reviewed: null
@@ -13,25 +13,25 @@ links:
asil: D
---
# SA-002: Aktoren (Caliper-Motoren)
# SA-002: Actuators (calliper motors)
## Verantwortung
## Responsibility
Zwei elektromechanische Aktoren an den hinteren Bremssaetteln klemmen
und loesen die Bremsbelaege. Geliefert (Annahme): kommerzielles Bauteil
eines Tier-1-Lieferanten.
Two electromechanical actuators on the rear callipers clamp and
release the brake pads. Supplied (assumption): commercial component
from a Tier-1 supplier.
## Schnittstellen
## Interfaces
| Schnittstelle | Typ | Bemerkung |
|---------------|--------------|-----------------------------------|
| Power | 12 V, PWM | bidirektional fuer Apply/Release |
| Strom-Shunt | Analog | wird in der ECU abgegriffen |
| Interface | Type | Notes |
|---------------|--------------|---------------------------------|
| Power | 12 V, PWM | bidirectional for apply/release |
| Current shunt | analog | sampled inside the ECU |
## Nichtfunktionale Eigenschaften
## Non-functional properties
- Max. Klemmkraft: 20 kN
- Apply-Zeit (0 → max): 600 ms
- Strom (nominal): 4 A
- Strom (Spitze): 30 A (kurzzeitig)
- Temperaturbereich: -40°C bis +85°C
- Max clamping force: 20 kN
- Apply time (0 → max): 600 ms
- Nominal current: 4 A
- Peak current: 30 A (brief)
- Temperature range: -40 °C to +85 °C
+19 -19
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Sensor-Cluster'
header: 'Sensor cluster'
level: 1.3
normative: true
reviewed: null
@@ -12,27 +12,27 @@ links:
asil: B
---
# SA-003: Sensor-Cluster
# SA-003: Sensor cluster
## Verantwortung
## Responsibility
Zusammenfassung aller fuer die EPB benoetigten Eingangssignale:
Wheel-Speed-Sensoren (4x), Inclinometer (1x), EPB-Schalter, Bremspedal-
Status, Gear-Position, Door-Open, Seat-Belt — die letzten vier per CAN.
Summary of all input signals required by the EPB: wheel-speed
sensors (4x), inclinometer (1x), EPB switch, brake-pedal status,
gear position, door open, seatbelt — the last four via CAN.
## Schnittstellen
## Interfaces
| Sensor | Typ | Quelle |
|-----------------|------------------|--------------|
| Wheel Speed x4 | Hall-Pulse | direkt |
| Inclinometer | SPI 1 kHz | direkt |
| EPB-Schalter | GPIO | direkt |
| Bremspedal | CAN 0x100 | aus BCM |
| Gear | CAN 0x110 | aus TCU |
| Door / Belt | CAN 0x120 | aus BCM |
| Sensor | Type | Source |
|-----------------|--------------|------------|
| Wheel speed x4 | Hall pulses | direct |
| Inclinometer | SPI 1 kHz | direct |
| EPB switch | GPIO | direct |
| Brake pedal | CAN 0x100 | from BCM |
| Gear | CAN 0x110 | from TCU |
| Door / belt | CAN 0x120 | from BCM |
## Nichtfunktionale Eigenschaften
## Non-functional properties
- Wheel-Speed-Genauigkeit: +/- 0.1 km/h ab 1 km/h
- Inclinometer-Genauigkeit: +/- 0.5°
- Sampling-Frequenz Inclinometer: 100 Hz
- Wheel-speed accuracy: +/- 0.1 km/h above 1 km/h
- Inclinometer accuracy: +/- 0.5°
- Inclinometer sampling rate: 100 Hz
+11 -11
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'HMI (Schalter, LED, Display)'
header: 'HMI (switch, LED, display)'
level: 1.4
normative: true
reviewed: null
@@ -11,17 +11,17 @@ links:
asil: QM
---
# SA-004: HMI (Schalter, LED, Display)
# SA-004: HMI (switch, LED, display)
## Verantwortung
## Responsibility
Fahrer-Interaktion und -Information: Tippschalter mit integrierter LED,
Statusanzeige im Kombi-Display via CAN.
Driver interaction and information: tap switch with integrated LED,
status display in the instrument cluster via CAN.
## Schnittstellen
## Interfaces
| Element | Typ | Verhalten |
|---------------|----------|--------------------------------------------|
| Tippschalter | GPIO | Apply-Richtung / Release-Richtung |
| LED | GPIO | aus / an / blink 2 Hz / blink 4 Hz |
| Display | CAN 0x3A0 | 50 Hz Status-Frame |
| Element | Type | Behaviour |
|---------------|----------|-------------------------------------------|
| Tap switch | GPIO | apply direction / release direction |
| LED | GPIO | off / on / blink 2 Hz / blink 4 Hz |
| Display | CAN 0x3A0| 50 Hz status frame |
+11 -10
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'CAN-Bus'
header: 'CAN bus'
level: 1.5
normative: true
reviewed: null
@@ -11,16 +11,17 @@ links:
asil: QM
---
# SA-005: CAN-Bus
# SA-005: CAN bus
## Verantwortung
## Responsibility
Kommunikations-Backbone fuer Eingangsdaten (Bremspedal, Gang, Tuer, Gurt),
Ausgabe (Status-Frame an Display) und Diagnose (UDS auf Tester-Adresse).
Communication backbone for input data (brake pedal, gear, door,
belt), output (status frame to the display) and diagnostics (UDS
on the tester address).
## Schnittstellen
## Interfaces
- Baudrate: 500 kbit/s, CAN 2.0B
- Empfangene Frames: 0x100 (Bremspedal), 0x110 (Gang), 0x120 (Door/Belt),
0x712 (UDS-Request)
- Gesendete Frames: 0x3A0 (Status 50 Hz), 0x71A (UDS-Response)
- Baud rate: 500 kbit/s, CAN 2.0B
- Received frames: 0x100 (brake pedal), 0x110 (gear),
0x120 (door/belt), 0x712 (UDS request)
- Sent frames: 0x3A0 (status 50 Hz), 0x71A (UDS response)
+55 -55
View File
@@ -14,7 +14,7 @@ h1{color:#1f3864}h2{color:#1f3864;margin-top:30px}
.missing{color:#c00}
</style></head><body>
<h1>demo-epb — Traceability Matrix</h1>
<p>Vollstaendige Kette: <code>SG → SYS → SA, SWE → SWA → Code (@arch) + Test (@reqs)</code></p>
<p>Complete chain: <code>SG → SYS → SA, SWE → SWA → Code (@arch) + Test (@reqs)</code></p>
<p>
<strong>SG:</strong> 5 &nbsp;
<strong>SYS:</strong> 10 &nbsp;
@@ -25,125 +25,125 @@ h1{color:#1f3864}h2{color:#1f3864;margin-top:30px}
<strong>Test-Files:</strong> 4
</p>
<table>
<tr><th>Safety Goal</th><th>System-Requirement</th><th>System-Arch</th><th>Software-Req</th><th>Software-Arch</th><th>Code</th><th>Test</th></tr>
<tr><th>Safety Goal</th><th>System Requirement</th><th>System Arch</th><th>Software Req</th><th>Software Arch</th><th>Code</th><th>Test</th></tr>
<tr>
<td><div><span class='id'>SG-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Kein ungewolltes Loesen der Parkbremse im Stillstand</div></td>
<td><div><span class='id'>SYS-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Halten der Parkbremse im Stillstand</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Aktoren (Caliper-Motoren)</div></td>
<td><div><span class='id'>SWE-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply-Controller haelt Klemmkraft</div><div><span class='id'>SWE-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Watchdog ueberwacht Apply-Controller</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Stillstands-Erkennung aus Wheel Speeds</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div></td>
<td><div><span class='id'>SG-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>No unintended release of the parking brake during standstill</div></td>
<td><div><span class='id'>SYS-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Holding the parking brake at standstill</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Actuators (calliper motors)</div></td>
<td><div><span class='id'>SWE-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply controller maintains clamping force</div><div><span class='id'>SWE-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Watchdog monitors the apply controller</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Standstill detection from wheel speeds</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisation</div></td>
<td><div class='id'>src/apply_controller.c</div></td>
<td><div class='id'>tests/unit/test_apply_controller.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Kein ungewolltes Loesen der Parkbremse im Stillstand</div></td>
<td><div><span class='id'>SYS-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Auto-Apply bei Motor-Aus</div></td>
<td><div><span class='id'>SG-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>No unintended release of the parking brake during standstill</div></td>
<td><div><span class='id'>SYS-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Auto-apply on engine off</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div></td>
<td><div><span class='id'>SWE-007</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Motor-Aus-Bedingung erkennen</div><div><span class='id'>SWE-008</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Auto-Apply nach 2 s Verzoegerung</div></td>
<td><div><span class='id'>SWE-007</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Detect engine-off condition</div><div><span class='id'>SWE-008</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Auto-apply after 2 s delay</div></td>
<td><div><span class='id'>SWA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Safety Manager</div></td>
<td><div class='id'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Kein ungewolltes Festklemmen waehrend der Fahrt</div></td>
<td><div><span class='id'>SYS-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply auf Fahrer-Anforderung</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Aktoren (Caliper-Motoren)</div></td>
<td><div><span class='id'>SWE-003</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Schalter-Apply-Signal an Apply-Controller weiterleiten</div><div><span class='id'>SWE-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Klemmkraft-Erreichen bestaetigen</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Stillstands-Erkennung aus Wheel Speeds</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch-Debouncing</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div><div><span class='id'>SWA-006</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch Debouncer</div></td>
<td><div><span class='id'>SG-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>No unintended clamping while driving</div></td>
<td><div><span class='id'>SYS-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply on driver request</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Actuators (calliper motors)</div></td>
<td><div><span class='id'>SWE-003</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Forward switch apply signal to the apply controller</div><div><span class='id'>SWE-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Confirm target clamping force reached</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Standstill detection from wheel speeds</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch debouncing</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisation</div><div><span class='id'>SWA-006</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch Debouncer</div></td>
<td><div class='id'>src/apply_controller.c</div><div class='id'>src/switch_debouncer.c</div></td>
<td><div class='id'>tests/unit/test_apply_controller.c</div><div class='id'>tests/unit/test_switch_debouncer.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Kein ungewolltes Festklemmen waehrend der Fahrt</div></td>
<td><div><span class='id'>SYS-005</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold am Berg</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor-Cluster</div></td>
<td><div><span class='id'>SWE-009</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold-Aktivierungsbedingung</div><div><span class='id'>SWE-010</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold-Uebergabe an Apply-Controller</div><div><span class='id'>SWE-024</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer Tiefpass-Filter</div></td>
<td><div><span class='id'>SG-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>No unintended clamping while driving</div></td>
<td><div><span class='id'>SYS-005</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold on an incline</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor cluster</div></td>
<td><div><span class='id'>SWE-009</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold activation condition</div><div><span class='id'>SWE-010</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold handover to the apply controller</div><div><span class='id'>SWE-024</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer low-pass filter</div></td>
<td><div><span class='id'>SWA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Safety Manager</div><div><span class='id'>SWA-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer Filter</div></td>
<td><div class='id'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-003</span> <span class='asil' style='background:#1f77b4'>A</span></div><div class='cnt'>Schutz gegen Aktor-Ueberlast</div></td>
<td><div><span class='id'>SYS-007</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Aktor-Stromueberwachung</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Aktoren (Caliper-Motoren)</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor-Cluster</div></td>
<td><div><span class='id'>SWE-013</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Strommessung mit 1 kHz</div><div><span class='id'>SWE-014</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Overcurrent-Cutoff</div><div><span class='id'>SWE-015</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Klemmkraft-Schaetzung aus Strom-Profil</div><div><span class='id'>SWE-023</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div></td>
<td><div><span class='id'>SWA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Actuator Driver</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div></td>
<td><div><span class='id'>SG-003</span> <span class='asil' style='background:#1f77b4'>A</span></div><div class='cnt'>Protection against actuator overload</div></td>
<td><div><span class='id'>SYS-007</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Actuator current monitoring</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Actuators (calliper motors)</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor cluster</div></td>
<td><div><span class='id'>SWE-013</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Current sampling at 1 kHz</div><div><span class='id'>SWE-014</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Overcurrent cutoff</div><div><span class='id'>SWE-015</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Clamping force estimation from current profile</div><div><span class='id'>SWE-023</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel-speed plausibilisation</div></td>
<td><div><span class='id'>SWA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Actuator Driver</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisation</div></td>
<td><div class='id'>src/actuator_driver.c</div></td>
<td><div class='id'>tests/unit/test_actuator_driver.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-004</span> <span class='asil' style='background:#ff7f0e'>C</span></div><div class='cnt'>Zuverlaessige Hill-Hold-Uebergabe</div></td>
<td><div><span class='id'>SYS-005</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold am Berg</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor-Cluster</div></td>
<td><div><span class='id'>SWE-009</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold-Aktivierungsbedingung</div><div><span class='id'>SWE-010</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-Hold-Uebergabe an Apply-Controller</div><div><span class='id'>SWE-024</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer Tiefpass-Filter</div></td>
<td><div><span class='id'>SG-004</span> <span class='asil' style='background:#ff7f0e'>C</span></div><div class='cnt'>Reliable hill-hold handover</div></td>
<td><div><span class='id'>SYS-005</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold on an incline</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor cluster</div></td>
<td><div><span class='id'>SWE-009</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold activation condition</div><div><span class='id'>SWE-010</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Hill-hold handover to the apply controller</div><div><span class='id'>SWE-024</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer low-pass filter</div></td>
<td><div><span class='id'>SWA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Safety Manager</div><div><span class='id'>SWA-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Inclinometer Filter</div></td>
<td><div class='id'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-004</span> <span class='asil' style='background:#ff7f0e'>C</span></div><div class='cnt'>Zuverlaessige Hill-Hold-Uebergabe</div></td>
<td><div><span class='id'>SYS-006</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Auto-Release beim Anfahren (Drive-Away-Assist)</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor-Cluster</div></td>
<td><div><span class='id'>SWE-011</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Anfahrabsicht erkennen</div><div><span class='id'>SWE-012</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sicherheits-Check vor Auto-Release</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Stillstands-Erkennung aus Wheel Speeds</div></td>
<td><div><span class='id'>SWA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Safety Manager</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div></td>
<td><div><span class='id'>SG-004</span> <span class='asil' style='background:#ff7f0e'>C</span></div><div class='cnt'>Reliable hill-hold handover</div></td>
<td><div><span class='id'>SYS-006</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Auto-release on drive-away (Drive-Away Assist)</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Sensor cluster</div></td>
<td><div><span class='id'>SWE-011</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Detect drive-away intent</div><div><span class='id'>SWE-012</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Safety check before auto-release</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Standstill detection from wheel speeds</div></td>
<td><div><span class='id'>SWA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Safety Manager</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisation</div></td>
<td><div class='id'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Reaktion auf Fahreranforderung</div></td>
<td><div><span class='id'>SYS-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply auf Fahrer-Anforderung</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Aktoren (Caliper-Motoren)</div></td>
<td><div><span class='id'>SWE-003</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Schalter-Apply-Signal an Apply-Controller weiterleiten</div><div><span class='id'>SWE-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Klemmkraft-Erreichen bestaetigen</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Stillstands-Erkennung aus Wheel Speeds</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch-Debouncing</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisierung</div><div><span class='id'>SWA-006</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch Debouncer</div></td>
<td><div><span class='id'>SG-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Response to driver requests</div></td>
<td><div><span class='id'>SYS-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply on driver request</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Actuators (calliper motors)</div></td>
<td><div><span class='id'>SWE-003</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Forward switch apply signal to the apply controller</div><div><span class='id'>SWE-004</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Confirm target clamping force reached</div><div><span class='id'>SWE-022</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Standstill detection from wheel speeds</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch debouncing</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-004</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Wheel Speed Plausibilisation</div><div><span class='id'>SWA-006</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch Debouncer</div></td>
<td><div class='id'>src/apply_controller.c</div><div class='id'>src/switch_debouncer.c</div></td>
<td><div class='id'>tests/unit/test_apply_controller.c</div><div class='id'>tests/unit/test_switch_debouncer.c</div></td>
</tr>
<tr>
<td><div><span class='id'>SG-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Reaktion auf Fahreranforderung</div></td>
<td><div><span class='id'>SYS-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Release auf Fahrer-Anforderung</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Aktoren (Caliper-Motoren)</div></td>
<td><div><span class='id'>SWE-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Release-Voraussetzungen pruefen</div><div><span class='id'>SWE-006</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Aktoren in Release-Position fahren</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch-Debouncing</div></td>
<td><div><span class='id'>SG-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Response to driver requests</div></td>
<td><div><span class='id'>SYS-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Release on driver request</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Actuators (calliper motors)</div></td>
<td><div><span class='id'>SWE-005</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Check release preconditions</div><div><span class='id'>SWE-006</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Drive actuators into release position</div><div><span class='id'>SWE-025</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch debouncing</div></td>
<td><div><span class='id'>SWA-002</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>Apply Controller</div><div><span class='id'>SWA-003</span> <span class='asil' style='background:#2ca02c'>B</span></div><div class='cnt'>Actuator Driver</div><div><span class='id'>SWA-006</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Switch Debouncer</div></td>
<td><div class='id'>src/apply_controller.c</div><div class='id'>src/actuator_driver.c</div><div class='id'>src/switch_debouncer.c</div></td>
<td><div class='id'>tests/unit/test_actuator_driver.c</div><div class='id'>tests/unit/test_apply_controller.c</div><div class='id'>tests/unit/test_switch_debouncer.c</div></td>
</tr>
<tr>
<td class='missing'></td>
<td><div><span class='id'>SYS-008</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Service-Modus fuer Werkstatt</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-004</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI (Schalter, LED, Display)</div></td>
<td><div><span class='id'>SWE-016</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS RoutineControl 0x31 fuer Service-Release</div><div><span class='id'>SWE-017</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Service-Mode-Indikator</div></td>
<td><div><span class='id'>SYS-008</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Service mode for the workshop</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-004</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI (switch, LED, display)</div></td>
<td><div><span class='id'>SWE-016</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS RoutineControl 0x31 for service release</div><div><span class='id'>SWE-017</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Service mode indicator</div></td>
<td><div><span class='id'>SWA-009</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Service Mode</div></td>
<td class='cnt'></td>
<td class='cnt'></td>
</tr>
<tr>
<td class='missing'></td>
<td><div><span class='id'>SYS-009</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS-Diagnose</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-005</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN-Bus</div></td>
<td><div><span class='id'>SWE-018</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS Service 0x19 ReadDTC</div><div><span class='id'>SWE-019</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS Service 0x22 ReadDataByIdentifier</div></td>
<td><div><span class='id'>SYS-009</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS diagnostics</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-005</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN bus</div></td>
<td><div><span class='id'>SWE-018</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS service 0x19 ReadDTC</div><div><span class='id'>SWE-019</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>UDS service 0x22 ReadDataByIdentifier</div></td>
<td><div><span class='id'>SWA-008</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Diagnostic Manager</div><div><span class='id'>SWA-010</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Logger</div></td>
<td class='cnt'></td>
<td class='cnt'></td>
</tr>
<tr>
<td class='missing'></td>
<td><div><span class='id'>SYS-010</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI-Statusanzeige</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-004</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI (Schalter, LED, Display)</div><div><span class='id'>SA-005</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN-Bus</div></td>
<td><div><span class='id'>SWE-020</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>LED-Steuerung</div><div><span class='id'>SWE-021</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN-Status-Frame</div></td>
<td><div><span class='id'>SYS-010</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI status display</div></td>
<td><div><span class='id'>SA-001</span> <span class='asil' style='background:#d62728'>D</span></div><div class='cnt'>EPB ECU</div><div><span class='id'>SA-004</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>HMI (switch, LED, display)</div><div><span class='id'>SA-005</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN bus</div></td>
<td><div><span class='id'>SWE-020</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>LED control</div><div><span class='id'>SWE-021</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>CAN status frame</div></td>
<td><div><span class='id'>SWA-007</span> <span class='asil' style='background:#888'>QM</span></div><div class='cnt'>Display Manager</div></td>
<td class='cnt'></td>
<td class='cnt'></td>
</tr>
</table>
<h2>Code → Architektur</h2>
<table><tr><th>Datei</th><th>@arch</th><th>@reqs</th></tr>
<h2>Code → Architecture</h2>
<table><tr><th>File</th><th>@arch</th><th>@reqs</th></tr>
<tr><td class='id'>src/safety_manager.c</td><td>SWA-001</td><td class='cnt'>SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012</td></tr>
<tr><td class='id'>src/apply_controller.c</td><td>SWA-002</td><td class='cnt'>SWE-001 SWE-002 SWE-003 SWE-004</td></tr>
<tr><td class='id'>src/actuator_driver.c</td><td>SWA-003</td><td class='cnt'>SWE-006 SWE-013 SWE-014 SWE-015</td></tr>
<tr><td class='id'>src/switch_debouncer.c</td><td>SWA-006</td><td class='cnt'>SWE-025</td></tr>
</table>
<h2>Test → Anforderungen</h2>
<table><tr><th>Test-Datei</th><th>Decklt SWA</th><th>@reqs</th></tr>
<h2>Test → Requirements</h2>
<table><tr><th>Test file</th><th>Covers SWA</th><th>@reqs</th></tr>
<tr><td class='id'>tests/unit/test_safety_manager.c</td><td>SWA-001</td><td class='cnt'>SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012</td></tr>
<tr><td class='id'>tests/unit/test_apply_controller.c</td><td>SWA-002</td><td class='cnt'>SWE-001 SWE-002 SWE-003 SWE-004 SWE-005</td></tr>
<tr><td class='id'>tests/unit/test_actuator_driver.c</td><td>SWA-003</td><td class='cnt'>SWE-006 SWE-013 SWE-014 SWE-015</td></tr>
+12 -12
View File
@@ -7,7 +7,7 @@
"sys": {
"id": "SYS-001",
"asil": "D",
"title": "Halten der Parkbremse im Stillstand"
"title": "Holding the parking brake at standstill"
},
"sa": [
{
@@ -58,7 +58,7 @@
"sys": {
"id": "SYS-004",
"asil": "D",
"title": "Auto-Apply bei Motor-Aus"
"title": "Auto-apply on engine off"
},
"sa": [
{
@@ -97,7 +97,7 @@
"sys": {
"id": "SYS-002",
"asil": "D",
"title": "Apply auf Fahrer-Anforderung"
"title": "Apply on driver request"
},
"sa": [
{
@@ -158,7 +158,7 @@
"sys": {
"id": "SYS-005",
"asil": "D",
"title": "Hill-Hold am Berg"
"title": "Hill-hold on an incline"
},
"sa": [
{
@@ -209,7 +209,7 @@
"sys": {
"id": "SYS-007",
"asil": "B",
"title": "Aktor-Stromueberwachung"
"title": "Actuator current monitoring"
},
"sa": [
{
@@ -268,7 +268,7 @@
"sys": {
"id": "SYS-005",
"asil": "D",
"title": "Hill-Hold am Berg"
"title": "Hill-hold on an incline"
},
"sa": [
{
@@ -319,7 +319,7 @@
"sys": {
"id": "SYS-006",
"asil": "B",
"title": "Auto-Release beim Anfahren (Drive-Away-Assist)"
"title": "Auto-release on drive-away (Drive-Away Assist)"
},
"sa": [
{
@@ -370,7 +370,7 @@
"sys": {
"id": "SYS-002",
"asil": "D",
"title": "Apply auf Fahrer-Anforderung"
"title": "Apply on driver request"
},
"sa": [
{
@@ -431,7 +431,7 @@
"sys": {
"id": "SYS-003",
"asil": "B",
"title": "Release auf Fahrer-Anforderung"
"title": "Release on driver request"
},
"sa": [
{
@@ -487,7 +487,7 @@
"sys": {
"id": "SYS-008",
"asil": "QM",
"title": "Service-Modus fuer Werkstatt"
"title": "Service mode for the workshop"
},
"sa": [
{
@@ -523,7 +523,7 @@
"sys": {
"id": "SYS-009",
"asil": "QM",
"title": "UDS-Diagnose"
"title": "UDS diagnostics"
},
"sa": [
{
@@ -563,7 +563,7 @@
"sys": {
"id": "SYS-010",
"asil": "QM",
"title": "HMI-Statusanzeige"
"title": "HMI status display"
},
"sa": [
{
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Apply-Controller haelt Klemmkraft'
header: 'Apply controller maintains clamping force'
level: 1.1
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-001: Apply-Controller haelt Klemmkraft
# SWE-001: Apply controller maintains clamping force
Der Apply-Controller muss die Klemmkraft im Hold-Zustand alle 50 ms verifizieren und bei Abweichung > 10% nachregeln.
The apply controller must verify the clamping force in the hold state every 50 ms and re-apply when the deviation exceeds 10%.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Watchdog ueberwacht Apply-Controller'
header: 'Watchdog monitors the apply controller'
level: 1.2
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-002: Watchdog ueberwacht Apply-Controller
# SWE-002: Watchdog monitors the apply controller
Ein unabhaengiger Watchdog muss die Liveness des Apply-Controllers mit 100 ms Timeout ueberwachen und bei Ausbleiben in den sicheren Zustand (Apply) gehen.
An independent watchdog must monitor the liveness of the apply controller with a 100 ms timeout and, on failure to respond, transition to the safe state (apply).
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Schalter-Apply-Signal an Apply-Controller weiterleiten'
header: 'Forward switch apply signal to the apply controller'
level: 1.3
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-003: Schalter-Apply-Signal an Apply-Controller weiterleiten
# SWE-003: Forward switch apply signal to the apply controller
Das Software-Modul Switch-Debouncer muss ein entprelltes Apply-Signal innerhalb von 50 ms an den Apply-Controller liefern.
The Switch Debouncer software module must deliver a debounced apply signal to the apply controller within 50 ms.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Klemmkraft-Erreichen bestaetigen'
header: 'Confirm target clamping force reached'
level: 1.4
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-004: Klemmkraft-Erreichen bestaetigen
# SWE-004: Confirm target clamping force reached
Der Apply-Controller muss das Erreichen der Ziel-Klemmkraft via Strommessung erkennen und ein Status-Flag setzen.
The apply controller must detect that the target clamping force has been reached via current measurement and set a status flag.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Release-Voraussetzungen pruefen'
header: 'Check release preconditions'
level: 1.5
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-005: Release-Voraussetzungen pruefen
# SWE-005: Check release preconditions
Vor jedem Release muss der Apply-Controller pruefen: Motor laeuft, Bremspedal betaetigt, Gang ist eingelegt. Andernfalls Release abweisen.
Before any release, the apply controller must verify: engine running, brake pedal pressed, gear engaged. Otherwise reject the release.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Aktoren in Release-Position fahren'
header: 'Drive actuators into release position'
level: 1.6
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-006: Aktoren in Release-Position fahren
# SWE-006: Drive actuators into release position
Der Actuator-Driver muss beide Aktoren parallel in Release-Position fahren. Maximalzeit: 1200 ms. Bei Timeout DTC setzen.
The Actuator Driver must drive both actuators in parallel into the release position. Maximum time: 1200 ms. On timeout, set a DTC.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Motor-Aus-Bedingung erkennen'
header: 'Detect engine-off condition'
level: 1.7
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-007: Motor-Aus-Bedingung erkennen
# SWE-007: Detect engine-off condition
Der Safety-Manager muss erkennen: Motor-Status = aus, Geschwindigkeit < 0.5 km/h. Auswertezyklus 50 ms.
The Safety Manager must detect: engine status = off, vehicle speed < 0.5 km/h. Sampling period 50 ms.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Auto-Apply nach 2 s Verzoegerung'
header: 'Auto-apply after 2 s delay'
level: 1.8
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-008: Auto-Apply nach 2 s Verzoegerung
# SWE-008: Auto-apply after 2 s delay
Ist die Motor-Aus-Bedingung 2 s stabil erfuellt und Parkbremse noch nicht aktiv, muss der Safety-Manager Apply-Anforderung an den Apply-Controller senden.
If the engine-off condition is stable for 2 s and the parking brake is not yet active, the Safety Manager must send an apply request to the apply controller.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Hill-Hold-Aktivierungsbedingung'
header: 'Hill-hold activation condition'
level: 1.9
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-009: Hill-Hold-Aktivierungsbedingung
# SWE-009: Hill-hold activation condition
Der Safety-Manager muss Hill-Hold aktivieren, wenn Neigung (gefiltert) > 5%, Geschwindigkeit < 0.5 km/h und Bremspedal betaetigt sind.
The Safety Manager must activate hill-hold when grade (filtered) > 5%, vehicle speed < 0.5 km/h and the brake pedal is pressed.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Hill-Hold-Uebergabe an Apply-Controller'
header: 'Hill-hold handover to the apply controller'
level: 1.10
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SWE-010: Hill-Hold-Uebergabe an Apply-Controller
# SWE-010: Hill-hold handover to the apply controller
Wird das Bremspedal bei aktivem Hill-Hold losgelassen, muss der Safety-Manager unmittelbar Apply-Anforderung an den Apply-Controller senden, bevor das Fahrzeug zu rollen beginnen kann.
If the brake pedal is released while hill-hold is active, the Safety Manager must immediately send an apply request to the apply controller before the vehicle can start to roll.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Anfahrabsicht erkennen'
header: 'Detect drive-away intent'
level: 1.11
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-011: Anfahrabsicht erkennen
# SWE-011: Detect drive-away intent
Anfahrabsicht ist erkannt, wenn: Gaspedal > 10%, Gang in Vorwaerts oder Rueckwaerts, Motor laeuft.
Drive-away intent is detected when: throttle > 10%, gear in forward or reverse, engine running.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Sicherheits-Check vor Auto-Release'
header: 'Safety check before auto-release'
level: 1.12
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-012: Sicherheits-Check vor Auto-Release
# SWE-012: Safety check before auto-release
Vor Auto-Release muessen erfuellt sein: Fahrertuer geschlossen, Sicherheitsgurt angelegt. Andernfalls warnen und nicht loesen.
Before auto-release, the following must be satisfied: driver door closed, seatbelt fastened. Otherwise warn and do not release.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Strommessung mit 1 kHz'
header: 'Current sampling at 1 kHz'
level: 1.13
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-013: Strommessung mit 1 kHz
# SWE-013: Current sampling at 1 kHz
Der Actuator-Driver muss den Motorstrom jedes Aktors mit mindestens 1 kHz abtasten. Genauigkeit +/- 100 mA.
The Actuator Driver must sample the motor current of each actuator at at least 1 kHz. Accuracy +/- 100 mA.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Overcurrent-Cutoff'
header: 'Overcurrent cutoff'
level: 1.14
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-014: Overcurrent-Cutoff
# SWE-014: Overcurrent cutoff
Bei Motorstrom > 8 A laenger als 100 ms muss der Actuator-Driver den Motor abschalten und einen DTC P0xxx setzen.
On motor current > 8 A for longer than 100 ms, the Actuator Driver must shut down the motor and set DTC P0xxx.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Klemmkraft-Schaetzung aus Strom-Profil'
header: 'Clamping force estimation from current profile'
level: 1.15
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-015: Klemmkraft-Schaetzung aus Strom-Profil
# SWE-015: Clamping force estimation from current profile
Der Actuator-Driver muss die erreichte Klemmkraft aus dem Stromverlauf bei Apply schaetzen (Modell: F = k * I_peak).
The Actuator Driver must estimate the achieved clamping force from the current waveform during apply (model: F = k * I_peak).
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'UDS RoutineControl 0x31 fuer Service-Release'
header: 'UDS RoutineControl 0x31 for service release'
level: 1.16
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-016: UDS RoutineControl 0x31 fuer Service-Release
# SWE-016: UDS RoutineControl 0x31 for service release
Service-Mode wird ueber UDS RoutineControl Service 0x31, Routine-ID 0x0301 aktiviert. Bedingung: Fahrzeug muss stillstehen.
Service mode is activated via UDS RoutineControl service 0x31, routine ID 0x0301. Precondition: vehicle must be at standstill.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Service-Mode-Indikator'
header: 'Service mode indicator'
level: 1.17
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-017: Service-Mode-Indikator
# SWE-017: Service mode indicator
Im Service-Mode muss die EPB-LED am Schalter mit 2 Hz blinken.
While in service mode, the EPB LED on the switch must blink at 2 Hz.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'UDS Service 0x19 ReadDTC'
header: 'UDS service 0x19 ReadDTC'
level: 1.18
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-018: UDS Service 0x19 ReadDTC
# SWE-018: UDS service 0x19 ReadDTC
Das System muss alle gespeicherten DTCs ueber Service 0x19 (Subfunktion 0x02 reportDTCByStatusMask) ausgeben.
The system must output all stored DTCs via service 0x19 (sub-function 0x02 reportDTCByStatusMask).
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'UDS Service 0x22 ReadDataByIdentifier'
header: 'UDS service 0x22 ReadDataByIdentifier'
level: 1.19
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-019: UDS Service 0x22 ReadDataByIdentifier
# SWE-019: UDS service 0x22 ReadDataByIdentifier
Folgende DIDs muessen lesbar sein: 0xF187 (SW-Version), 0x0301 (Klemmkraft links), 0x0302 (Klemmkraft rechts).
The following DIDs must be readable: 0xF187 (SW version), 0x0301 (clamping force left), 0x0302 (clamping force right).
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'LED-Steuerung'
header: 'LED control'
level: 1.20
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-020: LED-Steuerung
# SWE-020: LED control
Apply-aktiv: LED dauerleuchtend. Release: LED aus. Fehler: LED blinkt 4 Hz. Service-Mode: LED blinkt 2 Hz.
Apply active: LED solid. Release: LED off. Fault: LED blinks at 4 Hz. Service mode: LED blinks at 2 Hz.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'CAN-Status-Frame'
header: 'CAN status frame'
level: 1.21
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM
---
# SWE-021: CAN-Status-Frame
# SWE-021: CAN status frame
Status-Frame 0x3A0 mit 50 Hz: Byte 0 = Status (0=Released, 1=Applied, 2=Applying, 3=Releasing, 0xFF=Error), Byte 1-2 = Klemmkraft links, Byte 3-4 = Klemmkraft rechts.
Status frame 0x3A0 at 50 Hz: byte 0 = status (0=released, 1=applied, 2=applying, 3=releasing, 0xFF=error), byte 1-2 = left clamping force, byte 3-4 = right clamping force.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Stillstands-Erkennung aus Wheel Speeds'
header: 'Standstill detection from wheel speeds'
level: 1.22
normative: true
reviewed: null
@@ -12,6 +12,6 @@ links:
asil: B
---
# SWE-022: Stillstands-Erkennung aus Wheel Speeds
# SWE-022: Standstill detection from wheel speeds
Stillstand ist erkannt, wenn alle 4 Wheel-Speed-Signale fuer mindestens 200 ms unter 0.5 km/h liegen.
Standstill is detected when all 4 wheel-speed signals stay below 0.5 km/h for at least 200 ms.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Wheel Speed Plausibilisierung'
header: 'Wheel-speed plausibilisation'
level: 1.23
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-023: Wheel Speed Plausibilisierung
# SWE-023: Wheel-speed plausibilisation
Spreizung der Wheel-Speed-Signale: bei Geradeaus-Fahrt darf die Differenz nicht > 3 km/h sein. Andernfalls Sensor-Fehler-DTC.
Spread of the wheel-speed signals: when driving straight, the difference must not exceed 3 km/h. Otherwise set a sensor fault DTC.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Inclinometer Tiefpass-Filter'
header: 'Inclinometer low-pass filter'
level: 1.24
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SWE-024: Inclinometer Tiefpass-Filter
# SWE-024: Inclinometer low-pass filter
Das Roh-Neigungssignal muss mit einem Tiefpass 1. Ordnung (Zeitkonstante 200 ms) gefiltert werden, bevor es zur Hill-Hold-Bewertung verwendet wird.
The raw inclinometer signal must be filtered with a first-order low-pass (time constant 200 ms) before being used for hill-hold evaluation.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Switch-Debouncing'
header: 'Switch debouncing'
level: 1.25
normative: true
reviewed: null
@@ -11,6 +11,6 @@ links:
asil: QM
---
# SWE-025: Switch-Debouncing
# SWE-025: Switch debouncing
Der EPB-Schalter muss mit einer Entprell-Zeit von 50 ms entprellt werden. Stabiler Pegel = Eingangssignal fuer Apply-Controller.
The EPB switch must be debounced with a debounce time of 50 ms. Stable level = input signal for the apply controller.
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Halten der Parkbremse im Stillstand'
header: 'Holding the parking brake at standstill'
level: 1.1
normative: true
reviewed: null
@@ -10,8 +10,8 @@ links:
asil: D
---
# SYS-001: Halten der Parkbremse im Stillstand
# SYS-001: Holding the parking brake at standstill
Wenn die Parkbremse aktiviert ist und das Fahrzeug stillsteht, muss das EPB-System die mechanische Klemmkraft an beiden hinteren Bremssaetteln aufrecht erhalten, bis ein Loesen ausdruecklich angefordert wird. Sicherheitsziel: SG-01.
When the parking brake is engaged and the vehicle is at a standstill, the EPB system must maintain the mechanical clamping force on both rear callipers until a release is explicitly requested. Safety goal: SG-001.
**Verifikation:** SiL-Test mit Auf-/Ab-Hangelung, Klemmkraftmessung.
**Verification:** SiL test with up/down grade scenarios, clamping force measurement.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Apply auf Fahrer-Anforderung'
header: 'Apply on driver request'
level: 1.2
normative: true
reviewed: null
@@ -11,6 +11,6 @@ links:
asil: D
---
# SYS-002: Apply auf Fahrer-Anforderung
# SYS-002: Apply on driver request
Bei Betaetigung des EPB-Schalters in Apply-Richtung muss das System innerhalb von 800 ms die Parkbremse anlegen, sofern die Voraussetzungen erfuellt sind (Stillstand oder Geschwindigkeit unter 5 km/h). Sicherheitsziel: SG-01.
On apply-direction actuation of the EPB switch, the system must engage the parking brake within 800 ms, provided the preconditions are met (standstill or vehicle speed below 5 km/h). Safety goal: SG-002.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Release auf Fahrer-Anforderung'
header: 'Release on driver request'
level: 1.3
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SYS-003: Release auf Fahrer-Anforderung
# SYS-003: Release on driver request
Bei Betaetigung des EPB-Schalters in Release-Richtung muss das System die Parkbremse loesen, sofern die folgenden Voraussetzungen erfuellt sind: Motor laeuft, Fahrer betaetigt Bremspedal, Gang ist eingelegt. Maximalzeit fuer Loesen: 1500 ms.
On release-direction actuation of the EPB switch, the system must release the parking brake provided the following preconditions are met: engine running, driver pressing the brake pedal, a gear is engaged. Maximum release time: 1500 ms.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Auto-Apply bei Motor-Aus'
header: 'Auto-apply on engine off'
level: 1.4
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D
---
# SYS-004: Auto-Apply bei Motor-Aus
# SYS-004: Auto-apply on engine off
Wenn der Motor ausgeschaltet wird und das Fahrzeug stillsteht und keine Parkbremse aktiv ist, muss das System die Parkbremse spaetestens 2 s nach Erkennung Motor-Aus automatisch anlegen. Sicherheitsziel: SG-01.
When the engine is switched off and the vehicle is at a standstill, and the parking brake is not yet engaged, the system must automatically engage the parking brake at the latest 2 s after detecting engine-off. Safety goal: SG-001.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Hill-Hold am Berg'
header: 'Hill-hold on an incline'
level: 1.5
normative: true
reviewed: null
@@ -11,6 +11,6 @@ links:
asil: D
---
# SYS-005: Hill-Hold am Berg
# SYS-005: Hill-hold on an incline
Bei aktivem Hill-Hold (Fahrzeug steht am Hang mit Neigung > 5%, Fahrer betaetigt Bremspedal) uebernimmt das EPB-System die Bremskraft beim Loesen des Bremspedals und haelt diese, bis die Anfahrt erkannt wird. Sicherheitsziel: SG-01.
When hill-hold is active (vehicle on a slope with grade > 5%, driver pressing the brake pedal), the EPB system shall take over the brake force when the brake pedal is released and shall maintain it until drive-away is detected. Safety goal: SG-002.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Auto-Release beim Anfahren (Drive-Away-Assist)'
header: 'Auto-release on drive-away (Drive-Away Assist)'
level: 1.6
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SYS-006: Auto-Release beim Anfahren (Drive-Away-Assist)
# SYS-006: Auto-release on drive-away (Drive-Away Assist)
Wenn die Parkbremse aktiv ist und der Fahrer Anfahrabsicht zeigt (Gaspedal-Betaetigung bei eingelegtem Gang), muss das System die Parkbremse innerhalb von 500 ms loesen. Voraussetzung: alle Sicherheitskriterien (Fahrertuer geschlossen, Sicherheitsgurt) erfuellt.
When the parking brake is engaged and the driver shows intent to drive away (throttle actuation with gear engaged), the system must release the parking brake within 500 ms. Precondition: all safety criteria (driver door closed, seatbelt fastened) are met.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Aktor-Stromueberwachung'
header: 'Actuator current monitoring'
level: 1.7
normative: true
reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B
---
# SYS-007: Aktor-Stromueberwachung
# SYS-007: Actuator current monitoring
Das System muss den Motorstrom jedes Aktors mit mindestens 1 kHz ueberwachen und bei Ueberschreitung von 8 A fuer mehr als 100 ms den Aktor abschalten und einen DTC setzen. Sicherheitsziel: SG-03.
The system must monitor the motor current of each actuator at at least 1 kHz and, on exceeding 8 A for more than 100 ms, shut down the actuator and set a DTC. Safety goal: SG-003.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Service-Modus fuer Werkstatt'
header: 'Service mode for the workshop'
level: 1.8
normative: true
reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM
---
# SYS-008: Service-Modus fuer Werkstatt
# SYS-008: Service mode for the workshop
Das System muss ueber UDS RoutineControl (Service 0x31) einen Service-Modus bereitstellen, in dem die Aktoren manuell in Wartungs-Position gefahren werden koennen (z.B. fuer Bremsbelag-Wechsel).
The system must provide a service mode via UDS RoutineControl (service 0x31) in which the actuators can be moved manually into maintenance position (e.g. for brake pad replacement).
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'UDS-Diagnose'
header: 'UDS diagnostics'
level: 1.9
normative: true
reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM
---
# SYS-009: UDS-Diagnose
# SYS-009: UDS diagnostics
Das System muss UDS-Diagnose nach ISO 14229 bereitstellen: ReadDTC (0x19), ReadDataByIdentifier (0x22), RoutineControl (0x31), ECUReset (0x11). Tester-Adresse 0x712, Antwort-Adresse 0x71A.
The system must provide UDS diagnostics per ISO 14229: ReadDTC (0x19), ReadDataByIdentifier (0x22), RoutineControl (0x31), ECUReset (0x11). Tester address 0x712, response address 0x71A.
+3 -3
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'HMI-Statusanzeige'
header: 'HMI status display'
level: 1.10
normative: true
reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM
---
# SYS-010: HMI-Statusanzeige
# SYS-010: HMI status display
Der EPB-Status muss dem Fahrer signalisiert werden: LED am Schalter (an = Apply, aus = Release, blinkend = Fehler) sowie Text im Kombi-Display via CAN-Bus (Frame-ID 0x3A0, 50 Hz).
The EPB status must be signalled to the driver: LED on the switch (on = applied, off = released, blinking = error) and a text in the instrument cluster via CAN bus (frame ID 0x3A0, 50 Hz).
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Kein ungewolltes Loesen der Parkbremse im Stillstand'
header: 'No unintended release of the parking brake during standstill'
level: 1.1
normative: true
reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: D
---
# SG-001: Kein ungewolltes Loesen der Parkbremse im Stillstand
# SG-001: No unintended release of the parking brake during standstill
Die EPB darf sich im Stillstand des Fahrzeugs nicht ungewollt loesen. Abgeleitet aus HARA-Hazards H-01 (ungewolltes Loesen, Parkphase) und H-04 (Klemmkraftverlust im Hold).
The EPB shall not unintentionally release while the vehicle is at a standstill. Derived from HARA hazards H-01 (unintended release during parking) and H-04 (clamping force loss in hold state).
**FTTI:** 5 s (H-01) / 30 s (H-04).
**Safe State:** APPLIED (Klemmkraft halten).
**Safe state:** APPLIED (maintain clamping force).
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Kein ungewolltes Festklemmen waehrend der Fahrt'
header: 'No unintended clamping while driving'
level: 1.2
normative: true
reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: D
---
# SG-002: Kein ungewolltes Festklemmen waehrend der Fahrt
# SG-002: No unintended clamping while driving
Die EPB darf nicht waehrend der Fahrt ungewollt festklemmen. Abgeleitet aus HARA-Hazard H-02.
The EPB shall not unintentionally clamp while the vehicle is moving. Derived from HARA hazard H-02.
**FTTI:** 100 ms.
**Safe State:** Aktor stop (kein Apply einleiten).
**Safe state:** Actuator stop (do not initiate apply).
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Schutz gegen Aktor-Ueberlast'
header: 'Protection against actuator overload'
level: 1.3
normative: true
reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: A
---
# SG-003: Schutz gegen Aktor-Ueberlast
# SG-003: Protection against actuator overload
Das System muss Aktor-Motorschaeden durch Ueberstrom verhindern. Abgeleitet aus HARA-Hazard H-05.
The system shall prevent actuator motor damage due to overcurrent. Derived from HARA hazard H-05.
**FTTI:** 100 ms.
**Safe State:** Aktor abschalten, DTC setzen.
**Safe state:** Disable actuator, set DTC.
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Zuverlaessige Hill-Hold-Uebergabe'
header: 'Reliable hill-hold handover'
level: 1.4
normative: true
reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: C
---
# SG-004: Zuverlaessige Hill-Hold-Uebergabe
# SG-004: Reliable hill-hold handover
Beim Loslassen des Bremspedals an einem Hang muss die EPB die Bremskraft uebernehmen, bevor das Fahrzeug zu rollen beginnt. Abgeleitet aus HARA-Hazard H-06.
When the driver releases the brake pedal on an incline, the EPB shall take over the braking force before the vehicle starts rolling. Derived from HARA hazard H-06.
**FTTI:** 500 ms.
**Safe State:** Apply einleiten.
**Safe state:** Initiate apply.
+4 -4
View File
@@ -1,7 +1,7 @@
---
active: true
derived: false
header: 'Reaktion auf Fahreranforderung'
header: 'Response to driver requests'
level: 1.5
normative: true
reviewed: null
@@ -9,8 +9,8 @@ links: []
asil: B
---
# SG-005: Reaktion auf Fahreranforderung
# SG-005: Response to driver requests
Das System muss in spezifizierter Zeit auf Fahrer-Apply- und Release-Anforderungen reagieren. Abgeleitet aus HARA-Hazards H-03 und H-07.
The system shall respond to driver apply and release requests within specified times. Derived from HARA hazards H-03 and H-07.
**Reaktionszeit:** Apply <= 800 ms, Release <= 1500 ms.
**Response time:** apply <= 800 ms, release <= 1500 ms.
File diff suppressed because it is too large Load Diff
+54 -74
View File
@@ -1,18 +1,20 @@
#!/usr/bin/env python3
"""
Erzeugt eine HTML-Startseite (Dashboard) fuer demo-epb.
Generate an HTML landing page (dashboard) for demo-epb.
Scant das Repo nach Word-Dokumenten, Reports, Code, Tests, Architektur, und
schreibt build/index.html mit klickbaren Links.
Scans the repo for Word documents, reports, code, tests, architecture, and
writes build/index.html with clickable links.
Run nach `make test && make coverage && make docs && make test-report && python3 tools/traceability.py publish docs/traceability && python3 tools/render_plantuml.py`.
Run after `make test && make coverage && make docs && make test-report &&
python3 tools/traceability.py publish docs/traceability &&
python3 tools/render_plantuml.py`.
Output:
build/index.html — standalone, oeffnen mit Browser
build/index.html — standalone, open in a browser
Verwendung im Release-Bundle:
- Liegt bei demo-epb-vX.Y.Z/index.html
- Verlinkt alle anderen Bundle-Inhalte relativ
Use in the release bundle:
- Lives at demo-epb-vX.Y.Z/index.html
- Links to all other bundle contents using relative paths
"""
from __future__ import annotations
@@ -66,20 +68,11 @@ def collect_docs(rel_dir: str, in_release: bool = False) -> list[tuple[str, str]
if not d.exists():
return out
for f in sorted(d.glob("*.docx")):
# In release bundle, paths are different; here we use relative-to-repo.
href = os.path.relpath(f, REPO)
# If running for in_release context, paths need adjustment, but for now
# we always use repo-relative.
out.append((f.stem, href))
return out
def status_for(path: Path) -> str:
if path.exists():
return "ok"
return "missing"
def kpi_card(label: str, value: str, sub: str = "", color: str = "#1f3864") -> str:
return f"""
<div class='kpi'>
@@ -92,7 +85,7 @@ def kpi_card(label: str, value: str, sub: str = "", color: str = "#1f3864") -> s
def doc_section(title: str, docs: list[tuple[str, str]], description: str = "") -> str:
if not docs:
items = "<li class='cnt'>— keine Dokumente —</li>"
items = "<li class='cnt'>— no documents —</li>"
else:
items = "\n".join(
f'<li><a href="{html.escape(href)}">{html.escape(name)}</a></li>'
@@ -109,7 +102,7 @@ def doc_section(title: str, docs: list[tuple[str, str]], description: str = "")
def report_link(name: str, href: str, exists: bool, desc: str) -> str:
cls = "ok" if exists else "missing"
label = name + ("" if exists else " (nicht generiert — Coverage/Build laufen lassen)")
label = name + ("" if exists else " (not generated — run coverage/build)")
if exists:
return (f"<li><a href='{html.escape(href)}'>{html.escape(label)}</a> "
f"<span class='cnt'>— {html.escape(desc)}</span></li>")
@@ -139,9 +132,9 @@ def main() -> int:
ncs = collect_docs("docs/non-conformities")
misra_r = collect_docs("misra/records")
# Reports — Links zeigen auf BUNDLE-Pfade (relative zum index.html im Deploy).
# Die CI-Pipeline deployt die Artefakte in genau diese Pfade,
# darum ist deren Existenz hier irrelevant — Links werden immer emittiert.
# Reports — links target BUNDLE paths (relative to index.html in deploy).
# The CI pipeline copies artifacts to exactly these paths, so the links
# always resolve in the deployed bundle.
rep_paths = {
"coverage": "coverage/index.html",
"test": "reports/test-report.html",
@@ -149,17 +142,11 @@ def main() -> int:
"trace": "traceability/index.html",
"cppcheck": "reports/cppcheck-report.xml",
}
# Existence-Check zum Anzeigen "Generated?" — gegen den CI/lokalen Build-Pfad.
rep_cov_built = (REPO / "build" / "coverage-html" / "index.html").exists()
rep_test_built = (REPO / "build" / "test-report.html").exists()
rep_api_built = (REPO / "build" / "api-doc" / "html" / "index.html").exists()
rep_trace_built = (REPO / "docs" / "traceability" / "index.html").exists()
rep_cpp_built = (REPO / "build" / "cppcheck-report.xml").exists()
html_body = f"""<!doctype html>
<html lang='de'><head>
<html lang='en'><head>
<meta charset='utf-8'>
<title>demo-epb {html.escape(tag)} — Projekt-Dashboard</title>
<title>demo-epb {html.escape(tag)} — Project Dashboard</title>
<style>
:root {{ color-scheme: light; }}
body {{ font-family: -apple-system, "Segoe UI", sans-serif; margin: 0; padding: 0; color: #222; background: #f5f6f8; }}
@@ -187,71 +174,64 @@ footer {{ text-align: center; color: #888; padding: 30px; font-size: 13px; }}
</style></head>
<body>
<header>
<h1>demo-epb — Elektrische Parkbremse</h1>
<div class='meta'>Version <strong>{html.escape(tag)}</strong> &middot; Commit <code>{html.escape(sha)}</code> &middot; Generiert {html.escape(now)}</div>
<h1>demo-epb — Electric Parking Brake</h1>
<div class='meta'>Version <strong>{html.escape(tag)}</strong> &middot; Commit <code>{html.escape(sha)}</code> &middot; Generated {html.escape(now)}</div>
</header>
<main>
<div class='banner'>
<strong>Demo-Projekt:</strong> Vollstaendige Demo des
<strong>Demo project:</strong> Complete demonstration of the
<a href='https://gitea.slohmaier.com/slohmaier/dev-process'>slohmaier Dev Process</a>.
Diese Software ist bewusst kein Produktivcode, sondern Showcase der Engineering-Methodik.
This software is intentionally not production code; it is a showcase of the engineering method.
</div>
<div class='kpis'>
{kpi_card("Safety Goals", str(n_sg), "ASIL D/D/A/C/B", "#d62728")}
{kpi_card("System Reqs", str(n_sys), f"in reqs/sys/")}
{kpi_card("SW Reqs", str(n_swe), f"in reqs/swe/")}
{kpi_card("Arch-Elemente", f"{n_sa+n_swa}", f"{n_sa} SA + {n_swa} SWA")}
{kpi_card("Komponenten", f"{n_impl}", f"+ {n_stubs} Stubs", "#2ca02c")}
{kpi_card("Unit-Tests", str(n_tests), "Alle gruen", "#2ca02c")}
{kpi_card("Arch Elements", f"{n_sa+n_swa}", f"{n_sa} SA + {n_swa} SWA")}
{kpi_card("Components", f"{n_impl}", f"+ {n_stubs} stubs", "#2ca02c")}
{kpi_card("Unit tests", str(n_tests), "All green", "#2ca02c")}
</div>
<div class='cols'>
<section>
<h2>Plaene (Word)</h2>
<ul>
"""
for name, href in plans:
if not href.startswith("docs/safety") and not href.startswith("docs/manuals"):
html_body += f" <li><a href='{html.escape(href)}'>{html.escape(name)}</a></li>\n"
html_body += " </ul></section>\n"
html_body += doc_section("Funktionale Sicherheit (Word)", safety,
"HARA, Safety Case, FMEDA, Compliance, Verification, Tool-Qualification")
html_body += "<div class='cols'>"
html_body += doc_section("Plans (Word)", plans,
"Project Manual, PID, PM Plan, QA Plan, SWE Plan, Test Plan, CM Plan, RM Plan")
html_body += doc_section("Functional Safety (Word)", safety,
"HARA, Safety Case, FMEDA, Compliance, Verification, Tool Qualification")
html_body += "</div><div class='cols'>"
html_body += doc_section("Manuals (Word)", manuals,
"End-User + Werkstatt-Doku")
"End-user + workshop documentation")
audit_docs = reviews + ncs + misra_r
html_body += doc_section("Audit-Artefakte (Word)", audit_docs,
"Reviews, Non-Conformities, MISRA-Deviation-Records")
html_body += doc_section("Audit Artifacts (Word)", audit_docs,
"Reviews, non-conformities, MISRA deviation records")
html_body += "</div>"
# Reports — Links immer setzen, Bundle-Pfade.
html_body += "<section><h2>Engineering-Reports (CI-generiert)</h2><ul>\n"
html_body += report_link("Traceability-Matrix", rep_paths["trace"], True,
"SG -> SYS -> SA, SWE -> SWA -> Code+Test, bidirektional verifiziert")
html_body += report_link("Test-Summary", rep_paths["test"], True,
f"{n_tests} Unit-Tests mit Anforderungs-Mapping")
# Reports — always emit links, bundle-relative paths.
html_body += "<section><h2>Engineering Reports (CI-generated)</h2><ul>\n"
html_body += report_link("Traceability Matrix", rep_paths["trace"], True,
"SG -> SYS -> SA, SWE -> SWA -> Code+Test, verified bidirectionally")
html_body += report_link("Test Summary", rep_paths["test"], True,
f"{n_tests} unit tests with requirement mapping")
html_body += report_link("Coverage (gcov/lcov)", rep_paths["coverage"], True,
"Statement + Branch Coverage, klickbar bis Zeilen-Level")
html_body += report_link("API-Dokumentation (Doxygen)", rep_paths["api"], True,
"Alle Header + Funktionen, mit @arch/@reqs/@asil")
html_body += report_link("Cppcheck-Report (HTML)", "reports/cppcheck/index.html", True,
"Statische Analyse + MISRA-Findings, klickbar pro Datei")
html_body += report_link("Cppcheck-Report (XML, Roh)", rep_paths["cppcheck"], True,
"Maschinen-lesbares Format fuer eigene Tools")
"Statement + branch coverage, drill down to line level")
html_body += report_link("API Documentation (Doxygen)", rep_paths["api"], True,
"All headers + functions, with @arch/@reqs/@asil")
html_body += report_link("Cppcheck Report (HTML)", "reports/cppcheck/index.html", True,
"Static analysis + MISRA findings, clickable per file")
html_body += report_link("Cppcheck Report (XML, raw)", rep_paths["cppcheck"], True,
"Machine-readable format for your own tools")
html_body += "</ul></section>"
# Diagrams
diagrams = sorted((REPO / "docs" / "diagrams").glob("*.svg"))
if diagrams:
html_body += "<section><h2>Architektur-Diagramme (PlantUML)</h2><ul>"
html_body += "<section><h2>Architecture Diagrams (PlantUML)</h2><ul>"
for d in diagrams:
href = os.path.relpath(d, REPO)
html_body += f" <li><a href='{html.escape(href)}'>{html.escape(d.stem)}</a></li>\n"
@@ -260,24 +240,24 @@ footer {{ text-align: center; color: #888; padding: 30px; font-size: 13px; }}
# Source code links
html_body += """
<section>
<h2>Source-Code</h2>
<h2>Source Code</h2>
<ul>
<li><a href='src/safety_manager.c'>safety_manager.c</a> — Safety Manager (ASIL-D, Hill-Hold + Auto-Apply + Drive-Away)</li>
<li><a href='src/apply_controller.c'>apply_controller.c</a> — Apply Controller (ASIL-D, State Machine)</li>
<li><a href='src/actuator_driver.c'>actuator_driver.c</a> — Actuator Driver (ASIL-B, Overcurrent-Cutoff)</li>
<li><a href='src/safety_manager.c'>safety_manager.c</a> — Safety Manager (ASIL-D: Hill-Hold + Auto-Apply + Drive-Away)</li>
<li><a href='src/apply_controller.c'>apply_controller.c</a> — Apply Controller (ASIL-D, state machine)</li>
<li><a href='src/actuator_driver.c'>actuator_driver.c</a> — Actuator Driver (ASIL-B, overcurrent cutoff)</li>
<li><a href='src/switch_debouncer.c'>switch_debouncer.c</a> — Switch Debouncer (QM)</li>
<li class='cnt'>Plus 6 Stub-Header in <a href='src/stubs/'>src/stubs/</a></li>
<li class='cnt'>Plus 6 stub headers in <a href='src/stubs/'>src/stubs/</a></li>
</ul>
</section>
"""
html_body += f"""
<section>
<h2>Externe Links</h2>
<h2>External Links</h2>
<ul>
<li><a href='https://gitea.slohmaier.com/slohmaier/demo-epb'>Gitea-Repo</a></li>
<li><a href='https://gitea.slohmaier.com/slohmaier/demo-epb'>Gitea repo</a></li>
<li><a href='https://gitea.slohmaier.com/slohmaier/demo-epb/releases'>Releases</a></li>
<li><a href='https://gitea.slohmaier.com/slohmaier/dev-process'>Methodik-Repo (dev-process)</a></li>
<li><a href='https://gitea.slohmaier.com/slohmaier/dev-process'>Methodology repo (dev-process)</a></li>
</ul>
</section>
+11 -11
View File
@@ -2,7 +2,7 @@
"""
Erzeugt einen Test-Summary-Report aus dem Output unserer Unit-Tests.
Liest die Test-Output-Datei (build/test-output.txt) und erzeugt:
Reads the test-output file (build/test-output.txt) and produces:
- build/test-report.md
- build/test-report.html
@@ -67,7 +67,7 @@ def main() -> int:
output = TEST_OUTPUT.read_text()
results = parse_output(output)
if not results:
print("ERROR: keine Test-Suite im Output gefunden.")
print("ERROR: no test suite found in the output.")
return 1
total = sum(r["total"] for r in results)
@@ -77,11 +77,11 @@ def main() -> int:
# Markdown
md = [f"# demo-epb — Test Summary Report\n\n",
f"**Datum:** {now}\n\n",
f"**Gesamt:** {total} Tests, {passed} bestanden, {failed} fehlgeschlagen\n\n",
f"**Date:** {now}\n\n",
f"**Total:** {total} tests, {passed} passed, {failed} failed\n\n",
f"**Status:** {'PASS' if failed == 0 else 'FAIL'}\n\n",
"## Pro Test-Suite\n\n",
"| Suite | Anzahl | Bestanden | Fehlgeschlagen | Anforderungen |\n",
"## Per Test Suite\n\n",
"| Suite | Count | Passed | Failed | Requirements |\n",
"|-------|--------|-----------|-----------------|---------------|\n"]
for r in results:
reqs = ", ".join(reqs_for(r["binary"])) or ""
@@ -113,12 +113,12 @@ def main() -> int:
".pass-badge{background:#0a0}.fail-badge{background:#c00}",
"</style></head><body>",
"<h1>demo-epb — Test Summary Report</h1>",
f"<p><strong>Datum:</strong> {now}</p>",
f"<p><strong>Gesamt:</strong> {total} Tests, {passed} bestanden, {failed} fehlgeschlagen"
f"<p><strong>Date:</strong> {now}</p>",
f"<p><strong>Total:</strong> {total} tests, {passed} passed, {failed} failed"
f"<span class='badge {badge_cls}'>{badge_txt}</span></p>",
"<h2>Pro Test-Suite</h2>",
"<table><tr><th>Suite</th><th>Anzahl</th><th>Bestanden</th>"
"<th>Fehlgeschlagen</th><th>Anforderungen</th></tr>",
"<h2>Per Test Suite</h2>",
"<table><tr><th>Suite</th><th>Count</th><th>Passed</th>"
"<th>Failed</th><th>Requirements</th></tr>",
]
for r in results:
reqs = ", ".join(reqs_for(r["binary"])) or ""
+21 -21
View File
@@ -1,17 +1,17 @@
#!/usr/bin/env python3
"""
Traceability-Werkzeug fuer demo-epb.
Traceability tool for demo-epb.
Liest Markdown-Items aus safety/sg, reqs/sys, reqs/swe, arch/sys, arch/swe und
verifiziert die Traceability-Kette:
Reads Markdown items from safety/sg, reqs/sys, reqs/swe, arch/sys, arch/swe and
verifies the traceability chain:
SG <-- SYS <-- SA
<-- SWE <-- SWA <-- Code (@arch)
<-- Tests (@reqs)
Subcommands:
check Validiert Konsistenz, exit 1 bei Fehlern
publish DIR Schreibt HTML + JSON nach DIR/
check Validates consistency, exits 1 on errors
publish DIR Writes HTML + JSON to DIR/
Run:
python3 tools/traceability.py check
@@ -160,27 +160,27 @@ def check_code_test_mapping(items: dict[str, Item]) -> list[str]:
src = REPO / src_rel
arch_tags, _ = extract_tags(src)
if swa_id not in arch_tags:
errors.append(f"{src_rel}: header @arch enthaelt {swa_id} nicht "
f"(gefunden: {arch_tags or ''})")
errors.append(f"{src_rel}: header @arch does not contain {swa_id} "
f"(found: {arch_tags or ''})")
# For each test, verify @reqs covers the SWE that the corresponding SWA links to
for test_file, swa_id in IMPLEMENTED_TESTS.items():
test_path = REPO / "tests" / "unit" / test_file
_, reqs_in_test = extract_tags(test_path)
if not reqs_in_test:
errors.append(f"tests/unit/{test_file}: kein @reqs Tag im Header")
errors.append(f"tests/unit/{test_file}: no @reqs tag in header")
continue
swa = items.get(swa_id)
if swa is None:
errors.append(f"tests/unit/{test_file}: referenziertes "
f"{swa_id} nicht gefunden")
errors.append(f"tests/unit/{test_file}: referenced "
f"{swa_id} not found")
continue
swa_swe = set(swa.links)
test_swe = set(reqs_in_test)
missing = swa_swe - test_swe
if missing:
errors.append(f"tests/unit/{test_file}: deckt nicht alle SWE "
f"der {swa_id} ab — fehlend: {sorted(missing)}")
errors.append(f"tests/unit/{test_file}: does not cover all SWE of "
f"{swa_id} — missing: {sorted(missing)}")
return errors
@@ -241,7 +241,7 @@ def cmd_check(items: dict[str, Item]) -> int:
for e in errors:
print(f" - {e}")
return 1
print("OK — Traceability vollstaendig (SG → SYS → SA, SWE → SWA → Code+Test).")
print("OK — Traceability complete (SG → SYS → SA, SWE → SWA → Code+Test).")
return 0
@@ -314,7 +314,7 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
".missing{color:#c00}",
"</style></head><body>",
"<h1>demo-epb — Traceability Matrix</h1>",
"<p>Vollstaendige Kette: <code>SG → SYS → SA, SWE → SWA → Code (@arch) + Test (@reqs)</code></p>",
"<p>Complete chain: <code>SG → SYS → SA, SWE → SWA → Code (@arch) + Test (@reqs)</code></p>",
"<p>",
]
for p, _, label in SOURCES:
@@ -325,9 +325,9 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
parts.append("<table>")
parts.append(
"<tr><th>Safety Goal</th><th>System-Requirement</th>"
"<th>System-Arch</th><th>Software-Req</th>"
"<th>Software-Arch</th><th>Code</th><th>Test</th></tr>"
"<tr><th>Safety Goal</th><th>System Requirement</th>"
"<th>System Arch</th><th>Software Req</th>"
"<th>Software Arch</th><th>Code</th><th>Test</th></tr>"
)
def cell_items(ids: list[str]) -> str:
@@ -377,8 +377,8 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
parts.append("</table>")
# Code/Test details
parts.append("<h2>Code → Architektur</h2>")
parts.append("<table><tr><th>Datei</th><th>@arch</th><th>@reqs</th></tr>")
parts.append("<h2>Code → Architecture</h2>")
parts.append("<table><tr><th>File</th><th>@arch</th><th>@reqs</th></tr>")
for swa_id, src_rel in IMPLEMENTED_SWA.items():
arch, reqs = extract_tags(REPO / src_rel)
parts.append(
@@ -388,8 +388,8 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
)
parts.append("</table>")
parts.append("<h2>Test → Anforderungen</h2>")
parts.append("<table><tr><th>Test-Datei</th><th>Decklt SWA</th><th>@reqs</th></tr>")
parts.append("<h2>Test → Requirements</h2>")
parts.append("<table><tr><th>Test file</th><th>Covers SWA</th><th>@reqs</th></tr>")
for test_file, swa_id in IMPLEMENTED_TESTS.items():
_, reqs = extract_tags(REPO / "tests" / "unit" / test_file)
parts.append(