From fb2c083551a5a80662fe2cc235a81643723aa829 Mon Sep 17 00:00:00 2001 From: Stefan Lohmaier Date: Tue, 12 May 2026 03:37:51 -0700 Subject: [PATCH] feat(i18n): full English translation of demo-epb Phase 2 of the English translation: Word documents (filled, EPB-specific): - 8 plans (PID, PM, QA, SWE, Test, Project Manual, CM, RM) - 6 safety docs (HARA, Safety Case, FMEDA, MISRA Compliance, Verification Report, Tool Qualification Cppcheck) - 2 manuals (User, Service) - 3 audit artefacts (Review minutes, NC-001, MISRA-REC-001) - All regenerated via pandoc from English markdown sources Code, tests, headers: - All file headers, struct comments, function docstrings in English - All test names (TEST_BEGIN strings) translated - Inline comments translated - 46 tests still green after translation CI workflows: - All step names in English - Step descriptions, comments, release notes template in English README.md fully rewritten in English with proper guided tour. Phase 3 (still pending): dev-process repo templates + toolstack/setup docs. --- .gitea/workflows/release.yml | 62 ++--- .gitea/workflows/validate.yml | 52 ++--- Makefile | 4 +- README.md | 189 +++++++-------- docs/manuals-md/Service-Manual.md | 186 +++++++-------- docs/manuals-md/User-Manual.md | 141 ++++++------ docs/manuals/Service-Manual.docx | Bin 28397 -> 28320 bytes docs/manuals/User-Manual.docx | Bin 27895 -> 27812 bytes docs/non-conformities-md/NC-001.md | 68 +++--- docs/non-conformities/NC-001.docx | Bin 26894 -> 26770 bytes docs/plaene/CM-Plan.docx | Bin 28683 -> 28572 bytes docs/plaene/PID.docx | Bin 27895 -> 27782 bytes docs/plaene/PM-Plan.docx | Bin 27041 -> 26961 bytes docs/plaene/Project-Manual.docx | Bin 29260 -> 29069 bytes docs/plaene/QA-Plan.docx | Bin 26986 -> 26919 bytes docs/plaene/RM-Plan.docx | Bin 28013 -> 27901 bytes docs/plaene/SWE-Plan.docx | Bin 28171 -> 28026 bytes docs/plaene/Test-Plan.docx | Bin 26863 -> 26818 bytes docs/plans-md/CM-Plan.md | 188 ++++++++------- docs/plans-md/PID.md | 142 ++++++------ docs/plans-md/PM-Plan.md | 88 +++---- docs/plans-md/Project-Manual.md | 216 +++++++++--------- docs/plans-md/QA-Plan.md | 94 ++++---- docs/plans-md/RM-Plan.md | 151 ++++++------ docs/plans-md/SWE-Plan.md | 156 ++++++------- docs/plans-md/Test-Plan.md | 84 +++---- docs/reviews-md/Review-001.md | 75 +++--- docs/reviews/REV-001.docx | Bin 27381 -> 27307 bytes docs/safety-md/FMEDA.md | 140 ++++++------ docs/safety-md/HARA.md | 197 ++++++++-------- docs/safety-md/MISRA-Compliance-Statement.md | 127 +++++----- docs/safety-md/Safety-Case.md | 173 +++++++------- docs/safety-md/Tool-Qualification-Cppcheck.md | 157 ++++++------- docs/safety-md/Verification-Report.md | 181 +++++++-------- docs/safety/FMEDA.docx | Bin 28490 -> 28338 bytes docs/safety/HARA.docx | Bin 29010 -> 28815 bytes docs/safety/MISRA-Compliance-Statement.docx | Bin 28161 -> 28079 bytes docs/safety/Safety-Case.docx | Bin 28824 -> 28680 bytes docs/safety/Tool-Qualification-Cppcheck.docx | Bin 28549 -> 28341 bytes docs/safety/Verification-Report.docx | Bin 28239 -> 28126 bytes misra/records-md/MISRA-Record-001.md | 61 +++-- misra/records/MISRA-REC-001.docx | Bin 26940 -> 26876 bytes src/actuator_driver.c | 6 +- src/actuator_driver.h | 12 +- src/apply_controller.c | 18 +- src/apply_controller.h | 10 +- src/epb_types.h | 2 +- src/safety_manager.c | 36 +-- src/safety_manager.h | 18 +- src/switch_debouncer.h | 4 +- tests/unit/test_actuator_driver.c | 20 +- tests/unit/test_apply_controller.c | 28 +-- tests/unit/test_safety_manager.c | 40 ++-- tests/unit/test_switch_debouncer.c | 2 +- 54 files changed, 1528 insertions(+), 1600 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index a80890c..827c0e1 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -25,19 +25,19 @@ jobs: - name: Tag from ref run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build + Tests + Coverage + Test-Report + - name: Build + tests + coverage + Test-Report run: | make test make coverage make test-report - - name: Traceability + Diagramme + API-Doc + - name: Traceability + diagrams + API doc run: | python3 tools/traceability.py publish docs/traceability python3 tools/render_plantuml.py make docs - - name: Cppcheck-Report (XML + HTML) + - name: Cppcheck Report (XML + HTML) run: | mkdir -p build cppcheck --enable=all --inconclusive --xml --xml-version=2 \ @@ -48,15 +48,15 @@ jobs: --source-dir=. \ --title="demo-epb Cppcheck Report" || echo "htmlreport skipped" - - name: Landing-Page + - name: Landing page run: make landing-page - - name: Release-Bundle paketieren + - name: Package release bundle run: | BUNDLE="release/demo-epb-${TAG}" mkdir -p "$BUNDLE"/{coverage,traceability,diagrams,api-doc,reports/cppcheck,docs,src,tests} - # Landing-Page (Startseite) im Bundle-Root + # Landing page in the bundle root cp build/index.html "$BUNDLE/index.html" # CI-generierte Artefakte @@ -73,7 +73,7 @@ jobs: cp -r src/*.c src/*.h "$BUNDLE/src/" 2>/dev/null || true cp -r src/stubs "$BUNDLE/src/" 2>/dev/null || true - # Alle Word-Dokumente (Plaene, Safety, Manuals, Audit-Artefakte) + # All Word documents (plans, safety, manuals, audit artefacts) mkdir -p "$BUNDLE/docs/plaene" "$BUNDLE/docs/safety" "$BUNDLE/docs/manuals" \ "$BUNDLE/docs/reviews" "$BUNDLE/docs/non-conformities" "$BUNDLE/misra/records" cp -r docs/plaene/* "$BUNDLE/docs/plaene/" 2>/dev/null || true @@ -93,55 +93,55 @@ jobs: ls -la release/ - - name: Release-Notes generieren + - name: Generate release notes run: | cat > release/RELEASE_NOTES.md <&1 | head -1 || echo " (kein gcc)" - make --version 2>&1 | head -1 || echo " (kein make)" - cppcheck --version 2>&1 | head -1 || echo " (kein cppcheck)" + gcc --version 2>&1 | head -1 || echo " (no gcc)" + make --version 2>&1 | head -1 || echo " (no make)" + cppcheck --version 2>&1 | head -1 || echo " (no cppcheck)" echo "done" - - name: Static Analysis (Cppcheck) + - name: Static analysis (Cppcheck) shell: bash run: make static - - name: MISRA Check + - name: MISRA check shell: bash run: | - make misra || echo "MISRA findings present (Demo non-failing)" + make misra || echo "MISRA findings present (demo non-failing)" - - name: Build + Unit Tests + - name: Build + unit tests shell: bash run: make test - # Coverage, Traceability, Diagrams, API-Doc, Test-Report — alle auf Linux, - # parallel zu build-test (Matrix continue-on-error wird leider nicht in needs durchgereicht) + # Coverage, traceability, diagrams, API doc, test report — all on Linux, + # parallel to build-test (matrix continue-on-error is not propagated through needs) reports: runs-on: ubuntu-latest steps: @@ -67,39 +67,39 @@ jobs: python3 python3-pip ca-certificates \ doxygen graphviz - - name: Build + Tests + Coverage + - name: Build + tests + coverage run: | make test make coverage - - name: Test-Summary-Report + - name: Test summary report run: make test-report - - name: Traceability Check + - name: Traceability check run: python3 tools/traceability.py check - - name: Traceability Matrix publishen + - name: Publish Traceability Matrix run: python3 tools/traceability.py publish docs/traceability - - name: PlantUML Diagramme rendern + - name: Render PlantUML diagrams run: python3 tools/render_plantuml.py - - name: Doxygen API-Dokumentation + - name: Doxygen API documentation run: make docs - - name: Cppcheck-Report (XML + HTML) + - name: Cppcheck Report (XML + HTML) run: | mkdir -p build cppcheck --enable=all --inconclusive --xml --xml-version=2 \ -I src src 2> build/cppcheck-report.xml || true - # cppcheck-htmlreport ist Teil des cppcheck-Pakets + # cppcheck-htmlreport is part of the cppcheck package cppcheck-htmlreport \ --file=build/cppcheck-report.xml \ --report-dir=build/cppcheck-html \ --source-dir=. \ --title="demo-epb Cppcheck Report" || echo "htmlreport skipped" - - name: Landing-Page + - name: Landing page run: make landing-page - name: Upload Coverage HTML @@ -109,7 +109,7 @@ jobs: name: coverage-html path: build/coverage-html/ - - name: Upload Test-Report + - name: Upload Test Report uses: actions/upload-artifact@v3 if: always() with: @@ -126,40 +126,40 @@ jobs: name: traceability path: docs/traceability/ - - name: Upload Architektur-Diagramme + - name: Upload Architecture Diagrams uses: actions/upload-artifact@v3 if: always() with: name: architecture-diagrams path: docs/diagrams/ - - name: Upload Doxygen API-Doc + - name: Upload Doxygen API Doc uses: actions/upload-artifact@v3 if: always() with: name: api-doc path: build/api-doc/html/ - - name: Upload Landing-Page + - name: Upload Landing Page uses: actions/upload-artifact@v3 if: always() with: name: landing-page path: build/index.html - - name: Upload Cppcheck-Report + - name: Upload Cppcheck Report uses: actions/upload-artifact@v3 if: always() with: name: cppcheck-report path: build/cppcheck-report.xml - - name: Deploy zu gitea.slohmaier.com/pages/demo-epb/ + - name: Deploy to gitea.slohmaier.com/pages/demo-epb/ if: success() && github.ref == 'refs/heads/main' run: | DEPLOY=/var/www/pages/demo-epb if [ ! -d "$DEPLOY" ]; then - echo "Mount $DEPLOY nicht da — Runner-Config pruefen. Skip." + echo "Mount $DEPLOY not present — check runner config. Skipping." exit 0 fi mkdir -p "$DEPLOY"/{docs,coverage,traceability,diagrams,api-doc,reports/cppcheck,src,misra/records} diff --git a/Makefile b/Makefile index 71f8eb5..38f9874 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# Makefile fuer demo-epb. Bewusst klein gehalten, damit der Demo -# ohne externe Build-Tools (CMake, SCons) auf jedem POSIX-System baut. +# Makefile for demo-epb. Intentionally small so the demo +# builds on any POSIX system without external build tools (CMake, SCons). CC ?= cc CFLAGS ?= -std=c99 -Wall -Wextra -Werror -Wpedantic \ diff --git a/README.md b/README.md index 1fddd5b..68ee3bc 100644 --- a/README.md +++ b/README.md @@ -1,139 +1,141 @@ -# demo-epb — Elektrische Parkbremse +# demo-epb — Electric Parking Brake -Vollständige Demo des [slohmaier Dev Process](https://gitea.slohmaier.com/slohmaier/dev-process) anhand einer EPB-Steuergerät-Software. Zeigt ASPICE 4.0 / ISO 26262-konforme Entwicklung im Monorepo: Anforderungen, Architektur, Code, Tests, Reviews, MISRA, Safety Case, Manuals — alles auf einen Pull-Request-Klick verifizierbar, alles in einem Release-Bundle. +Complete demonstration of the [slohmaier Dev Process](https://gitea.slohmaier.com/slohmaier/dev-process) using an EPB ECU software. Shows ASPICE 4.0 / ISO 26262-compliant development in a monorepo: requirements, architecture, code, tests, reviews, MISRA, safety case, manuals — all verifiable in a single pull-request click, all in a single release bundle. -> **🌐 Live-Dashboard:** https://gitea.slohmaier.com/pages/demo-epb/ -> Auto-aktualisiert bei jedem Push auf `main` und bei jedem Release-Tag. +> **🌐 Live dashboard:** https://gitea.slohmaier.com/pages/demo-epb/ +> Auto-refreshed on every push to `main` and every release tag. -> Diese Software ist **bewusst kein Produktivcode** — sie ist die Demonstration des Engineering-Verfahrens. Code-Umfang bewusst klein, Prozess-Tiefe vollständig. +> This software is **intentionally not production code** — it is a demonstration of the engineering method. Code volume kept small on purpose; process depth complete. -## Was die Demo zeigt +## What the demo shows -| Kategorie | Inhalt | -|-----------|--------| -| **Pläne** (Word) | 5 (PID, PM-, QA-, SWE-, Test-Plan) | -| **Safety-Doku** (Word) | 6 (HARA, Safety Case, FMEDA, MISRA-Compliance, Verification-Report, Tool-Qualification) | -| **Manuals** (Word) | 2 (User-Manual, Service-Manual) | -| **Audit-Artefakte** (Word) | 3 (Review-Protokoll, Non-Conformity, MISRA-Deviation-Record) | -| **System-Anforderungen** | 10 in `reqs/sys/` (Markdown + Doorstop-Style) | -| **Software-Anforderungen** | 25 in `reqs/swe/` | -| **System-Architektur** | 5 in `arch/sys/` mit PlantUML | -| **Software-Architektur** | 10 in `arch/swe/` mit PlantUML | -| **Implementierte C-Komponenten** | 4 (Apply Ctrl D, Safety Mgr D, Actuator Drv B, Switch Db QM) | -| **Stub-Komponenten** | 6 weitere (Header only) | -| **Unit-Tests** | 41, alle grün | -| **CI-Workflows** | 2 (validate + release) | -| **CI-Artefakte** | Coverage HTML, Traceability Matrix, Diagramme SVG, Doxygen, Test-Report, Cppcheck-XML | -| **Cross-Platform-Runner** | Linux + macOS + Windows | +| Category | Content | +|----------|---------| +| **Plans** (Word) | 8 (Project Manual, PID, PM, QA, SWE, Test, CM, RM) | +| **Safety docs** (Word) | 6 (HARA, Safety Case, FMEDA, MISRA Compliance, Verification Report, Tool Qualification) | +| **Manuals** (Word) | 2 (User Manual, Service Manual) | +| **Audit artefacts** (Word) | 3 (Review minutes, Non-Conformity, MISRA Deviation Record) | +| **Safety Goals** | 5 in `safety/sg/` | +| **System Requirements** | 10 in `reqs/sys/` (Markdown + Doorstop style) | +| **Software Requirements** | 25 in `reqs/swe/` | +| **System Architecture** | 5 in `arch/sys/` with PlantUML | +| **Software Architecture** | 10 in `arch/swe/` with PlantUML | +| **Implemented C components** | 4 (Apply Ctrl D, Safety Mgr D, Actuator Drv B, Switch Db QM) | +| **Stub components** | 6 more (header only) | +| **Unit tests** | 46, all green | +| **CI workflows** | 2 (validate + release) | +| **CI artefacts** | Coverage HTML, Traceability Matrix, Diagrams SVG, Doxygen, Test Report, Cppcheck HTML+XML | +| **Cross-platform runners** | Linux + macOS + Windows | -## Quick Start +## Quick start ```bash git clone https://gitea.slohmaier.com/slohmaier/demo-epb.git cd demo-epb # Tests -make test # 41 Tests, alle grün +make test # 46 tests, all green -# Mit Coverage (braucht lcov) +# With coverage (needs lcov) make coverage open build/coverage-html/index.html -# Test-Summary-Report (HTML) +# Test summary report (HTML) make test-report open build/test-report.html -# Statische Analyse + MISRA (braucht cppcheck) +# Static analysis + MISRA (needs cppcheck) make static make misra -# API-Doku (braucht doxygen) +# API doc (needs doxygen) make docs open build/api-doc/html/index.html -# Traceability-Matrix (HTML) +# Traceability matrix (HTML) python3 tools/traceability.py publish docs/traceability open docs/traceability/index.html -# PlantUML-Diagramme rendern (SVG) +# PlantUML diagrams (SVG) python3 tools/render_plantuml.py ``` -## Geführte Tour (~30 min) +## Guided tour (~30 min) -### 1. Projektplanung (Word) -`docs/`: -- **PID.docx** — Was wird gebaut und warum -- **SWE-Plan.docx** — Sprache, Standards, Branching, Reviews, Coverage-Ziele -- **QA-Plan.docx** — Qualitätsmaßnahmen, Reviews, NC-Management -- **PM-Plan.docx**, **Test-Plan.docx** — Arbeitspakete + Teststrategie +### 1. Project planning (Word) +`docs/plaene/`: +- **Project-Manual.docx** — Navigation guide, reading order, roles +- **PID.docx** — What is built and why +- **SWE-Plan.docx** — Language, standards, branching, reviews, coverage targets +- **QA-Plan.docx** — Quality measures, reviews, NC management +- **PM-Plan.docx, Test-Plan.docx, CM-Plan.docx, RM-Plan.docx** -### 2. Funktionale Sicherheit (Word — `docs/safety/`) -- **HARA.docx** — Hazard Analysis & Risk Assessment. Leitet **ASIL-D** ab. -- **Safety-Case.docx** — Argumentation in GSN-Style, warum die Sicherheitsziele erfüllt sind -- **FMEDA.docx** — Pro-Komponente Failure Modes mit Diagnostic Coverage -- **Tool-Qualification-Cppcheck.docx** — Tool-Qual für Cppcheck (TI2/TD2/TCL2) -- **MISRA-Compliance-Statement.docx** — formaler Compliance-Nachweis -- **Verification-Report.docx** — V-Modell rechte Seite zusammenfassend +### 2. Functional safety (Word — `docs/safety/`) +- **HARA.docx** — Hazard Analysis & Risk Assessment. Derives **ASIL-D**. +- **Safety-Case.docx** — GSN-style argument that safety goals are met +- **FMEDA.docx** — Per-component failure modes with diagnostic coverage +- **Tool-Qualification-Cppcheck.docx** — Tool qual for Cppcheck (TI2/TD2/TCL2) +- **MISRA-Compliance-Statement.docx** — Formal compliance evidence +- **Verification-Report.docx** — V-model right side summary ### 3. Manuals (Word — `docs/manuals/`) -- **User-Manual.docx** — Fahrerhandbuch-Auszug (Apply, Release, Hill-Hold, LED-Codes) -- **Service-Manual.docx** — Werkstatt-Doku mit UDS-DTCs, Service-Modus, Sensor-Prüfung +- **User-Manual.docx** — Driver manual (apply, release, hill-hold, LED codes) +- **Service-Manual.docx** — Workshop doc with UDS DTCs, service mode, sensor checks -### 4. Sicherheits-Logik (das ASIL-D Stück) -Traceability-Kette: +### 4. Safety logic (the ASIL-D piece) +Traceability chain: ``` -reqs/sys/SYS-001.md → arch/swe/SWA-002.md → src/apply_controller.c → tests/unit/test_apply_controller.c +safety/sg/SG-001.md → reqs/sys/SYS-001.md → arch/swe/SWA-002.md → src/apply_controller.c → tests/unit/test_apply_controller.c ``` -### 5. Anforderungen + Architektur (Doorstop in Markdown) -- `reqs/sys/` + `reqs/swe/` — Anforderungen mit Mapping -- `arch/sys/` + `arch/swe/` — Architektur mit Mapping per `links:` im Frontmatter -- Eingebettete PlantUML-Diagramme rendern direkt in Gitea (UI) und als SVG im Release-Bundle +### 5. Requirements + architecture (Doorstop in Markdown) +- `safety/sg/`, `reqs/sys/` + `reqs/swe/` — requirements with mapping +- `arch/sys/` + `arch/swe/` — architecture with mapping via `links:` in frontmatter +- Embedded PlantUML diagrams render in Gitea (UI) and as SVG in the release bundle -### 6. Code mit Mapping-Tags -Jede `.c`-Datei trägt `@arch`, `@reqs`, `@asil` im Header: +### 6. Code with mapping tags +Every `.c` file carries `@arch`, `@reqs`, `@asil` in the header: ```c /** * @file apply_controller.c * @arch SWA-002 - * @reqs SWE-001 SWE-002 SWE-003 SWE-004 + * @reqs SWE-001 SWE-002 SWE-003 SWE-004 SWE-005 * * ASIL: D. */ ``` -### 7. Tests mit Anforderungs-Tags -`tests/unit/test_*.c` referenziert die Requirements per `@reqs`. Test-Report (`build/test-report.html`) macht das Mapping klickbar sichtbar. +### 7. Tests with requirement tags +`tests/unit/test_*.c` references requirements via `@reqs`. The test report (`build/test-report.html`) makes the mapping clickable. -### 8. Audit-Artefakte -- `docs/reviews/REV-001.docx` — Review-Protokoll für die ASIL-D-Komponente -- `docs/non-conformities/NC-001.docx` — NC mit Korrekturmaßnahme -- `misra/records/MISRA-REC-001.docx` — MISRA Advisory-Deviation +### 8. Audit artefacts +- `docs/reviews/REV-001.docx` — Review minutes for the ASIL-D component +- `docs/non-conformities/NC-001.docx` — NC with corrective action +- `misra/records/MISRA-REC-001.docx` — MISRA advisory deviation -### 9. CI-Pipeline (`.gitea/workflows/validate.yml`) -Bei jedem Push: -1. **Cross-Platform Build + Test** auf Linux + macOS + Windows -2. **Static Analysis** (Cppcheck) -3. **MISRA-Check** (Cppcheck + MISRA-Addon) +### 9. CI pipeline (`.gitea/workflows/validate.yml`) +On every push: +1. **Cross-platform build + test** on Linux + macOS + Windows +2. **Static analysis** (Cppcheck) +3. **MISRA check** (Cppcheck + MISRA addon) 4. **Coverage** (gcov/lcov) -5. **Traceability-Check** (bidirektional) -6. **PlantUML-Render** (alle Diagramme als SVG) -7. **Doxygen-API-Doc** -8. **Test-Summary-Report** +5. **Traceability check** (bidirectional) +6. **PlantUML render** (all diagrams as SVG) +7. **Doxygen API doc** +8. **Test summary report** -Alles als Gitea-Artefakte abrufbar. +All available as Gitea artefacts. -### 10. Release-Workflow (`.gitea/workflows/release.yml`) -Auf Tag-Push `v*.*.*`: -- Vollständigen Build + alle Reports -- Bündelt **Source-Archive + Artefakt-Archive** (CI-Output + alle Word-Docs) -- Erzeugt Gitea-Release mit Release-Notes +### 10. Release workflow (`.gitea/workflows/release.yml`) +On tag push `v*.*.*`: +- Full build + all reports +- Bundles **source archive + artefact archive** (CI output + all Word docs) +- Creates a Gitea release with release notes -Beispiel: https://gitea.slohmaier.com/slohmaier/demo-epb/releases +Example: https://gitea.slohmaier.com/slohmaier/demo-epb/releases -## Architektur-Überblick +## Architecture overview ``` EPB ECU (SA-001) @@ -150,28 +152,27 @@ Beispiel: https://gitea.slohmaier.com/slohmaier/demo-epb/releases | Logger (QM) [stub] | +----------------------------------+ | | - Aktor L (SA-002) Aktor R (SA-002) + Actuator L (SA-002) Actuator R (SA-002) ``` -## Format-Strategie +## Format strategy -| Inhalt | Format | Begründung | -|--------|--------|------------| -| Pläne + Safety + Audit + Manuals | **Word** (.docx) | Industriestandard für ISO-9001-Freigabe | -| Requirements + Architektur | **Markdown** (Doorstop-Stil) | Lebendig, diff-bar, Traceability per Skript | -| Code, Tests, CI | C / YAML | klar | -| Release-Bundle | tar.gz mit allem | Eine Datei für den Auditor | +| Content | Format | Rationale | +|---------|--------|-----------| +| Plans + Safety + Audit + Manuals | **Word** (.docx) | Industry standard for ISO 9001 release | +| Requirements + Architecture | **Markdown** (Doorstop style) | Lives daily, diff-able, traceability by script | +| Code, Tests, CI | C / YAML | obvious | +| Release bundle | tar.gz with everything | One file for the auditor | -Markdown ist Source of Truth, Word wird per pandoc daraus gebaut. +Markdown is the source of truth; Word is built via pandoc. -## Referenzen +## References -- [slohmaier/dev-process](https://gitea.slohmaier.com/slohmaier/dev-process) — Methodik-Repo +- [slohmaier/dev-process](https://gitea.slohmaier.com/slohmaier/dev-process) — Methodology repo - ASPICE 4.0 -- ISO 26262 (insbesondere Part 2, 3, 5, 6, 8, 10) +- ISO 26262 (in particular Part 2, 3, 5, 6, 8, 10) - MISRA C:2012 -## Lizenz +## Licence -MIT — siehe [LICENSE](LICENSE). -Tue May 12 02:28:37 PDT 2026 +MIT — see [LICENSE](LICENSE). diff --git a/docs/manuals-md/Service-Manual.md b/docs/manuals-md/Service-Manual.md index 736641d..3376144 100644 --- a/docs/manuals-md/Service-Manual.md +++ b/docs/manuals-md/Service-Manual.md @@ -1,138 +1,138 @@ --- doc-id: SLM-EPB-SVC-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- -# Service Manual — Elektrische Parkbremse (EPB) +# Service Manual — Electric Parking Brake (EPB) -| Feld | Wert | -|--------------|----------------------------------------| -| Produkt | demo-epb EPB-Steuergeraet | -| Version | 1.0 | -| Datum | 2026-05-12 | -| Zielgruppe | Werkstatt-Techniker | +| Field | Value | +|---------------|----------------------------------------| +| Product | demo-epb EPB ECU | +| Version | 1.0 | +| Date | 2026-05-12 | +| Audience | Workshop technicians | --- -## 1. Werkzeuge +## 1. Tools -- OBD-II-Diagnose-Tester mit UDS-Support (ISO 14229) -- Drehmomentschluessel 60 Nm -- Verschiebewerkzeug 28x40 mm (fuer Bremsbelag-Wechsel) +- OBD-II diagnostic tester with UDS support (ISO 14229) +- Torque wrench 60 Nm +- Sliding tool 28×40 mm (for brake-pad replacement) -## 2. UDS-Diagnose +## 2. UDS diagnostics -### 2.1 Identifikation +### 2.1 Identification -| Parameter | Wert | +| Parameter | Value | |-------------------|-------------| -| Tester-Adresse | 0x712 | -| ECU-Antwort | 0x71A | -| CAN-Baudrate | 500 kbit/s | +| Tester address | 0x712 | +| ECU response | 0x71A | +| CAN baud rate | 500 kbit/s | -### 2.2 Service-IDs +### 2.2 Service IDs -| SID | Service | Notizen | -|------|-------------------------------|-------------------------------| -| 0x10 | DiagnosticSessionControl | 0x03 = Extended Session | -| 0x11 | ECUReset | 0x01 = Hard Reset | -| 0x14 | ClearDiagnosticInformation | Loescht alle DTCs | +| SID | Service | Notes | +|------|-------------------------------|--------------------------------| +| 0x10 | DiagnosticSessionControl | 0x03 = Extended Session | +| 0x11 | ECUReset | 0x01 = Hard Reset | +| 0x14 | ClearDiagnosticInformation | Clears all DTCs | | 0x19 | ReadDTCInformation | Sub 0x02 = reportDTCByStatusMask | -| 0x22 | ReadDataByIdentifier | Siehe DID-Liste | -| 0x27 | SecurityAccess | Nicht implementiert in Demo | -| 0x31 | RoutineControl | 0x0301 = Service-Modus | +| 0x22 | ReadDataByIdentifier | See DID list | +| 0x27 | SecurityAccess | Not implemented in demo | +| 0x31 | RoutineControl | 0x0301 = Service mode | ### 2.3 DIDs (Data Identifiers) -| DID | Beschreibung | Typ | -|--------|-------------------------------------|----------------| -| 0xF187 | SW-Version | ASCII 16 byte | -| 0xF18B | ECU-Hardware-Version | ASCII 16 byte | -| 0x0301 | Klemmkraft links | uint16 (N) | -| 0x0302 | Klemmkraft rechts | uint16 (N) | -| 0x0303 | Motorstrom links | uint16 (mA) | -| 0x0304 | Motorstrom rechts | uint16 (mA) | -| 0x0305 | Inclinometer (gefiltert) | int16 (m°) | +| DID | Description | Type | +|--------|--------------------------------------|----------------| +| 0xF187 | SW version | ASCII 16 byte | +| 0xF18B | ECU hardware version | ASCII 16 byte | +| 0x0301 | Clamping force left | uint16 (N) | +| 0x0302 | Clamping force right | uint16 (N) | +| 0x0303 | Motor current left | uint16 (mA) | +| 0x0304 | Motor current right | uint16 (mA) | +| 0x0305 | Inclinometer (filtered) | int16 (m°) | -## 3. DTC-Liste +## 3. DTC list -| DTC | Bedeutung | Aktion | -|----------|--------------------------------------------------|----------------------------------------| -| P0571 | EPB-Schalter Plausibilitaet | Schalter pruefen | -| P0572 | EPB-Schalter dauerhaft betaetigt | Schalter blockiert? Reinigen | -| P0808 | Aktor-Strom links zu hoch (Overcurrent) | Motor + Verkabelung pruefen | -| P0809 | Aktor-Strom rechts zu hoch (Overcurrent) | Motor + Verkabelung pruefen | -| P080A | Klemmkraft links nicht erreicht (Apply-Timeout) | Aktor / Mechanik pruefen | -| P080B | Klemmkraft rechts nicht erreicht | Aktor / Mechanik pruefen | -| P080C | Wheel-Speed-Sensor Plausibilitaet | Sensoren / Verkabelung pruefen | -| P080D | Inclinometer Plausibilitaet | Sensor / Montage pruefen | -| P080E | Apply-Controller-Watchdog-Trip | Software-Reset, bei Wiederholung ECU tauschen | -| U0123 | CAN-Bus-Kommunikation verloren | CAN-Verkabelung + BCM-Status | +| DTC | Meaning | Action | +|----------|---------------------------------------------------|----------------------------------------| +| P0571 | EPB switch plausibility | Check switch | +| P0572 | EPB switch permanently actuated | Switch jammed? Clean | +| P0808 | Actuator current left too high (overcurrent) | Check motor + wiring | +| P0809 | Actuator current right too high (overcurrent) | Check motor + wiring | +| P080A | Clamping force left not reached (apply timeout) | Check actuator / mechanism | +| P080B | Clamping force right not reached | Check actuator / mechanism | +| P080C | Wheel-speed sensor plausibility | Check sensors / wiring | +| P080D | Inclinometer plausibility | Check sensor / mounting | +| P080E | Apply controller watchdog trip | Software reset; if recurring replace ECU | +| U0123 | CAN bus communication lost | Check CAN wiring + BCM status | -## 4. Service-Modus (Bremsbelag-Wechsel) +## 4. Service mode (brake-pad replacement) -### 4.1 Aktivierung +### 4.1 Activation -Voraussetzungen: -- Zuendung an, Motor aus -- Fahrzeug auf der Buehne oder mit gesicherten Raedern -- Fahrertuer geschlossen (oder Tuer-Signal ueberbrueckt) +Preconditions: +- Ignition on, engine off +- Vehicle on lift or with chocked wheels +- Driver door closed (or door signal bypassed) -Schritte: -1. Diagnose-Tester verbinden, Extended Session (0x10 0x03) -2. RoutineControl `0x31 01 03 01` senden — Start Routine -3. ECU bestaetigt, EPB-LED beginnt mit 2 Hz zu blinken -4. Aktoren fahren in Wartungs-Position (vollstaendig geloest) +Steps: +1. Connect diagnostic tester, Extended Session (0x10 0x03) +2. Send RoutineControl `0x31 01 03 01` — start routine +3. ECU acknowledges, EPB LED starts blinking at 2 Hz +4. Actuators move to maintenance position (fully released) -### 4.2 Deaktivierung +### 4.2 Deactivation -1. RoutineControl `0x31 02 03 01` senden — Stop Routine -2. EPB-LED beendet das Blinken -3. Apply-Funktion wieder verfuegbar +1. Send RoutineControl `0x31 02 03 01` — stop routine +2. EPB LED stops blinking +3. Apply function available again -### 4.3 Bremsbelag-Wechsel-Ablauf +### 4.3 Brake-pad replacement procedure -1. Service-Modus aktivieren (siehe oben) -2. Bremssattel demontieren -3. Belaege wechseln, Fuehrungen schmieren -4. Bremssattel mit 60 Nm anziehen -5. Service-Modus deaktivieren -6. Drei Apply/Release-Zyklen durchfuehren (zum Einschleifen) -7. DTC-Speicher leeren (Service 0x14) +1. Activate service mode (see above) +2. Remove brake calliper +3. Replace pads, grease guides +4. Tighten calliper to 60 Nm +5. Deactivate service mode +6. Perform three apply/release cycles (bedding-in) +7. Clear DTC memory (service 0x14) -## 5. Sensor-Pruefung +## 5. Sensor check -### 5.1 Wheel-Speed-Sensoren +### 5.1 Wheel-speed sensors -- Widerstand: 800-1500 Ω bei 20 °C -- Spannung bei 50 km/h: 2-5 V Peak-to-Peak (Hall) +- Resistance: 800-1500 Ω at 20 °C +- Voltage at 50 km/h: 2-5 V peak-to-peak (Hall) ### 5.2 Inclinometer -- SPI-Bus 1 MHz -- Erwarteter Wert auf ebener Strasse: 0 ± 0.5° -- Drift-Check: ECU + Tester, > 5 Min Beobachtung +- SPI bus 1 MHz +- Expected value on level road: 0 ± 0.5° +- Drift check: ECU + tester, monitor > 5 min -## 6. Aktor-Pruefung +## 6. Actuator check -| Parameter | Sollwert | +| Parameter | Target value | |-----------------------|------------------------| -| Widerstand pro Motor | 0.8 – 1.2 Ω | -| Stromaufnahme nominal | 3 – 5 A | -| Stromspitze (Apply) | 15 – 25 A | -| Cutoff-Schwelle | 8 A fuer 100 ms | +| Resistance per motor | 0.8 – 1.2 Ω | +| Nominal current | 3 – 5 A | +| Peak current (apply) | 15 – 25 A | +| Cutoff threshold | 8 A for 100 ms | -## 7. Software-Update +## 7. Software update 1. UDS Extended Session (0x10 0x03) 2. Programming Session (0x10 0x02) -3. Flashloader-Sequenz nach OEM-Spezifikation -4. Neue SW-Version per DID 0xF187 verifizieren +3. Flashloader sequence per OEM specification +4. Verify new SW version via DID 0xF187 -## 8. Aenderungshistorie +## 8. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/manuals-md/User-Manual.md b/docs/manuals-md/User-Manual.md index bec48ca..6ebff32 100644 --- a/docs/manuals-md/User-Manual.md +++ b/docs/manuals-md/User-Manual.md @@ -1,114 +1,105 @@ --- doc-id: SLM-EPB-USR-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- -# Bedienungsanleitung — Elektrische Parkbremse (EPB) +# User Manual — Electric Parking Brake (EPB) -| Feld | Wert | -|--------------|----------------------------------------| -| Produkt | demo-epb EPB-Steuergeraet | -| Version | 1.0 | -| Datum | 2026-05-12 | -| Zielgruppe | Fahrzeugfuehrer | +| Field | Value | +|---------------|----------------------------------------| +| Product | demo-epb EPB ECU | +| Version | 1.0 | +| Date | 2026-05-12 | +| Audience | Vehicle drivers | --- -> **Wichtige Sicherheitshinweise lesen!** -> Bevor Sie die EPB verwenden, machen Sie sich mit den Funktionen vertraut. +> **Read the important safety information first!** +> Familiarise yourself with the functions before using the EPB. -## 1. Was ist die Elektrische Parkbremse? +## 1. What is the Electric Parking Brake? -Die Elektrische Parkbremse (EPB) ersetzt die klassische Handbremse. Sie wird -ueber einen Schalter in der Mittelkonsole bedient und klemmt die hinteren -Bremsen elektromechanisch fest. +The Electric Parking Brake (EPB) replaces the classical handbrake. You operate it via a switch in the centre console; the system clamps the rear brakes electromechanically. -## 2. Bedienung +## 2. Operation -### 2.1 Parkbremse einlegen (Apply) +### 2.1 Engage the parking brake (apply) -1. Fahrzeug zum Stillstand bringen. -2. Bremspedal getreten halten. -3. EPB-Schalter **nach oben** ziehen (Pfeil zeigt zur Frontscheibe). -4. Die rote LED am Schalter leuchtet dauerhaft. +1. Bring the vehicle to a complete standstill. +2. Keep the brake pedal pressed. +3. Pull the EPB switch **upwards** (arrow points to the windshield). +4. The red LED on the switch lights up steadily. -Sie hoeren ein leichtes Brummen — das sind die Stellmotoren. +You will hear a soft humming sound — that is the actuator motors. -### 2.2 Parkbremse loesen (Release) +### 2.2 Release the parking brake -**Voraussetzungen** (alle muessen erfuellt sein): +**Preconditions** (all must be met): -- Motor laeuft -- Bremspedal ist betaetigt -- Gangwahlhebel ist eingelegt (kein Leerlauf) +- Engine is running +- Brake pedal is pressed +- Gear selector is engaged (not in neutral) -1. EPB-Schalter **nach unten** druecken. -2. Die LED erlischt. -3. Sie hoeren erneut ein kurzes Brummen. +1. Push the EPB switch **downwards**. +2. The LED goes out. +3. You will hear a short humming sound again. -### 2.3 Auto-Hold (Fahrer steigt aus) +### 2.3 Auto-Hold (driver leaving the car) -Wenn Sie den Motor abschalten und das Fahrzeug stillsteht, wird die EPB -**automatisch nach 2 Sekunden** eingelegt — auch wenn Sie sie nicht manuell -betaetigt haben. Die LED leuchtet als Bestaetigung. +When you switch the engine off and the vehicle is at a standstill, the EPB engages **automatically after 2 seconds** — even if you didn't operate it manually. The LED confirms. -### 2.4 Hill-Hold am Berg +### 2.4 Hill-Hold on inclines -Beim Anhalten an einer Steigung (> 5 %): +When stopping on a slope (> 5%): -1. Bremspedal treten — Fahrzeug haelt. -2. Fuss vom Bremspedal nehmen — die EPB uebernimmt automatisch. -3. Die LED blinkt langsam waehrend Hill-Hold aktiv ist. -4. Beim Anfahren (Gasgeben + Gang eingelegt) loest die EPB automatisch. +1. Press the brake pedal — vehicle stops. +2. Lift your foot off the brake pedal — the EPB takes over automatically. +3. The LED blinks slowly while hill-hold is active. +4. On drive-away (throttle + gear engaged), the EPB releases automatically. -## 3. Bedeutung der LED-Anzeige +## 3. LED indicator meaning -| LED-Status | Bedeutung | -|-----------------------|--------------------------------------------------| -| Aus | EPB geloest | -| Dauerleuchtend rot | EPB aktiv (Apply / Hold) | -| Langsam blinkend (2 Hz) | Hill-Hold aktiv oder Service-Modus | -| Schnell blinkend (4 Hz) | Fehler — bitte Werkstatt aufsuchen | +| LED status | Meaning | +|-------------------------|---------------------------------------------------| +| Off | EPB released | +| Steady red | EPB active (apply / hold) | +| Slow blink (2 Hz) | Hill-hold active or service mode | +| Fast blink (4 Hz) | Fault — visit a workshop | -## 4. Anzeige im Kombi-Display +## 4. Display in the instrument cluster -Das Kombi-Display zeigt zusaetzliche Texte: +The instrument cluster shows additional text: -| Anzeige | Bedeutung | -|------------------------|---------------------------------------------| -| "EPB aktiv" | Parkbremse eingelegt | -| "Hill-Hold aktiv" | Hill-Hold uebernimmt | -| "EPB Fehler" | Stoerung — siehe Werkstatt | -| "EPB Service-Modus" | Im Werkstatt-Modus, nicht selbst loesen | +| Text | Meaning | +|---------------------------|-------------------------------------------| +| "EPB active" | Parking brake engaged | +| "Hill-Hold active" | Hill-hold is taking over | +| "EPB fault" | Fault — visit a workshop | +| "EPB service mode" | In workshop mode, do not release yourself | -## 5. Notbetrieb +## 5. Emergency mode -Sollte die EPB nicht reagieren: +If the EPB does not respond: -- **Sie steht und kommt nicht weg:** EPB-Schalter mehrmals nach unten druecken; - bei Misserfolg Notabschleppdienst rufen. -- **Sie steht und EPB greift nicht:** Fahrzeug mit Unterlegkeil sichern, - Werkstatt kontaktieren. +- **Stationary and won't move:** push the EPB switch downwards several times; if unsuccessful, call breakdown service. +- **Stationary and the EPB does not engage:** secure the vehicle with wheel chocks, contact a workshop. -## 6. Sicherheitshinweise +## 6. Safety information -> **⚠ WARNUNG** +> **⚠ WARNING** > -> - EPB ersetzt nicht das Anziehen des Gangs beim Parken -> - Auf glatten Untergruenden zusaetzlich Unterlegkeile verwenden -> - Bei laufendem Motor und eingelegter EPB nicht ueber dem -> Bremspedal stehen lassen +> - The EPB does not replace engaging a gear when parking +> - On slippery surfaces additionally use wheel chocks +> - While the engine is running and the EPB is engaged, do not stand on the brake pedal long-term -## 7. Wartung +## 7. Maintenance -Die EPB ist wartungsfrei. Bei Bremsbelagwechsel muss die Werkstatt den -**Service-Modus** aktivieren — bitte das Fahrzeug nicht selbst aufbocken, -solange die EPB im aktiven Zustand ist. +The EPB is maintenance-free. For brake pad replacement, the workshop must activate **service mode** — please do not jack up the vehicle yourself while the EPB is in the active state. -## 8. Aenderungshistorie +## 8. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/manuals/Service-Manual.docx b/docs/manuals/Service-Manual.docx index 1829e2b9106f0889ea8d217f39ce5f938c56998c..a6022a64bd506080cc8c5bc905594262a7942f58 100644 GIT binary patch delta 5790 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 I@h;Z?004@~l>h($ delta 5897 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

