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 # SWA-001: Safety Manager
## Verantwortung ## Responsibility
Hoechste Sicherheitsschicht. Erkennt Motor-Aus, aktiviert Hill-Hold, Highest safety layer. Detects engine-off, activates hill-hold,
triggert Auto-Apply. Lebenswichtige Logik mit redundanter Pruefung. triggers auto-apply. Life-critical logic with redundant checks.
## Statische Sicht ## Static view
```plantuml ```plantuml
@startuml @startuml
@@ -31,20 +31,20 @@ package "Safety Manager" {
[Hill-Hold Logic] [Hill-Hold Logic]
[Auto-Apply Logic] [Auto-Apply Logic]
} }
[Safety Manager] ..> [Apply Controller] : Apply-Anforderung [Safety Manager] ..> [Apply Controller] : apply request
[Wheel Speed Plausi] --> [Safety Manager] : v_vehicle [Wheel Speed Plausi] --> [Safety Manager] : v_vehicle
[Inclinometer Filter] --> [Safety Manager] : grade [Inclinometer Filter] --> [Safety Manager] : grade
@enduml @enduml
``` ```
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status safety_mgr_init(void); Status safety_mgr_init(void);
void safety_mgr_step_50ms(const SafetyInputs* in); void safety_mgr_step_50ms(const SafetyInputs* in);
``` ```
## Dynamisches Verhalten ## Dynamic behaviour
```plantuml ```plantuml
@startuml @startuml
@@ -58,16 +58,16 @@ AutoApplyTriggered --> Idle : applied
@enduml @enduml
``` ```
## Ressourcen ## Resources
- Stack: <= 256 B - 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-007 | engine_off + v<0.5 in step_50ms |
| SWE-008 | 2s-Filter und Trigger | | SWE-008 | 2 s filter and trigger |
| SWE-009 | Hill-Hold-Aktivierung | | SWE-009 | hill-hold activation |
| SWE-010 | Brake-Released-Detektion | | SWE-010 | brake-released detection |
+22 -21
View File
@@ -16,12 +16,13 @@ asil: D
# SWA-002: Apply Controller # SWA-002: Apply Controller
## Verantwortung ## Responsibility
Zentraler Controller fuer Apply, Hold und Release der Parkbremse. Central controller for apply, hold and release of the parking brake.
ASIL-D-Kern der EPB-Software. Implementiert in `src/apply_controller.c`. ASIL-D core of the EPB software. Implemented in
`src/apply_controller.c`.
## Statische Sicht ## Static view
```plantuml ```plantuml
@startuml @startuml
@@ -34,7 +35,7 @@ ASIL-D-Kern der EPB-Software. Implementiert in `src/apply_controller.c`.
@enduml @enduml
``` ```
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status apply_ctrl_init(void); Status apply_ctrl_init(void);
@@ -42,7 +43,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in);
EpbStatus apply_ctrl_get_status(void); EpbStatus apply_ctrl_get_status(void);
``` ```
## Dynamisches Verhalten ## Dynamic behaviour
```plantuml ```plantuml
@startuml @startuml
@@ -58,24 +59,24 @@ Error --> Released : reset & no fault
@enduml @enduml
``` ```
## Ressourcen ## Resources
- Stack: <= 384 B - Stack: <= 384 B
- Worst-Case Timing: 350 us / Aufruf - Worst-case timing: 350 us per call
## Designentscheidungen ## Design decisions
| Entscheidung | Begruendung | | Decision | Rationale |
|--------------|-------------| |----------|-----------|
| Statische Allokation, kein Heap | Determinismus, MISRA C 21.3 | | Static allocation, no heap | Determinism, MISRA C 21.3 |
| State Machine | Einfacher zu verifizieren, deterministisch | | State machine | Easier to verify, deterministic |
| 50ms Step-Funktion | Synchron zur Inclinometer-Abtastung | | 50 ms step function | Synchronous with inclinometer sample rate |
## Mapping auf Anforderungen ## Mapping to requirements
| Anforderung | Wie abgedeckt | | Requirement | How covered |
|-------------|---------------| |-------------|-------------|
| SWE-001 | Hold-Zustand mit periodischer Klemmkraft-Pruefung | | SWE-001 | Hold state with periodic clamping-force check |
| SWE-002 | Watchdog-Pet im step_50ms | | SWE-002 | Watchdog pet in step_50ms |
| SWE-003 | sw_apply Input wird sofort ausgewertet | | SWE-003 | sw_apply input is evaluated immediately |
| SWE-004 | Current-Target-Detektion via Actuator-Driver-Feedback | | SWE-004 | current-target detection via actuator-driver feedback |
+16 -16
View File
@@ -15,13 +15,13 @@ asil: B
# SWA-003: Actuator Driver # SWA-003: Actuator Driver
## Verantwortung ## Responsibility
Low-Level-Ansteuerung der beiden Aktor-Motoren. PWM-Generierung, Low-level control of the two actuator motors. PWM generation,
Strom-Messung, Overcurrent-Cutoff, Klemmkraft-Schaetzung. current measurement, overcurrent cutoff, clamping-force estimation.
Implementiert in `src/actuator_driver.c`. Implemented in `src/actuator_driver.c`.
## Statische Sicht ## Static view
```plantuml ```plantuml
@startuml @startuml
@@ -32,7 +32,7 @@ Implementiert in `src/actuator_driver.c`.
@enduml @enduml
``` ```
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status actuator_init(void); 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_release(ActuatorId id, uint8_t pwm_percent);
void actuator_stop(ActuatorId id); void actuator_stop(ActuatorId id);
ActuatorStatus actuator_get_status(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 - Stack: <= 256 B
- Worst-Case Timing: 50 us / ISR - Worst-case timing: 50 us per ISR
- Static RAM: 64 B pro Aktor - Static RAM: 64 B per actuator
## Mapping auf Anforderungen ## Mapping to requirements
| Anforderung | Wie abgedeckt | | Requirement | How covered |
|-------------|---------------| |-------------|-------------|
| SWE-006 | actuator_release fuer beide Aktoren parallel | | SWE-006 | actuator_release for both actuators in parallel |
| SWE-013 | actuator_isr_1khz | | SWE-013 | actuator_isr_1khz |
| SWE-014 | Overcurrent-Detektor in ISR | | SWE-014 | overcurrent detector in ISR |
| SWE-015 | Peak-Current-Tracking + lineare Klemmkraft-Schaetzung | | SWE-015 | peak-current tracking + linear clamping-force estimate |
+6 -6
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'Wheel Speed Plausibilisierung' header: 'Wheel Speed Plausibilisation'
level: 1.4 level: 1.4
normative: true normative: true
reviewed: null reviewed: null
@@ -11,14 +11,14 @@ links:
asil: B asil: B
--- ---
# SWA-004: Wheel Speed Plausibilisierung # SWA-004: Wheel Speed Plausibilisation
## Verantwortung ## Responsibility
Aufbereitung und Plausibilisierung der 4 Wheel-Speed-Signale. Erkennt Conditioning and plausibilisation of the four wheel-speed signals.
Stillstand und plausibilisiert untereinander. Detects standstill and cross-checks the wheels.
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status wheel_speed_init(void); Status wheel_speed_init(void);
+4 -3
View File
@@ -12,11 +12,12 @@ asil: B
# SWA-005: Inclinometer Filter # 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 ```c
Status inclino_init(void); Status inclino_init(void);
+9 -8
View File
@@ -12,12 +12,13 @@ asil: QM
# SWA-006: Switch Debouncer # SWA-006: Switch Debouncer
## Verantwortung ## Responsibility
Software-Entprellung des EPB-Schalters. Liefert stabiles Apply / Release Software debouncing of the EPB switch. Provides a stable apply /
Signal an den Apply-Controller. Implementiert in `src/switch_debouncer.c`. release signal to the apply controller. Implemented in
`src/switch_debouncer.c`.
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status switch_init(void); Status switch_init(void);
@@ -25,8 +26,8 @@ void switch_step_10ms(SwitchRaw raw);
SwitchState switch_get_state(void); SwitchState switch_get_state(void);
``` ```
## Mapping auf Anforderungen ## Mapping to requirements
| Anforderung | Wie abgedeckt | | Requirement | How covered |
|-------------|---------------| |-------------|-------------|
| SWE-025 | 50ms Debounce-Logik | | SWE-025 | 50 ms debounce logic |
+5 -5
View File
@@ -13,15 +13,15 @@ asil: QM
# SWA-007: Display Manager # SWA-007: Display Manager
## Verantwortung ## Responsibility
Steuert LED am EPB-Schalter und CAN-Status-Frame an das Kombi-Display. Drives the LED on the EPB switch and the CAN status frame to the
Empfaengt Status vom Apply-Controller. instrument cluster. Receives status from the apply controller.
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status display_init(void); Status display_init(void);
void display_set_status(EpbStatus s); 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 # 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 ```c
Status diag_init(void); Status diag_init(void);
+4 -3
View File
@@ -13,7 +13,8 @@ asil: QM
# SWA-009: Service Mode # SWA-009: Service Mode
## Verantwortung ## Responsibility
Service-Modus fuer Werkstatt. Wird ueber UDS RoutineControl 0x31, Routine-ID Service mode for the workshop. Activated via UDS RoutineControl
0x0301 aktiviert. Steuert Aktoren in Wartungsposition. 0x31, routine ID 0x0301. Drives the actuators into maintenance
position.
+4 -4
View File
@@ -13,12 +13,12 @@ asil: QM
# SWA-010: Logger # SWA-010: Logger
## Verantwortung ## Responsibility
Logging fuer Entwicklung und Service. Ringpuffer im RAM (1 KB) sowie Logging for development and service. Ring buffer in RAM (1 KB)
Persistenz im EEPROM bei kritischen Ereignissen. plus persistence in EEPROM on critical events.
## Schnittstellen (Provided) ## Provided interfaces
```c ```c
Status log_init(void); Status log_init(void);
+30 -30
View File
@@ -21,28 +21,28 @@ asil: D
# SA-001: EPB ECU # SA-001: EPB ECU
## Verantwortung ## Responsibility
Zentrales Steuergeraet der elektrischen Parkbremse. Beinhaltet alle Software- Central control unit of the electric parking brake. Contains all
Komponenten und die elektronische Ansteuerung der Aktoren. software components and the electronic actuation of the actuators.
## System-Kontext ## System context
```plantuml ```plantuml
@startuml @startuml
node "EPB ECU" as ECU node "EPB ECU" as ECU
node "Aktor links" as AL node "Actuator left" as AL
node "Aktor rechts" as AR node "Actuator right" as AR
node "Wheel Speed Sensoren (x4)" as WS node "Wheel-speed sensors (x4)" as WS
node "Inclinometer" as IN node "Inclinometer" as IN
node "EPB-Schalter + LED" as SW node "EPB switch + LED" as SW
node "CAN-Bus" as CAN node "CAN bus" as CAN
node "Kombi-Display" as DI node "Instrument cluster" as DI
node "OBD-Tester" as OBD node "OBD tester" as OBD
ECU --> AL : PWM, I-Mess ECU --> AL : PWM, I-meas
ECU --> AR : PWM, I-Mess ECU --> AR : PWM, I-meas
WS --> ECU : Pulse WS --> ECU : pulses
IN --> ECU : SPI IN --> ECU : SPI
SW --> ECU : GPIO SW --> ECU : GPIO
ECU --> SW : LED ECU --> SW : LED
@@ -52,24 +52,24 @@ CAN <-> OBD
@enduml @enduml
``` ```
## Schnittstellen ## Interfaces
| Schnittstelle | Typ | Richtung | | Interface | Type | Direction |
|---------------|----------------|----------| |---------------|------------------|-----------|
| Aktor L/R | PWM + Shunt | I/O | | Actuator L/R | PWM + shunt | I/O |
| Wheel Speed | Hall-Pulse | In | | Wheel speed | Hall pulses | in |
| Inclinometer | SPI | In | | Inclinometer | SPI | in |
| Schalter | GPIO debounced | In | | Switch | GPIO debounced | in |
| LED | GPIO | Out | | LED | GPIO | out |
| CAN | ISO 11898 | I/O | | 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 - Worst-case reaction time (switch to actuator motion): 250 ms
- Flash-Bedarf: < 256 KB - Flash demand: < 256 KB
- RAM-Bedarf: < 32 KB - RAM demand: < 32 KB
- Stromaufnahme: < 200 mA (Standby) / < 30 A (Aktor-Spitze) - Current: < 200 mA (standby) / < 30 A (actuator peak)
+17 -17
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'Aktoren (Caliper-Motoren)' header: 'Actuators (calliper motors)'
level: 1.2 level: 1.2
normative: true normative: true
reviewed: null reviewed: null
@@ -13,25 +13,25 @@ links:
asil: D asil: D
--- ---
# SA-002: Aktoren (Caliper-Motoren) # SA-002: Actuators (calliper motors)
## Verantwortung ## Responsibility
Zwei elektromechanische Aktoren an den hinteren Bremssaetteln klemmen Two electromechanical actuators on the rear callipers clamp and
und loesen die Bremsbelaege. Geliefert (Annahme): kommerzielles Bauteil release the brake pads. Supplied (assumption): commercial component
eines Tier-1-Lieferanten. from a Tier-1 supplier.
## Schnittstellen ## Interfaces
| Schnittstelle | Typ | Bemerkung | | Interface | Type | Notes |
|---------------|--------------|-----------------------------------| |---------------|--------------|---------------------------------|
| Power | 12 V, PWM | bidirektional fuer Apply/Release | | Power | 12 V, PWM | bidirectional for apply/release |
| Strom-Shunt | Analog | wird in der ECU abgegriffen | | Current shunt | analog | sampled inside the ECU |
## Nichtfunktionale Eigenschaften ## Non-functional properties
- Max. Klemmkraft: 20 kN - Max clamping force: 20 kN
- Apply-Zeit (0 → max): 600 ms - Apply time (0 → max): 600 ms
- Strom (nominal): 4 A - Nominal current: 4 A
- Strom (Spitze): 30 A (kurzzeitig) - Peak current: 30 A (brief)
- Temperaturbereich: -40°C bis +85°C - Temperature range: -40 °C to +85 °C
+19 -19
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'Sensor-Cluster' header: 'Sensor cluster'
level: 1.3 level: 1.3
normative: true normative: true
reviewed: null reviewed: null
@@ -12,27 +12,27 @@ links:
asil: B asil: B
--- ---
# SA-003: Sensor-Cluster # SA-003: Sensor cluster
## Verantwortung ## Responsibility
Zusammenfassung aller fuer die EPB benoetigten Eingangssignale: Summary of all input signals required by the EPB: wheel-speed
Wheel-Speed-Sensoren (4x), Inclinometer (1x), EPB-Schalter, Bremspedal- sensors (4x), inclinometer (1x), EPB switch, brake-pedal status,
Status, Gear-Position, Door-Open, Seat-Belt — die letzten vier per CAN. gear position, door open, seatbelt — the last four via CAN.
## Schnittstellen ## Interfaces
| Sensor | Typ | Quelle | | Sensor | Type | Source |
|-----------------|------------------|--------------| |-----------------|--------------|------------|
| Wheel Speed x4 | Hall-Pulse | direkt | | Wheel speed x4 | Hall pulses | direct |
| Inclinometer | SPI 1 kHz | direkt | | Inclinometer | SPI 1 kHz | direct |
| EPB-Schalter | GPIO | direkt | | EPB switch | GPIO | direct |
| Bremspedal | CAN 0x100 | aus BCM | | Brake pedal | CAN 0x100 | from BCM |
| Gear | CAN 0x110 | aus TCU | | Gear | CAN 0x110 | from TCU |
| Door / Belt | CAN 0x120 | aus BCM | | Door / belt | CAN 0x120 | from BCM |
## Nichtfunktionale Eigenschaften ## Non-functional properties
- Wheel-Speed-Genauigkeit: +/- 0.1 km/h ab 1 km/h - Wheel-speed accuracy: +/- 0.1 km/h above 1 km/h
- Inclinometer-Genauigkeit: +/- 0.5° - Inclinometer accuracy: +/- 0.5°
- Sampling-Frequenz Inclinometer: 100 Hz - Inclinometer sampling rate: 100 Hz
+11 -11
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'HMI (Schalter, LED, Display)' header: 'HMI (switch, LED, display)'
level: 1.4 level: 1.4
normative: true normative: true
reviewed: null reviewed: null
@@ -11,17 +11,17 @@ links:
asil: QM asil: QM
--- ---
# SA-004: HMI (Schalter, LED, Display) # SA-004: HMI (switch, LED, display)
## Verantwortung ## Responsibility
Fahrer-Interaktion und -Information: Tippschalter mit integrierter LED, Driver interaction and information: tap switch with integrated LED,
Statusanzeige im Kombi-Display via CAN. status display in the instrument cluster via CAN.
## Schnittstellen ## Interfaces
| Element | Typ | Verhalten | | Element | Type | Behaviour |
|---------------|----------|--------------------------------------------| |---------------|----------|-------------------------------------------|
| Tippschalter | GPIO | Apply-Richtung / Release-Richtung | | Tap switch | GPIO | apply direction / release direction |
| LED | GPIO | aus / an / blink 2 Hz / blink 4 Hz | | LED | GPIO | off / on / blink 2 Hz / blink 4 Hz |
| Display | CAN 0x3A0 | 50 Hz Status-Frame | | Display | CAN 0x3A0| 50 Hz status frame |
+11 -10
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'CAN-Bus' header: 'CAN bus'
level: 1.5 level: 1.5
normative: true normative: true
reviewed: null reviewed: null
@@ -11,16 +11,17 @@ links:
asil: QM asil: QM
--- ---
# SA-005: CAN-Bus # SA-005: CAN bus
## Verantwortung ## Responsibility
Kommunikations-Backbone fuer Eingangsdaten (Bremspedal, Gang, Tuer, Gurt), Communication backbone for input data (brake pedal, gear, door,
Ausgabe (Status-Frame an Display) und Diagnose (UDS auf Tester-Adresse). belt), output (status frame to the display) and diagnostics (UDS
on the tester address).
## Schnittstellen ## Interfaces
- Baudrate: 500 kbit/s, CAN 2.0B - Baud rate: 500 kbit/s, CAN 2.0B
- Empfangene Frames: 0x100 (Bremspedal), 0x110 (Gang), 0x120 (Door/Belt), - Received frames: 0x100 (brake pedal), 0x110 (gear),
0x712 (UDS-Request) 0x120 (door/belt), 0x712 (UDS request)
- Gesendete Frames: 0x3A0 (Status 50 Hz), 0x71A (UDS-Response) - 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} .missing{color:#c00}
</style></head><body> </style></head><body>
<h1>demo-epb — Traceability Matrix</h1> <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> <p>
<strong>SG:</strong> 5 &nbsp; <strong>SG:</strong> 5 &nbsp;
<strong>SYS:</strong> 10 &nbsp; <strong>SYS:</strong> 10 &nbsp;
@@ -25,125 +25,125 @@ h1{color:#1f3864}h2{color:#1f3864;margin-top:30px}
<strong>Test-Files:</strong> 4 <strong>Test-Files:</strong> 4
</p> </p>
<table> <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> <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'>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'>Halten 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'>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'>Aktoren (Caliper-Motoren)</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 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'>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 Plausibilisierung</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'>src/apply_controller.c</div></td>
<td><div class='id'>tests/unit/test_apply_controller.c</div></td> <td><div class='id'>tests/unit/test_apply_controller.c</div></td>
</tr> </tr>
<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'>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 bei Motor-Aus</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'>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><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'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td> <td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr> </tr>
<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'>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 auf Fahrer-Anforderung</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'>Aktoren (Caliper-Motoren)</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'>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'>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 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'>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'>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> <td><div class='id'>tests/unit/test_apply_controller.c</div><div class='id'>tests/unit/test_switch_debouncer.c</div></td>
</tr> </tr>
<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'>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 am Berg</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'>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'>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><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'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td> <td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr> </tr>
<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'>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'>Aktor-Stromueberwachung</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'>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'>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'>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'>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 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 Plausibilisation</div></td>
<td><div class='id'>src/actuator_driver.c</div></td> <td><div class='id'>src/actuator_driver.c</div></td>
<td><div class='id'>tests/unit/test_actuator_driver.c</div></td> <td><div class='id'>tests/unit/test_actuator_driver.c</div></td>
</tr> </tr>
<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'>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 am Berg</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'>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'>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><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'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td> <td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr> </tr>
<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'>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 beim Anfahren (Drive-Away-Assist)</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'>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'>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 Plausibilisierung</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'>src/safety_manager.c</div></td>
<td><div class='id'>tests/unit/test_safety_manager.c</div></td> <td><div class='id'>tests/unit/test_safety_manager.c</div></td>
</tr> </tr>
<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'>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 auf Fahrer-Anforderung</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'>Aktoren (Caliper-Motoren)</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'>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'>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 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'>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'>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> <td><div class='id'>tests/unit/test_apply_controller.c</div><div class='id'>tests/unit/test_switch_debouncer.c</div></td>
</tr> </tr>
<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'>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 auf Fahrer-Anforderung</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'>Aktoren (Caliper-Motoren)</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'>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'>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><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'>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> <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>
<tr> <tr>
<td class='missing'></td> <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'>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 (Schalter, LED, 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></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'>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><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>
<td class='cnt'></td> <td class='cnt'></td>
</tr> </tr>
<tr> <tr>
<td class='missing'></td> <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'>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'>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'>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><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>
<td class='cnt'></td> <td class='cnt'></td>
</tr> </tr>
<tr> <tr>
<td class='missing'></td> <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'>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 (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'>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-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'>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><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>
<td class='cnt'></td> <td class='cnt'></td>
</tr> </tr>
</table> </table>
<h2>Code → Architektur</h2> <h2>Code → Architecture</h2>
<table><tr><th>Datei</th><th>@arch</th><th>@reqs</th></tr> <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/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/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/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> <tr><td class='id'>src/switch_debouncer.c</td><td>SWA-006</td><td class='cnt'>SWE-025</td></tr>
</table> </table>
<h2>Test → Anforderungen</h2> <h2>Test → Requirements</h2>
<table><tr><th>Test-Datei</th><th>Decklt SWA</th><th>@reqs</th></tr> <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_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_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> <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": { "sys": {
"id": "SYS-001", "id": "SYS-001",
"asil": "D", "asil": "D",
"title": "Halten der Parkbremse im Stillstand" "title": "Holding the parking brake at standstill"
}, },
"sa": [ "sa": [
{ {
@@ -58,7 +58,7 @@
"sys": { "sys": {
"id": "SYS-004", "id": "SYS-004",
"asil": "D", "asil": "D",
"title": "Auto-Apply bei Motor-Aus" "title": "Auto-apply on engine off"
}, },
"sa": [ "sa": [
{ {
@@ -97,7 +97,7 @@
"sys": { "sys": {
"id": "SYS-002", "id": "SYS-002",
"asil": "D", "asil": "D",
"title": "Apply auf Fahrer-Anforderung" "title": "Apply on driver request"
}, },
"sa": [ "sa": [
{ {
@@ -158,7 +158,7 @@
"sys": { "sys": {
"id": "SYS-005", "id": "SYS-005",
"asil": "D", "asil": "D",
"title": "Hill-Hold am Berg" "title": "Hill-hold on an incline"
}, },
"sa": [ "sa": [
{ {
@@ -209,7 +209,7 @@
"sys": { "sys": {
"id": "SYS-007", "id": "SYS-007",
"asil": "B", "asil": "B",
"title": "Aktor-Stromueberwachung" "title": "Actuator current monitoring"
}, },
"sa": [ "sa": [
{ {
@@ -268,7 +268,7 @@
"sys": { "sys": {
"id": "SYS-005", "id": "SYS-005",
"asil": "D", "asil": "D",
"title": "Hill-Hold am Berg" "title": "Hill-hold on an incline"
}, },
"sa": [ "sa": [
{ {
@@ -319,7 +319,7 @@
"sys": { "sys": {
"id": "SYS-006", "id": "SYS-006",
"asil": "B", "asil": "B",
"title": "Auto-Release beim Anfahren (Drive-Away-Assist)" "title": "Auto-release on drive-away (Drive-Away Assist)"
}, },
"sa": [ "sa": [
{ {
@@ -370,7 +370,7 @@
"sys": { "sys": {
"id": "SYS-002", "id": "SYS-002",
"asil": "D", "asil": "D",
"title": "Apply auf Fahrer-Anforderung" "title": "Apply on driver request"
}, },
"sa": [ "sa": [
{ {
@@ -431,7 +431,7 @@
"sys": { "sys": {
"id": "SYS-003", "id": "SYS-003",
"asil": "B", "asil": "B",
"title": "Release auf Fahrer-Anforderung" "title": "Release on driver request"
}, },
"sa": [ "sa": [
{ {
@@ -487,7 +487,7 @@
"sys": { "sys": {
"id": "SYS-008", "id": "SYS-008",
"asil": "QM", "asil": "QM",
"title": "Service-Modus fuer Werkstatt" "title": "Service mode for the workshop"
}, },
"sa": [ "sa": [
{ {
@@ -523,7 +523,7 @@
"sys": { "sys": {
"id": "SYS-009", "id": "SYS-009",
"asil": "QM", "asil": "QM",
"title": "UDS-Diagnose" "title": "UDS diagnostics"
}, },
"sa": [ "sa": [
{ {
@@ -563,7 +563,7 @@
"sys": { "sys": {
"id": "SYS-010", "id": "SYS-010",
"asil": "QM", "asil": "QM",
"title": "HMI-Statusanzeige" "title": "HMI status display"
}, },
"sa": [ "sa": [
{ {
+3 -3
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'Apply-Controller haelt Klemmkraft' header: 'Apply controller maintains clamping force'
level: 1.1 level: 1.1
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Watchdog ueberwacht Apply-Controller' header: 'Watchdog monitors the apply controller'
level: 1.2 level: 1.2
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Schalter-Apply-Signal an Apply-Controller weiterleiten' header: 'Forward switch apply signal to the apply controller'
level: 1.3 level: 1.3
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Klemmkraft-Erreichen bestaetigen' header: 'Confirm target clamping force reached'
level: 1.4 level: 1.4
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Release-Voraussetzungen pruefen' header: 'Check release preconditions'
level: 1.5 level: 1.5
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Aktoren in Release-Position fahren' header: 'Drive actuators into release position'
level: 1.6 level: 1.6
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Motor-Aus-Bedingung erkennen' header: 'Detect engine-off condition'
level: 1.7 level: 1.7
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Auto-Apply nach 2 s Verzoegerung' header: 'Auto-apply after 2 s delay'
level: 1.8 level: 1.8
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Hill-Hold-Aktivierungsbedingung' header: 'Hill-hold activation condition'
level: 1.9 level: 1.9
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Hill-Hold-Uebergabe an Apply-Controller' header: 'Hill-hold handover to the apply controller'
level: 1.10 level: 1.10
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Anfahrabsicht erkennen' header: 'Detect drive-away intent'
level: 1.11 level: 1.11
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Sicherheits-Check vor Auto-Release' header: 'Safety check before auto-release'
level: 1.12 level: 1.12
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Strommessung mit 1 kHz' header: 'Current sampling at 1 kHz'
level: 1.13 level: 1.13
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Overcurrent-Cutoff' header: 'Overcurrent cutoff'
level: 1.14 level: 1.14
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Klemmkraft-Schaetzung aus Strom-Profil' header: 'Clamping force estimation from current profile'
level: 1.15 level: 1.15
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'UDS RoutineControl 0x31 fuer Service-Release' header: 'UDS RoutineControl 0x31 for service release'
level: 1.16 level: 1.16
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'Service-Mode-Indikator' header: 'Service mode indicator'
level: 1.17 level: 1.17
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'UDS Service 0x19 ReadDTC' header: 'UDS service 0x19 ReadDTC'
level: 1.18 level: 1.18
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'UDS Service 0x22 ReadDataByIdentifier' header: 'UDS service 0x22 ReadDataByIdentifier'
level: 1.19 level: 1.19
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'LED-Steuerung' header: 'LED control'
level: 1.20 level: 1.20
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'CAN-Status-Frame' header: 'CAN status frame'
level: 1.21 level: 1.21
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'Stillstands-Erkennung aus Wheel Speeds' header: 'Standstill detection from wheel speeds'
level: 1.22 level: 1.22
normative: true normative: true
reviewed: null reviewed: null
@@ -12,6 +12,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Wheel Speed Plausibilisierung' header: 'Wheel-speed plausibilisation'
level: 1.23 level: 1.23
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Inclinometer Tiefpass-Filter' header: 'Inclinometer low-pass filter'
level: 1.24 level: 1.24
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Switch-Debouncing' header: 'Switch debouncing'
level: 1.25 level: 1.25
normative: true normative: true
reviewed: null reviewed: null
@@ -11,6 +11,6 @@ links:
asil: QM 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 active: true
derived: false derived: false
header: 'Halten der Parkbremse im Stillstand' header: 'Holding the parking brake at standstill'
level: 1.1 level: 1.1
normative: true normative: true
reviewed: null reviewed: null
@@ -10,8 +10,8 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Apply auf Fahrer-Anforderung' header: 'Apply on driver request'
level: 1.2 level: 1.2
normative: true normative: true
reviewed: null reviewed: null
@@ -11,6 +11,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Release auf Fahrer-Anforderung' header: 'Release on driver request'
level: 1.3 level: 1.3
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Auto-Apply bei Motor-Aus' header: 'Auto-apply on engine off'
level: 1.4 level: 1.4
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Hill-Hold am Berg' header: 'Hill-hold on an incline'
level: 1.5 level: 1.5
normative: true normative: true
reviewed: null reviewed: null
@@ -11,6 +11,6 @@ links:
asil: D 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 active: true
derived: false derived: false
header: 'Auto-Release beim Anfahren (Drive-Away-Assist)' header: 'Auto-release on drive-away (Drive-Away Assist)'
level: 1.6 level: 1.6
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Aktor-Stromueberwachung' header: 'Actuator current monitoring'
level: 1.7 level: 1.7
normative: true normative: true
reviewed: null reviewed: null
@@ -10,6 +10,6 @@ links:
asil: B 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 active: true
derived: false derived: false
header: 'Service-Modus fuer Werkstatt' header: 'Service mode for the workshop'
level: 1.8 level: 1.8
normative: true normative: true
reviewed: null reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM 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 active: true
derived: false derived: false
header: 'UDS-Diagnose' header: 'UDS diagnostics'
level: 1.9 level: 1.9
normative: true normative: true
reviewed: null reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM 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 active: true
derived: false derived: false
header: 'HMI-Statusanzeige' header: 'HMI status display'
level: 1.10 level: 1.10
normative: true normative: true
reviewed: null reviewed: null
@@ -9,6 +9,6 @@ links: []
asil: QM 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 active: true
derived: false derived: false
header: 'Kein ungewolltes Loesen der Parkbremse im Stillstand' header: 'No unintended release of the parking brake during standstill'
level: 1.1 level: 1.1
normative: true normative: true
reviewed: null reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: D 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). **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 active: true
derived: false derived: false
header: 'Kein ungewolltes Festklemmen waehrend der Fahrt' header: 'No unintended clamping while driving'
level: 1.2 level: 1.2
normative: true normative: true
reviewed: null reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: D 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. **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 active: true
derived: false derived: false
header: 'Schutz gegen Aktor-Ueberlast' header: 'Protection against actuator overload'
level: 1.3 level: 1.3
normative: true normative: true
reviewed: null reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: A 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. **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 active: true
derived: false derived: false
header: 'Zuverlaessige Hill-Hold-Uebergabe' header: 'Reliable hill-hold handover'
level: 1.4 level: 1.4
normative: true normative: true
reviewed: null reviewed: null
@@ -9,9 +9,9 @@ links: []
asil: C 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. **FTTI:** 500 ms.
**Safe State:** Apply einleiten. **Safe state:** Initiate apply.
+4 -4
View File
@@ -1,7 +1,7 @@
--- ---
active: true active: true
derived: false derived: false
header: 'Reaktion auf Fahreranforderung' header: 'Response to driver requests'
level: 1.5 level: 1.5
normative: true normative: true
reviewed: null reviewed: null
@@ -9,8 +9,8 @@ links: []
asil: B 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 #!/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 Scans the repo for Word documents, reports, code, tests, architecture, and
schreibt build/index.html mit klickbaren Links. 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: Output:
build/index.html — standalone, oeffnen mit Browser build/index.html — standalone, open in a browser
Verwendung im Release-Bundle: Use in the release bundle:
- Liegt bei demo-epb-vX.Y.Z/index.html - Lives at demo-epb-vX.Y.Z/index.html
- Verlinkt alle anderen Bundle-Inhalte relativ - Links to all other bundle contents using relative paths
""" """
from __future__ import annotations 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(): if not d.exists():
return out return out
for f in sorted(d.glob("*.docx")): 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) 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)) out.append((f.stem, href))
return out 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: def kpi_card(label: str, value: str, sub: str = "", color: str = "#1f3864") -> str:
return f""" return f"""
<div class='kpi'> <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: def doc_section(title: str, docs: list[tuple[str, str]], description: str = "") -> str:
if not docs: if not docs:
items = "<li class='cnt'>— keine Dokumente —</li>" items = "<li class='cnt'>— no documents —</li>"
else: else:
items = "\n".join( items = "\n".join(
f'<li><a href="{html.escape(href)}">{html.escape(name)}</a></li>' 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: def report_link(name: str, href: str, exists: bool, desc: str) -> str:
cls = "ok" if exists else "missing" 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: if exists:
return (f"<li><a href='{html.escape(href)}'>{html.escape(label)}</a> " return (f"<li><a href='{html.escape(href)}'>{html.escape(label)}</a> "
f"<span class='cnt'>— {html.escape(desc)}</span></li>") f"<span class='cnt'>— {html.escape(desc)}</span></li>")
@@ -139,9 +132,9 @@ def main() -> int:
ncs = collect_docs("docs/non-conformities") ncs = collect_docs("docs/non-conformities")
misra_r = collect_docs("misra/records") misra_r = collect_docs("misra/records")
# Reports — Links zeigen auf BUNDLE-Pfade (relative zum index.html im Deploy). # Reports — links target BUNDLE paths (relative to index.html in deploy).
# Die CI-Pipeline deployt die Artefakte in genau diese Pfade, # The CI pipeline copies artifacts to exactly these paths, so the links
# darum ist deren Existenz hier irrelevant — Links werden immer emittiert. # always resolve in the deployed bundle.
rep_paths = { rep_paths = {
"coverage": "coverage/index.html", "coverage": "coverage/index.html",
"test": "reports/test-report.html", "test": "reports/test-report.html",
@@ -149,17 +142,11 @@ def main() -> int:
"trace": "traceability/index.html", "trace": "traceability/index.html",
"cppcheck": "reports/cppcheck-report.xml", "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_body = f"""<!doctype html>
<html lang='de'><head> <html lang='en'><head>
<meta charset='utf-8'> <meta charset='utf-8'>
<title>demo-epb {html.escape(tag)} — Projekt-Dashboard</title> <title>demo-epb {html.escape(tag)} — Project Dashboard</title>
<style> <style>
:root {{ color-scheme: light; }} :root {{ color-scheme: light; }}
body {{ font-family: -apple-system, "Segoe UI", sans-serif; margin: 0; padding: 0; color: #222; background: #f5f6f8; }} 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> </style></head>
<body> <body>
<header> <header>
<h1>demo-epb — Elektrische Parkbremse</h1> <h1>demo-epb — Electric Parking Brake</h1>
<div class='meta'>Version <strong>{html.escape(tag)}</strong> &middot; Commit <code>{html.escape(sha)}</code> &middot; Generiert {html.escape(now)}</div> <div class='meta'>Version <strong>{html.escape(tag)}</strong> &middot; Commit <code>{html.escape(sha)}</code> &middot; Generated {html.escape(now)}</div>
</header> </header>
<main> <main>
<div class='banner'> <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>. <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>
<div class='kpis'> <div class='kpis'>
{kpi_card("Safety Goals", str(n_sg), "ASIL D/D/A/C/B", "#d62728")} {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("System Reqs", str(n_sys), f"in reqs/sys/")}
{kpi_card("SW Reqs", str(n_swe), f"in reqs/swe/")} {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("Arch Elements", 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("Components", f"{n_impl}", f"+ {n_stubs} stubs", "#2ca02c")}
{kpi_card("Unit-Tests", str(n_tests), "Alle gruen", "#2ca02c")} {kpi_card("Unit tests", str(n_tests), "All green", "#2ca02c")}
</div> </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 += "</div><div class='cols'>"
html_body += doc_section("Manuals (Word)", manuals, html_body += doc_section("Manuals (Word)", manuals,
"End-User + Werkstatt-Doku") "End-user + workshop documentation")
audit_docs = reviews + ncs + misra_r audit_docs = reviews + ncs + misra_r
html_body += doc_section("Audit-Artefakte (Word)", audit_docs, html_body += doc_section("Audit Artifacts (Word)", audit_docs,
"Reviews, Non-Conformities, MISRA-Deviation-Records") "Reviews, non-conformities, MISRA deviation records")
html_body += "</div>" html_body += "</div>"
# Reports — Links immer setzen, Bundle-Pfade. # Reports — always emit links, bundle-relative paths.
html_body += "<section><h2>Engineering-Reports (CI-generiert)</h2><ul>\n" html_body += "<section><h2>Engineering Reports (CI-generated)</h2><ul>\n"
html_body += report_link("Traceability-Matrix", rep_paths["trace"], True, html_body += report_link("Traceability Matrix", rep_paths["trace"], True,
"SG -> SYS -> SA, SWE -> SWA -> Code+Test, bidirektional verifiziert") "SG -> SYS -> SA, SWE -> SWA -> Code+Test, verified bidirectionally")
html_body += report_link("Test-Summary", rep_paths["test"], True, html_body += report_link("Test Summary", rep_paths["test"], True,
f"{n_tests} Unit-Tests mit Anforderungs-Mapping") f"{n_tests} unit tests with requirement mapping")
html_body += report_link("Coverage (gcov/lcov)", rep_paths["coverage"], True, html_body += report_link("Coverage (gcov/lcov)", rep_paths["coverage"], True,
"Statement + Branch Coverage, klickbar bis Zeilen-Level") "Statement + branch coverage, drill down to line level")
html_body += report_link("API-Dokumentation (Doxygen)", rep_paths["api"], True, html_body += report_link("API Documentation (Doxygen)", rep_paths["api"], True,
"Alle Header + Funktionen, mit @arch/@reqs/@asil") "All headers + functions, with @arch/@reqs/@asil")
html_body += report_link("Cppcheck-Report (HTML)", "reports/cppcheck/index.html", True, html_body += report_link("Cppcheck Report (HTML)", "reports/cppcheck/index.html", True,
"Statische Analyse + MISRA-Findings, klickbar pro Datei") "Static analysis + MISRA findings, clickable per file")
html_body += report_link("Cppcheck-Report (XML, Roh)", rep_paths["cppcheck"], True, html_body += report_link("Cppcheck Report (XML, raw)", rep_paths["cppcheck"], True,
"Maschinen-lesbares Format fuer eigene Tools") "Machine-readable format for your own tools")
html_body += "</ul></section>" html_body += "</ul></section>"
# Diagrams # Diagrams
diagrams = sorted((REPO / "docs" / "diagrams").glob("*.svg")) diagrams = sorted((REPO / "docs" / "diagrams").glob("*.svg"))
if diagrams: if diagrams:
html_body += "<section><h2>Architektur-Diagramme (PlantUML)</h2><ul>" html_body += "<section><h2>Architecture Diagrams (PlantUML)</h2><ul>"
for d in diagrams: for d in diagrams:
href = os.path.relpath(d, REPO) href = os.path.relpath(d, REPO)
html_body += f" <li><a href='{html.escape(href)}'>{html.escape(d.stem)}</a></li>\n" 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 # Source code links
html_body += """ html_body += """
<section> <section>
<h2>Source-Code</h2> <h2>Source Code</h2>
<ul> <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/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/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/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><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> </ul>
</section> </section>
""" """
html_body += f""" html_body += f"""
<section> <section>
<h2>Externe Links</h2> <h2>External Links</h2>
<ul> <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/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> </ul>
</section> </section>
+11 -11
View File
@@ -2,7 +2,7 @@
""" """
Erzeugt einen Test-Summary-Report aus dem Output unserer Unit-Tests. 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.md
- build/test-report.html - build/test-report.html
@@ -67,7 +67,7 @@ def main() -> int:
output = TEST_OUTPUT.read_text() output = TEST_OUTPUT.read_text()
results = parse_output(output) results = parse_output(output)
if not results: if not results:
print("ERROR: keine Test-Suite im Output gefunden.") print("ERROR: no test suite found in the output.")
return 1 return 1
total = sum(r["total"] for r in results) total = sum(r["total"] for r in results)
@@ -77,11 +77,11 @@ def main() -> int:
# Markdown # Markdown
md = [f"# demo-epb — Test Summary Report\n\n", md = [f"# demo-epb — Test Summary Report\n\n",
f"**Datum:** {now}\n\n", f"**Date:** {now}\n\n",
f"**Gesamt:** {total} Tests, {passed} bestanden, {failed} fehlgeschlagen\n\n", f"**Total:** {total} tests, {passed} passed, {failed} failed\n\n",
f"**Status:** {'PASS' if failed == 0 else 'FAIL'}\n\n", f"**Status:** {'PASS' if failed == 0 else 'FAIL'}\n\n",
"## Pro Test-Suite\n\n", "## Per Test Suite\n\n",
"| Suite | Anzahl | Bestanden | Fehlgeschlagen | Anforderungen |\n", "| Suite | Count | Passed | Failed | Requirements |\n",
"|-------|--------|-----------|-----------------|---------------|\n"] "|-------|--------|-----------|-----------------|---------------|\n"]
for r in results: for r in results:
reqs = ", ".join(reqs_for(r["binary"])) or "" reqs = ", ".join(reqs_for(r["binary"])) or ""
@@ -113,12 +113,12 @@ def main() -> int:
".pass-badge{background:#0a0}.fail-badge{background:#c00}", ".pass-badge{background:#0a0}.fail-badge{background:#c00}",
"</style></head><body>", "</style></head><body>",
"<h1>demo-epb — Test Summary Report</h1>", "<h1>demo-epb — Test Summary Report</h1>",
f"<p><strong>Datum:</strong> {now}</p>", f"<p><strong>Date:</strong> {now}</p>",
f"<p><strong>Gesamt:</strong> {total} Tests, {passed} bestanden, {failed} fehlgeschlagen" f"<p><strong>Total:</strong> {total} tests, {passed} passed, {failed} failed"
f"<span class='badge {badge_cls}'>{badge_txt}</span></p>", f"<span class='badge {badge_cls}'>{badge_txt}</span></p>",
"<h2>Pro Test-Suite</h2>", "<h2>Per Test Suite</h2>",
"<table><tr><th>Suite</th><th>Anzahl</th><th>Bestanden</th>" "<table><tr><th>Suite</th><th>Count</th><th>Passed</th>"
"<th>Fehlgeschlagen</th><th>Anforderungen</th></tr>", "<th>Failed</th><th>Requirements</th></tr>",
] ]
for r in results: for r in results:
reqs = ", ".join(reqs_for(r["binary"])) or "" reqs = ", ".join(reqs_for(r["binary"])) or ""
+21 -21
View File
@@ -1,17 +1,17 @@
#!/usr/bin/env python3 #!/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 Reads Markdown items from safety/sg, reqs/sys, reqs/swe, arch/sys, arch/swe and
verifiziert die Traceability-Kette: verifies the traceability chain:
SG <-- SYS <-- SA SG <-- SYS <-- SA
<-- SWE <-- SWA <-- Code (@arch) <-- SWE <-- SWA <-- Code (@arch)
<-- Tests (@reqs) <-- Tests (@reqs)
Subcommands: Subcommands:
check Validiert Konsistenz, exit 1 bei Fehlern check Validates consistency, exits 1 on errors
publish DIR Schreibt HTML + JSON nach DIR/ publish DIR Writes HTML + JSON to DIR/
Run: Run:
python3 tools/traceability.py check python3 tools/traceability.py check
@@ -160,27 +160,27 @@ def check_code_test_mapping(items: dict[str, Item]) -> list[str]:
src = REPO / src_rel src = REPO / src_rel
arch_tags, _ = extract_tags(src) arch_tags, _ = extract_tags(src)
if swa_id not in arch_tags: if swa_id not in arch_tags:
errors.append(f"{src_rel}: header @arch enthaelt {swa_id} nicht " errors.append(f"{src_rel}: header @arch does not contain {swa_id} "
f"(gefunden: {arch_tags or ''})") f"(found: {arch_tags or ''})")
# For each test, verify @reqs covers the SWE that the corresponding SWA links to # For each test, verify @reqs covers the SWE that the corresponding SWA links to
for test_file, swa_id in IMPLEMENTED_TESTS.items(): for test_file, swa_id in IMPLEMENTED_TESTS.items():
test_path = REPO / "tests" / "unit" / test_file test_path = REPO / "tests" / "unit" / test_file
_, reqs_in_test = extract_tags(test_path) _, reqs_in_test = extract_tags(test_path)
if not reqs_in_test: 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 continue
swa = items.get(swa_id) swa = items.get(swa_id)
if swa is None: if swa is None:
errors.append(f"tests/unit/{test_file}: referenziertes " errors.append(f"tests/unit/{test_file}: referenced "
f"{swa_id} nicht gefunden") f"{swa_id} not found")
continue continue
swa_swe = set(swa.links) swa_swe = set(swa.links)
test_swe = set(reqs_in_test) test_swe = set(reqs_in_test)
missing = swa_swe - test_swe missing = swa_swe - test_swe
if missing: if missing:
errors.append(f"tests/unit/{test_file}: deckt nicht alle SWE " errors.append(f"tests/unit/{test_file}: does not cover all SWE of "
f"der {swa_id} ab — fehlend: {sorted(missing)}") f"{swa_id} — missing: {sorted(missing)}")
return errors return errors
@@ -241,7 +241,7 @@ def cmd_check(items: dict[str, Item]) -> int:
for e in errors: for e in errors:
print(f" - {e}") print(f" - {e}")
return 1 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 return 0
@@ -314,7 +314,7 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
".missing{color:#c00}", ".missing{color:#c00}",
"</style></head><body>", "</style></head><body>",
"<h1>demo-epb — Traceability Matrix</h1>", "<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>", "<p>",
] ]
for p, _, label in SOURCES: 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("<table>")
parts.append( parts.append(
"<tr><th>Safety Goal</th><th>System-Requirement</th>" "<tr><th>Safety Goal</th><th>System Requirement</th>"
"<th>System-Arch</th><th>Software-Req</th>" "<th>System Arch</th><th>Software Req</th>"
"<th>Software-Arch</th><th>Code</th><th>Test</th></tr>" "<th>Software Arch</th><th>Code</th><th>Test</th></tr>"
) )
def cell_items(ids: list[str]) -> str: 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>") parts.append("</table>")
# Code/Test details # Code/Test details
parts.append("<h2>Code → Architektur</h2>") parts.append("<h2>Code → Architecture</h2>")
parts.append("<table><tr><th>Datei</th><th>@arch</th><th>@reqs</th></tr>") parts.append("<table><tr><th>File</th><th>@arch</th><th>@reqs</th></tr>")
for swa_id, src_rel in IMPLEMENTED_SWA.items(): for swa_id, src_rel in IMPLEMENTED_SWA.items():
arch, reqs = extract_tags(REPO / src_rel) arch, reqs = extract_tags(REPO / src_rel)
parts.append( parts.append(
@@ -388,8 +388,8 @@ def cmd_publish(items: dict[str, Item], out_dir: Path) -> int:
) )
parts.append("</table>") parts.append("</table>")
parts.append("<h2>Test → Anforderungen</h2>") parts.append("<h2>Test → Requirements</h2>")
parts.append("<table><tr><th>Test-Datei</th><th>Decklt SWA</th><th>@reqs</th></tr>") 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(): for test_file, swa_id in IMPLEMENTED_TESTS.items():
_, reqs = extract_tags(REPO / "tests" / "unit" / test_file) _, reqs = extract_tags(REPO / "tests" / "unit" / test_file)
parts.append( parts.append(