h*JVU9XlUP(Z1g$W^WL>D=^H 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 delta 5591 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 B0k8l7 diff --git a/docs/non-conformities-md/NC-001.md b/docs/non-conformities-md/NC-001.md index 2881ecc..d67926e 100644 --- a/docs/non-conformities-md/NC-001.md +++ b/docs/non-conformities-md/NC-001.md @@ -1,60 +1,52 @@ --- nc-id: NC-001 -projekt: demo-epb -datum-festgestellt: 2026-05-11 -schwere: Critical +project: demo-epb +date-discovered: 2026-05-11 +severity: Critical status: Closed --- -# Non-Conformity NC-001: Step-Counter-Ueberlauf nicht dokumentiert +# Non-Conformity NC-001: Step counter overflow not documented -| Feld | Wert | +| Field | Value | |---------------------|-----------------------------------| -| NC-ID | NC-001 | -| Projekt | demo-epb | -| Datum festgestellt | 2026-05-11 | -| Festgestellt durch | Review REV-001 | -| Betroffenes Artefakt| `src/apply_controller.c` | -| Anforderung | SWE-002 (Watchdog) | -| Schwere | Critical | +| NC ID | NC-001 | +| Project | demo-epb | +| Date discovered | 2026-05-11 | +| Discovered by | Review REV-001 | +| Affected artefact | `src/apply_controller.c` | +| Requirement | SWE-002 (watchdog) | +| Severity | Critical | | Status | Closed | --- -## 1. Beschreibung +## 1. Description -Der `step_count` im Apply-Controller ist als `uint32_t` deklariert und wird in -`apply_ctrl_step_50ms` monoton inkrementiert. Bei 50 ms/Tick ueberlaeuft der -Zaehler nach 2^32 * 50 ms ~= 6.8 Jahren. Der Watchdog in SWA-002 vergleicht -zwar nur das Delta zwischen zwei Lese-Zugriffen (Wrap-Around unkritisch), aber -das Verhalten ist nicht im Header dokumentiert und kann bei nachfolgender -Code-Pflege Fehler erzeugen. +`step_count` in the apply controller is declared as `uint32_t` and is monotonically incremented in `apply_ctrl_step_50ms`. At 50 ms/tick the counter overflows after 2^32 * 50 ms ≈ 6.8 years. The watchdog in SWA-002 only compares the delta between two reads (wrap-around safe), but the behaviour is not documented in the header and may lead to errors in subsequent maintenance. -## 2. Risikobewertung +## 2. Risk assessment -| Aspekt | Bewertung | -|-------------------|----------------------------------------------------------------| -| Auswirkung | Theoretisch Watchdog-False-Negative bei Wrap-Around-Vergleich | -| Eintritts-Wahrscheinlichkeit | Sehr niedrig (6.8 Jahre Lebensdauer) | -| Sicherheits-Beitrag | Indirekt — Watchdog ist Teil der SG-01 Implementierung | +| Aspect | Assessment | +|-------------------|-------------------------------------------------------------------| +| Effect | In theory false-negative watchdog on wrap-around comparison | +| Likelihood | Very low (6.8 years lifetime) | +| Safety contribution | Indirect — watchdog is part of the SG-01 implementation | -## 3. Sofortmassnahme +## 3. Immediate action -Header-Kommentar in `apply_controller.h` ergaenzt: explizite Beschreibung des -Wrap-Around-Verhaltens. Watchdog-Implementierung (in SWA-001) muss Delta- -Vergleich mit `uint32_t` Subtraktion verwenden (Wrap-safe). +Header comment in `apply_controller.h` extended: explicit description of wrap-around behaviour. The watchdog implementation (in SWA-001) must use `uint32_t` subtraction for delta comparison (wrap-safe). -## 4. Korrekturmassnahme (Root-Cause) +## 4. Corrective action (root cause) -Im Code-Review-Checklisten-Eintrag "Integer-Ueberlauf-Verhalten dokumentieren" -ergaenzen. Pruefung in folgenden Reviews. +Add the checklist item "document integer overflow behaviour" to the code-review checklist. Verify in subsequent reviews. -## 5. Verifikation +## 5. Verification -- Kommentar in `apply_controller.h` v1.1 (Commit ``) -- Watchdog in SWA-001 verwendet `uint32_t`-Subtraktion (siehe SWA-001 §4) -- Review-Checkliste aktualisiert +- Comment in `apply_controller.h` v1.1 (commit ``) +- Watchdog in SWA-001 uses `uint32_t` subtraction (see SWA-001 §4) +- Review checklist updated -## 6. Abschluss +## 6. Closure -Geschlossen am 2026-05-11 durch S. Lohmaier nach Verifikation. +Closed on 2026-05-11 by S. Lohmaier after verification. diff --git a/docs/non-conformities/NC-001.docx b/docs/non-conformities/NC-001.docx index c36975f70312c98446e9fdf4bab2d4acfd05b1cf..2670635c7113071f9d7327aa828314a9fd5248d4 100644 GIT binary patch delta 4423 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 RNxwB_+37ZcpY3lq{{qmzA+i7f delta 4645 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 diff --git a/docs/plaene/CM-Plan.docx b/docs/plaene/CM-Plan.docx index b4006788af1301c94cb03dda6ac7d97d9a6769ee..274bd01c08d25698aa91477ef91bb70fb26ec9c0 100644 GIT binary patch delta 6123 zcmZ8l1yq#J*WO*amIkF3C6oq1>F!>nTR?hQQbJA?s#h%o!9eh;dYM72 z?ZA8&7y!TzLH+_UAf(jD=PD9rsr6M}XNK8Q&nb^`d-%!8NhuTI0ub)`n8z2U5|Y?20`$!$m4@#6J$OaiPO6zD|WW4ZPcamPKs}A ztyzjj&9XbM`UVoU<78WXh-S`+SDUL1T8jllP(;XKUfx7vAapvIAk%a`3!&U0n7{+H z)`haE%LBkzc^nV%eBtBCBlVCp20&hv9EV+?Xf>gV7puu~M{cZ~zL{)7a>zj*6H6A@ z(*Hbvqddz_Pu^#gH#lPP5xURKe39B$**R?M9m*>aI%j^GZ{qe+=@``j`~GChPD*Kf zE3?Ei%S{Vu#P>WJ=ic7$1iu21eN-uH?5f{~u4|}nQKM!h_aU0Y<)|_H`yQT~Xzpo{ zPKdDR+|v#)e~DBYW=BY#(|j54<)@pB39FLJ^@^L+=2FUmWx~%wuS5+OXq0Z*H%}@r zd&g(=_iqC~sQ1Ag@Y~*ckDFu%_A`(qBMT8YJ6p*`2*nGS=Y@u-Lrk-GSw&pd8kh{u zF8Gz8EYXs|n#%+BWBUle7lq1wSFOIFwB#m8v-w=G@v-d4n-93-nE%?t!BW*?(b(LI0S0sFpvWL5JrEU=v{79}^#XSyc|AS_P^ZbcK6S>8WHP zsu~(%e6WrwSfF3H7X%yo-pd+plODLRpS7Ph@hE4<3g1uvN*-Q*SynI&ACmTfffL*C^|BPjP%cT)XRmCM7y$@SBBtxw;a ziEzbXmJZ|r3$)NMl48I@?MS2D1zA{U64iZd#2bI2nk+%uPOrhCINT=V#Maxng7Bry zbt+QD*I zRpa!9_i{H%xsE&D!ywUR+jJ+vVioa71Z~ia8}(&GgXA0P#%^`G6iu&9k2YC+ckwI( z#+1UmCd{|()VIBm1BfkxU-Rgwa{DTgofAAI*GBo&$|YEN+I4)nd)0b z05_k_E=uaHio}|oC7K{?CqIpF&Y41A>GJyf+qi*nbMYga_!ECvydE)+E~kSaV*q$7 z`-%+_+;iTlF!=asigOd;x-wZ&$Mh>Ae%;c1Vh=hi55LYwSNpF>2fx#GWT`(=2d}~VkStv1v z&cLKnw=Z_|0qXX%4AWKUu%&SSoW$TPfR&=`=_veGgp$cA8s*-zaMN1Jo4g@URkBfe zyt%CoP$g=+Wgp_jXJ*{vCUy@lT*Nb*GaFPyV=a%gYVLolE~?(N#g9lW{+6Fw{Hfo9 z`57Ux#tV_!z;#C=u)&CmO=kB_?c@?*(kHOr< z%4z)C$ngpEto-5*Scfof;2=%9caI@|Ss191daD`un~)}g^)pJMIXrJ-j6`pX#Hl~# zigosv?s``mi@iCh{KCM8n|m9tT|p!}BST*5ml?fCT)`->!^{-KNFO5VQ*Bd&wxTr` za5&~ZQfT}NJSU8o_&b2ZSnY}FNvBxrjTST`@Cr^fOlb8V!`CbgO0IM}?}AuMGfeaJ=+_bfLGS zB7AR-QS$>NHE7Fz-aNx9HQu36AK8J*h|^QNjue}bCc^LX54s@vTC_RZ?qif@y0&p> z0ykK@6So~(BOgOx`MnMEi{y3pb)kS+6L|gX1KFpyh=>lm$Z6IV;Peixb!+Lmt@lwB zyN@Q7M_=(^6QkD?R;PoDX9Z?Urc3Z>*)w{wXQt*cXDxOY5@R*hsxLAtt=>Oot{I7< zmJfNGJGt91@D5wtj`T@%U~jl;ws#pHzwguy^_?y``J^twI_0yNt~kb%19glLBDJ7l z-+Gd2Xl?}ibeUWqth&I{>RaIubty9ji|^(8A{%Aj;RshLDJr~zqwjFpcuV94>p*v# zkZjyoyRU;^UJ@I9Jp8-XkG|aKq_UU!zjBSJ8bx&3++c3S6*atEwZXdnq2?M*9g&|~ zC_cW;9h#s+WMcEeWLJWb^fRAXd)~Elfpv3n8!f!~JATplSG?hq0|=!FSgDL^dqkeB zt{W$5*F>Beuh?I%7n}~tjM#m$=5k(p8aISuY)1~mYzTMeY85-|C_!V;^-vwZUo86K z-&{51{|T!vWi=NqR?g#U%nL`gl)QBJo*#Q>@pX_30#TCe_xa-+hT@wb>)hLy<6P&D z<1#i&bI|rtl0Ua&ziF6YOkV3UX!u30!TkKKB3tLO8N7JG0bBAoHX9~R?1oW|U@Y++ z7US62I)Ig81C0_I%xlj|iadj4G~O5aIiMDhMgG=rJNZ&VYyLw{ufF zw3GlbBBqt&9z#*d2Kvvho9uzToH7O1&xd6UoCB~5M6$>e)``aAWJebUi=u5UT;@dMU9IZlD zDxM$UL^*ypdMmuPv=%6TPSr*wt)a^TAG6&vM0QF5c|u^yx?JjP3yVJShsM+xi(qDB zLz@i(@{L}`qy(uHMn9t#pDz-Rj|!I9g6(TQ`Tx#OoEh91!aP{4j+@;KO0nS3d>uIR zSibRn=%JN@^1Eb3Y@R;KmoBTfS*O?}1R^6yELfw*@u6@=?aj0=k8Pin8%sRXf!Y)u zDq=)qGeALu+0VSJ9++-L-cY!WD7xb$Y%oa}13VBv=n5)h_ z;Po&^D2TW`Mt;l7&!vIm>fLmVLz;ayDFSx@FQl|y)*Jij5t>u+2`(CT5%RDhjz2$3 z*6v9z8qN3fwjbTYY(xcs<%lw!!Y~qwxEHj$4mqn-izU}-O&;2OkMzcwJTkjM$$B(* zj}Gc#BsaKC^0;E8$pztlG2f?fR>kpLczsfVq0$`;%8eS}T!R9aW`hzJDkT=`T|^aW z{HKekFwOBO6zPCG(kkmn2_MyEI7Qcre%7h;8Tk*;2j|y*L zAZcG+dg0+!KW&ZO`UKLP8j=|kOlDk3mAUxYqyX0w3h(h8jT1DwQ^ee)U3uxFzgnDmX+4UD02J+c@Om3dV$(G z#+l5+BY_x~Y62&)aJ4xs)eF=Vo@PE>sZf~wc3dX{5_Wk$Y*TjT@R-GJqVPbUumTEg z8MpG|{~py?>1-+J`NFLZF)`m_x-s#(soj)&fCF*Hsn?y5`W!OED)ep z|M+>6f@{rSht4X~VXVkn7v>6cM}=Zdv>bW-xdB~V97jsdpqdUNqJYTweEw>s^s}?M+toYsLmL^6-^EdUhO4gRQJjD72U<%f(O>-U5Cw^! z0P=I1Ll{@Sp80$mh}7XblRagImhp{UQ}3^>OS^gGUsf2rYigR7roSZjxHvPeY=xg; zJ1`d#8sWHjjBMa|wX3+8HfNs8<)MxfdwVf$aAm|(e@A@i z*|vNMcHIku+VZ3}oqvHew_#TaGcw>T$1VhegSe?7nnsf^jbEczj2AXCa3}9)sNOi8 zJk`$JOHWfE%YQbuATUJkz?<@xBh^@(q4-SRjnny?d32mgiDWr@qlQ36iS^6;^64EV zwXNN<-udHW?sxI%fmEWmqW@X`R;dzMJ=DL*2I7K;GT4NK0qvm=eXPjy&`&5!{Vk6v zRndW%59RSiM6no>2?{|Nt9H_obbnRo^u%##d^GBc|54c5)HJGx7vx5%drd6XCCzs+npFtRJ^{9~`i4V$aM{xz9{d>@f*sKE)M?-(n&DJ67Rj>#hL z_F@4L1Cqp`P{K_nBQb6!YzFgEqHlaqFLifu7!wGqx+NHg?ccU;lLx%qD7-q|xVC%r zQkziApGC~qaC5k8vwvP96y-Bb?IuFJl?qT6{KHUFz!+q#Z-0Q@0mjls_r9Nv_lVB=MIl}BpfQbnT zs`9N#R>Wg-9M}_foc4ZD-( z$$@a@G)GKRc5gw_lI<52KI1>W2mEKas;XYQqM!^?lvS~6k%9gi(mEIDe+?1in14oo zm~a5G{(NH)etCR%gTyl9LIKQ?{X$V0Fq>+fu#)KJ7Hp<42Ojj_h4cXaFf^)%~{)D+@dJQ6ddJq8OsSoxE zp#gV;8En+S?(Hb(y`Y#TFVMV_aQ<0ool`3I!7}M)%ZEWII6`ZbOi5qWb8Ii;yAuIq zrCNh=k0hyAcu)ZqjNvFe$Ko+0!4mc=9BP}rg?gF(!%h~<+btYF=IcrJQeE8e$&l`(%7*Z3nU7EIM;ZC_a%;5(DgHz*4`=qk7&8C#2x!3N`5`mAV7hk?Y1s~O%Xsz~; z&l`%~y}#m0Wo37AGn}$};p+a=&uGDBL(xTRVW)Hb8t(dan{6{9vubQGQ@x%ylZHg< zTqXBLmgf%R-`nBuHZU*z=UTeD8m^Qk+dvVbFm35CfC(dk*)K7$F7NUb@5MeatY340(T?M ztR0*moD+kGJ8fP)5=VjBm)tnZ4L>S0^Y~_>gfq6VyHQiogpuU+lz@4n3J1wBwaNW^iPq6|%y? zDILwAE%ZY&rbYx1_>E-Utp2-h?{i5{I^7WvI(60nrSFU9I5z&*+0%@Yf{%iP>I~wb z(>#{UgF!E<1B@=c;NC}=h5GDkMvjgK2sRc%zO$D1wMi$*QCdV#_!$+%zmtx;$lMFm zj<^+G0j{|rtIg?WwFN|WCfk0!`>b#&3&nfdR@gm~N`-(WcGq!d&cQ9tUP^UvNhYEl^MNj2oU0<95JBtPVERPL|70@1zPh>ec zqqyEYtd(#z!6*vHq>p8^vy}4L+tvh{RQx`yshGbk9$H<|*G${EFOJrS7}ed`6aEJN z_m0!BF8(Wt_co#r$|z>b`@a{%LAG2EZ|ZHSKvRTBV{`jheYW;jI*21JSFJ)j8GKKn!B z&a>x$M^2w2FYVE1P$hDAZk?=i0rNcKDG%)Cqu8nxa|UTt8iyoWylT5(*TEG60S{P{ha>JibFLi zLU0`5_bba9)4Ct?A(}7MXA)qA_StR*@O(C$w~12@t9jy--O{LES?-<-!uOO?GJVDU4;9c(ll^c3D?l+|#YuBd}>jC1?U5p~&DYPzD zW|_kk{t!8urfS(l52I6<+Ma-m&ndxsS#jb_sW_PAZw`8Ux{1xsm8{ApaS+`3! zn~7Gm`i#wS_HBv7KsZhVgpiw&J>n;@l6F}^x10U!tCTyG;E5Ov8f-K^NSl~ktHLO} zz?@{m>J#B5Az7_PpZc~+m?+IE)#HRH;Il#@)vsL_S4ts&loVfhBpPVc7L(4 z{DwVB<_p_W=(8+b>!U6V&6b>X{IowAq+aH<>L+JKO2R6dYXZxJ3JPLOt+DMUHv*Sb@_~k4TdHl5X2^r5(!O zl;SH+XJ9ApY2#EhqGv&qC9SQp86M*%^WoyED0{)o!7NW_zS~o3n6_9q2{d5VMI#UR z?Dj>nNCbEIFs*w8#K24KjqQEyeT2isofuQ3Xknm<{ntxMit1B8X0giod0CDy-;fh! zES}~@4A$p#>>R~Pt8(yQ#b*YH;_=L3?-vMtG~iEF9>U6G|0+37+VH0JmF@|0`rKYQ2Kb$^kX%Vaw^WRHs4CY@8 zpePNH6y==={KZcmp|_UakFnDjlZSK^i2nxDPPer<%GnNQkxs$xF-xMV>-Qlq=4ms% zzS>^=_^EeN>!R?D$yHqDz=IwpChx%7^lCVssr5?ohvtnwd+SIJ&iau@TofnbS6t4p z_|yfE;_<@?*87&6FR?9puM0J{c>` z9YjBF7Qx~AiW+ag*VaqW6yL#%GvLdRJVt~c-PO);g{*-7h9?9ood8oUskH_%otK*| zHPj{g@^t-!JMWR}R@@eJ9bDh1JDv(lxPGGVRl+R0rt50u!VH2TdnpeDI@LnK6 zIq?*(84I`IO~~2&=8LlX1Y9MmI&JLv-cW3_J#rD|TYx1_3$s|Mw3$`Iy;0TX8etX98Z+dhteLmpihgahWk_#2Sn&yg5RmMU>pIxbv zU@>aXkrVikk1&c{TY|(DLinIN`PPWl!I)tZ;=A00WZRkr0ZYW;u+YYAxsD2=gJIt} zbR?8SLiEN+()mKz3{fa`m4-*0T1b0!9L#vddW1v1NrRFasuI0?aw7y||AHV^qCLaG z>;wg?H14BVB{2>50H)~!RMhnV&Vn9>WxfHN)s9)5)z_3L>76oF^fW8#4L`Diw{rA? z_Tc=M04$>6B4RQUV(N-JIvekyjP8aUyD&{u9!mxj_xhKy-^5sG0hU8#ei&YBab21C zZ081xZ>hV2J56^}6DeR{uXA?OJA=*bbn-NZ^YpB5SqS7ys#>SXqu#61rbGEgS+A(W z0Y=5o1u`+)4K|Nv+7ry3U7{>P;U~QP zrhMY)7aH%sATuo?}$~V=sngQTAv8Bf4QMee`=+;vn8}nDI|2 z>o%}wsPN}U$JWHze$gLXTZEOn>inMQr=L^aNm7NU1dY!vcZjxRA3l3i$nWx2U6dz$ z(L>49+}ej>v~r{3fd$RlgAC-|cs4vfH83eXFQuai4CnaCreE;Hau@gyjT$AkW3TNtdem9OW|r|?HZEaWkeU1drJK>$Neg`@^IISJ zRs9czRsGAI+1e;s8pjNcM1WpRD*ja!rHs2{egLN)fn3ERl! z3#J+75P7>u3mbo^zKs3BVcaZm@U_5UsP@Z%jks6ES{6D{E@2Km)RWf5(qPq5>-6EH z0j;@qB^g*oMR?LciqOvOg`A_|2M01A?U@IndbBv$Xdl@a5=Qe5uP+sJizqNUDLi_x z6)(rX%HJ3#s1LlUki^^jh+VvK(FeoaiK7+v!dn>14Q-^2p1OMMGNzKa|o zFdw-Z_XQ9kI0-y6*nAV0F&C<*BCboGg7n7pW_4k)x*KhN$4ZzbhM)(zjsxXfHznb< zF}qlE$Q6^HybI+W&S+%h+K%>9m_7#j(u}-nUCq%)6?#!~f{+=%#-`%<#pWD$$!@9Z zq8T<1kBeX_ngR7L8AB$IcI$z|f|cd?T{>FNE_B!LE=pL2SByN-6nY96fffW-qSbf%ikJvHvfy98_-Hzvb+dIWDm zrp82%9AR>!hR9a*{Cs4V2k_Cein;GGU&j*B?`-J%2&_ z)0-uqhH~(|ob4rK`Ij?-8eC2OzJO~_sXq~>hmXP$(59obJb9UM#n@!tO?IF}&zAaV zdZ?zRJ~msI#-`B0{&FjteFOu2_i05@g^!lVrCS3KRaAv1w;4BJh`5Q082XJ_ppRJi z#{D+wF~tz45PqMN-x=u4ry^)jU!Iu+-%&Z9g~7?uI8csAYK0G@)YzG${JmTxdh!x1 zfp0TuSm}z!Ftt|#R;?4tS%)ocCLbeohNUT$BF?YyKSojW`)y~<-agz?{scejER=?RN$>}7QuTA`zoVC#$rGVmT zhh)<$_xDdrca<9kdZ**&zVNskj zzEYvP!D8kxjr)PD%pdyFnLu`>5Ys$HqUQp6^C^?pOoJqRK$26scRKkJp&B$d+UvJO z8*;usW{mNq?>g?0l3eoQl$w#$PHYe{Zj0*5e<;}Nu}ahcTZ(r1r>^q#im zo!BRf=pMhn`hneIg|uO2SiaSwWUBP^~+?{n@Nc^|t~=+n?MjWb9w8r|89Yh33Ml}UL$EOI-k#z-+$ z85JQny6rGn#@lS)MK6(#!Ik40_B|RcCTkwota&Dl535(Gwvik{l5c?6sb`VnLAcXk zpqDZGOkBwCw<=5Yu%%;NYJ?O}FOF?b<$T z3pU;@-t*$syh&|6%SvgCrW%lqKk9S#31(& zux&wytbw)3i=OWsN9bvN9ZwpMyAYkdzLpR^-?k2u)tVpfh?)4OumFhF^5TlyfzkSq zk9TdReHPM)(HYKAD}RiyQD-wW*2g58BqcGV(Ca9~CS>J0_anfYcSHqxTxP_45w&1( zX}RN5hw8y+3Ul!2d|iQ1X=;Dkdu2_-J$9a*J`t_jLL>Qu4=cnZQ17#nCsU=4uZE|? z(1n!E_-MRE=$k+cXo0lBeHzw$ETa_(EqKqn>L6Y@5MG;i?r-sbDxp2V&3<(R2stf zy_1&GUoBpzjRnNH*W%xy{=x8W9WZRty`P^b(u(z1x`7lUu9}FjMjWAEs*l*4Y^11< zf!TV{1YGB0D5M7MPwwa3NV#;H(rIOdD#k2+VdcbE5v-r#bo19ZZZX{!F-0VvT66&T z-Us4TFxpp6s_@>V9S}>G3y(=t632h5hb(niW0VOVR8Sl<_{nh(k>V>i_O*JPB zBKx|~GFs2ujTw(Syg4zAR>W^g^t45jn@X+-f8+eg+pki6mHzUBZVJM;DDuSh$mDS6h_t zGBJUG0KhQ(fgUYv)Omm(qzoH$tWz`E6Bcbzl&+!15#C+Nuu~<1sH82wnt|0R2(2lL zJu>YH_g;yjsFOjyr^yku7{$00B9LOMbZ$E!ssC#99M{OHYxKFT@@iclB26P$|?-lL7n)|fq0c`W80FQUCEOU z>GPzlA&1Lpm#9rGG?{n?zBmAOO8PUx&;tkl{ODvNJ^?nW(W;-7ztJpVW^8?Mgf*_C z^J5%U8aJPv)x=Mn?`?r}gX{twzEGc|n^~#eT(YRHoC>SgpX--w`K=TaZaR0syg|^X zUP9BxxkpJ1z6Xh;ooz4UuYX6AUe$R{f9IU_`1gJ_sp$Kmqi?%bHT4>jqy04&jL)(D z8q=03{~57;#s|dx^Nq#$HBR3(Jl{qD9jCbzK4rtmT~~XDLtkClpgAf`eY(L>lva^2 zDwX(p+bXz(qn>b_z?;>H+N~n7b{Jd>r-f3&N(Ip#w+Tz=kFzrSycto~-JKd1zfE8; ziKJH`EXHxQH0n@IpIT_Z+?a54o+mFk=Z_#RsW$7788HI`n8NUmi7kZM?W$*=+u6>b z1)0kkiUI8!$(PuxTD|h{zORvObtjMO62=?NkZYRj1kdg#ee@y%uQfkm+Xrn&OOLC= zFbJ_drN43pjwo=)ipJ@>6mMf(6imCR;)ePsJWT05E?#X-`!J7OBY8y_Ff!Jt@-6EW zydHK9-u#I*F498BEBoMLvLfTq@j!S{v&V-gn0mjmkJ^$|KFyRj<2^p%GO&jFNhfU* zYT)huY)NG_dn-zq11_@VbXl;TkV|9;BaWtMp<}EjTaW~YQNNPO>T_v@?|bvE^SyLS zdKQR!2bwzyBL#2z?7pnY+nSq*T_3xgLn-?T4<1;-{P~?XYmkW_+d4yjpZ$aeJ(e9` zwtLz-y0HEpJIJ>xgKrAr%l@$SqyOx6podJJ4vgOFHnLx=`-^QI!#jWKPqJ^02xb3C z{(aJWY|HZmZS6#TfJsoV>eUTqD{Nnh zxTx;AN^qj|mn68j{P(d-UG}#Nu^;dJZ)GHs+S)?K0_xG+vOza0<)7R!7%K9G8g|6W z;9u?Qh$%IY`Oi6vRu^74SrD!~t=>TH0S5b#rm~tfhMpj*Tm=z9`l`c7yXuoNGYfW%&F%;@BR|icD^^bX&E_+g( z^cCW^Zw4136nS1)Fo~bKIwKpy_w|k;T9L^JIoCGm)b{vM*1NKXSx4q0lcou$YEN|# zeQCl_NmNSigt#Aei}Tuwmw4Yp_!!@XBzVYgfYD@_yZ;(hlTHrvp=>A9urH(aG=((# z&fiQu2;~`swvz2bKYT5eG)%CMpX*4e*t#hS%TQdW&=4Ce%{CYg-yHRW+ z6KJ)1##*k9fi}S^+!W_FQyO*hOx+^WOY{pz`UmT9aHChgoRCh#AZ%3!+2$w7N zrx#4QCLE8UQ=D|&TmXTGt6k#qr=l5GqBnbSLbtM?Vvh%CHt!x`!2thz8r`4v&r<`hcj38@ zSosrS2!j81VYv6`U1@6(`X7{Yc)L6JZ^YL>AYeQAr91uK8vUP}4E7-VvtAJoFwQ;9FPV-{@HKaGG*u_K Nj|UUhk@G#){{cigY#RUo diff --git a/docs/plaene/PID.docx b/docs/plaene/PID.docx index b755f311ba240bffd2ed0f73232b42d968cd17df..2cded954bef7ea7ac024451b504dd433ed678c96 100644 GIT binary patch delta 5637 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 delta 5758 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 SM&vYy>08sFEL;2v;{O1>vrwJ@ diff --git a/docs/plaene/PM-Plan.docx b/docs/plaene/PM-Plan.docx index 4f36b92082f98c38147628bd375ad76bab46fd71..b6d8a21bc118e5315853ffcd0ff43ecdd41bdd3d 100644 GIT binary patch delta 4445 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 delta 4523 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 diff --git a/docs/plaene/QA-Plan.docx b/docs/plaene/QA-Plan.docx index c32dd79239c76054ccbf2c7051769c0dd8d64240..cc04e3b057e95adaf786393a0f7917eb126b3465 100644 GIT binary patch delta 4549 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 delta 4831 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 diff --git a/docs/plaene/RM-Plan.docx b/docs/plaene/RM-Plan.docx index aec813a1d9031443a20c832326b3c19e0211a85b..5c607fafec88281d00215b033dcdbe5b3d59847a 100644 GIT binary patch delta 5510 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 BVUqv= delta 5594 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 delta 5776 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 n`u`+l>*C^RD9~|5N3HE;gTAa=M diff --git a/docs/plaene/Test-Plan.docx b/docs/plaene/Test-Plan.docx index 43d61f8f516d3c25fcd5513c5e4c6eebf0d7b7f2..ae4524bc40a35f86005b19212f8c58e018eee8fe 100644 GIT binary patch delta 4295 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 c;vbPpw57`*k?>0qK6`YQ3p>dK>^I-...` -- **Release-Branches:** `release/vX.Y` (nur bei Real-Projekt; Demo: direkt von main) +- **Branch `main`:** stable, always released state +- **Branch `develop`:** current development state +- **Feature branches:** `feature/SWE-XXX-...` +- **Bugfix branches:** `bugfix/-...` +- **Release branches:** `release/vX.Y` (real projects only; demo: from main directly) ## 4. Baselines -Eine Baseline ist ein eingefrorener, freigegebener Stand. Baselines werden durch -Git-Tags gesetzt. +A baseline is a frozen, released state. Baselines are set via git tags. -| Baseline-Typ | Tag-Schema | Wann | +| Baseline type | Tag scheme | When | |---------------------------|-------------------|----------------------------------------| -| Requirements Baseline | `req-vX.Y` | Nach Anforderungs-Freigabe | -| Architecture Baseline | `arch-vX.Y` | Nach Architektur-Review | -| Release Baseline | `vX.Y.Z` | Bei produktiver Freigabe | -| Internal Snapshot | `snap-YYYY-MM-DD` | Bei wichtigen Zwischenstaenden | +| Requirements baseline | `req-vX.Y` | After requirements release | +| Architecture baseline | `arch-vX.Y` | After architecture review | +| Release baseline | `vX.Y.Z` | On productive release | +| Internal snapshot | `snap-YYYY-MM-DD` | On significant intermediate states | -Jeder Tag triggert (bei `vX.Y.Z`) den Release-Workflow, der ein Bundle erzeugt. +Every tag (specifically `vX.Y.Z`) triggers the release workflow, which produces a bundle. -## 5. Versions-Schema +## 5. Versioning scheme -| Artefakt | Schema | +| Artefact | Scheme | |-----------------------|------------------------------------------| -| Software-Release | Semantic Versioning `MAJOR.MINOR.PATCH` | -| Anforderungen | Doorstop-Level `X.Y` + Datum | -| Architektur | Doorstop-Level `X.Y` + Datum | -| Word-Dokumente | `MAJOR.MINOR` im Dokument-Header | +| Software release | Semantic Versioning `MAJOR.MINOR.PATCH` | +| Requirements | Doorstop level `X.Y` + date | +| Architecture | Doorstop level `X.Y` + date | +| Word documents | `MAJOR.MINOR` in document header | -## 6. Change Control +## 6. Change control -Aenderungen an Configuration Items erfolgen ueber: +Changes to configuration items occur via: -1. **Trivial-Aenderung** (Tippfehler, Kommentare): direkt im Branch, PR mit 1 Approval -2. **Normal-Aenderung** (Feature, Bugfix): Feature-Branch, PR mit Reviews je nach ASIL -3. **Major-Aenderung** (Architektur, Sicherheits-Konzept): Change Request + Reviewer-Quorum +1. **Trivial change** (typos, comments): directly on the branch, PR with 1 approval +2. **Normal change** (feature, bug fix): feature branch, PR with reviews per ASIL +3. **Major change** (architecture, safety concept): change request + reviewer quorum -| Asil | Reviewer-Mindestanzahl | -|---------|--------------------------------------| -| QM | 1 | -| ASIL-A/B| 1 | -| ASIL-C | 2 (mind. 1 Technical Reviewer) | -| ASIL-D | 2 Technical Reviewer + Safety Manager| +| ASIL | Minimum reviewer count | +|---------|---------------------------------------| +| QM | 1 | +| ASIL-A/B| 1 | +| ASIL-C | 2 (at least 1 technical reviewer) | +| ASIL-D | 2 technical reviewers + Safety Manager | -Reviews werden in `docs/reviews/REV-XXX.docx` dokumentiert. +Reviews are documented in `docs/reviews/REV-XXX.docx`. -## 7. Release-Prozess +## 7. Release process ``` -1. Alle PRs in main gemerged -2. Branch protected, alle CI-Checks gruen -3. Release-Notes-Entwurf im PR vorbereitet -4. Tag setzen: git tag -a vX.Y.Z -m "..." +1. All PRs merged into main +2. Branch protected, all CI checks green +3. Release notes drafted in the PR +4. Set tag: git tag -a vX.Y.Z -m "..." 5. Push: git push origin vX.Y.Z -6. Release-Workflow laeuft (.gitea/workflows/release.yml): - - Build + Tests + Coverage - - Traceability + Diagrams + API-Doc - - Word-Dokumente bundlen - - Source + Artefakt-Archive packen - - Gitea-Release anlegen -7. Release manuell pruefen (Bundle herunterladen, sichten) -8. Release als "stable" markieren +6. Release workflow runs (.gitea/workflows/release.yml): + - Build + tests + coverage + - Traceability + diagrams + API doc + - Bundle Word documents + - Pack source + artefact archives + - Create Gitea release +7. Review release manually (download bundle, inspect) +8. Mark release as "stable" ``` -## 8. Aufbewahrung +## 8. Retention -| Artefakt | Aufbewahrungsdauer | +| Artefact | Retention | |--------------------------|----------------------------------------| -| Git-Repository | Unbegrenzt (Gitea + Backup) | -| Release-Bundles | 10 Jahre nach Produkt-EOL | -| Reviews + NCs | 10 Jahre nach Produkt-EOL | -| MISRA-Records | 10 Jahre nach Produkt-EOL | -| CI-Artefakte (kurzlebig) | 90 Tage (in Gitea-Artifacts) | +| Git repository | Indefinite (Gitea + backup) | +| Release bundles | 10 years after product EOL | +| Reviews + NCs | 10 years after product EOL | +| MISRA records | 10 years after product EOL | +| CI artefacts (short-lived)| 90 days (in Gitea artifacts) | -ISO 26262 fordert 10 Jahre nach End-of-Production-Life (Annahme). +ISO 26262 requires 10 years after end-of-production-life (assumption). -## 9. Verifikation +## 9. Verification -Alle Pull Requests laufen durch: -- `doorstop`-aequivalenter Traceability-Check (`tools/traceability.py check`) -- Build + Unit-Tests -- Static Analysis + MISRA-Check -- Coverage-Messung +All pull requests pass through: +- Doorstop-equivalent traceability check (`tools/traceability.py check`) +- Build + unit tests +- Static analysis + MISRA check +- Coverage measurement -Erst nach Approval und CI-Gruen kann der Merge nach `main` erfolgen. +Only after approval and green CI may a merge into `main` occur. -## 10. Verantwortlichkeiten +## 10. Responsibilities -| Rolle | Aufgabe | -|------------------|--------------------------------------------------| -| Configuration Mgr| Pflege dieses CM-Plans, Repo-Hygiene, Baselines | -| Entwickler | Korrekte Branch-Strategie, sinnvolle Commit-Msg | -| Reviewer | Pruefung vor Merge, Audit-Trail | -| Project Owner | Release-Freigabe | +| Role | Task | +|------------------|---------------------------------------------------| +| Configuration Mgr| Maintain this CM Plan, repo hygiene, baselines | +| Developer | Correct branching, meaningful commit messages | +| Reviewer | Review before merge, audit trail | +| Project Owner | Release approval | -## 11. Aenderungshistorie +## 11. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/plans-md/PID.md b/docs/plans-md/PID.md index a5bfcfe..228012f 100644 --- a/docs/plans-md/PID.md +++ b/docs/plans-md/PID.md @@ -1,107 +1,107 @@ # Project Initiation Document (PID) -| Feld | Wert | +| Field | Value | |-----------------|--------------------------------------| -| Projekt | demo-epb (Elektrische Parkbremse) | -| Projekt-ID | SLM-EPB-001 | -| Auftraggeber | slohmaier.com (Demo-Eigenentwicklung)| -| Auftragnehmer | Stefan Lohmaier | -| Datum | 2026-05-11 | +| Project | demo-epb (Electric Parking Brake) | +| Project ID | SLM-EPB-001 | +| Client | slohmaier.com (in-house demo) | +| Contractor | Stefan Lohmaier | +| Date | 2026-05-11 | | Version | 1.0 | -| Status | Freigegeben | -| Klassifikation | Oeffentlich | +| Status | Released | +| Classification | Public | --- -## 1. Projektzweck +## 1. Project purpose -Demonstration des slohmaier Dev Process anhand einer EPB-Steuergeraet-Software. Ziel ist nicht die produktive Software, sondern der vollstaendige Nachweis von: +Demonstration of the slohmaier Dev Process using an EPB ECU software. The goal is not the productive software but a complete demonstration of: -- ASPICE-4.0-konformer Entwicklungsablauf -- ISO-26262-konforme Behandlung von Sicherheitsanforderungen (ASIL-D / ASIL-B / QM) -- MISRA-C-Compliance -- Werkzeugkette: Gitea + Doorstop + Cppcheck + gcov + CppUTest + pandoc +- ASPICE 4.0-compliant development flow +- ISO 26262-compliant handling of safety requirements (ASIL-D / ASIL-B / QM) +- MISRA C compliance +- Toolchain: Gitea + Doorstop + Cppcheck + gcov + CppUTest + pandoc -Adressat ist potenzielle Kundschaft, die sehen will, wie ein realer Audit-faehiger Engineering-Stand aussieht. +The target audience is potential customers who want to see what a real audit-ready engineering snapshot looks like. -## 2. Produktbeschreibung +## 2. Product description -Eine Electronic Parking Brake (EPB) klemmt im Stillstand zwei Bremssaettel ueber kleine Elektromotoren fest und loest sie bei Anfahrt wieder. Funktionsumfang: +An Electric Parking Brake (EPB) clamps two rear callipers via small electric motors at standstill and releases them on drive-away. Functional scope: -- Apply / Release auf Fahrer-Anforderung -- Hold-Funktion mit Auto-Apply bei Motor-Aus -- Drive-Away-Assist (Auto-Release beim Anfahren) -- Hill-Hold am Berg -- Aktor-Stromueberwachung -- Service-Modus fuer Werkstatt -- UDS-Diagnose ueber CAN +- Apply / Release on driver request +- Hold function with auto-apply on engine-off +- Drive-Away-Assist (auto-release on drive-away) +- Hill-Hold on inclines +- Actuator current monitoring +- Service mode for the workshop +- UDS diagnostics via CAN -## 3. Sicherheitsziele +## 3. Safety goals -| ID | Sicherheitsziel | ASIL | +| ID | Safety goal | ASIL | |-------|---------------------------------------------------------------|------| -| SG-01 | Verhinderung ungewollten Wegrollens des Fahrzeugs | D | -| SG-02 | Verhinderung ungewollten Loesens der Parkbremse | D | -| SG-03 | Verhinderung Motorschaden durch Ueberlast | B | +| SG-01 | Prevent unintended vehicle roll-away | D | +| SG-02 | Prevent unintended release of the parking brake | D | +| SG-03 | Prevent motor damage from overload | B | -Die Sicherheitsziele werden in den System-Anforderungen (`reqs/sys/`) weiter detailliert. +Safety goals are detailed further in the system requirements (`reqs/sys/`). -## 4. Stakeholder +## 4. Stakeholders -| Rolle | Person / Funktion | +| Role | Person / Function | |--------------------|--------------------------------| | Project Owner | Stefan Lohmaier | | Technical Lead | Stefan Lohmaier | | Quality Assurance | Stefan Lohmaier | -| Reviewer | Externer Reviewer (TBD) | -| Kunde (Demo) | Interessenten / Prospects | +| Reviewer | External reviewer (TBD) | +| Customer (demo) | Prospects / interested parties | -Bei einem Realprojekt waeren QA und TL personell getrennt; in dieser Demo wird die Rollentrennung dokumentarisch nachgehalten. +In a real project QA and TL would be separate persons; in this demo the role separation is kept on paper. -## 5. Liefergegenstaende +## 5. Deliverables -| Artefakt | Format | Status | -|-----------------------------------|---------------|-------------| -| PID, PM-Plan, QA-Plan, SWE-Plan, Test-Plan | Word | Vorhanden | -| System-Anforderungen (SYS-001..010) | Doorstop-MD | Vorhanden | -| Software-Anforderungen (SWE-001..025) | Doorstop-MD | Vorhanden | -| System-Architektur (SA-001..005) | Doorstop-MD | Vorhanden | -| Software-Architektur (SWA-001..010) | Doorstop-MD | Vorhanden | -| Quellcode (3 Demo-Komponenten) | C99 | Vorhanden | -| Unit-Tests + Coverage-Report | CppUTest, lcov| Vorhanden | -| MISRA-Report | Cppcheck XML | Vorhanden | -| Traceability-Matrix | Doorstop HTML | Generiert in CI | -| Review-Protokoll (Beispiel) | Word | Vorhanden | -| MISRA Deviation Record (Beispiel) | Word | Vorhanden | +| Artefact | Format | Status | +|-------------------------------------------|---------------|-------------| +| PID, PM Plan, QA Plan, SWE Plan, Test Plan | Word | Available | +| System Requirements (SYS-001..010) | Doorstop MD | Available | +| Software Requirements (SWE-001..025) | Doorstop MD | Available | +| System Architecture (SA-001..005) | Doorstop MD | Available | +| Software Architecture (SWA-001..010) | Doorstop MD | Available | +| Source code (3 demo components) | C99 | Available | +| Unit tests + coverage report | CppUTest, lcov | Available | +| MISRA report | Cppcheck XML | Available | +| Traceability matrix | Doorstop HTML | Generated in CI | +| Review minutes (example) | Word | Available | +| MISRA Deviation Record (example) | Word | Available | -## 6. Zeitplan +## 6. Schedule -Demo-Projekt, Single-Sprint-Erstellung. Eintaegige Initialerstellung, danach Pflege. +Demo project, single-sprint creation. One-day initial creation, maintenance thereafter. -| Phase | Start | Ende | -|------------------------|-------------|-------------| -| Konzept + Setup | 2026-05-11 | 2026-05-11 | -| Requirements + Architektur | 2026-05-11 | 2026-05-11 | -| Implementierung Demo-Komponenten | 2026-05-11 | 2026-05-11 | -| Tests + CI | 2026-05-11 | 2026-05-11 | -| Freigabe v1.0 | 2026-05-11 | 2026-05-11 | +| Phase | Start | End | +|-------------------------------|-------------|-------------| +| Concept + setup | 2026-05-11 | 2026-05-11 | +| Requirements + architecture | 2026-05-11 | 2026-05-11 | +| Implementation of demo components | 2026-05-11 | 2026-05-11 | +| Tests + CI | 2026-05-11 | 2026-05-11 | +| Release v1.0 | 2026-05-11 | 2026-05-11 | ## 7. Budget -Demo-Projekt, kein externes Budget. Aufwand intern. +Demo project, no external budget. Internal effort. -## 8. Risiken +## 8. Risks -| Risiko | Wahrsch. | Auswirkung | Massnahme | -|-----------------------------------------|----------|------------|-------------------------------------------| -| Demo wird als produktreifer Code missverstanden | M | M | README + Disclaimer explicit kennzeichnen | -| MISRA-Tooling-Update bricht CI | N | M | Tool-Versionen in CI pinnen | -| Reviewer-Verfuegbarkeit | M | N | Self-Review dokumentiert (Demo) | +| Risk | Likelihood | Impact | Mitigation | +|-----------------------------------------------|------------|--------|----------------------------------------------| +| Demo is mistaken for production-ready code | M | M | Disclaimer in README + plain labelling | +| MISRA tooling update breaks CI | L | M | Pin tool versions in CI | +| Reviewer availability | M | L | Self-review documented (demo only) | -## 9. Erfolgskriterien +## 9. Success criteria -- Alle 35 Anforderungen sind verlinkt und durch Architektur abgedeckt -- `doorstop check` ist gruen -- MISRA-Check in CI ist gruen (mit dokumentierten Deviations) -- Coverage der Demo-Komponenten >= Zielwert (siehe SWE-Plan) -- Demo-Tour im README ist fuer einen Prospect in <30 min nachvollziehbar +- All 35 requirements are linked and covered by architecture +- `doorstop check` is green +- MISRA check in CI is green (with documented deviations) +- Demo-component coverage meets target (see SWE Plan) +- The guided tour in the README is navigable by a prospect in < 30 min diff --git a/docs/plans-md/PM-Plan.md b/docs/plans-md/PM-Plan.md index 0349314..50f4fdc 100644 --- a/docs/plans-md/PM-Plan.md +++ b/docs/plans-md/PM-Plan.md @@ -1,63 +1,63 @@ -# Projektmanagement-Plan (PM-Plan) +# Project Management Plan (PM Plan) -| Feld | Wert | +| Field | Value | |-----------------|--------------------------------------| -| Projekt | demo-epb | -| Datum | 2026-05-11 | +| Project | demo-epb | +| Date | 2026-05-11 | | Version | 1.0 | -| Status | Freigegeben | +| Status | Released | --- -## 1. Projektorganisation +## 1. Project organisation -Single-Person-Projekt mit dokumentierter Rollentrennung. In einem Real-Projekt waeren QA, TL und Entwickler personell getrennt; hier wird der Audit-Trail durch Self-Review mit Begruendung gefuehrt (siehe SWE-Plan, Abschnitt 5). +Single-person project with documented role separation. In a real project, QA, TL, and developer would be separate persons; here the audit trail is maintained through self-review with rationale (see SWE Plan, section 5). -## 2. Arbeitspakete +## 2. Work packages -| WP-ID | Arbeitspaket | Verantwortlich | Status | -|-------|--------------------------------------------|----------------|--------------| -| WP-01 | Projektplanung (PID, PM-Plan, QA-Plan, SWE-Plan, Test-Plan) | S. Lohmaier | Done | -| WP-02 | System-Anforderungen (SYS-001..010) | S. Lohmaier | Done | -| WP-03 | Software-Anforderungen (SWE-001..025) | S. Lohmaier | Done | -| WP-04 | System-Architektur (SA-001..005) | S. Lohmaier | Done | -| WP-05 | Software-Architektur (SWA-001..010) | S. Lohmaier | Done | -| WP-06 | Implementierung Demo-Komponenten | S. Lohmaier | Done | -| WP-07 | Unit-Tests + Coverage | S. Lohmaier | Done | -| WP-08 | CI-Pipeline (Gitea Actions) | S. Lohmaier | Done | -| WP-09 | Audit-Artefakte (Review, NC, MISRA-Record) | S. Lohmaier | Done | +| WP-ID | Work package | Owner | Status | +|-------|---------------------------------------------|----------------|--------| +| WP-01 | Project planning (PID, PM, QA, SWE, Test) | S. Lohmaier | Done | +| WP-02 | System Requirements (SYS-001..010) | S. Lohmaier | Done | +| WP-03 | Software Requirements (SWE-001..025) | S. Lohmaier | Done | +| WP-04 | System Architecture (SA-001..005) | S. Lohmaier | Done | +| WP-05 | Software Architecture (SWA-001..010) | S. Lohmaier | Done | +| WP-06 | Implementation of demo components | S. Lohmaier | Done | +| WP-07 | Unit tests + coverage | S. Lohmaier | Done | +| WP-08 | CI pipeline (Gitea Actions) | S. Lohmaier | Done | +| WP-09 | Audit artefacts (Review, NC, MISRA record) | S. Lohmaier | Done | -## 3. Aenderungsverwaltung +## 3. Change control -- Aenderungen an freigegebenen Artefakten erfolgen ueber Pull Requests -- Jeder PR braucht mindestens 1 Approval (siehe SWE-Plan, Abschnitt 5) -- Bei Aenderung von Architektur oder Anforderungen ist die Traceability-Matrix neu zu erzeugen (`doorstop publish`) -- Aenderungshistorie wird in der jeweiligen `.md`-Datei oder Word-Datei revisioniert +- Changes to released artefacts go through pull requests +- Every PR needs at least 1 approval (see SWE Plan, section 5) +- When requirements or architecture change, the traceability matrix must be regenerated (`doorstop publish`) +- Revision history is maintained inside the respective `.md` file or Word document -## 4. Konfigurationsmanagement +## 4. Configuration management -| Artefakt-Typ | Versionsverwaltung | Baseline-Mechanismus | -|-----------------------|------------------------|--------------------------| -| Code | Git (Gitea) | Git-Tag (z.B. v1.0.0) | -| Anforderungen / Arch | Git + Doorstop | Git-Tag + doorstop publish | -| Word-Dokumente | Git | Datei-Versionsstempel + Revisions-History im Dokument | -| CI-Konfiguration | Git | Versionsdatei + Tag | +| Artefact type | Versioning | Baseline mechanism | +|-------------------|-----------------------|------------------------------------| +| Code | Git (Gitea) | Git tag (e.g. v1.0.0) | +| Requirements / Arch | Git + Doorstop | Git tag + doorstop publish | +| Word documents | Git | File version stamp + revision history in the document | +| CI configuration | Git | Version pin + tag | -## 5. Kommunikation +## 5. Communication -| Kanal | Zweck | -|---------------|-----------------------------------| -| Gitea Issues | Bug-Tracking, Tasks | -| Gitea PRs | Review, Approval, Audit-Trail | -| Matrix Chat | Schnelle Abstimmung | -| E-Mail | Formelle Freigaben (CC: Auftraggeber) | +| Channel | Purpose | +|---------------|--------------------------------------| +| Gitea Issues | Bug tracking, tasks | +| Gitea PRs | Review, approval, audit trail | +| Matrix chat | Quick alignment | +| Email | Formal releases (cc client) | -## 6. Berichtswesen +## 6. Reporting -- Wochenstatus per E-Mail (in Real-Projekten) -- Audit-Report bei Projektabschluss (PDF aus Doorstop + Word-Plaene) -- Coverage- und MISRA-Reports werden bei jedem Push aktualisiert (CI-Artefakte) +- Weekly status by email (in real projects) +- Audit report at project closure (PDF from Doorstop + Word plans) +- Coverage and MISRA reports are refreshed on every push (CI artefacts) -## 7. Abschluss +## 7. Closure -Projekt gilt als abgeschlossen, wenn alle Erfolgskriterien aus dem PID erfuellt sind und ein Git-Tag `v1.0` gesetzt ist. +The project is considered closed when all success criteria from the PID are met and the `v1.0` git tag is set. diff --git a/docs/plans-md/Project-Manual.md b/docs/plans-md/Project-Manual.md index 370a9eb..04d2bc9 100644 --- a/docs/plans-md/Project-Manual.md +++ b/docs/plans-md/Project-Manual.md @@ -1,172 +1,168 @@ --- doc-id: SLM-EPB-PM-MAN-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- # Project Manual — demo-epb -| Feld | Wert | -|--------------|----------------------------------------| -| Projekt | demo-epb (Elektrische Parkbremse) | -| Dokument-ID | SLM-EPB-PM-MAN-001 | -| Version | 1.0 | -| Status | Freigegeben | -| Datum | 2026-05-12 | -| Zielgruppe | Neue Projektmitglieder, Auditoren | +| Field | Value | +|---------------|----------------------------------------| +| Project | demo-epb (Electric Parking Brake) | +| Document ID | SLM-EPB-PM-MAN-001 | +| Version | 1.0 | +| Status | Released | +| Date | 2026-05-12 | +| Audience | New project members, auditors | --- -## 1. Zweck +## 1. Purpose -Dieses Project Manual ist der **Einstieg** ins demo-epb Projekt. Es beantwortet: +This Project Manual is the entry point to the demo-epb project. It answers: -- Was wird gebaut? -- Welche Dokumente gibt es, in welcher Reihenfolge lesen? -- Wer ist verantwortlich wofuer? -- Wie laeuft der Entwicklungs- und Freigabe-Zyklus? +- What is being built? +- Which documents exist, in what reading order? +- Who is responsible for what? +- How does the development and release cycle work? -## 2. Was ist demo-epb? +## 2. What is demo-epb? -Eine vollstaendige Demo des **slohmaier Dev Process** anhand einer -EPB-Steuergeraet-Software. Ziel ist **nicht** die produktive Software, sondern -der Nachweis ASPICE 4.0 / ISO 26262-konformer Entwicklung. +A complete demo of the **slohmaier Dev Process** using an EPB ECU software. The goal is **not** the productive software, but evidence of ASPICE 4.0 / ISO 26262-compliant development. Detail: `docs/plaene/PID.docx`. -## 3. Lese-Reihenfolge fuer neue Projektmitglieder +## 3. Reading order for new project members -| Tag | Dokument | Warum | +| Day | Document | Why | |-----|----------------------------------------|----------------------------------------| -| 1 | dieses Project Manual | Orientierung | -| 1 | `PID.docx` | Was + Warum | -| 1 | `User-Manual.docx` | Produkt-Verstaendnis | -| 2 | `HARA.docx` + `Safety-Case.docx` | Sicherheits-Konzept | -| 2 | `SWE-Plan.docx` + `QA-Plan.docx` | Engineering-Konventionen | -| 3 | `reqs/` + `arch/` (Markdown) | Anforderungen + Architektur | -| 3 | `src/apply_controller.c` | Beispiel ASIL-D Code | -| 4 | `traceability/index.html` | Vernetzung der Artefakte | -| 4 | `coverage/index.html` | Was ist getestet | -| 5 | Diese Anleitung selber pflegen | Onboarding fuer den Naechsten | +| 1 | this Project Manual | Orientation | +| 1 | `PID.docx` | What + Why | +| 1 | `User-Manual.docx` | Product understanding | +| 2 | `HARA.docx` + `Safety-Case.docx` | Safety concept | +| 2 | `SWE-Plan.docx` + `QA-Plan.docx` | Engineering conventions | +| 3 | `reqs/` + `arch/` (markdown) | Requirements + architecture | +| 3 | `src/apply_controller.c` | Example ASIL-D code | +| 4 | `traceability/index.html` | Wiring of artefacts | +| 4 | `coverage/index.html` | What is tested | +| 5 | Maintain this manual | Onboarding for the next person | -## 4. Dokumenten-Landschaft +## 4. Document landscape ``` demo-epb/ -├── docs/plaene/ ← PID, PM-Plan, QA-Plan, SWE-Plan, Test-Plan, CM-Plan, RM-Plan -├── docs/safety/ ← HARA, Safety-Case, FMEDA, MISRA-Compliance, Verification-Report, Tool-Qualification -├── docs/manuals/ ← User-Manual, Service-Manual -├── docs/reviews/ ← Review-Protokolle -├── docs/non-conformities/ ← NC-Eintraege -├── misra/records/ ← MISRA Deviation Records -├── reqs/sys/ ← Doorstop-MD System Requirements -├── reqs/swe/ ← Doorstop-MD Software Requirements -├── arch/sys/ ← Doorstop-MD System Architecture + PlantUML -├── arch/swe/ ← Doorstop-MD Software Architecture + PlantUML -├── safety/sg/ ← Doorstop-MD Safety Goals (ASIL-Ableitung) -├── src/ ← C-Code, mit @arch + @reqs Tags im Header -├── tests/ ← Unit-Tests mit @reqs Tags -├── tools/ ← Python-Skripte (Traceability, PlantUML, Reports) -├── .gitea/workflows/ ← CI-Pipelines (validate + release) -└── docs/index.html ← Auto-generierte Startseite +├── docs/plaene/ ← PID, PM Plan, QA Plan, SWE Plan, Test Plan, CM Plan, RM Plan +├── docs/safety/ ← HARA, Safety Case, FMEDA, MISRA Compliance, Verification Report, Tool Qualification +├── docs/manuals/ ← User Manual, Service Manual +├── docs/reviews/ ← Review minutes +├── docs/non-conformities/ ← NC entries +├── misra/records/ ← MISRA deviation records +├── reqs/sys/ ← Doorstop MD system requirements +├── reqs/swe/ ← Doorstop MD software requirements +├── arch/sys/ ← Doorstop MD system architecture + PlantUML +├── arch/swe/ ← Doorstop MD software architecture + PlantUML +├── safety/sg/ ← Doorstop MD safety goals (ASIL derivation) +├── src/ ← C source, with @arch + @reqs tags in headers +├── tests/ ← Unit tests with @reqs tags +├── tools/ ← Python helper scripts (traceability, PlantUML, reports) +├── .gitea/workflows/ ← CI pipelines (validate + release) +└── docs/index.html ← Auto-generated landing page ``` -Eine **klickbare Uebersicht** liefert `docs/index.html` (Browser oeffnen). +A clickable overview is `docs/index.html` (open in browser). -## 5. Rollen und Verantwortlichkeiten +## 5. Roles and responsibilities -| Rolle | Verantwortung | Person (Demo) | -|--------------------|-----------------------------------------------------|--------------------------| -| Project Owner | Strategische Entscheidungen, Freigabe Release | Stefan Lohmaier | -| Technical Lead | Architektur, Code-Reviews, technische Entscheidungen | Stefan Lohmaier | -| Safety Manager | HARA, Safety Case, ASIL-Konformitaet | Stefan Lohmaier (Demo) | -| QA-Beauftragter | QA-Plan-Pflege, Audit-Vorbereitung | Stefan Lohmaier (Demo) | -| Configuration Mgr | Baselines, Releases, Git-Repo-Hygiene | Stefan Lohmaier (Demo) | -| Entwickler | Implementierung gemaess Architektur + Tests | Stefan Lohmaier (Demo) | -| Reviewer | Code- und Dokument-Reviews | Externer Reviewer (TBD) | +| Role | Responsibility | Person (demo) | +|--------------------|-------------------------------------------------------|--------------------------| +| Project Owner | Strategic decisions, release approval | Stefan Lohmaier | +| Technical Lead | Architecture, code reviews, technical decisions | Stefan Lohmaier | +| Safety Manager | HARA, Safety Case, ASIL conformance | Stefan Lohmaier (demo) | +| QA Officer | QA Plan maintenance, audit preparation | Stefan Lohmaier (demo) | +| Configuration Mgr | Baselines, releases, git repo hygiene | Stefan Lohmaier (demo) | +| Developer | Implementation per architecture + tests | Stefan Lohmaier (demo) | +| Reviewer | Code and document reviews | External reviewer (TBD) | -In der Demo ist eine Person in allen Rollen; in einem Real-Projekt mit ASIL-C/D -sind diese personell zu trennen (insb. Entwickler ungleich Reviewer fuer -sicherheitskritischen Code). +In this demo one person fills all roles; in a real project with ASIL-C/D these are to be separated personnel-wise (developer ≠ reviewer for safety-critical code). -## 6. Entwicklungs-Lebenszyklus +## 6. Development lifecycle ``` -Anforderung +Requirement │ ▼ -Architektur (Markdown + PlantUML) +Architecture (Markdown + PlantUML) │ ▼ -Implementation (C, mit @arch + @reqs) +Implementation (C, with @arch + @reqs) │ ▼ -Unit-Test (CppUTest-aehnliches Framework, mit @reqs) +Unit test (CppUTest-like framework, with @reqs) │ ▼ -Pull Request (Branch -> main) +Pull request (branch → main) │ ▼ -CI: Build + Test + Coverage + MISRA + Traceability-Check +CI: build + test + coverage + MISRA + traceability check │ ▼ -Code-Review (Approval-Pflicht je nach ASIL) +Code review (approval required per ASIL) │ ▼ -Merge nach main +Merge to main │ - ▼ (bei Release-Punkt) + ▼ (at release point) Tag v*.*.* │ ▼ -CI Release-Workflow: Bundle + Gitea-Release +CI release workflow: bundle + Gitea release ``` -## 7. Freigabe-Strategie +## 7. Release strategy -- **Pull-Requests** brauchen mindestens 1 Approval (mehr fuer ASIL-C/D, siehe SWE-Plan) -- **Tags** im Format `vMAJOR.MINOR.PATCH` triggern den Release-Workflow -- **Release-Bundle** enthaelt Source + alle Reports + alle Word-Dokumente -- **Audit-Faehigkeit** ist jederzeit gegeben (Git-History + Doku-Lifecycle) +- **Pull requests** need at least 1 approval (more for ASIL-C/D, see SWE Plan) +- **Tags** of the form `vMAJOR.MINOR.PATCH` trigger the release workflow +- **Release bundle** contains source + all reports + all Word documents +- **Audit readiness** is maintained continuously (git history + document lifecycle) -## 8. Wo Probleme melden +## 8. Where to report problems -| Problem-Typ | Wo dokumentieren | -|-----------------------|-------------------------------------------------| -| Bug | Gitea Issue (Tag `bug`) | -| Anforderungs-Aenderung| Gitea Issue (Tag `requirement`) + Doorstop-Update | -| Non-Conformity | `docs/non-conformities-md/NC-XXX.md` -> Word | -| MISRA-Abweichung | `misra/records-md/MISRA-REC-XXX.md` -> Word | -| Sicherheits-Problem | Sofort an Safety Manager + NC | +| Problem type | Where to document | +|----------------------|------------------------------------------------| +| Bug | Gitea issue (tag `bug`) | +| Requirement change | Gitea issue (tag `requirement`) + Doorstop update | +| Non-conformity | `docs/non-conformities-md/NC-XXX.md` → Word | +| MISRA deviation | `misra/records-md/MISRA-REC-XXX.md` → Word | +| Safety problem | Escalate to Safety Manager + NC | ## 9. Tools -Siehe `infrastructure/` im iCloud-Workspace fuer Setup-Details. Kurzform: +See `infrastructure/` in the iCloud workspace for setup details. Short list: -- **Gitea** (gitea.slohmaier.com) — Source-Control + CI + Releases -- **Doorstop-Stil** Markdown — Anforderungen + Architektur -- **PlantUML** — Diagramme (eingebettet) -- **Cppcheck** + **GCC -Werror** — Statische Analyse + MISRA -- **gcov/lcov** — Coverage -- **Doxygen** — API-Doc -- **pandoc** — Markdown -> Word/PDF -- **Python** (Stdlib) — Traceability + Report-Generatoren +- **Gitea** (gitea.slohmaier.com) — source control + CI + releases +- **Doorstop-style** Markdown — requirements + architecture +- **PlantUML** — diagrams (embedded) +- **Cppcheck** + **GCC -Werror** — static analysis + MISRA +- **gcov/lcov** — coverage +- **Doxygen** — API doc +- **pandoc** — Markdown → Word/PDF +- **Python** (stdlib) — traceability + report generators -## 10. Verwandte Dokumente +## 10. Related documents -| Plan | Datei | Inhalt | -|----------------------|-------------------------------------|----------------------------------------| -| Project Initiation | `PID.docx` | Was + Warum | -| Projekt-Management | `PM-Plan.docx` | Arbeitspakete, Termine, Stakeholder | -| Quality Assurance | `QA-Plan.docx` | Reviews, Audits, NC-Management | -| Configuration Mgmt | `CM-Plan.docx` | Baselines, Releases, Change Control | -| Risk Management | `RM-Plan.docx` | Risiken, Mitigation, Monitoring | -| Software Development | `SWE-Plan.docx` | Sprache, Standards, Coverage-Ziele | -| Test | `Test-Plan.docx` | Test-Strategie | +| Plan | File | Content | +|----------------------|------------------------------------|----------------------------------------| +| Project Initiation | `PID.docx` | What + Why | +| Project Management | `PM-Plan.docx` | Work packages, schedule, stakeholders | +| Quality Assurance | `QA-Plan.docx` | Reviews, audits, NC management | +| Configuration Mgmt | `CM-Plan.docx` | Baselines, releases, change control | +| Risk Management | `RM-Plan.docx` | Risks, mitigation, monitoring | +| Software Development | `SWE-Plan.docx` | Language, standards, coverage targets | +| Test | `Test-Plan.docx` | Test strategy | -## 11. Aenderungshistorie +## 11. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/plans-md/QA-Plan.md b/docs/plans-md/QA-Plan.md index fe94571..dfdc9e0 100644 --- a/docs/plans-md/QA-Plan.md +++ b/docs/plans-md/QA-Plan.md @@ -1,67 +1,67 @@ -# Qualitaetssicherungs-Plan (QA-Plan) +# Quality Assurance Plan (QA Plan) -| Feld | Wert | +| Field | Value | |-----------------|--------------------------------------| -| Projekt | demo-epb | -| Datum | 2026-05-11 | +| Project | demo-epb | +| Date | 2026-05-11 | | Version | 1.0 | -| Status | Freigegeben | +| Status | Released | --- -## 1. Qualitaetsziele +## 1. Quality goals -- Vollstaendige Traceability: SYS → SA → SWE → SWA → Code → Test -- 0 MISRA-Required-Violations (Deviations dokumentiert) -- 0 statische-Analyse-Findings auf High/Error-Level -- Coverage-Ziele (siehe SWE-Plan Abschnitt 8) eingehalten -- Alle PRs reviewed und approved +- Complete traceability: SYS → SA → SWE → SWA → Code → Test +- 0 MISRA Required violations (deviations documented) +- 0 static-analysis findings at High / Error level +- Coverage targets met (see SWE Plan section 8) +- All PRs reviewed and approved -## 2. Qualitaetsmassnahmen +## 2. Quality measures -| Massnahme | Tool / Methode | Frequenz | -|---------------------------------|----------------------------|----------------| -| Traceability-Check | `doorstop check` | jeder Push | -| MISRA-Check | Cppcheck + MISRA-Addon | jeder Push | -| Static Analysis | Cppcheck, clang-tidy | jeder Push | -| Unit Tests | CppUTest | jeder Push | -| Coverage | gcov / lcov | jeder Push | -| Peer Review | Gitea PRs | jede Aenderung | -| Architektur-Review | Technical Review, 2 Approver | bei Aenderung | -| Audit-Vorbereitung | doorstop publish + Word-Doku | bei Release | +| Measure | Tool / Method | Frequency | +|----------------------------------|------------------------------|------------------| +| Traceability check | `doorstop check` | every push | +| MISRA check | Cppcheck + MISRA addon | every push | +| Static analysis | Cppcheck, clang-tidy | every push | +| Unit tests | CppUTest | every push | +| Coverage | gcov / lcov | every push | +| Peer review | Gitea PRs | every change | +| Architecture review | Technical review, 2 approvers | on changes | +| Audit preparation | doorstop publish + Word docs | on release | ## 3. Reviews -| Artefakt | Review-Typ | Min. Approver | -|-----------------------------|-------------------|----------------| -| Anforderungen | Technical Review | 1 | -| Architektur-Element | Technical Review | 2 | -| Code (QM / ASIL-A/B) | Peer Review | 1 | -| Code (ASIL-C/D) | Technical Review | 2 | -| Plaene und Berichte | Peer Review | 1 | -| MISRA Deviation Permit | Technical Lead | 1 | +| Artefact | Review type | Min. approvers | +|--------------------------------|---------------------|-----------------| +| Requirements | Technical review | 1 | +| Architecture element | Technical review | 2 | +| Code (QM / ASIL-A/B) | Peer review | 1 | +| Code (ASIL-C/D) | Technical review | 2 | +| Plans and reports | Peer review | 1 | +| MISRA deviation permit | Technical lead | 1 | -## 4. Non-Conformity Management +## 4. Non-conformity management -Abweichungen vom Plan oder von Anforderungen werden als Non-Conformity (NC) dokumentiert: +Deviations from the plan or from requirements are documented as a non-conformity (NC): -- Pfad: `docs/non-conformities/NC-XXX.docx` -- Jede NC erhaelt eine eindeutige ID -- Schwere-Klassifizierung: Critical / Major / Minor -- Korrekturmassnahme und Verifikation werden nachgehalten -- Beispiel-NC vorhanden: NC-001 +- Path: `docs/non-conformities/NC-XXX.docx` +- Each NC has a unique ID +- Severity classification: Critical / Major / Minor +- Corrective action and verification are tracked +- Example NC present: NC-001 -## 5. Audit-Vorbereitung +## 5. Audit preparation -Audit-Faehigkeit wird durchgehend erhalten: +Audit readiness is maintained continuously: -- Git-History ist Audit-Trail (kein direkter Push auf `main`) -- `docs/plans-md/` enthaelt die freigegebenen Plaene (Word in `docs/` daneben) -- `docs/traceability/` enthaelt automatisch generierte Matrizen -- `misra/records/` enthaelt MISRA-Deviation-Records -- `tests/results/` enthaelt Test- und Coverage-Reports (CI-Artefakte) -- `docs/reviews/` enthaelt Review-Protokolle +- Git history is the audit trail (no direct push to `main`) +- `docs/plans-md/` holds the released plans (Word in `docs/` alongside) +- `docs/traceability/` holds the auto-generated matrices +- `misra/records/` holds MISRA deviation records +- `tests/results/` holds test and coverage reports (CI artefacts) +- `docs/reviews/` holds review minutes -## 6. Verbesserungsmassnahmen +## 6. Improvement actions -Jeder Sprint-Abschluss enthaelt eine kurze Lessons-Learned-Notiz in `docs/lessons-learned/`. In dieser Demo verzichtet, da Single-Sprint-Projekt. +Every sprint closure includes a brief lessons-learned note in `docs/lessons-learned/`. Skipped in this demo because it is a single-sprint project. diff --git a/docs/plans-md/RM-Plan.md b/docs/plans-md/RM-Plan.md index f705881..be22eb9 100644 --- a/docs/plans-md/RM-Plan.md +++ b/docs/plans-md/RM-Plan.md @@ -1,111 +1,108 @@ --- doc-id: SLM-EPB-RM-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- -# Risk Management Plan (RM-Plan) +# Risk Management Plan (RM Plan) -| Feld | Wert | -|--------------|----------------------------------------| -| Projekt | demo-epb | -| Dokument-ID | SLM-EPB-RM-001 | -| Version | 1.0 | -| Status | Freigegeben | -| Datum | 2026-05-12 | -| Norm | ASPICE MAN.5 | +| Field | Value | +|---------------|----------------------------------------| +| Project | demo-epb | +| Document ID | SLM-EPB-RM-001 | +| Version | 1.0 | +| Status | Released | +| Date | 2026-05-12 | +| Standard | ASPICE MAN.5 | --- -## 1. Zweck +## 1. Purpose -Identifiziert, bewertet und behandelt **Projekt-Risiken** (organisatorisch, -technisch, Zeitplan, Resource). Abgegrenzt von **funktionalen Sicherheits- -Risiken** (Hazards), die im HARA behandelt werden. +Identifies, assesses, and treats **project risks** (organisational, technical, schedule, resource). Distinct from **functional safety risks** (hazards), which live in the HARA. -## 2. Methodik +## 2. Methodology -| Schritt | Aktion | -|--------------------|-------------------------------------------------| -| 1. Identifikation | Workshops, Lessons-Learned, Stakeholder-Input | -| 2. Klassifikation | Wahrscheinlichkeit (W) x Auswirkung (A) | -| 3. Bewertung | Risk Score = W * A (1-25) | -| 4. Behandlung | Vermeiden / Mindern / Akzeptieren / Transferieren | -| 5. Monitoring | Quartalsweise Review, Statusupdate | +| Step | Activity | +|-------------------|---------------------------------------------------| +| 1. Identification | Workshops, lessons learned, stakeholder input | +| 2. Classification | Probability (P) × Impact (I) | +| 3. Assessment | Risk score = P × I (1-25) | +| 4. Treatment | Avoid / Mitigate / Accept / Transfer | +| 5. Monitoring | Quarterly review, status updates | -### 2.1 Klassifikations-Skala +### 2.1 Classification scale -| Wahrscheinlichkeit | Bedeutung | -|--------------------|----------------------------| -| 1 | Sehr unwahrscheinlich | -| 2 | Unwahrscheinlich | -| 3 | Moeglich | -| 4 | Wahrscheinlich | -| 5 | Sehr wahrscheinlich | +| Probability | Meaning | +|-------------|----------------------------| +| 1 | Very unlikely | +| 2 | Unlikely | +| 3 | Possible | +| 4 | Likely | +| 5 | Very likely | -| Auswirkung | Bedeutung | -|------------|--------------------------------------------| -| 1 | Vernachlaessigbar | -| 2 | Geringe Verzoegerung / Mehraufwand | -| 3 | Spuerbare Auswirkung auf Termin/Budget | -| 4 | Erhebliche Auswirkung, Projekt gefaehrdet | -| 5 | Projekt-Stop | +| Impact | Meaning | +|--------|------------------------------------------| +| 1 | Negligible | +| 2 | Minor delay / additional effort | +| 3 | Noticeable impact on schedule/budget | +| 4 | Significant impact, project at risk | +| 5 | Project stop | -| Score-Bereich | Aktion | -|---------------|------------------------------------------| -| 1-4 | Akzeptieren, monitoren | -| 5-9 | Mindern (Plan) | -| 10-15 | Mindern (sofort, mit Eskalation) | -| 16-25 | Eskalation an Project Owner | +| Score range | Action | +|-------------|----------------------------------------| +| 1-4 | Accept, monitor | +| 5-9 | Mitigate (plan) | +| 10-15 | Mitigate (immediate, with escalation) | +| 16-25 | Escalate to Project Owner | -## 3. Risiko-Register +## 3. Risk register -| ID | Beschreibung | W | A | Score | Behandlung | Status | -|-------|---------------------------------------------------------|---|---|-------|------------------------------------------|----------| -| R-01 | Demo wird als produktreifer Code missverstanden | 3 | 3 | 9 | Disclaimer im README + Project Manual | Mitigated | -| R-02 | MISRA-Tooling-Update bricht CI (false positives) | 2 | 3 | 6 | Tool-Versionen pinnen, Regression-Suite | Mitigated | -| R-03 | Reviewer-Verfuegbarkeit fuer ASIL-D | 3 | 4 | 12 | Self-Review dokumentiert (nur Demo) | Akzeptiert (Demo) | -| R-04 | Gitea-Server-Ausfall | 2 | 4 | 8 | Lokale Klone, regelmaessige Backups | Mitigated | -| R-05 | Apple-Cert-Ablauf ohne Vorwarnung | 3 | 3 | 9 | Renewal-Reminder + 30-Tage-Vorwarnung | Mitigated | -| R-06 | Windows-Build-VM unzuverlaessig (busybox-PATH-Konflikte)| 4 | 2 | 8 | MSYS2 dokumentiert, alt PATH vorne | Open | -| R-07 | macOS act_runner host-mode Cache-Bug | 3 | 2 | 6 | continue-on-error, dokumentiert | Open | -| R-08 | Doorstop-Tooling-Kompatibilitaet bei Update | 2 | 3 | 6 | Eigenes traceability.py, kein doorstop-Dep | Mitigated | -| R-09 | Wissensverlust bei Single-Person-Setup | 4 | 4 | 16 | Project Manual + Dokumentation pflegen | Open | +| ID | Description | P | I | Score | Treatment | Status | +|-------|----------------------------------------------------------|---|---|-------|------------------------------------------|------------| +| R-01 | Demo is mistaken for production-ready code | 3 | 3 | 9 | Disclaimer in README + Project Manual | Mitigated | +| R-02 | MISRA tooling update breaks CI (false positives) | 2 | 3 | 6 | Pin tool versions, regression suite | Mitigated | +| R-03 | Reviewer availability for ASIL-D | 3 | 4 | 12 | Self-review documented (demo only) | Accepted (demo) | +| R-04 | Gitea server outage | 2 | 4 | 8 | Local clones, regular backups | Mitigated | +| R-05 | Apple certificate expiry without warning | 3 | 3 | 9 | Renewal reminder + 30-day notice | Mitigated | +| R-06 | Windows build VM unreliable (busybox-PATH conflicts) | 4 | 2 | 8 | MSYS2 documented, alt PATH ordering | Open | +| R-07 | macOS act_runner host-mode cache bug | 3 | 2 | 6 | continue-on-error, documented | Open | +| R-08 | Doorstop tool compatibility on upgrade | 2 | 3 | 6 | Own traceability.py, no doorstop dep | Mitigated | +| R-09 | Knowledge loss with single-person setup | 4 | 4 | 16 | Maintain Project Manual + documentation | Open | -## 4. Risiko-Reviews +## 4. Risk reviews -| Frequenz | Teilnehmer | Outputs | -|--------------|-------------------------|--------------------------------------| -| Quartalsweise| Project Owner + TL | Aktualisiertes Register, Action-Items | -| Bei Aenderung| Betroffene Rollen | Risiko-Score-Update | -| Bei Release | Project Owner + QA | Restrisiken-Bewertung | +| Frequency | Participants | Outputs | +|--------------|--------------------------|--------------------------------------| +| Quarterly | Project Owner + TL | Updated register, action items | +| On change | Affected roles | Risk score update | +| At release | Project Owner + QA | Residual-risk assessment | -## 5. Eskalations-Pfad +## 5. Escalation path ``` -R-Owner (taeglich) +Risk owner (daily) │ Score > 9 ▼ -Project Owner (woechentlich) +Project Owner (weekly) │ Score > 15 ▼ -Stakeholder / Auftraggeber (sofort) +Stakeholder / Client (immediately) ``` -## 6. Lessons Learned +## 6. Lessons learned -Geschlossene Risiken werden bei Projektabschluss in `docs/lessons-learned/` -zusammengefasst, um in Folge-Projekten besser einschaetzen zu koennen. +Closed risks are summarised at project closure under `docs/lessons-learned/`, to better assess follow-up projects. -## 7. Verwandte Dokumente +## 7. Related documents -- `PM-Plan.docx` — Top-Level-Risiken (Auszug) -- `HARA.docx` — Funktionale Sicherheits-Risiken (Hazards, getrennt von Projekt-Risiken) -- `QA-Plan.docx` — Non-Conformity-Management +- `PM-Plan.docx` — Top-level risks (summary) +- `HARA.docx` — Functional safety risks (hazards, separate from project risks) +- `QA-Plan.docx` — Non-conformity management -## 8. Aenderungshistorie +## 8. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/plans-md/SWE-Plan.md b/docs/plans-md/SWE-Plan.md index 2bff111..c5d3ff3 100644 --- a/docs/plans-md/SWE-Plan.md +++ b/docs/plans-md/SWE-Plan.md @@ -1,114 +1,114 @@ -# Software Development Plan (SWE-Plan) +# Software Development Plan (SWE Plan) -| Feld | Wert | +| Field | Value | |-----------------|--------------------------------------| -| Projekt | demo-epb | -| Datum | 2026-05-11 | +| Project | demo-epb | +| Date | 2026-05-11 | | Version | 1.0 | -| Status | Freigegeben | -| ASIL | D (hoechste Komponente) | +| Status | Released | +| ASIL | D (highest component) | --- -## 1. Entwicklungsmethode +## 1. Development method -V-Modell nach ISO 26262 Part 6, iterativ innerhalb der Phasen. Linke Seite: Anforderungen → Architektur → Detailentwurf → Implementierung. Rechte Seite: Unit-Test → Integrationstest → Systemtest. +V-model per ISO 26262 Part 6, iterative within phases. Left side: requirements → architecture → detailed design → implementation. Right side: unit test → integration test → system test. -Aenderungen erfolgen ueber Pull Requests (Change Requests werden in einem Real-Projekt zusaetzlich gefuehrt). +Changes go through pull requests (change requests are tracked separately in a real project). -## 2. Programmiersprache und Standards +## 2. Programming language and standards -| Aspekt | Festlegung | +| Aspect | Decision | |---------------------|-----------------------------------------------------| -| Sprache | C (C99) | -| Coding Standard | MISRA C:2012 (Required + Mandatory einzuhalten) | -| Naming | snake_case fuer Funktionen, UPPER_CASE fuer Makros | -| Header-Format | `@file`, `@arch`, `@reqs` Tags fuer Code → Doku-Link | +| Language | C (C99) | +| Coding standard | MISRA C:2012 (Required + Mandatory mandatory) | +| Naming | snake_case for functions, UPPER_CASE for macros | +| Header format | `@file`, `@arch`, `@reqs` tags linking code to docs | -### MISRA-Handhabung +### MISRA handling -- Required- und Mandatory-Regeln verpflichtend -- Advisory-Regeln projektspezifisch (siehe `misra/permits/`) -- Abweichungen pro Stelle: MISRA Deviation Record (`misra/records/`) -- Projektweite Abweichungen: MISRA Deviation Permit (`misra/permits/`) -- MISRA-Pruefung in der CI (`cppcheck --addon=misra --error-exitcode=1`) +- Required and Mandatory rules are mandatory +- Advisory rules are project-specific (see `misra/permits/`) +- Per-site deviations: MISRA deviation record (`misra/records/`) +- Project-wide deviations: MISRA deviation permit (`misra/permits/`) +- MISRA check runs in CI (`cppcheck --addon=misra --error-exitcode=1`) -## 3. Build-Umgebung +## 3. Build environment -| Komponente | Tool / Version | +| Component | Tool / Version | |--------------------|-----------------------------------------------------| -| Build-System | CMake 3.20+ | -| Compiler | GCC (Host fuer Demo-Tests; ARM-GCC fuer Target) | -| Zielplattform | ARM Cortex-M4 (Annahme; Demo-Tests auf x86_64 Host) | -| Host-Plattform | macOS / Linux x86_64 | -| CI-Runner | Gitea Actions Docker-Image | +| Build system | CMake 3.20+ | +| Compiler | GCC (host for demo tests; ARM-GCC for target) | +| Target platform | ARM Cortex-M4 (assumption; demo tests run on x86_64 host) | +| Host platform | macOS / Linux x86_64 | +| CI runner | Gitea Actions Docker image | -## 4. Branching-Strategie +## 4. Branching strategy ``` -main — Stabiler, freigegebener Stand -develop — Aktueller Entwicklungsstand -feature/SWE-XXX — Feature-Branch pro Anforderung -bugfix/BUG-XXX — Bugfix-Branch +main — stable, released state +develop — current development state +feature/SWE-XXX — feature branch per requirement +bugfix/BUG-XXX — bug-fix branch ``` -- `main` und `develop` sind geschuetzt (kein direkter Push) -- Merge nur ueber PR mit Approval -- Branch-Name enthaelt Issue- oder Anforderungs-Nummer +- `main` and `develop` are protected (no direct push) +- Merge only via PR with approval +- Branch name includes the issue or requirement number -## 5. Review-Verpflichtungen +## 5. Review obligations -| Artefakt | Review-Art | Mindest-Approvals | -|-----------------------------|-------------------|--------------------| -| Quellcode QM / ASIL-A/B | Peer Review | 1 | -| Quellcode ASIL-C/D | Technical Review | 2 | -| Architektur-Dokument | Technical Review | 2 | -| Anforderung | Technical Review | 1 | -| Testfaelle | Peer Review | 1 | -| MISRA Permit | Technical Lead | 1 | +| Artefact | Review type | Min. approvals | +|-----------------------------|---------------------|-----------------| +| Source code QM / ASIL-A/B | Peer review | 1 | +| Source code ASIL-C/D | Technical review | 2 | +| Architecture document | Technical review | 2 | +| Requirement | Technical review | 1 | +| Test cases | Peer review | 1 | +| MISRA permit | Technical lead | 1 | -Single-Person-Demo: Self-Review mit dokumentierter Pruefliste; in einem Real-Projekt nicht zulaessig. +Single-person demo: self-review with documented checklist; not permissible in a real project. ## 6. Definition of Done -- Code kompiliert fehlerfrei -- MISRA-Check in CI ist gruen -- Statische Analyse (Cppcheck, clang-tidy) ohne neue Findings -- Unit Tests gruen -- Coverage-Ziel erreicht -- PR reviewed und approved -- Anforderung mit Test verlinkt (`@reqs` Tag im Code + Test-Datei) -- Architektur-Element verlinkt (`@arch` Tag im Code) +- Code compiles without errors +- MISRA check in CI is green +- Static analysis (Cppcheck, clang-tidy) has no new findings +- Unit tests are green +- Coverage target reached +- PR reviewed and approved +- Requirement linked to a test (`@reqs` tag in code + test file) +- Architecture element linked (`@arch` tag in code) -## 7. Integration und Test-Strategie +## 7. Integration and test strategy -| Teststufe | Verantwortlich | Umgebung | Automatisierung | -|---------------------|----------------|----------------|-----------------| -| Unit Test | Entwickler | Host (x86) | CI | -| Integrationstest | Entwickler | Host / SiL | CI / manuell | -| Systemtest | QA | SiL / HiL | teilweise | -| Abnahmetest | Auftraggeber | HiL / Fahrzeug | manuell | +| Test level | Owner | Environment | Automation | +|--------------------|----------------|---------------|------------------| +| Unit test | Developer | Host (x86) | CI | +| Integration test | Developer | Host / SiL | CI / manual | +| System test | QA | SiL / HiL | partial | +| Acceptance test | Customer | HiL / vehicle | manual | -Demo: nur Unit-Tests auf Host. +Demo: only unit tests on host. -## 8. Coverage-Ziele +## 8. Coverage targets -| ASIL | Statement | Branch | MC/DC | Konkret im Projekt | -|------|-----------|--------|----------|---------------------| -| QM | >= 80% | — | — | Switch Debouncer | -| B | >= 80% | >= 80% | — | Actuator Driver | -| D | >= 90% | >= 90% | >= 80% | Apply Controller | +| ASIL | Statement | Branch | MC/DC | Concrete in this project | +|------|-----------|--------|----------|---------------------------| +| QM | ≥ 80% | — | — | Switch Debouncer | +| B | ≥ 80% | ≥ 80% | — | Actuator Driver | +| D | ≥ 90% | ≥ 90% | ≥ 80% | Apply Controller | -Coverage wird per `gcov` / `lcov` in der CI gemessen und nach `tests/results/coverage/` abgelegt. +Coverage is measured via `gcov` / `lcov` in CI and stored under `tests/results/coverage/`. -## 9. Toolqualifikation +## 9. Tool qualification -| Tool | Verwendung | Qualifikations-Status (Demo) | -|-------------------|------------------------------|----------------------------------------------| -| GCC | Compilation | Eigene Qualifizierung (in Realprojekt) | -| Cppcheck + MISRA | Statische Analyse / MISRA | Tool-Confidence Level TCL2 / Tool-Class T2 | -| CppUTest | Unit-Tests | TCL1 / T1 (Fehler vom Entwickler erkannt) | -| gcov / lcov | Coverage | TCL1 / T1 | -| Doorstop | Traceability | TCL1 / T1 | +| Tool | Use | Qualification status (demo) | +|-------------------|------------------------------|-----------------------------------------------| +| GCC | Compilation | Own qualification (in real project) | +| Cppcheck + MISRA | Static analysis / MISRA | Tool Confidence Level TCL2 / Tool Class T2 | +| CppUTest | Unit tests | TCL1 / T1 (defects caught by developer) | +| gcov / lcov | Coverage | TCL1 / T1 | +| Doorstop | Traceability | TCL1 / T1 | -Demo enthaelt keine vollstaendigen Tool-Qualification-Reports; in einem Real-Projekt waeren diese im Anhang. +The demo does not include full tool-qualification reports; in a real project these would live in an appendix. diff --git a/docs/plans-md/Test-Plan.md b/docs/plans-md/Test-Plan.md index aa61abc..ddb4d65 100644 --- a/docs/plans-md/Test-Plan.md +++ b/docs/plans-md/Test-Plan.md @@ -1,63 +1,63 @@ -# Test-Plan +# Test Plan -| Feld | Wert | +| Field | Value | |-----------------|--------------------------------------| -| Projekt | demo-epb | -| Datum | 2026-05-11 | +| Project | demo-epb | +| Date | 2026-05-11 | | Version | 1.0 | -| Status | Freigegeben | +| Status | Released | --- -## 1. Teststrategie +## 1. Test strategy -Test-First fuer alle Demo-Komponenten. Jede Anforderung erhaelt mindestens einen Test (`@reqs` Tag im Test). Coverage-Ziele wie im SWE-Plan Abschnitt 8. +Test-first for all demo components. Every requirement has at least one test (`@reqs` tag in the test). Coverage targets as in the SWE Plan section 8. -## 2. Teststufen +## 2. Test levels -| Stufe | Scope | Tool | Umgebung | Demo-Status | -|---------------|--------------------|------------|------------|-------------| -| Unit | Funktionen / Module| CppUTest | Host x86 | Vorhanden | -| Integration | Modulzusammenspiel | CppUTest | Host x86 | TBD | -| System | End-to-end | manuell | SiL / HiL | nicht im Demo | -| Abnahme | Kundenabnahme | manuell | HiL / KFZ | nicht im Demo | +| Level | Scope | Tool | Environment | Demo status | +|---------------|--------------------|------------|-------------|---------------| +| Unit | Functions / modules| CppUTest | host x86 | Available | +| Integration | Module interaction | CppUTest | host x86 | TBD | +| System | End-to-end | manual | SiL / HiL | not in demo | +| Acceptance | Customer acceptance| manual | HiL / vehicle | not in demo | -## 3. Test-Verwaltung +## 3. Test management -- Tests liegen in `tests/unit/` (eine Datei pro Modul) -- Test-Datei enthaelt `@reqs` Tag mit den abgedeckten Anforderungs-IDs -- Test-Lauf erfolgt automatisch in der CI bei jedem Push -- Coverage-Report wird als CI-Artefakt unter `tests/results/coverage/` abgelegt +- Tests live in `tests/unit/` (one file per module) +- Each test file carries an `@reqs` tag with the covered requirement IDs +- Tests run automatically in CI on every push +- Coverage report is uploaded as a CI artefact under `tests/results/coverage/` -## 4. Test-Auswahl je Komponente +## 4. Test selection per component -| Komponente | ASIL | Test-Datei | Methodik | -|--------------------|------|--------------------------------------|--------------------------| -| Apply Controller | D | tests/unit/test_apply_controller.cpp | Equivalence Classes + Boundary + MC/DC | -| Actuator Driver | B | tests/unit/test_actuator_driver.cpp | Equivalence Classes + Boundary | -| Switch Debouncer | QM | tests/unit/test_switch_debouncer.cpp | Equivalence Classes | +| Component | ASIL | Test file | Method | +|--------------------|------|---------------------------------------|---------------------------------| +| Apply Controller | D | tests/unit/test_apply_controller.c | Equivalence classes + boundary + MC/DC | +| Actuator Driver | B | tests/unit/test_actuator_driver.c | Equivalence classes + boundary | +| Switch Debouncer | QM | tests/unit/test_switch_debouncer.c | Equivalence classes | -## 5. Eingangs- und Abschlusskriterien +## 5. Entry and exit criteria -**Eingang fuer Testdurchfuehrung:** -- Code kompiliert -- Doorstop-Check gruen -- Statische Analyse ohne kritische Findings +**Entry to test execution:** +- Code compiles +- Doorstop check is green +- Static analysis has no critical findings -**Abschluss:** -- Alle Tests gruen -- Coverage-Ziel erreicht -- Test-Report archiviert +**Exit:** +- All tests green +- Coverage target reached +- Test report archived -## 6. Fehlerverwaltung +## 6. Defect handling -- Test-Fehlschlag = blockendes Issue -- Issue wird ueber Gitea Issues angelegt, im PR referenziert -- Schwere-Kategorisierung wie in QA-Plan Abschnitt 4 +- Test failure = blocking issue +- Issue is filed via Gitea Issues, referenced in the PR +- Severity classification per QA Plan section 4 ## 7. Reporting -Test-Reports werden automatisch erzeugt: -- Konsolen-Output von CppUTest (TAP / JUnit XML) -- Coverage-HTML aus lcov -- Beides als CI-Artefakt unter `tests/results/` +Test reports are generated automatically: +- Console output of CppUTest (TAP / JUnit XML) +- Coverage HTML from lcov +- Both as CI artefacts under `tests/results/` diff --git a/docs/reviews-md/Review-001.md b/docs/reviews-md/Review-001.md index 3f3b709..4988149 100644 --- a/docs/reviews-md/Review-001.md +++ b/docs/reviews-md/Review-001.md @@ -1,56 +1,55 @@ --- review-id: REV-001 -projekt: demo-epb -datum: 2026-05-11 -typ: Technical Review (ASIL-D Code) -artefakt: src/apply_controller.c (SWA-002) -status: Approved (mit Anmerkungen) +project: demo-epb +date: 2026-05-11 +type: Technical Review (ASIL-D code) +artefact: src/apply_controller.c (SWA-002) +status: Approved (with comments) --- -# Review-Protokoll REV-001 +# Review Minutes REV-001 -| Feld | Wert | -|--------------|--------------------------------------| -| Review-ID | REV-001 | -| Projekt | demo-epb | -| Datum | 2026-05-11 | -| Reviewer 1 | Stefan Lohmaier (Self-Review) | -| Reviewer 2 | (Tech Lead, in Realprojekt) | -| Artefakt | `src/apply_controller.c` v1.0 | +| Field | Value | +|---------------|--------------------------------------| +| Review ID | REV-001 | +| Project | demo-epb | +| Date | 2026-05-11 | +| Reviewer 1 | Stefan Lohmaier (self-review) | +| Reviewer 2 | (Tech Lead, in real project) | +| Artefact | `src/apply_controller.c` v1.0 | | ASIL | D | | Status | Approved with comments | --- -## 1. Pruefumfang +## 1. Scope of review -- Code-Inspektion `apply_controller.c` + `.h` -- Pruefung auf Vollstaendigkeit der State Machine (Coverage gegen SWA-002) -- Pruefung der MISRA-Compliance (Cppcheck-Report) -- Pruefung der Mapping-Tags (`@arch`, `@reqs`) -- Pruefung der Unit-Tests gegen verlinkte Anforderungen SWE-001..SWE-004 +- Code inspection of `apply_controller.c` + `.h` +- Check for completeness of the state machine (coverage against SWA-002) +- Check for MISRA compliance (Cppcheck report) +- Check of mapping tags (`@arch`, `@reqs`) +- Check of unit tests against the linked requirements SWE-001..SWE-004 ## 2. Findings -| Nr | Schwere | Beschreibung | Aktion | +| Nr | Severity | Description | Action | |----|-----------|--------------------------------------------------------------------|---------------------| -| 1 | Minor | Kommentar "/* @reqs SWE-005 */" konsumiert Anforderung, die formal SWA-002 zugeordnet ist — Mapping-Tabelle bestaetigt aber Mehrfachzuordnung. | Akzeptiert mit Hinweis in SWA-002 §8. | -| 2 | Major | Kein expliziter Test fuer das Verhalten "release im RELEASING-Zustand wird ignoriert". | Test ergaenzt in nachfolgendem PR. | -| 3 | Critical | `s_ctx.step_count` ueberlaeuft alle 2^32 * 50 ms = ~7 Jahre. Im sicheren Zustand ist Ueberlauf unkritisch (Watchdog vergleicht Delta), aber sollte dokumentiert sein. | Kommentar im Header ergaenzt. | +| 1 | Minor | The comment "/* @reqs SWE-005 */" consumes a requirement formally assigned to SWA-002 — mapping table confirms multi-assignment though. | Accepted with note in SWA-002 §8. | +| 2 | Major | No explicit test for the behaviour "release during the RELEASING state is ignored". | Test added in follow-up PR. | +| 3 | Critical | `s_ctx.step_count` overflows after 2^32 * 50 ms = ~7 years. Overflow is harmless in the safe state (watchdog compares deltas) but should be documented. | Comment added in header. | -Critical-Finding 3 wurde als Non-Conformity NC-001 erfasst und in v1.1 geschlossen. +Critical finding 3 was raised as Non-Conformity NC-001 and closed in v1.1. -## 3. Pruefung der Mapping-Tags +## 3. Check of mapping tags ``` @arch SWA-002 OK @reqs SWE-001 SWE-002 SWE-003 SWE-004 OK ``` -Alle vier SWE-Reqs werden durch Test-Faelle in `tests/unit/test_apply_controller.c` -abgedeckt: +All four SWE requirements are covered by test cases in `tests/unit/test_apply_controller.c`: -| SWE | Test-Funktion | +| SWE | Test function | |---------|---------------------------------------------------------| | SWE-001 | `test_applied_holds_force` | | SWE-002 | `test_watchdog_alive_counter` | @@ -59,20 +58,18 @@ abgedeckt: ## 4. Coverage -| Metrik | Ziel | Erreicht | +| Metric | Target | Achieved | |---------------------|------------|-----------| -| Statement Coverage | >= 90% | 92.3% | -| Branch Coverage | >= 90% | 91.0% | -| MC/DC | >= 80% | 84% | +| Statement Coverage | ≥ 90% | 92.3% | +| Branch Coverage | ≥ 90% | 91.0% | +| MC/DC | ≥ 80% | 84% | -Coverage-Report: CI-Artefakt `coverage-html` (Build #N). +Coverage report: CI artefact `coverage-html` (build #N). -## 5. Freigabe-Entscheidung +## 5. Release decision -**Approved with comments.** Critical-Finding wird als NC-001 separat behandelt. -Empfehlung fuer Real-Projekt: zweiter unabhaengiger Reviewer fuer ASIL-D. +**Approved with comments.** Critical finding tracked as NC-001 separately. Recommendation for real project: second independent reviewer for ASIL-D. --- -*Single-Person-Demo: Self-Review nach dokumentierter Pruefliste. In einem Real-Projekt -ist Self-Review fuer ASIL-D unzulaessig (SWE-Plan, Abschnitt 5).* +*Single-person demo: self-review per documented checklist. In a real project, self-review for ASIL-D is not admissible (SWE Plan section 5).* diff --git a/docs/reviews/REV-001.docx b/docs/reviews/REV-001.docx index f29a4545b3926f7752aff032759d257b2a1bdc13..2fa38363e5654ba258e0fd62ca1e5054d8db5d80 100644 GIT binary patch delta 5222 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 N2VGck6YZ}V{txnS40!+m delta 5127 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 diff --git a/docs/safety-md/FMEDA.md b/docs/safety-md/FMEDA.md index 4503275..2fc1171 100644 --- a/docs/safety-md/FMEDA.md +++ b/docs/safety-md/FMEDA.md @@ -1,119 +1,111 @@ --- doc-id: SLM-EPB-FMEDA-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- # Failure Mode Effects and Diagnostic Analysis (FMEDA) -| Feld | Wert | -|--------------|----------------------------------------| -| Projekt | demo-epb | -| Dokument-ID | SLM-EPB-FMEDA-001 | -| Version | 1.0 | -| Status | Freigegeben | -| Datum | 2026-05-12 | -| Norm | ISO 26262 Part 5 §8 + Part 10 | +| Field | Value | +|---------------|----------------------------------------| +| Project | demo-epb | +| Document ID | SLM-EPB-FMEDA-001 | +| Version | 1.0 | +| Status | Released | +| Date | 2026-05-12 | +| Standard | ISO 26262 Part 5 §8 + Part 10 | --- -## 1. Zweck +## 1. Purpose -Bottom-up-Analyse der Hardware- und Software-Fehlermoeglichkeiten der EPB, -Quantifizierung der Diagnostic Coverage (DC) und Berechnung der Single-Point -Fault Metric (SPFM) und Latent Fault Metric (LFM). Wird zur Bewertung der -Hardware-Architektur-Metriken nach ISO 26262-5 benoetigt. +Bottom-up analysis of EPB hardware and software failure modes, quantifying Diagnostic Coverage (DC) and computing the Single-Point Fault Metric (SPFM) and Latent Fault Metric (LFM). Required for hardware architecture metrics per ISO 26262-5. -In dieser Demo wird der **Software-Anteil** behandelt; der Hardware-FMEDA -ergeht separat (Komponenten-Hersteller). +This demo covers the **software** portion; the hardware FMEDA is provided separately (component manufacturer). -## 2. Methodik +## 2. Methodology -Pro Software-Komponente werden mogliche Failure Modes aufgelistet, ihre -Effekte beschrieben, Detection-Mechanismen identifiziert und die -Diagnostic Coverage abgeschaetzt. +For each software component, possible failure modes are listed, their effects described, detection mechanisms identified, and the diagnostic coverage estimated. -DC-Klassen nach ISO 26262-5 §C.2: +DC classes per ISO 26262-5 §C.2: -| DC-Klasse | DC % | Bedeutung | +| DC class | DC % | Meaning | |-----------|-------|--------------------------------------| -| Low | < 60% | Schwache Diagnose | -| Medium | 60-90%| Mittlere Diagnose | -| High | > 90% | Starke Diagnose | +| Low | < 60% | Weak diagnostics | +| Medium | 60-90%| Medium diagnostics | +| High | > 90% | Strong diagnostics | -## 3. FMEDA-Tabelle pro Komponente +## 3. FMEDA table per component ### 3.1 SWA-002 Apply Controller (ASIL-D) -| FM-ID | Failure Mode | Effekt | Detection | DC | Safe State erreicht? | +| FM-ID | Failure mode | Effect | Detection | DC | Safe state reached? | |-------|---------------------------------------|--------------------------------------|---------------------------------|-------|----------------------| -| FM-01 | State-Machine bleibt in APPLYING haengen | Bremse nie applied | Timeout 30*50ms -> ERROR | High | Ja (ERROR-State) | -| FM-02 | Falscher State-Uebergang APPLIED->RELEASED ohne Bedingung | Wegrollen | Vorbedingungs-Check (`release_preconditions_ok`) | High | Ja | -| FM-03 | Watchdog-Counter ueberlaeuft | Watchdog feuert false-positive | Wrap-safe Subtraktion in Watchdog (NC-001) | High | Ja (Reset) | -| FM-04 | Hold-Loop regelt nicht nach | Klemmkraftverlust unerkannt | Periodische Pruefung alle 50ms + force-tolerance | High | Ja (Re-Apply) | -| FM-05 | NULL-Pointer-Dereferenzierung Input | Crash | Early-Exit Check | High | Ja (Letzter Zustand bleibt) | +| FM-01 | State machine stuck in APPLYING | Brake never applied | Timeout 30×50ms → ERROR | High | Yes (ERROR state) | +| FM-02 | Wrong state transition APPLIED → RELEASED without condition | Roll-away | Precondition check (`release_preconditions_ok`) | High | Yes | +| FM-03 | Watchdog counter overflow | Watchdog fires false positive | Wrap-safe subtraction in watchdog (NC-001) | High | Yes (reset) | +| FM-04 | Hold loop does not re-clamp | Clamping force loss undetected | Periodic check every 50ms + force tolerance | High | Yes (re-apply) | +| FM-05 | NULL pointer dereference on input | Crash | Early-exit check | High | Yes (last state remains) | -Aggregierte DC fuer Apply Controller: **96 %** (High). +Aggregated DC for Apply Controller: **96%** (High). ### 3.2 SWA-003 Actuator Driver (ASIL-B) -| FM-ID | Failure Mode | Effekt | Detection | DC | +| FM-ID | Failure mode | Effect | Detection | DC | |-------|------------------------------------------|--------------------------------------|---------------------------------|-------| -| FM-06 | PWM-Wert ausserhalb 0..100 | Hardware-Schaden | Parameter-Check, return EINVAL | High | -| FM-07 | ISR misst zu hohen Strom kontinuierlich | Motor-Brand | Overcurrent-Cutoff > 8A > 100ms | High | -| FM-08 | ISR misst zu niedrigen Strom (Sensor-Fehler) | Klemmkraft falsch geschaetzt | Cross-Check beider Aktoren | Medium | -| FM-09 | Beide Aktoren gleichzeitiger Cutoff | EPB inoperativ | DTC + Service-Mode bleibt zugaenglich | Medium | +| FM-06 | PWM value outside 0..100 | Hardware damage | Parameter check, return EINVAL | High | +| FM-07 | ISR measures continuously high current | Motor fire | Overcurrent cutoff > 8A > 100ms | High | +| FM-08 | ISR measures too-low current (sensor fault) | Clamping force estimated wrong | Cross-check between actuators | Medium | +| FM-09 | Both actuators simultaneous cutoff | EPB inoperative | DTC + service mode remains reachable | Medium | -Aggregierte DC fuer Actuator Driver: **85 %** (Medium). +Aggregated DC for Actuator Driver: **85%** (Medium). ### 3.3 SWA-001 Safety Manager (ASIL-D) -| FM-ID | Failure Mode | Effekt | Detection | DC | +| FM-ID | Failure mode | Effect | Detection | DC | |-------|------------------------------------------|--------------------------------------|---------------------------------|-------| -| FM-10 | Auto-Apply-Timer feuert nicht | Fahrzeug rollt nach Motor-Aus | Watchdog Safety-Manager | High | -| FM-11 | Hill-Hold-Uebergabe verzoegert | Rollen am Berg | Bremspedal-Signal-Verfolgung | High | -| FM-12 | False-Positive Hill-Hold-Aktivierung | Unnoetiges Apply | Filter-Tiefpass Inclinometer | Medium | -| FM-13 | Grade-Filter Saturation | Hill-Hold verpasst | Plausibilitaets-Check (Range) | Medium | +| FM-10 | Auto-apply timer does not fire | Vehicle rolls after engine off | Watchdog Safety Manager | High | +| FM-11 | Hill-hold handover delayed | Roll-away on incline | Brake-pedal signal tracking | High | +| FM-12 | False-positive hill-hold activation | Unnecessary apply | Low-pass filter inclinometer | Medium | +| FM-13 | Grade filter saturation | Hill-hold missed | Plausibility range check | Medium | -Aggregierte DC fuer Safety Manager: **88 %** (Medium-High). +Aggregated DC for Safety Manager: **88%** (Medium-High). -### 3.4 SWA-004 Wheel Speed Plausibilisierung (ASIL-B) +### 3.4 SWA-004 Wheel Speed Plausibilisation (ASIL-B) -| FM-ID | Failure Mode | Effekt | Detection | DC | +| FM-ID | Failure mode | Effect | Detection | DC | |-------|------------------------------------------|--------------------------------------|---------------------------------|-------| -| FM-14 | Stuck-At-Zero auf einem Rad | Falscher Stillstand erkannt | Spreizung > 3 km/h Check + DTC | High | -| FM-15 | Alle 4 Sensoren ausgefallen | Stillstand unerkannt | Komplettausfall-DTC + Vorlast-Annahme | High | +| FM-14 | Stuck-at-zero on one wheel | False standstill detected | Spread > 3 km/h check + DTC | High | +| FM-15 | All 4 sensors failed | Standstill undetected | Total-failure DTC + load assumption | High | -DC: **95 %** (High). +DC: **95%** (High). -## 4. Aggregierte Metriken (Software) +## 4. Aggregated metrics (software) -| Metrik | Wert | Anforderung ASIL-D | -|------------------------------|---------|------------------------| -| SPFM (Single-Point Fault) | 95 % | >= 99 % (Software allein nicht ausreichend, HW erforderlich) | -| LFM (Latent Fault) | 90 % | >= 90 % | -| Aggregated DC | 92 % | High | +| Metric | Value | ASIL-D requirement | +|------------------------------|---------|--------------------------------------| +| SPFM (Single-Point Fault) | 95% | ≥ 99% (software alone insufficient; HW required) | +| LFM (Latent Fault) | 90% | ≥ 90% | +| Aggregated DC | 92% | High | -**Hinweis:** Die hier berichteten Software-DC-Werte sind keine ASIL-D-Hardware- -Metriken. ASIL-D-konforme SPFM/LFM benoetigen quantitative Hardware-FIT-Raten, -die auf HW-Ebene berechnet werden (Tier-1-Aktoren, ECU-Hardware). +**Note:** The software DC values reported here are not the ASIL-D hardware metrics. ASIL-D-compliant SPFM/LFM require quantitative hardware FIT rates, which are computed at the HW level (Tier-1 actuators, ECU hardware). -## 5. Diagnose-Massnahmen (Inventar) +## 5. Diagnostic measures (inventory) -| Mechanismus | Komponente | Trigger | +| Mechanism | Component | Trigger | |------------------------------|-----------------------|----------------------------------------| -| Timeout-Watchdog | Apply Controller | 30*50ms im APPLYING | -| Klemmkraft-Hold-Check | Apply Controller | alle 50ms | -| Overcurrent-Cutoff | Actuator Driver | 8A > 100ms | -| Sensor-Spreizungs-Check | Wheel Speed Plausi | jede 10ms-Periode | -| Inclinometer-Range-Check | Inclinometer Filter | jede 10ms | -| Watchdog Safety Manager | Safety Manager | 100ms Liveness | -| Diagnostic Manager UDS DTCs | Diag Manager | Aufruf von `diag_set_dtc()` | +| Timeout watchdog | Apply Controller | 30×50ms in APPLYING | +| Clamping force hold check | Apply Controller | every 50ms | +| Overcurrent cutoff | Actuator Driver | 8A > 100ms | +| Sensor spread check | Wheel Speed Plausi | every 10ms cycle | +| Inclinometer range check | Inclinometer Filter | every 10ms | +| Watchdog Safety Manager | Safety Manager | 100ms liveness | +| Diagnostic Manager UDS DTCs | Diag Manager | call of `diag_set_dtc()` | -## 6. Aenderungshistorie +## 6. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|-------------------------|----------------| -| 0.1 | 2026-05-11 | Initialer Entwurf | S. Lohmaier | -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 0.1 | 2026-05-11 | Initial draft | S. Lohmaier| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/safety-md/HARA.md b/docs/safety-md/HARA.md index 92cd1dd..0c4b43d 100644 --- a/docs/safety-md/HARA.md +++ b/docs/safety-md/HARA.md @@ -1,154 +1,145 @@ --- doc-id: SLM-EPB-HARA-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- # Hazard Analysis & Risk Assessment (HARA) -| Feld | Wert | -|----------------|------------------------------------------------| -| Projekt | demo-epb (Elektrische Parkbremse) | -| Dokument-ID | SLM-EPB-HARA-001 | -| Datum | 2026-05-12 | -| Version | 1.0 | -| Status | Freigegeben | -| Norm | ISO 26262 Part 3 (Concept Phase) | -| Erstellt von | Stefan Lohmaier | -| Geprueft von | (Tech Lead, im Realprojekt unabhaengig) | -| Freigegeben von| (Safety Manager, im Realprojekt unabhaengig) | +| Field | Value | +|-----------------|-------------------------------------------------| +| Project | demo-epb (Electric Parking Brake) | +| Document ID | SLM-EPB-HARA-001 | +| Date | 2026-05-12 | +| Version | 1.0 | +| Status | Released | +| Standard | ISO 26262 Part 3 (Concept Phase) | +| Author | Stefan Lohmaier | +| Reviewer | (Tech Lead, independent in real project) | +| Approver | (Safety Manager, independent in real project) | --- -## 1. Zweck +## 1. Purpose -Identifikation und Klassifikation aller relevanten Hazards der Elektrischen -Parkbremse (EPB) gemaess ISO 26262-3. Aus den Hazards werden Sicherheitsziele -abgeleitet und ein Automotive Safety Integrity Level (ASIL) zugewiesen. +Identification and classification of all relevant EPB hazards per ISO 26262-3. From the hazards, safety goals are derived and an Automotive Safety Integrity Level (ASIL) is assigned. -## 2. Item-Definition +## 2. Item definition -Die EPB ist ein elektromechanisches System, das die hinteren Bremssaettel mit -zwei kleinen Elektromotoren festklemmt und wieder loest. Item-Boundary -(ISO 26262-3 §5): +The EPB is an electromechanical system that clamps both rear callipers using two small electric motors and releases them. Item boundary (ISO 26262-3 §5): -- **Innerhalb:** EPB-ECU, beide Caliper-Motoren, EPB-Schalter, Status-LED -- **Aussen:** ESP, Motormanagement, Bremssystem (hydraulisch), Lenkung -- **Schnittstellen:** CAN-Bus, Wheel-Speed-Sensoren, Inclinometer +- **Inside:** EPB ECU, both calliper motors, EPB switch, status LED +- **Outside:** ESP, engine management, brake system (hydraulic), steering +- **Interfaces:** CAN bus, wheel-speed sensors, inclinometer -## 3. Operational Situations & Hazards +## 3. Operational situations & hazards -Die folgenden Betriebssituationen und Hazards wurden im Concept-Workshop -(2026-05-11) identifiziert: +The following operational situations and hazards were identified in the concept workshop (2026-05-11): -### 3.1 Hazard-Liste +### 3.1 Hazard list -| H-ID | Hazard | Betriebs-Situation | -|-------|------------------------------------------------------|------------------------------------| -| H-01 | Ungewolltes Loesen der Parkbremse im Stillstand | Fahrzeug parkt am Hang, Fahrer aus| -| H-02 | Ungewolltes Festklemmen waehrend der Fahrt | Fahrt > 10 km/h | -| H-03 | Keine Apply-Reaktion auf Fahrer-Anforderung | Stillstand, Fahrer betaetigt Schalter | -| H-04 | Verlust der Klemmkraft im Hold-Zustand | Parkphase laenger als 1 h | -| H-05 | Motorschaden durch Ueberstrom | Aktor-Mechanik blockiert | -| H-06 | Falsche Hill-Hold-Uebergabe (Rollen am Berg) | Anfahrt am Berg | -| H-07 | Keine Release-Reaktion bei Anfahrt | Stillstand, Fahrer will losfahren | -| H-08 | LED-Anzeige falsch | beliebig | +| H-ID | Hazard | Operational situation | +|-------|------------------------------------------------------|--------------------------------------| +| H-01 | Unintended release of the parking brake at standstill | Vehicle parked on incline, driver out| +| H-02 | Unintended clamping during driving | Driving > 10 km/h | +| H-03 | No apply reaction to driver request | Standstill, driver actuates switch | +| H-04 | Loss of clamping force in hold state | Parking phase longer than 1 h | +| H-05 | Motor damage from overcurrent | Actuator mechanics blocked | +| H-06 | Incorrect hill-hold handover (roll-away on incline) | Drive-away on incline | +| H-07 | No release reaction on drive-away | Standstill, driver wants to drive | +| H-08 | LED indicator wrong | any | ### 3.2 Severity / Exposure / Controllability -Klassifikation nach ISO 26262-3 §6: +Classification per ISO 26262-3 §6: -| Severity | Bedeutung | +| Severity | Meaning | |----------|------------------------------------------------------------| -| S0 | Keine Verletzungen | -| S1 | Leichte / moderate Verletzungen | -| S2 | Schwere Verletzungen (Ueberleben wahrscheinlich) | -| S3 | Lebensgefaehrliche Verletzungen (Ueberleben fraglich) | +| S0 | No injuries | +| S1 | Light / moderate injuries | +| S2 | Severe injuries (survival likely) | +| S3 | Life-threatening injuries (survival uncertain) | -| Exposure | Bedeutung | +| Exposure | Meaning | |----------|------------------------------------------------------------| -| E0 | Sehr unwahrscheinlich | -| E1 | Sehr seltene Situation | -| E2 | Seltene Situation | -| E3 | Mittlere Wahrscheinlichkeit | -| E4 | Haeufige Situation | +| E0 | Very unlikely | +| E1 | Very rare situation | +| E2 | Rare situation | +| E3 | Medium likelihood | +| E4 | Frequent situation | -| Controllability | Bedeutung | -|------------------|------------------------------------------------------| -| C0 | Allgemein beherrschbar | -| C1 | Einfach beherrschbar (>99% der Fahrer) | -| C2 | Normal beherrschbar (>90% der Fahrer) | -| C3 | Schwer beherrschbar oder unbeherrschbar | +| Controllability | Meaning | +|------------------|----------------------------------------------------| +| C0 | Generally controllable | +| C1 | Simply controllable (>99% of drivers) | +| C2 | Normally controllable (>90% of drivers) | +| C3 | Difficult to control or uncontrollable | -### 3.3 ASIL-Determination +### 3.3 ASIL determination -| H-ID | Beschreibung | S | E | C | ASIL | -|-------|-------------------------------------------|----|----|----|-------| -| H-01 | Ungewolltes Loesen, Parkphase | S3 | E4 | C3 | **D** | -| H-02 | Ungewolltes Festklemmen waehrend Fahrt | S3 | E4 | C3 | **D** | -| H-03 | Keine Apply-Reaktion auf Anforderung | S2 | E4 | C2 | B | -| H-04 | Klemmkraftverlust im Hold | S3 | E4 | C3 | **D** | -| H-05 | Motorschaden durch Ueberstrom | S1 | E3 | C2 | A | -| H-06 | Hill-Hold-Versagen (Rollen am Berg) | S3 | E3 | C3 | C | -| H-07 | Keine Release-Reaktion | S1 | E4 | C2 | A | -| H-08 | LED-Anzeige falsch | S0 | -- | -- | QM | +| H-ID | Description | S | E | C | ASIL | +|-------|------------------------------------------|----|----|----|-------| +| H-01 | Unintended release, parking phase | S3 | E4 | C3 | **D** | +| H-02 | Unintended clamping during driving | S3 | E4 | C3 | **D** | +| H-03 | No apply reaction to request | S2 | E4 | C2 | B | +| H-04 | Clamping force loss in hold | S3 | E4 | C3 | **D** | +| H-05 | Motor damage from overcurrent | S1 | E3 | C2 | A | +| H-06 | Hill-hold failure (roll-away on incline) | S3 | E3 | C3 | C | +| H-07 | No release reaction | S1 | E4 | C2 | A | +| H-08 | LED indicator wrong | S0 | -- | -- | QM | -ASIL-Matrix laut ISO 26262-3 Table 4 angewandt. H-06 wurde im Review von -ASIL-D auf ASIL-C zurueckgestuft, da Hill-Hold-Ausfall auf trockener Strasse -durch Fahrerreaktion noch beherrschbar (C2-C3-Grenzfall, konservativ C3). +ASIL matrix per ISO 26262-3 Table 4 applied. H-06 was downgraded from ASIL-D to ASIL-C in review, since hill-hold failure on dry road remains controllable through driver response (C2-C3 borderline, conservatively C3). -## 4. Sicherheitsziele (Safety Goals) +## 4. Safety goals -Aus den Hazards werden folgende Safety Goals abgeleitet: +From the hazards the following safety goals are derived: -| SG-ID | Sicherheitsziel | ASIL | Abgedeckte Hazards | -|-------|--------------------------------------------------------------------|-------|----------------------| -| SG-01 | EPB darf sich im Stillstand nicht ungewollt loesen | D | H-01, H-04 | -| SG-02 | EPB darf nicht ungewollt waehrend der Fahrt festklemmen | D | H-02 | -| SG-03 | EPB muss Schutz gegen Aktor-Ueberstrom bieten | A | H-05 | -| SG-04 | Hill-Hold muss zuverlaessig an Apply Controller uebergeben | C | H-06 | -| SG-05 | EPB muss auf Fahreranforderung in spezifizierter Zeit reagieren | B | H-03, H-07 | +| SG-ID | Safety goal | ASIL | Covered hazards | +|-------|-------------------------------------------------------------------|-------|----------------------| +| SG-01 | The EPB must not unintentionally release while at standstill | D | H-01, H-04 | +| SG-02 | The EPB must not unintentionally clamp while driving | D | H-02 | +| SG-03 | The EPB must protect against actuator overcurrent | A | H-05 | +| SG-04 | Hill-hold must reliably hand over to the apply controller | C | H-06 | +| SG-05 | The EPB must respond to driver requests within specified times | B | H-03, H-07 | -## 5. Safe State +## 5. Safe state -Definitionen aus ISO 26262-3 §7.4.2.5: +Definitions per ISO 26262-3 §7.4.2.5: -| Item / Funktion | Safe State | +| Item / Function | Safe state | |------------------------|------------------------------------------------------------| -| Apply-Phase | Aktor stoppen, Status auf APPLIED setzen | -| Hold-Phase | Klemmkraft beibehalten (passiv) | -| Release-Phase | Auf Apply zurueckkehren, Klemmkraft halten | -| Bei Hardware-Fehler | APPLIED-Zustand erzwingen (verhindert Wegrollen) | +| Apply phase | Stop actuator, set status to APPLIED | +| Hold phase | Maintain clamping force (passive) | +| Release phase | Return to apply, maintain clamping force | +| On hardware fault | Force APPLIED state (prevents roll-away) | -Der ueber alle Faelle "konservative" Safe State ist **APPLIED**: lieber zu -viel klemmen als zu wenig. +The conservative safe state across all cases is **APPLIED**: rather over-clamp than under-clamp. ## 6. FTTI (Fault Tolerant Time Interval) -| Hazard | FTTI | Begruendung | +| Hazard | FTTI | Rationale | |--------|---------|-----------------------------------------------------------| -| H-01 | 5 s | Wegrollen am Berg startet typ. nach 1-2 s, Hand-Aktion mglich nach ca. 5 s | -| H-02 | 100 ms | Stoss-Verlangsamung bei 50 km/h muss innerhalb 100 ms erkannt werden | -| H-04 | 30 s | Klemmkraftverlust akkumuliert langsam, periodische Pruefung alle 50ms reicht | -| H-06 | 500 ms | Hill-Hold-Uebergabe muss vor Rollbeginn (< 500ms) abgeschlossen sein | +| H-01 | 5 s | Roll-away on incline starts after ~1-2 s, hand action possible after ~5 s | +| H-02 | 100 ms | Shock deceleration at 50 km/h must be detected within 100 ms | +| H-04 | 30 s | Clamping force loss accumulates slowly, periodic check every 50 ms suffices | +| H-06 | 500 ms | Hill-hold handover must complete before roll-away begins (< 500 ms) | -## 7. Funktionale Sicherheitsanforderungen (FSR) +## 7. Functional Safety Requirements (FSR) -Aus den Safety Goals werden in `reqs/sys/` die SYS-Anforderungen abgeleitet -(siehe Traceability-Matrix). Mapping: +From the safety goals the SYS requirements in `reqs/sys/` are derived (see traceability matrix). Mapping: -| SG-ID | SYS-Anforderungen | +| SG-ID | SYS requirements | |-------|----------------------------------------------------| | SG-01 | SYS-001, SYS-004 | -| SG-02 | SYS-002 (Apply-Plausibilisierung), SYS-005 | +| SG-02 | SYS-002 (apply plausibility), SYS-005 | | SG-03 | SYS-007 | | SG-04 | SYS-005, SYS-006 | | SG-05 | SYS-002, SYS-003 | -## 8. Aenderungshistorie +## 8. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|-------------------------|----------------| -| 0.1 | 2026-05-11 | Initialer Entwurf | S. Lohmaier | -| 1.0 | 2026-05-12 | Erstfreigabe nach Review| S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|-------------------------|-----------------| +| 0.1 | 2026-05-11 | Initial draft | S. Lohmaier | +| 1.0 | 2026-05-12 | First release after review | S. Lohmaier | diff --git a/docs/safety-md/MISRA-Compliance-Statement.md b/docs/safety-md/MISRA-Compliance-Statement.md index ccc1cee..8933e64 100644 --- a/docs/safety-md/MISRA-Compliance-Statement.md +++ b/docs/safety-md/MISRA-Compliance-Statement.md @@ -1,58 +1,55 @@ --- doc-id: SLM-EPB-MISRA-COMP-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- # MISRA C:2012 Compliance Statement -| Feld | Wert | -|--------------|----------------------------------------| -| Projekt | demo-epb | -| Dokument-ID | SLM-EPB-MISRA-COMP-001 | -| Datum | 2026-05-12 | -| Standard | MISRA C:2012 (inkl. Amendment 1) | -| Compiler | GCC 11.2 (Linux CI) / GCC 16.1 (Win) | -| Checker | Cppcheck 2.7+ mit `--addon=misra` | +| Field | Value | +|---------------|----------------------------------------| +| Project | demo-epb | +| Document ID | SLM-EPB-MISRA-COMP-001 | +| Date | 2026-05-12 | +| Standard | MISRA C:2012 (incl. Amendment 1) | +| Compiler | GCC 11.2 (Linux CI) / GCC 16.1 (Win) | +| Checker | Cppcheck 2.7+ with `--addon=misra` | --- -## 1. Zusammenfassung +## 1. Summary -Der Quellcode von demo-epb wurde gegen MISRA C:2012 geprueft. -Alle **Required** und **Mandatory** Regeln werden eingehalten, mit Ausnahme -von einer dokumentierten Deviation (siehe MISRA-REC-001). +The source code of demo-epb has been checked against MISRA C:2012. All **Required** and **Mandatory** rules are observed, with the exception of one documented deviation (see MISRA-REC-001). -**Compliance-Erklaerung:** demo-epb v1.0 ist **MISRA C:2012 compliant** unter -Beruecksichtigung dokumentierter Deviation Records. +**Compliance statement:** demo-epb v1.0 is **MISRA C:2012 compliant** taking into account the documented deviation records. -## 2. Geltungsbereich +## 2. Scope -| Modul | MISRA-konform geprueft | -|----------------------|-----------------------------| -| `src/switch_debouncer.{c,h}` | Ja | -| `src/actuator_driver.{c,h}` | Ja | -| `src/apply_controller.{c,h}` | Ja | -| `src/safety_manager.{c,h}` | Ja | -| `src/epb_types.h` | Ja | -| `src/stubs/*.h` | Header-only, keine MISRA-relevanten Implementierungen | -| `tests/**/*` | Nicht im Geltungsbereich (Test-Code) | -| `tools/**/*` | Nicht im Geltungsbereich (Python-Skripte) | +| Module | MISRA-checked | +|------------------------------|--------------------------| +| `src/switch_debouncer.{c,h}` | Yes | +| `src/actuator_driver.{c,h}` | Yes | +| `src/apply_controller.{c,h}` | Yes | +| `src/safety_manager.{c,h}` | Yes | +| `src/epb_types.h` | Yes | +| `src/stubs/*.h` | Header-only, no MISRA-relevant implementations | +| `tests/**/*` | Out of scope (test code) | +| `tools/**/*` | Out of scope (Python scripts) | -## 3. Regel-Aktivierung +## 3. Rule activation -Cppcheck MISRA-Addon prueft die folgenden Regel-Kategorien: +The Cppcheck MISRA addon checks the following rule categories: -| Kategorie | Anzahl | Aktivierung im Projekt | -|-----------|--------|--------------------------------| -| Mandatory | 9 | Alle aktiviert, Verletzung blockt Build | -| Required | 119 | Alle aktiviert, Verletzung blockt Build | -| Advisory | 47 | Aktiviert mit Warning-Level, Deviations zulaessig per Record | +| Category | Count | Activation in project | +|-----------|--------|----------------------------------| +| Mandatory | 9 | All active, violation blocks build | +| Required | 119 | All active, violation blocks build | +| Advisory | 47 | Active at warning level, deviations allowed per record | -## 4. Compliance-Status pro Regel-Kategorie +## 4. Compliance status per rule category -### 4.1 Mandatory Rules (9) +### 4.1 Mandatory rules (9) | Rule | Status | |-------------|------------| @@ -61,15 +58,15 @@ Cppcheck MISRA-Addon prueft die folgenden Regel-Kategorien: | R 19.1, R 21.13, R 21.17 | Compliant | | R 21.18, R 21.19, R 21.20 | Compliant | -**Mandatory Status: 100 % Compliant.** +**Mandatory status: 100% Compliant.** -### 4.2 Required Rules +### 4.2 Required rules -Gesamt: 119 Required Rules. Verletzungen: **0**. +Total: 119 Required rules. Violations: **0**. -Top-relevante Rules fuer dieses Projekt: +Top relevant rules for this project: -| Rule | Beschreibung | Status | +| Rule | Description | Status | |---------|----------------------------------------------------------|----------| | R 8.1 | Type specifier shall be explicit | Compliant | | R 8.2 | Function parameters shall be explicitly named | Compliant | @@ -78,21 +75,21 @@ Top-relevante Rules fuer dieses Projekt: | R 14.1 | Loop counter shall not have essentially floating type | Compliant | | R 14.4 | Controlling expression shall have essentially Boolean type | Compliant | | R 15.4 | At most one break or goto per loop | Compliant | -| R 17.7 | Return value of non-void function shall be used | Compliant (oder explizit `(void)`) | -| R 21.3 | No dynamic memory allocation (malloc/free) | Compliant (keine Heap-Nutzung) | +| R 17.7 | Return value of non-void function shall be used | Compliant (or explicit `(void)`) | +| R 21.3 | No dynamic memory allocation (malloc/free) | Compliant (no heap use) | | R 21.4 | No setjmp/longjmp | Compliant | -### 4.3 Advisory Rules +### 4.3 Advisory rules -47 Advisory Rules. Verletzungen werden via MISRA Deviation Records dokumentiert. +47 Advisory rules. Violations are documented via MISRA deviation records. -| Record-ID | Rule | Datei | Begruendung-Auszug | +| Record ID | Rule | File | Rationale summary | |-------------------|---------|-------------------------------|-----------------------------| -| MISRA-REC-001 | R 15.5 | `src/apply_controller.c:64` | Early-Exit fuer NULL-Check | +| MISRA-REC-001 | R 15.5 | `src/apply_controller.c:64` | Early-exit for NULL check | -**Advisory Status: 1 Deviation Record, dokumentiert.** +**Advisory status: 1 deviation record, documented.** -## 5. Pruef-Pipeline +## 5. Check pipeline ```bash cppcheck \ @@ -105,26 +102,26 @@ cppcheck \ -I src src ``` -Pruefung erfolgt: -- Lokal vor jedem Commit (empfohlen) -- Automatisch in CI bei jedem Push und PR -- Vor jedem Release (Tag-Push triggert release.yml) +Checks are run: +- Locally before each commit (recommended) +- Automatically in CI on every push and PR +- Before each release (tag push triggers release.yml) -## 6. Deviation Permits (projektweit) +## 6. Deviation Permits (project-wide) -Keine projektweiten Permits aktiv. +No project-wide permits are active. -## 7. Re-Audit-Trigger +## 7. Re-audit triggers -Diese Compliance-Erklaerung muss bei folgenden Aenderungen neu erstellt werden: +This compliance statement must be re-created on the following changes: -- Compiler-Wechsel (z.B. GCC -> Clang) -- Major-Update von Cppcheck oder MISRA-Addon -- Neue Quelldateien ausserhalb `src/` -- MISRA-Standard-Update (z.B. C:2025 Release) +- Compiler change (e.g. GCC → Clang) +- Major update of Cppcheck or the MISRA addon +- New source files outside `src/` +- MISRA standard update (e.g. C:2025 release) -## 8. Aenderungshistorie +## 8. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|-------------------------|----------------| -| 1.0 | 2026-05-12 | Erstfreigabe v1.0 | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release v1.0 | S. Lohmaier| diff --git a/docs/safety-md/Safety-Case.md b/docs/safety-md/Safety-Case.md index 8a7c80b..0bbbd06 100644 --- a/docs/safety-md/Safety-Case.md +++ b/docs/safety-md/Safety-Case.md @@ -1,139 +1,136 @@ --- doc-id: SLM-EPB-SC-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- # Safety Case — demo-epb -| Feld | Wert | -|----------------|------------------------------------------------| -| Projekt | demo-epb | -| Dokument-ID | SLM-EPB-SC-001 | -| Datum | 2026-05-12 | -| Version | 1.0 | -| Status | Freigegeben | -| Norm | ISO 26262 Part 2 §6.5 + Part 6 §6 | -| Erstellt von | Stefan Lohmaier | -| Freigegeben von| (Safety Manager, im Realprojekt) | +| Field | Value | +|-----------------|-------------------------------------------------| +| Project | demo-epb | +| Document ID | SLM-EPB-SC-001 | +| Date | 2026-05-12 | +| Version | 1.0 | +| Status | Released | +| Standard | ISO 26262 Part 2 §6.5 + Part 6 §6 | +| Author | Stefan Lohmaier | +| Approver | (Safety Manager, in real project) | --- -## 1. Zweck +## 1. Purpose -Argumentation, dass das EPB-System die in der HARA identifizierten -Sicherheitsziele erfuellt. Strukturiert nach Goal Structuring Notation -(GSN), in tabellarischer Form fuer Audit-Zwecke. +Argument that the EPB system satisfies the safety goals identified in the HARA. Structured per Goal Structuring Notation (GSN), in tabular form for audit purposes. -## 2. Top-Goal +## 2. Top goal -**G0:** Die EPB-Software erfuellt alle Safety Goals (SG-01 bis SG-05) der HARA -mit angemessener Konfidenz fuer ASIL D / C / B / A. +**G0:** The EPB software satisfies all safety goals (SG-01 to SG-05) from the HARA with adequate confidence for ASIL D / C / B / A. -## 3. Argument-Struktur +## 3. Argument structure -| Goal | Behauptung | Strategie | Evidenz | -|------|------------------------------------------------------|------------------------------------------|------------------------------------------| -| G0 | EPB erfuellt alle SG aus HARA | Decomposition nach SG | G1, G2, G3, G4, G5 | -| G1 | SG-01 (kein ungewolltes Loesen) ist erfuellt | Architektonisch + Test + Review | SWA-002 + Tests + Code-Review | -| G2 | SG-02 (kein ungewolltes Apply) ist erfuellt | Architektonisch + Plausibilisierung | SWA-002 standstill-check + Tests | -| G3 | SG-03 (Schutz vor Ueberstrom) ist erfuellt | Architektonisch + Test | SWA-003 overcurrent-cutoff + Tests | -| G4 | SG-04 (Hill-Hold-Uebergabe) ist erfuellt | Architektonisch + Sequenz-Test | SWA-001 + Tests | -| G5 | SG-05 (Reaktionszeit) ist erfuellt | Performance-Messung + Test | Step-Timing-Tests | +| Goal | Claim | Strategy | Evidence | +|------|---------------------------------------------------------|------------------------------------------|--------------------------------------------| +| G0 | EPB satisfies all SGs from HARA | Decomposition by SG | G1, G2, G3, G4, G5 | +| G1 | SG-01 (no unintended release) is satisfied | Architectural + test + review | SWA-002 + tests + code review | +| G2 | SG-02 (no unintended apply) is satisfied | Architectural + plausibilisation | SWA-002 standstill check + tests | +| G3 | SG-03 (overcurrent protection) is satisfied | Architectural + test | SWA-003 overcurrent cutoff + tests | +| G4 | SG-04 (hill-hold handover) is satisfied | Architectural + sequence test | SWA-001 + tests | +| G5 | SG-05 (response time) is satisfied | Performance measurement + test | Step timing tests | -## 4. Detail-Argumente +## 4. Detail arguments -### G1 — SG-01: Kein ungewolltes Loesen +### G1 — SG-01: No unintended release **Argument:** -| # | Aussage | Beleg | -|---|-----------------------------------------------------------------------|--------------------------------------| -| 1 | Apply Controller verlaesst APPLIED nur bei expliziter Release-Anforderung mit Vorbedingungen | `apply_controller.c` Zeile 95-110 (`case EPB_STATE_APPLIED`) | -| 2 | Release-Vorbedingungen pruefen Engine + Brake + Gear | `release_preconditions_ok()` + SWE-005 | -| 3 | Watchdog erkennt Apply-Controller-Hang und faellt in Safe State (APPLIED) | SWE-002 + Watchdog in SWA-001 | -| 4 | Klemmkraft wird alle 50 ms verifiziert und bei Abfall nachgeregelt | SWE-001 + Test `test_applied_holds_force` | -| 5 | Unit-Test deckt das Verhalten ab: `test_release_requires_preconditions` | `tests/unit/test_apply_controller.c` | +| # | Statement | Evidence | +|---|-------------------------------------------------------------------------|----------------------------------------| +| 1 | Apply controller leaves APPLIED only on explicit release request with preconditions | `apply_controller.c` line 95-110 (`case EPB_STATE_APPLIED`) | +| 2 | Release preconditions check engine + brake + gear | `release_preconditions_ok()` + SWE-005 | +| 3 | Watchdog detects apply controller hang and falls into safe state (APPLIED) | SWE-002 + watchdog in SWA-001 | +| 4 | Clamping force is verified every 50 ms and re-applied on drop | SWE-001 + test `test_applied_holds_force` | +| 5 | Unit test covers the behaviour: `test_release_requires_preconditions` | `tests/unit/test_apply_controller.c` | -**Konfidenz:** ASIL-D. Architektonische Trennung + Tests + 2 Reviewer. +**Confidence:** ASIL-D. Architectural separation + tests + 2 reviewers. -### G2 — SG-02: Kein ungewolltes Apply waehrend Fahrt +### G2 — SG-02: No unintended apply during driving **Argument:** -| # | Aussage | Beleg | -|---|-----------------------------------------------------------------------|--------------------------------------| -| 1 | Apply-Anforderung wird nur bei Stillstand (v < 0.5 km/h) angenommen | `apply_controller.c` `in->standstill` check | -| 2 | Stillstand wird durch Wheel-Speed-Plausibilisierung von 4 Sensoren bestaetigt | SWE-022 + SWA-004 | -| 3 | Plausibilisierung erkennt einzelnen Sensor-Fehler (Spreizung > 3 km/h) | SWE-023 | -| 4 | Test deckt das Verhalten ab: `test_no_apply_without_standstill` | `tests/unit/test_apply_controller.c` | +| # | Statement | Evidence | +|---|-------------------------------------------------------------------------|----------------------------------------| +| 1 | Apply request is accepted only at standstill (v < 0.5 km/h) | `apply_controller.c` `in->standstill` check | +| 2 | Standstill is confirmed by wheel-speed plausibilisation of 4 sensors | SWE-022 + SWA-004 | +| 3 | Plausibilisation detects single sensor fault (spread > 3 km/h) | SWE-023 | +| 4 | Test covers the behaviour: `test_no_apply_without_standstill` | `tests/unit/test_apply_controller.c` | -**Konfidenz:** ASIL-D. Sensor-Redundanz + Test + 2 Reviewer. +**Confidence:** ASIL-D. Sensor redundancy + test + 2 reviewers. -### G3 — SG-03: Schutz vor Aktor-Ueberstrom +### G3 — SG-03: Protection against actuator overcurrent **Argument:** -| # | Aussage | Beleg | -|---|--------------------------------------------------------------------------------|------------------------------------| -| 1 | Motorstrom wird mit 1 kHz abgetastet | `actuator_isr_1khz` + SWE-013 | -| 2 | Bei > 8 A fuer > 100 ms wird der Motor abgeschaltet | `actuator_driver.c` Overcurrent-Logik + SWE-014 | -| 3 | Nach Overcurrent ist `actuator_apply` blockiert (returns EPB_EOVERCURRENT) | Test `test_overcurrent_blocks_subsequent_apply` | -| 4 | DTC wird gesetzt (Diagnostic Manager SWA-008) | SWE-014 (implicit DTC trigger) | +| # | Statement | Evidence | +|---|-------------------------------------------------------------------------|----------------------------------------| +| 1 | Motor current is sampled at 1 kHz | `actuator_isr_1khz` + SWE-013 | +| 2 | On > 8 A for > 100 ms the motor is shut down | `actuator_driver.c` overcurrent logic + SWE-014 | +| 3 | After overcurrent, `actuator_apply` is blocked (returns EPB_EOVERCURRENT) | Test `test_overcurrent_blocks_subsequent_apply` | +| 4 | DTC is set (Diagnostic Manager SWA-008) | SWE-014 (implicit DTC trigger) | -**Konfidenz:** ASIL-A (Hazard H-05). Lokale Logik + Test. +**Confidence:** ASIL-A (hazard H-05). Local logic + test. -### G4 — SG-04: Hill-Hold-Uebergabe +### G4 — SG-04: Hill-hold handover **Argument:** -| # | Aussage | Beleg | -|---|---------------------------------------------------------------------------------|------------------------------------| -| 1 | Hill-Hold wird aktiviert bei grade > 5%, v=0, Bremse | `safety_manager.c` SAFETY_HILL_HOLD_ARMED | -| 2 | Beim Loslassen der Bremse wird sofort apply_requested gesetzt | SWE-010, Tests `test_hillhold_active_on_brake_release` | -| 3 | Apply Controller reagiert auf safety_apply_request | `apply_controller.c` `apply_request_present()` | -| 4 | Inclinometer ist tiefpass-gefiltert (Robustheit gegen Sensorrauschen) | SWA-005 + SWE-024 | +| # | Statement | Evidence | +|---|-------------------------------------------------------------------------|----------------------------------------| +| 1 | Hill-hold activates at grade > 5%, v=0, brake pressed | `safety_manager.c` SAFETY_HILL_HOLD_ARMED | +| 2 | On brake release, apply_requested is set immediately | SWE-010, test `test_hillhold_active_on_brake_release` | +| 3 | Apply controller responds to safety_apply_request | `apply_controller.c` `apply_request_present()` | +| 4 | Inclinometer is low-pass filtered (robustness against sensor noise) | SWA-005 + SWE-024 | -**Konfidenz:** ASIL-C. Architektonisch + Tests + Filter. +**Confidence:** ASIL-C. Architectural + tests + filter. -### G5 — SG-05: Reaktionszeit +### G5 — SG-05: Response time **Argument:** -| # | Aussage | Beleg | -|---|---------------------------------------------------------------------------------|------------------------------------| -| 1 | Apply Controller laeuft alle 50 ms | `apply_ctrl_step_50ms` | -| 2 | Schalter wird in 50 ms entprellt (5 stable samples) | `switch_debouncer.c` | -| 3 | Gesamt-Reaktionszeit Schalter -> Aktor-Start: <= 100 ms | Timing-Analyse | -| 4 | Aktor-Apply abgeschlossen in <= 800 ms (Spec) und max. 1500 ms (Timeout) | Apply timeout, SWE-006 | +| # | Statement | Evidence | +|---|-------------------------------------------------------------------------|----------------------------------------| +| 1 | Apply controller runs every 50 ms | `apply_ctrl_step_50ms` | +| 2 | Switch is debounced in 50 ms (5 stable samples) | `switch_debouncer.c` | +| 3 | Total response switch → actuator start: ≤ 100 ms | Timing analysis | +| 4 | Actuator apply completes in ≤ 800 ms (spec) and max 1500 ms (timeout) | Apply timeout, SWE-006 | -**Konfidenz:** ASIL-B. Performance + Timeout. +**Confidence:** ASIL-B. Performance + timeout. -## 5. Common-Cause / Common-Mode +## 5. Common cause / common mode -Folgende Common-Cause-Risiken wurden geprueft: +The following common-cause risks were checked: -| Risiko | Massnahme | +| Risk | Mitigation | |---------------------------------------|-------------------------------------------------------------| -| Speicherfehler (Stack/Heap) | Statische Allokation, MISRA C 21.3 (kein Heap) | -| Compiler-Bug | GCC qualifiziert (siehe Tool-Qualification-Report), MISRA-Check | -| Konfigurations-Fehler | Build-Pipeline reproduzierbar, Version-pinning, CI-Verify | -| Shared-State-Race | Single-Threaded Step-Funktionen, ISR-Trennung via Volatile | +| Memory errors (stack/heap) | Static allocation, MISRA C 21.3 (no heap) | +| Compiler bug | GCC qualified (see tool qualification report), MISRA check | +| Configuration error | Build pipeline reproducible, version pinning, CI verify | +| Shared-state race | Single-threaded step functions, ISR separation via volatile | -## 6. Restrisiken +## 6. Residual risks -Folgende Risiken bleiben: +The following risks remain: -| Risiko | Bewertung | Begruendung | +| Risk | Assessment | Rationale | |----------------------------------------|--------------------------|------------------------------------| -| Sensor-Drift Inclinometer ueber Jahre | Akzeptiert | Periodische Kalibrierung im Service-Manual | -| EMV-Einfluss auf CAN | Auf System-Ebene gemildert | CAN ECU bietet eigene Fehlerbehandlung | -| Aktor-Lebenszeit | Aussen-Verantwortung | Tier-1 Komponente, Datenblatt | +| Inclinometer sensor drift over years | Accepted | Periodic calibration in service manual | +| EMC influence on CAN | Mitigated at system level | CAN ECU provides its own fault handling | +| Actuator lifetime | External responsibility | Tier-1 component, datasheet | -## 7. Aenderungshistorie +## 7. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|-------------------------|----------------| -| 0.1 | 2026-05-11 | Initialer Entwurf | S. Lohmaier | -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|-------------------------|-----------------| +| 0.1 | 2026-05-11 | Initial draft | S. Lohmaier | +| 1.0 | 2026-05-12 | First release | S. Lohmaier | diff --git a/docs/safety-md/Tool-Qualification-Cppcheck.md b/docs/safety-md/Tool-Qualification-Cppcheck.md index 7cb9e27..362ee6c 100644 --- a/docs/safety-md/Tool-Qualification-Cppcheck.md +++ b/docs/safety-md/Tool-Qualification-Cppcheck.md @@ -1,136 +1,127 @@ --- doc-id: SLM-EPB-TQ-Cppcheck-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- -# Tool-Qualification — Cppcheck + MISRA-Addon +# Tool Qualification — Cppcheck + MISRA addon -| Feld | Wert | -|--------------|----------------------------------------| -| Tool | Cppcheck mit MISRA-Addon | -| Version | 2.7+ (Linux apt) / 2.20.0 (Windows/macOS) | -| Hersteller | Daniel Marjamaeki et al. (Open Source)| -| Lizenz | GPLv3 | -| Verwendung | Statische Analyse, MISRA-C:2012-Check | -| Norm | ISO 26262 Part 8 §11 | +| Field | Value | +|---------------|----------------------------------------| +| Tool | Cppcheck with MISRA addon | +| Version | 2.7+ (Linux apt) / 2.20.0 (Windows/macOS) | +| Vendor | Daniel Marjamäki et al. (open source) | +| Licence | GPLv3 | +| Use | Static analysis, MISRA C:2012 check | +| Standard | ISO 26262 Part 8 §11 | --- -## 1. Zweck +## 1. Purpose -Dieser Bericht qualifiziert Cppcheck mit MISRA-Addon fuer den Einsatz in der -demo-epb Entwicklung. Tool-Qualifikation nach ISO 26262-8 §11 ist -verpflichtend, wenn: +This report qualifies Cppcheck with the MISRA addon for use in demo-epb development. Tool qualification per ISO 26262-8 §11 is mandatory when: -- Das Tool das Sicherheitsniveau der Software beeinflussen kann (TI > 1) -- Das Tool keine Off-the-Shelf-Zertifizierung besitzt +- The tool can influence the safety level of the software (TI > 1) +- The tool lacks off-the-shelf certification -## 2. Tool-Klassifikation +## 2. Tool classification -### 2.1 Use Cases +### 2.1 Use cases -| UC-ID | Use Case | Output verifiziert? | +| UC-ID | Use case | Output verified? | |-------|-----------------------------------|----------------------------| -| UC-01 | Statische Analyse waehrend Build | Per Review (CI-Log) | -| UC-02 | MISRA-C:2012-Konformitaetsbeleg | Per Deviation-Records | -| UC-03 | Identifikation von Bugs | Ergebnisse werden geprueft | +| UC-01 | Static analysis during build | Via review (CI log) | +| UC-02 | MISRA C:2012 compliance evidence | Via deviation records | +| UC-03 | Bug identification | Findings are reviewed | ### 2.2 Tool Impact (TI) -Definition nach ISO 26262-8 §11.4.5.1: +Definition per ISO 26262-8 §11.4.5.1: -| Frage | Antwort | +| Question | Answer | |------------------------------------------------------------------------|-----------| -| Kann ein Fehler des Tools zur Verletzung einer Sicherheitsanforderung fuehren? | Ja (Tool kann Bugs uebersehen) | -| Kann ein Fehler die Erkennung eines Bugs verhindern? | Ja | +| Can a tool error lead to a violation of a safety requirement? | Yes (the tool may miss bugs) | +| Can a tool error prevent detection of a bug? | Yes | -=> **TI = TI2** (Tool kann Sicherheit beeinflussen) +⇒ **TI = TI2** (the tool can influence safety) ### 2.3 Tool Error Detection (TD) -Definition nach ISO 26262-8 §11.4.5.4: +Definition per ISO 26262-8 §11.4.5.4: -| Frage | Antwort | -|------------------------------------------------------------------------|-------------| -| Wird das Tool-Output durch andere Massnahmen verifiziert? | Teilweise: Doppelgang via clang-tidy + Code-Review + Unit-Tests | -| Werden Bugs durch nachgelagerte Reviews / Tests erkannt? | Ja | +| Question | Answer | +|------------------------------------------------------------------------|--------------| +| Is the tool output verified by other measures? | Partially: redundant via clang-tidy + code review + unit tests | +| Are bugs detected by downstream reviews / tests? | Yes | -=> **TD = TD2** (Mittlere Detection-Wahrscheinlichkeit) +⇒ **TD = TD2** (medium detection probability) ### 2.4 Tool Confidence Level (TCL) -Mit TI2 + TD2 ergibt sich laut ISO 26262-8 Tabelle 4: **TCL2**. +With TI2 + TD2 we obtain per ISO 26262-8 Table 4: **TCL2**. -### 2.5 Qualification Method +### 2.5 Qualification method -Fuer TCL2 + ASIL-D ist eine **Tool-Qualifikation** notwendig (Tabelle 5). -Anwendbare Methoden: +For TCL2 + ASIL-D, a **tool qualification** is required (Table 5). Applicable methods: -- Increased confidence from use (§11.4.7) — fuer Cppcheck verfuegbar +- Increased confidence from use (§11.4.7) — available for Cppcheck - Evaluation of the tool development process (§11.4.8) - Validation of the software tool (§11.4.9) -In diesem Projekt: **Increased Confidence from Use**. +In this project: **Increased Confidence from Use**. -## 3. Increased Confidence from Use — Evidenz +## 3. Increased Confidence from Use — evidence -### 3.1 Reifegrad / Verbreitung +### 3.1 Maturity / adoption -| Kriterium | Bewertung | -|----------------------------------------|----------------------------------------| -| Tool-Alter | > 15 Jahre Entwicklung | -| Aktive Community | > 100 Contributors auf GitHub | -| Releases pro Jahr | ~6 Stable Releases | -| Bekannte Anwender im Automotive-Sektor | Documented users incl. mehrere OEMs | -| Bug-Tracker | Oeffentlich (GitHub Issues) | -| Test-Suite | Eigene Self-Test-Suite, > 5000 Tests | +| Criterion | Assessment | +|----------------------------------------|------------------------------------------| +| Tool age | > 15 years of development | +| Active community | > 100 contributors on GitHub | +| Releases per year | ~6 stable releases | +| Known automotive users | Documented users including several OEMs | +| Bug tracker | Public (GitHub Issues) | +| Test suite | Own self-test suite, > 5000 tests | -### 3.2 Frueheren Einsatz im Projekt-Kontext +### 3.2 Prior use in project context -Cppcheck wird seit 2023 in slohmaier-Projekten fuer Static-Analysis-Builds -eingesetzt (Anekdotisch: ControlNav, BrailleKit). Keine bekannten Faelle, in -denen Cppcheck eine echte Sicherheitsverletzung uebersehen hat, die durch -Code-Review nicht doch noch gefunden wurde. +Cppcheck has been used since 2023 in slohmaier projects for static-analysis builds (anecdotally: ControlNav, BrailleKit). No known cases where Cppcheck missed a real safety violation that wasn't subsequently caught by code review. -### 3.3 Validation-Tests im Projekt +### 3.3 Validation tests in project -Pro Build werden folgende Validierungs-Checks gegen Cppcheck durchgefuehrt: +Each build performs the following validation checks against Cppcheck: -| Test | Erwartetes Verhalten | Ergebnis | +| Test | Expected behaviour | Result | |--------------------------------------------|----------------------------------|-----------| -| Eingebauter Test-Case `tests/validation_cppcheck.c` mit bewusst injiziertem Bug | Cppcheck erkennt | OK | -| Cppcheck-Output ist deterministisch | Wiederholte Laeufe == identisch | OK | -| MISRA-Regeln werden gegen Referenz-Set geprueft | Erkennung min. 95% required-Regeln | OK | +| Built-in test case `tests/validation_cppcheck.c` with intentionally injected bug | Cppcheck detects it | OK | +| Cppcheck output is deterministic | Repeated runs == identical | OK | +| MISRA rules checked against reference set | Detection ≥ 95% required rules | OK | -## 4. Bekannte Einschraenkungen +## 4. Known limitations -| Einschraenkung | Mitigation | -|------------------------------------------|------------------------------------------| -| MISRA-Addon implementiert nicht alle 175 Regeln vollstaendig | Manuelle Review-Checklisten fuer fehlende Regeln | -| Geringere Erkennungsrate bei Heap-Bugs | Keine Heap-Nutzung im Projekt (MISRA 21.3) | -| False Positives bei komplexen Pointer-Aliasen | Deviation-Records pro Fall | +| Limitation | Mitigation | +|------------------------------------------|---------------------------------------------| +| MISRA addon does not implement all 175 rules completely | Manual review checklists for missing rules | +| Lower detection rate for heap bugs | No heap usage in this project (MISRA 21.3) | +| False positives on complex pointer aliasing | Per-instance deviation records | -## 5. Qualification-Verdict +## 5. Qualification verdict -Cppcheck mit MISRA-Addon ist **qualifiziert** fuer den Einsatz in demo-epb mit -TCL2 ASIL-D, basierend auf "Increased Confidence from Use". +Cppcheck with the MISRA addon is **qualified** for use in demo-epb at TCL2 ASIL-D, based on "Increased Confidence from Use". -Diese Qualifikation gilt fuer die Version 2.7+ auf Linux (CI) und Version -2.20.0 auf macOS/Windows (Entwickler-Workstations). Bei Tool-Update muss die -Validierung wiederholt werden (Regression-Suite). +This qualification applies to version 2.7+ on Linux (CI) and version 2.20.0 on macOS/Windows (developer workstations). On tool update the validation must be repeated (regression suite). -## 6. Geltungsbereich +## 6. Scope -Diese Tool-Qualifikation gilt **nur** fuer: -- Projekt: demo-epb -- ASIL: bis D -- Verwendung: statische Analyse + MISRA-Check (CI + lokal) -- Tool-Versionen: 2.7+ Linux / 2.20.0 macOS+Windows +This tool qualification applies **only** to: +- Project: demo-epb +- ASIL: up to D +- Use: static analysis + MISRA check (CI + local) +- Tool versions: 2.7+ Linux / 2.20.0 macOS+Windows -## 7. Aenderungshistorie +## 7. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|-------------------------|----------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/safety-md/Verification-Report.md b/docs/safety-md/Verification-Report.md index e3da92b..3be4728 100644 --- a/docs/safety-md/Verification-Report.md +++ b/docs/safety-md/Verification-Report.md @@ -1,132 +1,127 @@ --- doc-id: SLM-EPB-VER-001 version: 1.0 -status: Freigegeben -datum: 2026-05-12 +status: Released +date: 2026-05-12 --- -# Verifikations-Bericht (V-Modell rechte Seite) +# Verification Report (V-model right side) -| Feld | Wert | -|--------------|----------------------------------------| -| Projekt | demo-epb | -| Dokument-ID | SLM-EPB-VER-001 | -| Datum | 2026-05-12 | -| Version | 1.0 | -| Norm | ISO 26262 Part 6 §9 + §10 | +| Field | Value | +|---------------|----------------------------------------| +| Project | demo-epb | +| Document ID | SLM-EPB-VER-001 | +| Date | 2026-05-12 | +| Version | 1.0 | +| Standard | ISO 26262 Part 6 §9 + §10 | --- -## 1. Zweck +## 1. Purpose -Zusammenfassender Verifikations-Nachweis fuer die EPB-Software v1.0. Belegt, -dass die Implementierung die spezifizierten Anforderungen erfuellt -(V-Modell rechte Seite, Test- und Verifikationsphase). +Consolidated verification evidence for EPB software v1.0. Confirms that the implementation satisfies the specified requirements (V-model right side, test and verification phase). -## 2. Verifikations-Methoden +## 2. Verification methods -| Methode | Verwendung | -|-------------------------------|--------------------------------------------------| -| Statische Code-Analyse | Cppcheck, clang-tidy, GCC -Wall -Wextra -Werror | -| MISRA-C:2012 Compliance-Check | Cppcheck mit MISRA-Addon | -| Unit-Tests | 41 Tests, alle gruen | -| Coverage-Messung | gcov + lcov (Statement / Branch / MCDC-aequivalent) | -| Code-Reviews | Pull-Request-Reviews mit Approval-Pflicht | -| Traceability-Verifikation | `tools/traceability.py check` bidirektional | -| Architektur-Review | Technical Review mit 2 Approvern | +| Method | Use | +|---------------------------------|--------------------------------------------------| +| Static code analysis | Cppcheck, clang-tidy, GCC -Wall -Wextra -Werror | +| MISRA C:2012 compliance check | Cppcheck with MISRA addon | +| Unit tests | 46 tests, all green | +| Coverage measurement | gcov + lcov (statement / branch / MC/DC-equivalent) | +| Code reviews | Pull-request reviews with approval requirement | +| Traceability verification | `tools/traceability.py check` bidirectional | +| Architecture review | Technical review with 2 approvers | -## 3. Test-Ergebnisse +## 3. Test results -### 3.1 Unit-Tests (gesamt) +### 3.1 Unit tests (overall) -| Test-Suite | Anzahl Tests | Erfolgreich | Fehlgeschlagen | -|-------------------------------|--------------|-------------|-----------------| -| test_switch_debouncer | 5 | 5 | 0 | -| test_actuator_driver | 11 | 11 | 0 | -| test_apply_controller | 12 | 12 | 0 | -| test_safety_manager | 13 | 13 | 0 | -| **Total** | **41** | **41** | **0** | +| Test suite | Number of tests | Passed | Failed | +|-------------------------------|------------------|--------|--------| +| test_switch_debouncer | 5 | 5 | 0 | +| test_actuator_driver | 11 | 11 | 0 | +| test_apply_controller | 12 | 12 | 0 | +| test_safety_manager | 18 | 18 | 0 | +| **Total** | **46** | **46** | **0** | -### 3.2 Anforderungs-Coverage +### 3.2 Requirement coverage -Jede SWE-Anforderung wird durch mindestens einen Unit-Test referenziert -(via `@reqs` Tag im Test-File): +Every SWE requirement is referenced by at least one unit test (via `@reqs` tag in the test file): -| SWE-Req | Test-Funktion(en) | -|------------------------|------------------------------------------------------------| -| SWE-001 | `test_applied_holds_force` | -| SWE-002 | `test_watchdog_alive_counter` | -| SWE-003 | `test_apply_request_starts_applying` | -| SWE-004 | `test_applying_reaches_applied_on_target_force` | -| SWE-005 | (implizit) `test_release_requires_preconditions` | -| SWE-006 | `test_release_with_preconditions` | -| SWE-007 | `test_auto_apply_armed_on_engine_off` | -| SWE-008 | `test_auto_apply_triggers_after_2s` | -| SWE-009 | `test_hillhold_arms_on_grade_brake_standstill` | -| SWE-010 | `test_hillhold_active_on_brake_release` | -| SWE-013 | `test_isr_samples_current` | -| SWE-014 | `test_overcurrent_cutoff_after_100ms` | -| SWE-015 | `test_clamping_force_estimate` | -| SWE-025 | `test_debounce_apply_takes_5_samples` | +| SWE Req | Test function(s) | +|------------------------|--------------------------------------------------------------| +| SWE-001 | `test_applied_holds_force` | +| SWE-002 | `test_watchdog_alive_counter` | +| SWE-003 | `test_apply_request_starts_applying` | +| SWE-004 | `test_applying_reaches_applied_on_target_force` | +| SWE-005 | (implicit) `test_release_requires_preconditions` | +| SWE-006 | `test_release_with_preconditions` | +| SWE-007 | `test_auto_apply_armed_on_engine_off` | +| SWE-008 | `test_auto_apply_triggers_after_2s` | +| SWE-009 | `test_hillhold_arms_on_grade_brake_standstill` | +| SWE-010 | `test_hillhold_active_on_brake_release` | +| SWE-011 | `test_drive_away_armed_on_intent` | +| SWE-012 | `test_drive_away_blocked_without_safety` | +| SWE-013 | `test_isr_samples_current` | +| SWE-014 | `test_overcurrent_cutoff_after_100ms` | +| SWE-015 | `test_clamping_force_estimate` | +| SWE-025 | `test_debounce_apply_takes_5_samples` | -SWE-Reqs aus den nicht implementierten Komponenten (SWA-004..SWA-010, -Stubs) sind im Verifikations-Scope dieser Demo nicht abgedeckt — die -Komponenten sind als Stubs spezifiziert, aber nicht implementiert. Im -Realprojekt waeren auch diese vollstaendig geprueft. +SWE requirements of the not-implemented stub components (SWA-004..SWA-010) are out of scope for this demo verification — the components are specified but not implemented. In a real project they would all be verified. -### 3.3 Coverage-Metriken (Demo-Komponenten) +### 3.3 Coverage metrics (demo components) -| Komponente | Statement | Branch | MC/DC | Ziel ASIL | -|---------------------------|-----------|--------|-------|-----------| -| switch_debouncer (QM) | 100 % | 100 % | n/a | >= 80 % | -| actuator_driver (B) | 95 % | 92 % | n/a | >= 80 % | -| apply_controller (D) | 92 % | 91 % | 84 % | >= 90 % | -| safety_manager (D) | 96 % | 94 % | 87 % | >= 90 % | +| Component | Statement | Branch | MC/DC | ASIL target | +|----------------------------|-----------|--------|-------|--------------| +| switch_debouncer (QM) | 100% | 100% | n/a | ≥ 80% | +| actuator_driver (B) | 95% | 92% | n/a | ≥ 80% | +| apply_controller (D) | 92% | 91% | 84% | ≥ 90% | +| safety_manager (D) | 96% | 94% | 87% | ≥ 90% | -**Status:** Alle ASIL-Ziele erreicht. +**Status:** All ASIL targets met. -### 3.4 Statische Analyse +### 3.4 Static analysis -Cppcheck Run vom 2026-05-12: +Cppcheck run on 2026-05-12: -| Severity | Anzahl | -|------------|--------| -| Error | 0 | -| Warning | 0 | -| Style | 0 | -| Performance| 0 | -| Portability| 0 | +| Severity | Count | +|------------|-------| +| Error | 0 | +| Warning | 0 | +| Style | 0 | +| Performance| 0 | +| Portability| 0 | -### 3.5 MISRA-C:2012 +### 3.5 MISRA C:2012 -Siehe `MISRA-Compliance-Statement.docx`. Zusammenfassung: +See `MISRA-Compliance-Statement.docx`. Summary: -- Mandatory: 100 % Compliant -- Required: 100 % Compliant -- Advisory: 1 Deviation Record (MISRA-REC-001) +- Mandatory: 100% Compliant +- Required: 100% Compliant +- Advisory: 1 deviation record (MISRA-REC-001) -## 4. Reviews durchgefuehrt +## 4. Reviews conducted -| Review-ID | Artefakt | Reviewer | Status | +| Review ID | Artefact | Reviewer | Status | |-----------|------------------------------|----------|------------------------| -| REV-001 | `src/apply_controller.c` | S. Lohmaier (Self) | Approved with comments | -| (weitere) | (im Realprojekt voll) | mind. 2 Approver | -- | +| REV-001 | `src/apply_controller.c` | S. Lohmaier (self) | Approved with comments | +| (further) | (in real project, full) | ≥ 2 approvers | -- | -## 5. Non-Conformities +## 5. Non-conformities -| NC-ID | Beschreibung | Status | +| NC ID | Description | Status | |--------|------------------------------|---------| -| NC-001 | Step-Counter-Ueberlauf-Dok | Closed | +| NC-001 | Step counter overflow doc | Closed | -## 6. Verifications-Verdict +## 6. Verification verdict -demo-epb v1.0 erfuellt die in SWE-Plan, QA-Plan und Test-Plan spezifizierten -Verifikations-Kriterien. +demo-epb v1.0 satisfies the verification criteria specified in the SWE Plan, QA Plan, and Test Plan. -**Empfehlung:** Freigabe fuer Release v1.0. +**Recommendation:** Approve release v1.0. -## 7. Aenderungshistorie +## 7. Revision history -| Version | Datum | Aenderung | Autor | -|---------|-------------|---------------------|-------------| -| 1.0 | 2026-05-12 | Erstfreigabe | S. Lohmaier | +| Version | Date | Change | Author | +|---------|-------------|---------------------|------------| +| 1.0 | 2026-05-12 | First release | S. Lohmaier| diff --git a/docs/safety/FMEDA.docx b/docs/safety/FMEDA.docx index c5622bb83b43f0fdf696e84fc891edd8f4c89447..b28444b20205d83e7602c2096c6f618e527a9604 100644 GIT binary patch delta 6296 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�E#agk(8R&hQl4P<%~Oe9X`}uxwHB;ka}O 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 delta 6595 zcmZ8m1yoee+g^~A78Vg{q`N^0X^@caUY72XlBGkMrKDj&dg%@Um+q964nab?BtP}{ zoqx?abLM?!-sin@X6~Km+;`&FP^Q*VaMhF^p^*Skv9JJ+;x)KaD5#F&b*m`&DEN-z z6-L#wl#Ew|0KhXC^cIyKA_&&~*lKVBUPsn~{q{d}Y=C@tJvDrS5UHU+MQ$4A*z;t_ z{MV)JyZBRcQ196VUQ zQ^4-klCzzIMI_hV`Q1ASWqe~~^m{D+FHeJixVUMN+fh>Ku&O&lu*BnsctZh)=S3$i zeM$l)%7t#y41R>N^SOuGyR&xX>+VF!Q%<*4J8~B{1(?MwsQOI4>7E59-=a|C?Qf54 zn0uJ_RH#xcfE1sMMLK`5JR9uv@|}`U_EmhabdEV)Cc81YSS-}J`_LI>gM5B#-#Mb~ ze}d*CJ?SS&aFrSdncY8ST*JB6qq?5nv>J5L&~3du{0zFHHj#k`|`1SF)1Q+C@_^3jV#q%BS*) zTj(P8t81#ZakKXhrhwudwKsms)O-)=NEfoOc1-yqHAyr(2yW43JYnHwy^kTo`;ov5 zr|X;rDz{#%&j$z6`_(v)$lu&z<)7WDE0&W@y#-1Z&QkjOJPwL?yok13c_3H1gKzOC zQSYbG-hhV!qOimC2}H1D2;F);G0vijX}Gb99vy(soJ`{2Iqmf{h0g;({BA>PiWo}xEo#z z$N0voi(`%(^RThGmt=6H|fH4u4733{zcZ=5mGOTaj_qRMJy?;Ag zYK7Mr)~ZJ!HR=@J&dj#=Y?p1-CnNT!N_JehID}w6g`!{yt&Gs)7l798`hB?vvNdEm z!8kv>@k{8qQ;?r|0Y|m)>Jn{)84X77Dl9C@ImME48T0)(eA4Mz;5EoYNoyO7!_@sG z_ViLBh5&fRAC0vEo04hv_11eYB=ZvY+`MuTm&nyeSZk5^k=DIm$>+c~8FaDa5Z{Gc z1&GANSzAw%KDc7m-W}xlGHBU`!@i<3)dnO%99YazS=^lsl?>gZre>zX|Ee!$T$uJF zI`J5Pt*d2UzP_ly2kNT8jZPIKf^255A*Ywa7!4L|8;SX)h9n;!OR?0-aaL_a0{r6| zSu#0pRbeA>ASs);MKls)FEoo!3Hl!V5a1Q|^Pa?anDZ?Yd3flOXpsr2oii4=?Ah#T z3S#_J$6tXl-5|sM?BQ}p!B|XgqIpfV0N+i%G0`u}+y454+l%Nzj|#S4ah}Q2*r*Bh zeL3fCd!bg$r&cvIT8v6|f<>Gt7y<|vD~iVvCBRLSt8kAmm|rpHl#lD)jtC~jg>0q} zThvB|$SIEc=L;d&nj^6UrJS${xAZ^c%_OP)kS;t^N-U?FA?fqXMJCgiLZ94a78cF)G$!#^&ZmZUo4#~wy_xxmMC z^pFto_4T1>`>%b>3oS_V@VL%NfdR1^sH!$!B699%SzGkN#@G39^&5H2y4lgnYyC|! zBk6`33PJg`i{q6nsPH%Q+z3FI3k^sZ5|!i3yl@bD;PdQg>1+koNXT zakRQn^R|pszhcFZV*AEq9|FjVPraR>Za6?w3_sG!^!9u=khT6@8YZk9^DN#muwRt3d1@c7 zo_)1F3o?rh^^CujE6yeqQtzAI^}5c$IL7wK@7W#_^!^xqF<4$S!>>UbC4OmXx4Z1( zT5==rM^FMzbimKhV+YA`9U|+-9$-(V>)NKsl@QL2W}sEtnHqice9DW{VX}IhIYxLX zC5I^2lyJO5zRy^M-Q(lHu*h_)#eN2MvVCqlc@Li)f@@ECUMA6Fh%dcQ&NDUPEMj~G z`s5UTxD1#5q{O4F_YxC_dX+QnSx1E~Hat zRIXC%yD4VxugzSQCQciC16=;$ik1T0O*jYZ9okSdy(1$sp8r(t!=(U6&eJLP>|9X! zFcZf%ZCFsc{DF-Dgr_5NR?nQ#Y?>4tqY}%=$8_2qtL;1>F8Ne#SZm6F{m?s9LF8*x zn-iinXFpa(T|>d8-r(Xzq&2S`r;DQ72!c06VAa^nuqo;GQQ`9}GfmYl@RyLMXR%pI z$IL_NKaoJ!rd1TUggfn5^ll9ephB%mb(jw?UHjuCtw2x{#5r0@*SfeQSea#h=-TQ4 z*;9x^W#F{_Yexn`+EcK1D)=GNw(ri=#4GfR17D)p@QaaInlnxHq;;bQ`4hl#hE z*4ZR4%d6{1#P1!rKu75>o_h?7MSj4bK;Lq!E=<_~_?#YWLh^NuKE4tW@vfrP9NYqk$-0rqXn9t&)WBb#g=dh;o3@e+GSmI;2%mV9 z8)(3Yy}(;mXYE$PSaOhH!GTJ!qZdO_6(>+U0-St7{yJCGS|)*F=v+NCfO3?InQ<+6 z`G}G9VbOwTdUP34kRL8kGvEDdXx+?5fDJ>XLQzf{0>u)=E8!twJMgr6OG65!ntQR_ zF!7BZZ|!ty=2;MP`1tWihUr7F^di$`|JS;q%)IfZXP7r^mkELdUO1m4&h*EJo0tz5 z<~HwYw$)h+X`D|8Nh*zuO=9#c7c#meh$VB|-J)NZ8nedADurHPz^^6iyOYrt(;WF8ccY=cbJ?!1%Of>8 z^qt){@gLkuGr97Vc-2 z)TY4`>w&MFQU#3-42X5Dnu}2;*^fALHWF{$sfz~>Z5wYgE4-n=-bA3YA7uN>83bz=-(hB)Lz zR*NQ9u(-9DpW}V$W7#RNoH+836~{4Ps157Dl1ORsY}w^ASWC0lt_i$As}+uR&Ooj8 z@k0@cF73#$7Z!cRE}?NWv~R(sky0}(z3gqoU~dw3wXpfoBCAen(PI2<#Nv9tx(pa@ zAqMu?eBG6_E9$N*zV~?I!uv&k1EkuOYA~v@oi~1dfhPH*6?U;Q=yAA)c>vGra$ZGX zy7qovy{%?7^TR;KsD%Ru1CIp$@enSEgI(BAYYTjTCF&Cz6(~!qTxZuaz#{=08=g3z z!WyVltkciq}Ne%#wT8Nw>=_kGE&W6{6v&fW3hWs-eS;)>k?a4DnMonJ33yFX}2 zSPTEgkPuJNZY6f~)&*u-t1!%6=zqSM9)pndcX#*n@fxC=m<}ds;8C?L-!v#`{DwY> zu9+ZcW=IQUef|`5V?uh?02$UrNXk*F(BsmBP7c`T%2gtDu`;p)&7K;y5W~AfBJ$I8 z!QNkzm9~s^deee3rq;F);F6yNvVqafR=MV89=EGt>yEqPb>rfXiRN+a(sKC9-!(xv5#FnpEB6hwuiaTBBMk1;X}Cn!nAU;?0;zdf4Wj6IAhAL+X*Ga&@GC)P z2fkP&8Y+(-*IeU6g@He}ZuE@-PVqSC?JEOc%Z^oowGfahp>*R?dgCH%-Dz8!QlqEp z1k(6%_7bg!JDfst1wr)lL6&vze)nox66CDyUfyVUwQJ}#PC^@AZv}-RqG(;BHLwv| zI^&FWUbyGVN7gKm%98etDeR23S~XR>&AF_X(Oy4ho_rNiuK`FOm-hjze7%K?dn=Y*N(g$=;eut&(@SQ1?lN{s>^H2R(E@*I|r6g_EAYEUHUQ zo928DX_b<@Mbq$pMg*-JlF|Q8bdI+ns|;Nzh8(jp#S`25C%RzJzSWkP<+hZ9YPr6x zOcE>Dm_cIsNtMQj8Ke%m*|9eTwn3zeIUO81W}}@2Nq*wTaEVKsL-6i1DQ(5aCoJ-o z700QfNh+`yIuZ8khFwS4b%n2?A#QpA=9{l)P96;Zvjp{!4t$4T@8 zPQ}!Omus{wcCk_a#TaDdYMC5WnCXMMe2YQjC&X;|IVtD4>L@uzT5?`5i~Sk<1XS<5 zGAf%F(v~Eh8y%c=X2@o^@a5IUV?RGKwcRry*2WXQ$q-BEZf=lBj;_32`AlNi&3W$) z(b*XuHghuYfJ1Tm)N3!#)nq8ci9|rha8?JFE#P&;F#T=ban_)ykZ*cvVxZ0Nhh~8z zK{_wZY>|DzN>uA=F!uZLYHqHJq8T>R3hi7U$f;sN!?#-%n2kRN!uP;$EswAFMp_Fs z$r4wuWdGhz{I`4LD!Dsy}xCX)x|VpVEh|DZRupmiqWDSmS5>eF@kH~`+_GS zYduA&=3X^ejZA|q={!i2I}{xQ8v-W`B}e#vB8D_T79b>bd9+7fiQdte2g zfr9-fv!Y3SzCsDDQlo}A^>7o0nlhY-xjvCG(5Iy^aJ4IXqcU42G;GpEcc0kdxcbxn z36|`7-{{`QJ5l>KlLODR+hBsB40M*-tQTgXDMJpVn=s>|cuV9=50AN6yU$)1EI0un zNSyA1Q!DEcGey&w=QB|7MaI>!V~b4bbADVjGnL5-|PQb8rjqmBJJFPtKL$kN*rsFps3u_w`l#{{o-s9 zuAsREPT4xGXI|jD4I0JK(OKyS!LPYqQ|5Y99?;~VfY$d`CT>ywbBQaAuH&U0$WQ=) zLFm0YE2OA$ey%ne&$4ytovp#6t&kU9(3*$Nfr|BBC&6}6YSD4O)fcA(H8{Rj?7F<@ zYgi$Hie==SZ6xgutitH0?E24&KDuThyAG8ygDc&A!xM@O8SP%3fOeQFc?-Nc`6)FV zhgsNwOE`>_bYyP{mkf*1W~?c$)<%6VbuD2(cp%yDmniDD!GqWVSO#m}(BN@i)*;>= zq8G!>fwcJUWbqq*k;P=tEE4T@y?~(C)M?mQmK=JIGrs){D?WE>oIafU7-Pm8l=CDB z&A1ht-2Z_;e%wly))_vt*U!{!^!>>ExIK_8LI~SM2(5Z-#i^b3fVtqT5tMO9H+qddq@ezw7!msAonC>ooyZR!VOuErn6b!V_8 zcPxp8_fx~61eRplMZBo5n)yXEh8gHR3I^V&?M(Cw-^bACg;Gi3=VLjT=(NfwPt4b# zZ;UwF&5^<`xPysc6$Y*10|wLpx`4+gL`Hlq;EHJ%u;mo0uieDb(MR91=I~ zMo7I{uf@1WvK=8d{00pl(^YJN#b-c@ElTi%ntlE@+GX~nqdfNecQFJBpHK2vnv%xm z5UWqZ@x2FzYUMW5&ZyS|Zm7Q>VGIj2QgTY*U5=Kd9N6she^c)CVD}^6EA1jTVUSGH z=S=Cw!CykDB-d)Ah+F$oxHkGzjH$nH@IoG*D9OKM=*2+j`jsu9PzkBS2RAz3?j6|&uUCpe?dh++~n?l}k+kLM@ z#Ev(&`QM%&fqY*{3@?F=n+E6CyD@z|%Tu@}6g`;;n#SKv-}pF-XTF6{nNr<{_6T(# zEvsnC-jUBr6dX(Zdz=4kZw;igw5c(3zmD;W(&oZRs zl$BT^gw3f6*+kJzzC?pB%t_!3##S^AXPry;WNQ}WzF12UNkn(eS}Lr3vh0~WWBZKO z+GM{_p*&?piBXRE6=y*-yT#0hYhuJe&@4fk0fHeK~;wy_IHc@c5`7u8p}jzx>sFx7(kLNnY8qrUgn zGgYA2_wOPJk|j>_;}#Sh_Y9x{_yR7u*`qj#D^n7YTni605z=%zh?(YI+vZmsX=R^k zrfukt_3B1!D_q}@P!+}W!NL+UMufdE8|_w?-GsXcphH}jFRA;yzR>FRv-RApRVI@{ zJjhyrN>-mJT=f;}J?HKw@ZPicf|`JPps|JAm)bE_(KD?HC0loS0V&e!PnCpvi_$d* zi!Sn)+%MUZKIY!r7V8cvMN!_~1IaiwMJe-)Yfccd3cd35lXdb%0i=}KS2v?yHrMQ~ z!Th)WdSjs47M-YAI+B%&DYMsAG!!wWLHbztsbXuV=5LHr-2{=$$zx_g)QO_ci2HW2 zMLU8!Kex8I4zN04&IZzD=rO+nO|VdQumX4pR@#Ln&jeF`3Eu5~;JcTYjXL@A{QCn3 z1_bcmuiU(C>0gZtv6uKOb@oF4dr5%p!1HHB)PVvOhXiWiz)JH+>q3z+^o{@k!2frp z{9XTDJb}pmcBZ4@Bf|tB^hGbo$$KhCPZAr1&??@UMYuS50slm;*W zfZul~|0;nfVwTWK=YJxO{pMI%LHC@g{&N0)#J^{kiS@r6LK`TH%RihqF3(Zp?4Z^z LbQr=8f5QGB(KL7b diff --git a/docs/safety/MISRA-Compliance-Statement.docx b/docs/safety/MISRA-Compliance-Statement.docx index 47a8174b84a0699700d69ed0b7a61d8fffea330d..86d01bd70984ece2fb5a5f2bad347a578496ab0d 100644 GIT binary patch delta 5780 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 I9qs}D17~xZP5=M^ delta 5760 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 diff --git a/docs/safety/Safety-Case.docx b/docs/safety/Safety-Case.docx index cf80929314d3d08af8d47e523f57fe1eded5db50..daa60b143c6565115e48e930e08d47aa55f4bfbd 100644 GIT binary patch delta 6813 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 S{(o=sFju!HXa^3D;QtR_Ts=Sl delta 6935 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 diff --git a/docs/safety/Tool-Qualification-Cppcheck.docx b/docs/safety/Tool-Qualification-Cppcheck.docx index 7886c82524f163e3b7eb4bcc17b304908f8d67b0..5750ecbed0c882cb5c9f680d2ec310e95c342871 100644 GIT binary patch delta 6305 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 diff --git a/docs/safety/Verification-Report.docx b/docs/safety/Verification-Report.docx index 39b236fa9143f434c4016cdac2c749e86c1828ca..8b6acce059a2b5f1650bca4cef2b0211c73c9e9f 100644 GIT binary patch delta 5736 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 delta 5846 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 D!|1(S diff --git a/src/actuator_driver.c b/src/actuator_driver.c index 91887cf..1655739 100644 --- a/src/actuator_driver.c +++ b/src/actuator_driver.c @@ -11,7 +11,7 @@ typedef struct { ActuatorStatus status; - uint16_t over_ms; /* Millisekunden ueber Strom-Limit (zaehlt in 1 kHz ISR) */ + uint16_t over_ms; /* Milliseconds above current limit (counts in 1 kHz ISR) */ } ActuatorCtx; static ActuatorCtx s_ctx[ACTUATOR_COUNT]; @@ -100,7 +100,7 @@ void actuator_isr_1khz(ActuatorId id, uint16_t current_sample_ma) s_ctx[id].status.peak_current_ma = current_sample_ma; } - /* SWE-014: Overcurrent-Cutoff bei > 8 A fuer > 100 ms */ + /* SWE-014: Overcurrent cutoff at > 8 A for > 100 ms */ if (current_sample_ma > ACT_OVERCURRENT_LIMIT_MA) { if (s_ctx[id].over_ms < UINT16_MAX) { ++s_ctx[id].over_ms; @@ -115,7 +115,7 @@ void actuator_isr_1khz(ActuatorId id, uint16_t current_sample_ma) s_ctx[id].over_ms = 0U; } - /* SWE-015: Klemmkraft aus Peak-Strom schaetzen (nur bei Apply). */ + /* SWE-015: Estimate clamping force from peak current (only on apply). */ if (s_ctx[id].status.direction == ACT_DIR_APPLY) { const uint32_t force = ((uint32_t)s_ctx[id].status.peak_current_ma * ACT_FORCE_PER_AMP_N) / 1000U; diff --git a/src/actuator_driver.h b/src/actuator_driver.h index bb7cae9..42a4c05 100644 --- a/src/actuator_driver.h +++ b/src/actuator_driver.h @@ -1,6 +1,6 @@ /** * @file actuator_driver.h - * @brief Low-Level-Ansteuerung der EPB-Aktoren. + * @brief Low-level control of the EPB actuators. * * @arch SWA-003 * @reqs SWE-006 SWE-013 SWE-014 SWE-015 @@ -21,14 +21,14 @@ typedef enum { typedef struct { ActuatorDirection direction; uint8_t pwm_percent; /* 0..100 */ - uint16_t current_ma; /* aktueller Motorstrom */ + uint16_t current_ma; /* current motor current */ uint16_t peak_current_ma; - uint16_t clamping_force_n; /* geschaetzt aus Strom */ + uint16_t clamping_force_n; /* estimated from current */ bool overcurrent; EpbStatus last_error; } ActuatorStatus; -/** Strom-Limit (Spec) und Zeitfenster fuer Cutoff (Spec). */ +/** Current limit (spec) and time window for cutoff (spec). */ #define ACT_OVERCURRENT_LIMIT_MA 8000U #define ACT_OVERCURRENT_WINDOW_MS 100U #define ACT_FORCE_PER_AMP_N 2500U /* lineare Naeherung */ @@ -40,9 +40,9 @@ EpbStatus actuator_stop(ActuatorId id); ActuatorStatus actuator_get_status(ActuatorId id); /** - * @brief ISR-Hook fuer Strom-Sampling. Wird mit 1 kHz aufgerufen. + * @brief ISR hook for current sampling. Called at 1 kHz. * - * Fuer Tests durch Test-Doubles ersetzt. + * Replaced by test doubles for testing. */ void actuator_isr_1khz(ActuatorId id, uint16_t current_sample_ma); diff --git a/src/apply_controller.c b/src/apply_controller.c index 147099d..91ad28c 100644 --- a/src/apply_controller.c +++ b/src/apply_controller.c @@ -5,8 +5,8 @@ * @arch SWA-002 * @reqs SWE-001 SWE-002 SWE-003 SWE-004 * - * ASIL: D. Diese Komponente ist die sicherheitskritische Kernlogik. - * Aenderungen erfordern Technical Review mit 2 Approvals. + * ASIL: D. This is the safety-critical core logic. + * Changes require a technical review with 2 approvals. */ #include @@ -15,9 +15,9 @@ typedef struct { EpbState state; - uint8_t step_in_state; /* 50ms-Ticks im aktuellen State */ + uint8_t step_in_state; /* 50ms ticks in the current state */ EpbStatus last_error; - uint32_t step_count; /* Watchdog-Alive-Counter */ + uint32_t step_count; /* Watchdog alive counter */ } ApplyCtx; static ApplyCtx s_ctx; @@ -30,7 +30,7 @@ static void enter_state(EpbState new_state) static bool release_preconditions_ok(const ApplyInputs* in) { - /* @reqs SWE-005 (Release-Voraussetzungen) — hier konsumiert */ + /* @reqs SWE-005 (Release preconditions) — consumed here */ return in->engine_running && in->brake_pedal_pressed && in->gear_engaged; @@ -68,7 +68,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in) return; } - /* SWE-002: Watchdog-Alive-Counter erhoehen */ + /* SWE-002: Watchdog alive counter erhoehen */ ++s_ctx.step_count; if (s_ctx.step_in_state < UINT8_MAX) { @@ -85,7 +85,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in) break; case EPB_STATE_APPLYING: - /* SWE-004: Klemmkraft-Erreichen pruefen */ + /* SWE-004: Check target clamping force reached */ if (min_force(in) >= APPLY_TARGET_FORCE_N) { (void)actuator_stop(ACTUATOR_LEFT); (void)actuator_stop(ACTUATOR_RIGHT); @@ -99,7 +99,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in) break; case EPB_STATE_APPLIED: - /* SWE-001: Klemmkraft halten — bei Unterschreitung nachregeln */ + /* SWE-001: Hold clamping force — re-apply on drop */ if (min_force(in) < (APPLY_TARGET_FORCE_N - HOLD_TOLERANCE_N)) { (void)actuator_apply(ACTUATOR_LEFT, 60U); (void)actuator_apply(ACTUATOR_RIGHT, 60U); @@ -128,7 +128,7 @@ void apply_ctrl_step_50ms(const ApplyInputs* in) case EPB_STATE_ERROR: default: - /* Auf Reset warten; sicherer Zustand ist Apply, also kein Release */ + /* Wait for reset; safe state is Apply, hence no release */ if (!apply_request_present(in) && !release_request_present(in)) { s_ctx.last_error = EPB_OK; enter_state(EPB_STATE_RELEASED); diff --git a/src/apply_controller.h b/src/apply_controller.h index 3a708a2..0d7f070 100644 --- a/src/apply_controller.h +++ b/src/apply_controller.h @@ -1,6 +1,6 @@ /** * @file apply_controller.h - * @brief Apply/Hold/Release-Steuerung der EPB. + * @brief Apply/Hold/Release control of the EPB. * * @arch SWA-002 * @reqs SWE-001 SWE-002 SWE-003 SWE-004 @@ -23,14 +23,14 @@ typedef struct { uint16_t right_force_n; } ApplyInputs; -#define APPLY_TARGET_FORCE_N 12000U /* Ziel-Klemmkraft je Aktor */ +#define APPLY_TARGET_FORCE_N 12000U /* Target clamping force per actuator */ #define APPLY_TIMEOUT_50MS 30U /* 30 * 50ms = 1500 ms */ -#define HOLD_TOLERANCE_N 1200U /* 10% von Ziel */ +#define HOLD_TOLERANCE_N 1200U /* 10% of target */ EpbStatus apply_ctrl_init(void); /** - * @brief Step-Funktion 50 ms. + * @brief 50 ms step function. * * @reqs SWE-001 SWE-002 SWE-003 SWE-004 */ @@ -38,6 +38,6 @@ void apply_ctrl_step_50ms(const ApplyInputs* in); EpbState apply_ctrl_get_state(void); EpbStatus apply_ctrl_last_error(void); -uint32_t apply_ctrl_get_step_count(void); /* Watchdog-Alive-Counter */ +uint32_t apply_ctrl_get_step_count(void); /* Watchdog alive counter */ #endif /* APPLY_CONTROLLER_H */ diff --git a/src/epb_types.h b/src/epb_types.h index 27a3a4a..93141bf 100644 --- a/src/epb_types.h +++ b/src/epb_types.h @@ -1,6 +1,6 @@ /** * @file epb_types.h - * @brief Gemeinsame Typen fuer die EPB-Software. + * @brief Common types for the EPB software. * * @arch SA-001 */ diff --git a/src/safety_manager.c b/src/safety_manager.c index 0598ecb..70fb6e7 100644 --- a/src/safety_manager.c +++ b/src/safety_manager.c @@ -1,14 +1,14 @@ /** * @file safety_manager.c - * @brief Safety Manager — Hill-Hold, Auto-Apply, Drive-Away-Assist. + * @brief Safety Manager — Hill-Hold, Auto-Apply, Drive-Away Assist. * * @arch SWA-001 * @reqs SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012 * - * ASIL: D. Diese Komponente entscheidet, wann der Apply Controller eine - * Apply- oder Release-Anforderung erhaelt (Hill-Hold-Uebergabe, Auto-Apply - * bei Motor-Aus, Drive-Away-Assist). - * Aenderungen erfordern Technical Review mit 2 Approvals. + * ASIL: D. This component decides, when the Apply Controller receives an + * apply or release request (hill-hold handover, auto-apply on + * engine-off, drive-away assist). + * Changes require a technical review with 2 approvals. */ #include @@ -16,7 +16,7 @@ typedef struct { SafetyState state; - uint16_t ticks_in_state; /* 50ms-Ticks im aktuellen Zustand */ + uint16_t ticks_in_state; /* 50ms ticks in the current state */ bool apply_requested; bool release_requested; } SafetyCtx; @@ -36,7 +36,7 @@ static bool standstill(const SafetyInputs* in) static bool grade_steep(const SafetyInputs* in) { - /* @reqs SWE-009: Hill-Hold ab |grade| > 5% */ + /* @reqs SWE-009: Hill-hold above |grade| > 5% */ float g = in->grade_percent; if (g < 0.0f) { g = -g; @@ -45,7 +45,7 @@ static bool grade_steep(const SafetyInputs* in) } /** - * @reqs SWE-011 (Anfahrabsicht erkennen) + * @reqs SWE-011 (Detect drive-away intent) */ static bool drive_intent(const SafetyInputs* in) { @@ -55,7 +55,7 @@ static bool drive_intent(const SafetyInputs* in) } /** - * @reqs SWE-012 (Sicherheits-Check vor Auto-Release) + * @reqs SWE-012 (Safety check before auto-release) */ static bool drive_away_safety_ok(const SafetyInputs* in) { @@ -87,19 +87,19 @@ void safety_mgr_step_50ms(const SafetyInputs* in) switch (s_ctx.state) { case SAFETY_IDLE: - /* @reqs SWE-009: Hill-Hold-Aktivierung */ + /* @reqs SWE-009: Hill-hold activation */ if (grade_steep(in) && standstill(in) && in->brake_pedal_pressed) { enter(SAFETY_HILL_HOLD_ARMED); break; } - /* @reqs SWE-007: Motor-Aus-Bedingung erkennen */ + /* @reqs SWE-007: Detect engine-off condition */ if (!in->engine_running && standstill(in) && in->current_state != EPB_STATE_APPLIED && in->current_state != EPB_STATE_APPLYING) { enter(SAFETY_AUTO_APPLY_ARMED); break; } - /* @reqs SWE-011 + SWE-012: Drive-Away-Assist */ + /* @reqs SWE-011 + SWE-012: Drive-Away Assist */ if (in->current_state == EPB_STATE_APPLIED && drive_intent(in) && drive_away_safety_ok(in)) { s_ctx.release_requested = true; @@ -108,20 +108,20 @@ void safety_mgr_step_50ms(const SafetyInputs* in) break; case SAFETY_HILL_HOLD_ARMED: - /* @reqs SWE-010: Beim Loslassen des Bremspedals Apply triggern */ + /* @reqs SWE-010: Trigger apply on brake release */ if (!in->brake_pedal_pressed) { s_ctx.apply_requested = true; enter(SAFETY_HILL_HOLD_ACTIVE); break; } - /* Bedingung fuer Hill-Hold nicht mehr erfuellt? */ + /* Hill-hold condition no longer met? */ if (!grade_steep(in) || !standstill(in)) { enter(SAFETY_IDLE); } break; case SAFETY_HILL_HOLD_ACTIVE: - /* Beendet, wenn Fahrzeug rollt oder Bremse appliziert */ + /* Ends when vehicle rolls or brake is applied */ if (in->vehicle_speed_kmh > SAFETY_RELEASE_KMH || in->current_state == EPB_STATE_APPLIED) { enter(SAFETY_IDLE); @@ -131,12 +131,12 @@ void safety_mgr_step_50ms(const SafetyInputs* in) break; case SAFETY_AUTO_APPLY_ARMED: - /* Bedingung muss durchgaengig erfuellt sein */ + /* Condition must remain continuously satisfied */ if (in->engine_running || !standstill(in)) { enter(SAFETY_IDLE); break; } - /* @reqs SWE-008: Auto-Apply nach 2 s (40 Ticks) Verzoegerung */ + /* @reqs SWE-008: Auto-apply after 2 s (40 ticks) delay */ if (s_ctx.ticks_in_state >= SAFETY_AUTO_APPLY_DELAY_50MS) { s_ctx.apply_requested = true; enter(SAFETY_AUTO_APPLY_TRIGGERED); @@ -152,7 +152,7 @@ void safety_mgr_step_50ms(const SafetyInputs* in) break; case SAFETY_DRIVE_AWAY: - /* Beendet, wenn die Bremse geloest wurde oder Vorbedingungen nicht mehr ok. */ + /* Ends when the brake has been released or preconditions are no longer ok. */ if (in->current_state == EPB_STATE_RELEASED || in->current_state == EPB_STATE_RELEASING) { enter(SAFETY_IDLE); diff --git a/src/safety_manager.h b/src/safety_manager.h index f6ea35f..a8b912d 100644 --- a/src/safety_manager.h +++ b/src/safety_manager.h @@ -1,6 +1,6 @@ /** * @file safety_manager.h - * @brief Safety Manager — Hill-Hold, Auto-Apply, Drive-Away-Assist. + * @brief Safety Manager — hill-hold, auto-apply, drive-away assist. * * @arch SWA-001 * @reqs SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012 @@ -38,25 +38,25 @@ typedef struct { bool brake_pedal_pressed; float vehicle_speed_kmh; float grade_percent; - EpbState current_state; /* aus Apply Controller */ - /* Drive-Away-Assist Inputs (SWE-011, SWE-012) */ + EpbState current_state; /* from Apply Controller */ + /* Drive-Away Assist Inputs (SWE-011, SWE-012) */ float gas_pedal_percent; /* 0..100 */ - bool gear_in_drive; /* Vorwaerts oder Rueckwaerts */ - bool door_closed; /* Fahrertuer */ - bool seatbelt_fastened; /* Fahrer-Gurt */ + bool gear_in_drive; /* forward or reverse */ + bool door_closed; /* driver door */ + bool seatbelt_fastened; /* driver seatbelt */ } SafetyInputs; -/* Schwellwerte als Konstanten, damit Tests darauf zugreifen koennen. */ +/* Thresholds as constants, so tests can access them. */ #define SAFETY_AUTO_APPLY_DELAY_50MS 40U /* 40 * 50ms = 2.0 s */ #define SAFETY_STANDSTILL_KMH 0.5f #define SAFETY_RELEASE_KMH 2.0f #define SAFETY_HILLHOLD_GRADE_PCT 5.0f -#define SAFETY_DRIVE_INTENT_GAS_PCT 10.0f /* Gaspedal > 10% = Anfahrabsicht */ +#define SAFETY_DRIVE_INTENT_GAS_PCT 10.0f /* Throttle > 10% = drive-away intent */ EpbStatus safety_mgr_init(void); void safety_mgr_step_50ms(const SafetyInputs* in); bool safety_mgr_apply_requested(void); -bool safety_mgr_release_requested(void); /* Drive-Away-Assist */ +bool safety_mgr_release_requested(void); /* Drive-Away Assist */ SafetyState safety_mgr_get_state(void); #endif /* SAFETY_MANAGER_H */ diff --git a/src/switch_debouncer.h b/src/switch_debouncer.h index 7c84afb..47c6ebd 100644 --- a/src/switch_debouncer.h +++ b/src/switch_debouncer.h @@ -1,6 +1,6 @@ /** * @file switch_debouncer.h - * @brief EPB-Schalter mit Software-Entprellung. + * @brief EPB switch with software debounce. * * @arch SWA-006 * @reqs SWE-025 @@ -12,7 +12,7 @@ #include "epb_types.h" -/** Step-Zyklus 10 ms. Debounce-Schwelle 50 ms (5 stabile Samples). */ +/** Step cycle 10 ms. Debounce threshold 50 ms (5 stable samples). */ #define SWITCH_DEBOUNCE_SAMPLES 5 EpbStatus switch_init(void); diff --git a/tests/unit/test_actuator_driver.c b/tests/unit/test_actuator_driver.c index 250f18f..e627b50 100644 --- a/tests/unit/test_actuator_driver.c +++ b/tests/unit/test_actuator_driver.c @@ -1,6 +1,6 @@ /** * @file test_actuator_driver.c - * @brief Unit-Tests fuer den Actuator-Driver. + * @brief Unit tests for the Actuator Driver. * * @reqs SWE-006 SWE-013 SWE-014 SWE-015 * @arch SWA-003 @@ -12,7 +12,7 @@ TestStats g_test_stats = {0, 0}; static void test_init(void) { - TEST_BEGIN("init -> beide Aktoren STOP, 0 mA"); + TEST_BEGIN("init -> both actuators STOP, 0 mA"); ASSERT_EQ(actuator_init(), EPB_OK); ActuatorStatus l = actuator_get_status(ACTUATOR_LEFT); ActuatorStatus r = actuator_get_status(ACTUATOR_RIGHT); @@ -61,7 +61,7 @@ static void test_release_normal(void) static void test_isr_samples_current(void) { - TEST_BEGIN("ISR-Sample setzt current_ma und peak"); + TEST_BEGIN("ISR sample sets current_ma and peak"); (void)actuator_init(); (void)actuator_apply(ACTUATOR_LEFT, 80); actuator_isr_1khz(ACTUATOR_LEFT, 3000); @@ -73,10 +73,10 @@ static void test_isr_samples_current(void) static void test_overcurrent_cutoff_after_100ms(void) { - TEST_BEGIN("Overcurrent > 8 A fuer 100 ms -> STOP + overcurrent flag"); + TEST_BEGIN("Overcurrent > 8 A for 100 ms -> STOP + overcurrent flag"); (void)actuator_init(); (void)actuator_apply(ACTUATOR_LEFT, 80); - /* 100 Samples (= 100 ms bei 1 kHz) ueber 8 A */ + /* 100 samples (= 100 ms at 1 kHz) above 8 A */ for (int i = 0; i < 100; ++i) { actuator_isr_1khz(ACTUATOR_LEFT, 8500); } @@ -89,7 +89,7 @@ static void test_overcurrent_cutoff_after_100ms(void) static void test_overcurrent_below_window_no_cutoff(void) { - TEST_BEGIN("Overcurrent < 100 ms loest noch nicht aus"); + TEST_BEGIN("Overcurrent < 100 ms does not trip yet"); (void)actuator_init(); (void)actuator_apply(ACTUATOR_LEFT, 80); for (int i = 0; i < 50; ++i) { @@ -103,7 +103,7 @@ static void test_overcurrent_below_window_no_cutoff(void) static void test_overcurrent_blocks_subsequent_apply(void) { - TEST_BEGIN("nach Overcurrent: weiterer apply -> EOVERCURRENT"); + TEST_BEGIN("after overcurrent: subsequent apply -> EOVERCURRENT"); (void)actuator_init(); (void)actuator_apply(ACTUATOR_LEFT, 80); for (int i = 0; i < 120; ++i) { @@ -116,11 +116,11 @@ static void test_overcurrent_blocks_subsequent_apply(void) static void test_clamping_force_estimate(void) { - TEST_BEGIN("Klemmkraft-Schaetzung aus Peak-Strom (SWE-015)"); + TEST_BEGIN("Clamping force estimation from peak current (SWE-015)"); (void)actuator_init(); (void)actuator_apply(ACTUATOR_LEFT, 80); - actuator_isr_1khz(ACTUATOR_LEFT, 4000); /* 4 A Peak */ - actuator_isr_1khz(ACTUATOR_LEFT, 3500); /* danach niedriger */ + actuator_isr_1khz(ACTUATOR_LEFT, 4000); /* 4 A peak */ + actuator_isr_1khz(ACTUATOR_LEFT, 3500); /* then lower */ ActuatorStatus s = actuator_get_status(ACTUATOR_LEFT); /* F = (4000 * 2500) / 1000 = 10000 N */ ASSERT_EQ(s.clamping_force_n, 10000); diff --git a/tests/unit/test_apply_controller.c b/tests/unit/test_apply_controller.c index 1be47eb..93c9313 100644 --- a/tests/unit/test_apply_controller.c +++ b/tests/unit/test_apply_controller.c @@ -1,6 +1,6 @@ /** * @file test_apply_controller.c - * @brief Unit-Tests fuer den Apply-Controller (ASIL-D Kern). + * @brief Unit tests for the Apply Controller (ASIL-D core). * * @reqs SWE-001 SWE-002 SWE-003 SWE-004 SWE-005 * @arch SWA-002 @@ -56,7 +56,7 @@ static void test_null_input(void) static void test_apply_request_starts_applying(void) { - TEST_BEGIN("Apply-Request bei Stillstand -> APPLYING"); + TEST_BEGIN("Apply request at standstill -> APPLYING"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -68,7 +68,7 @@ static void test_apply_request_starts_applying(void) static void test_no_apply_without_standstill(void) { - TEST_BEGIN("Apply-Request ohne Stillstand wird ignoriert"); + TEST_BEGIN("Apply request without standstill is ignored"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -81,7 +81,7 @@ static void test_no_apply_without_standstill(void) static void test_applying_reaches_applied_on_target_force(void) { - TEST_BEGIN("APPLYING -> APPLIED wenn beide Klemmkraefte >= Target"); + TEST_BEGIN("APPLYING -> APPLIED when both clamping forces >= target"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -97,14 +97,14 @@ static void test_applying_reaches_applied_on_target_force(void) static void test_applying_timeout_to_error(void) { - TEST_BEGIN("APPLYING-Timeout (>30 Steps) -> ERROR"); + TEST_BEGIN("APPLYING timeout (>30 steps) -> ERROR"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); in.sw_state = SWITCH_APPLY; apply_ctrl_step_50ms(&in); /* -> APPLYING */ in.sw_state = SWITCH_NEUTRAL; - /* Klemmkraefte bleiben bei 0 -> Timeout nach 30 Steps */ + /* Clamping forces stay at 0 -> timeout after 30 steps */ apply_full_cycle_until_state(&in, EPB_STATE_ERROR, 35); ASSERT_EQ(apply_ctrl_get_state(), EPB_STATE_ERROR); ASSERT_EQ(apply_ctrl_last_error(), EPB_ETIMEOUT); @@ -113,7 +113,7 @@ static void test_applying_timeout_to_error(void) static void test_applied_holds_force(void) { - TEST_BEGIN("APPLIED haelt Klemmkraft (SWE-001)"); + TEST_BEGIN("APPLIED maintains clamping force (SWE-001)"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -124,18 +124,18 @@ static void test_applied_holds_force(void) in.right_force_n = 12000; apply_ctrl_step_50ms(&in); /* -> APPLIED */ - /* Klemmkraft sinkt auf 10000 (unter Toleranz-Schwelle 10800) */ + /* Clamping force drops to 10000 (below tolerance threshold 10800) */ in.left_force_n = 10000; in.right_force_n = 10000; apply_ctrl_step_50ms(&in); - /* Apply-Controller muss nachregeln -> APPLYING */ + /* Apply controller must re-apply -> APPLYING */ ASSERT_EQ(apply_ctrl_get_state(), EPB_STATE_APPLYING); TEST_END(); } static void test_release_requires_preconditions(void) { - TEST_BEGIN("Release ohne Engine wird abgelehnt"); + TEST_BEGIN("Release without engine is rejected"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -155,7 +155,7 @@ static void test_release_requires_preconditions(void) static void test_release_with_preconditions(void) { - TEST_BEGIN("Release mit allen Voraussetzungen -> RELEASING -> RELEASED"); + TEST_BEGIN("Release with all preconditions -> RELEASING -> RELEASED"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -180,7 +180,7 @@ static void test_release_with_preconditions(void) static void test_safety_apply_request(void) { - TEST_BEGIN("Safety-Manager Apply-Request (Hill-Hold/Auto-Apply)"); + TEST_BEGIN("Safety Manager apply request (Hill-Hold/Auto-Apply)"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -193,7 +193,7 @@ static void test_safety_apply_request(void) static void test_watchdog_alive_counter(void) { - TEST_BEGIN("Step-Counter steigt monoton (SWE-002 Watchdog-Alive)"); + TEST_BEGIN("Step counter increases monotonically (SWE-002 watchdog alive)"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); @@ -207,7 +207,7 @@ static void test_watchdog_alive_counter(void) static void test_error_state_recoverable(void) { - TEST_BEGIN("ERROR -> RELEASED bei neutralem Switch"); + TEST_BEGIN("ERROR -> RELEASED on neutral switch"); (void)actuator_init(); (void)apply_ctrl_init(); ApplyInputs in = make_idle_inputs(); diff --git a/tests/unit/test_safety_manager.c b/tests/unit/test_safety_manager.c index a301403..9b6d6e5 100644 --- a/tests/unit/test_safety_manager.c +++ b/tests/unit/test_safety_manager.c @@ -1,6 +1,6 @@ /** * @file test_safety_manager.c - * @brief Unit-Tests fuer den Safety Manager (ASIL-D). + * @brief Unit tests for the Safety Manager (ASIL-D). * * @reqs SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012 * @arch SWA-001 @@ -38,7 +38,7 @@ static void step_n(SafetyInputs* in, int n) static void test_init(void) { - TEST_BEGIN("init -> IDLE, kein Apply-Request"); + TEST_BEGIN("init -> IDLE, no apply request"); ASSERT_EQ(safety_mgr_init(), EPB_OK); ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE); ASSERT_TRUE(!safety_mgr_apply_requested()); @@ -47,7 +47,7 @@ static void test_init(void) static void test_null_input(void) { - TEST_BEGIN("NULL Input ist no-op"); + TEST_BEGIN("NULL input is a no-op"); (void)safety_mgr_init(); safety_mgr_step_50ms(NULL); ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE); @@ -58,7 +58,7 @@ static void test_null_input(void) static void test_auto_apply_armed_on_engine_off(void) { - TEST_BEGIN("SWE-007: Motor aus + Stillstand -> AUTO_APPLY_ARMED"); + TEST_BEGIN("SWE-007: engine off + standstill -> AUTO_APPLY_ARMED"); (void)safety_mgr_init(); SafetyInputs in = make_driving(); in.engine_running = false; @@ -71,7 +71,7 @@ static void test_auto_apply_armed_on_engine_off(void) static void test_auto_apply_triggers_after_2s(void) { - TEST_BEGIN("SWE-008: nach ca. 2s -> TRIGGERED + Apply-Request"); + TEST_BEGIN("SWE-008: after ~2s -> TRIGGERED + apply request"); (void)safety_mgr_init(); SafetyInputs in = make_driving(); in.engine_running = false; @@ -92,7 +92,7 @@ static void test_auto_apply_triggers_after_2s(void) static void test_auto_apply_aborts_on_engine_on(void) { - TEST_BEGIN("Auto-Apply bricht ab wenn Motor wieder an"); + TEST_BEGIN("Auto-Apply aborts when engine comes back on"); (void)safety_mgr_init(); SafetyInputs in = make_driving(); in.engine_running = false; @@ -107,7 +107,7 @@ static void test_auto_apply_aborts_on_engine_on(void) static void test_auto_apply_returns_idle_when_applied(void) { - TEST_BEGIN("AUTO_APPLY_TRIGGERED -> IDLE wenn Apply Controller fertig"); + TEST_BEGIN("AUTO_APPLY_TRIGGERED -> IDLE when Apply Controller is done"); (void)safety_mgr_init(); SafetyInputs in = make_driving(); in.engine_running = false; @@ -129,7 +129,7 @@ static void test_auto_apply_returns_idle_when_applied(void) static void test_hillhold_arms_on_grade_brake_standstill(void) { - TEST_BEGIN("SWE-009: Grad >5% + Stillstand + Bremse -> HILL_HOLD_ARMED"); + TEST_BEGIN("SWE-009: grade >5% + standstill + brake -> HILL_HOLD_ARMED"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = 8.0f; @@ -141,7 +141,7 @@ static void test_hillhold_arms_on_grade_brake_standstill(void) static void test_hillhold_negative_grade_also_triggers(void) { - TEST_BEGIN("Hill-Hold auch bei negativem Grad (abschuessig)"); + TEST_BEGIN("Hill-hold also on negative grade (downhill)"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = -7.0f; @@ -152,7 +152,7 @@ static void test_hillhold_negative_grade_also_triggers(void) static void test_hillhold_below_threshold_no_arm(void) { - TEST_BEGIN("Grad < 5% -> kein Hill-Hold"); + TEST_BEGIN("Grade < 5% -> no hill-hold"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = 4.0f; @@ -163,7 +163,7 @@ static void test_hillhold_below_threshold_no_arm(void) static void test_hillhold_active_on_brake_release(void) { - TEST_BEGIN("SWE-010: Bremse losgelassen -> HILL_HOLD_ACTIVE + Apply-Request"); + TEST_BEGIN("SWE-010: brake released -> HILL_HOLD_ACTIVE + apply request"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = 8.0f; @@ -177,7 +177,7 @@ static void test_hillhold_active_on_brake_release(void) static void test_hillhold_active_ends_on_vehicle_rolling(void) { - TEST_BEGIN("HILL_HOLD_ACTIVE endet wenn Fahrzeug rollt (v > 2 km/h)"); + TEST_BEGIN("HILL_HOLD_ACTIVE ends when vehicle rolls (v > 2 km/h)"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = 8.0f; @@ -193,7 +193,7 @@ static void test_hillhold_active_ends_on_vehicle_rolling(void) static void test_hillhold_armed_to_idle_if_grade_drops(void) { - TEST_BEGIN("HILL_HOLD_ARMED -> IDLE wenn Grad < 5% wird"); + TEST_BEGIN("HILL_HOLD_ARMED -> IDLE when grade < 5%"); (void)safety_mgr_init(); SafetyInputs in = make_standstill(); in.grade_percent = 8.0f; @@ -226,7 +226,7 @@ static SafetyInputs make_applied_at_rest(void) static void test_drive_away_armed_on_intent(void) { - TEST_BEGIN("SWE-011 + SWE-012: Anfahrabsicht + Safety -> DRIVE_AWAY + Release-Request"); + TEST_BEGIN("SWE-011 + SWE-012: intent + safety -> DRIVE_AWAY + release request"); (void)safety_mgr_init(); SafetyInputs in = make_applied_at_rest(); in.gas_pedal_percent = 25.0f; @@ -239,12 +239,12 @@ static void test_drive_away_armed_on_intent(void) static void test_drive_away_blocked_without_safety(void) { - TEST_BEGIN("SWE-012: Tuer offen blockiert Drive-Away"); + TEST_BEGIN("SWE-012: door open blocks drive-away"); (void)safety_mgr_init(); SafetyInputs in = make_applied_at_rest(); in.gas_pedal_percent = 25.0f; in.gear_in_drive = true; - in.door_closed = false; /* Tuer offen */ + in.door_closed = false; /* door open */ safety_mgr_step_50ms(&in); ASSERT_EQ(safety_mgr_get_state(), SAFETY_IDLE); ASSERT_TRUE(!safety_mgr_release_requested()); @@ -253,7 +253,7 @@ static void test_drive_away_blocked_without_safety(void) static void test_drive_away_blocked_without_seatbelt(void) { - TEST_BEGIN("SWE-012: Gurt nicht angelegt blockiert Drive-Away"); + TEST_BEGIN("SWE-012: seatbelt not fastened blocks drive-away"); (void)safety_mgr_init(); SafetyInputs in = make_applied_at_rest(); in.gas_pedal_percent = 25.0f; @@ -266,7 +266,7 @@ static void test_drive_away_blocked_without_seatbelt(void) static void test_drive_away_blocked_below_gas_threshold(void) { - TEST_BEGIN("SWE-011: Gas < 10% loest kein Drive-Away aus"); + TEST_BEGIN("SWE-011: throttle < 10% does not trigger drive-away"); (void)safety_mgr_init(); SafetyInputs in = make_applied_at_rest(); in.gas_pedal_percent = 5.0f; @@ -278,7 +278,7 @@ static void test_drive_away_blocked_below_gas_threshold(void) static void test_drive_away_ends_when_released(void) { - TEST_BEGIN("DRIVE_AWAY -> IDLE wenn Apply Controller geloest hat"); + TEST_BEGIN("DRIVE_AWAY -> IDLE when Apply Controller has released"); (void)safety_mgr_init(); SafetyInputs in = make_applied_at_rest(); in.gas_pedal_percent = 25.0f; @@ -293,7 +293,7 @@ static void test_drive_away_ends_when_released(void) static void test_already_applied_does_not_arm_auto_apply(void) { - TEST_BEGIN("Bereits Applied: kein Auto-Apply Arming"); + TEST_BEGIN("Already applied: no auto-apply arming"); (void)safety_mgr_init(); SafetyInputs in = make_driving(); in.engine_running = false; diff --git a/tests/unit/test_switch_debouncer.c b/tests/unit/test_switch_debouncer.c index 7c31e2c..55b2a99 100644 --- a/tests/unit/test_switch_debouncer.c +++ b/tests/unit/test_switch_debouncer.c @@ -1,6 +1,6 @@ /** * @file test_switch_debouncer.c - * @brief Unit-Tests fuer den Switch-Debouncer. + * @brief Unit tests for the Switch Debouncer. * * @reqs SWE-025 * @arch SWA-006