Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b58185af7 | |||
| 2167c100e8 | |||
| 39b7182e0b | |||
| ba7a3ebd27 | |||
| c81121c3d5 | |||
| 8451099b90 |
+6
-6
@@ -1,10 +1,10 @@
|
|||||||
# Doorstop-Konfiguration fuer demo-epb
|
# Doorstop configuration for demo-epb
|
||||||
#
|
#
|
||||||
# Bidirektionale Traceability:
|
# Bidirectional traceability:
|
||||||
# SYS-XXX -> SA-XXX (System-Anforderung wird durch System-Arch abgedeckt)
|
# SYS-XXX -> SA-XXX (system requirement covered by system arch)
|
||||||
# SA-XXX -> SWE-XXX (System-Arch verfeinert auf Software-Anforderung)
|
# SA-XXX -> SWE-XXX (system arch refined to software requirement)
|
||||||
# SWE-XXX -> SWA-XXX (Software-Anforderung wird durch Software-Arch abgedeckt)
|
# SWE-XXX -> SWA-XXX (software requirement covered by software arch)
|
||||||
# SWA-XXX -> Code (via @arch Tag im Quellcode)
|
# SWA-XXX -> Code (via @arch tag in source code)
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
digits: 3
|
digits: 3
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -59,7 +61,7 @@ jobs:
|
|||||||
# Landing page in the bundle root
|
# Landing page in the bundle root
|
||||||
cp build/index.html "$BUNDLE/index.html"
|
cp build/index.html "$BUNDLE/index.html"
|
||||||
|
|
||||||
# CI-generierte Artefakte
|
# CI-generated artefacts
|
||||||
cp -r build/coverage-html/* "$BUNDLE/coverage/" 2>/dev/null || true
|
cp -r build/coverage-html/* "$BUNDLE/coverage/" 2>/dev/null || true
|
||||||
cp -r docs/traceability/* "$BUNDLE/traceability/"
|
cp -r docs/traceability/* "$BUNDLE/traceability/"
|
||||||
cp -r docs/diagrams/* "$BUNDLE/diagrams/"
|
cp -r docs/diagrams/* "$BUNDLE/diagrams/"
|
||||||
@@ -69,14 +71,14 @@ jobs:
|
|||||||
cp build/test-report.html "$BUNDLE/reports/" 2>/dev/null || true
|
cp build/test-report.html "$BUNDLE/reports/" 2>/dev/null || true
|
||||||
cp build/test-report.md "$BUNDLE/reports/" 2>/dev/null || true
|
cp build/test-report.md "$BUNDLE/reports/" 2>/dev/null || true
|
||||||
|
|
||||||
# Source-Code zum Anklicken aus dem Bundle (begrenzt auf das wichtigste)
|
# Source code from the bundle (limited to the essentials)
|
||||||
cp -r src/*.c src/*.h "$BUNDLE/src/" 2>/dev/null || true
|
cp -r src/*.c src/*.h "$BUNDLE/src/" 2>/dev/null || true
|
||||||
cp -r src/stubs "$BUNDLE/src/" 2>/dev/null || true
|
cp -r src/stubs "$BUNDLE/src/" 2>/dev/null || true
|
||||||
|
|
||||||
# All Word documents (plans, safety, manuals, audit artefacts)
|
# All Word documents (plans, safety, manuals, audit artefacts)
|
||||||
mkdir -p "$BUNDLE/docs/plaene" "$BUNDLE/docs/safety" "$BUNDLE/docs/manuals" \
|
mkdir -p "$BUNDLE/docs/plans" "$BUNDLE/docs/safety" "$BUNDLE/docs/manuals" \
|
||||||
"$BUNDLE/docs/reviews" "$BUNDLE/docs/non-conformities" "$BUNDLE/misra/records"
|
"$BUNDLE/docs/reviews" "$BUNDLE/docs/non-conformities" "$BUNDLE/misra/records"
|
||||||
cp -r docs/plaene/* "$BUNDLE/docs/plaene/" 2>/dev/null || true
|
cp -r docs/plans/* "$BUNDLE/docs/plans/" 2>/dev/null || true
|
||||||
cp -r docs/safety/* "$BUNDLE/docs/safety/" 2>/dev/null || true
|
cp -r docs/safety/* "$BUNDLE/docs/safety/" 2>/dev/null || true
|
||||||
cp -r docs/manuals/* "$BUNDLE/docs/manuals/" 2>/dev/null || true
|
cp -r docs/manuals/* "$BUNDLE/docs/manuals/" 2>/dev/null || true
|
||||||
cp -r docs/reviews/* "$BUNDLE/docs/reviews/" 2>/dev/null || true
|
cp -r docs/reviews/* "$BUNDLE/docs/reviews/" 2>/dev/null || true
|
||||||
@@ -119,10 +121,10 @@ jobs:
|
|||||||
- \`reports/test-report.html\` — Test summary with requirement mapping
|
- \`reports/test-report.html\` — Test summary with requirement mapping
|
||||||
|
|
||||||
**Documents (Word, curated):**
|
**Documents (Word, curated):**
|
||||||
- \`docs/plaene/\` — PID, PM-/QA-/SWE-/Test-Plan
|
- \`docs/plans/\` — PID, PM-/QA-/SWE-/Test-Plan
|
||||||
- \`docs/safety/\` — HARA, Safety Case, FMEDA, MISRA-Compliance, Verification-Report, Tool-Qualification
|
- \`docs/safety/\` — HARA, Safety Case, FMEDA, MISRA-Compliance, Verification-Report, Tool-Qualification
|
||||||
- \`docs/manuals/\` — User-Manual + Service-Manual
|
- \`docs/manuals/\` — User-Manual + Service-Manual
|
||||||
- \`docs/reviews/\` — Review-Protokoll(e)
|
- \`docs/reviews/\` — Review minutes
|
||||||
- \`docs/non-conformities/\` — Non-conformity entries
|
- \`docs/non-conformities/\` — Non-conformity entries
|
||||||
- \`docs/misra/\` — MISRA Deviation Records
|
- \`docs/misra/\` — MISRA Deviation Records
|
||||||
|
|
||||||
@@ -130,11 +132,11 @@ jobs:
|
|||||||
|
|
||||||
- All 46 unit tests green (Linux runner required)
|
- All 46 unit tests green (Linux runner required)
|
||||||
- Coverage measured with gcov/lcov
|
- Coverage measured with gcov/lcov
|
||||||
- Statische Analyse mit Cppcheck (0 Findings)
|
- Static analysis with Cppcheck (0 findings)
|
||||||
- MISRA C:2012 compliance confirmed (1 Advisory deviation)
|
- MISRA C:2012 compliance confirmed (1 Advisory deviation)
|
||||||
- Traceability verified bidirectionally (50 Items)
|
- Traceability verified bidirectionally (50 items)
|
||||||
|
|
||||||
## Referenzen
|
## References
|
||||||
|
|
||||||
- Methodology: https://gitea.slohmaier.com/slohmaier/dev-process
|
- Methodology: https://gitea.slohmaier.com/slohmaier/dev-process
|
||||||
- Commit: ${{ github.sha }}
|
- Commit: ${{ github.sha }}
|
||||||
@@ -177,7 +179,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
DEPLOY=/var/www/pages/demo-epb
|
DEPLOY=/var/www/pages/demo-epb
|
||||||
if [ ! -d "$DEPLOY" ]; then
|
if [ ! -d "$DEPLOY" ]; then
|
||||||
echo "Mount $DEPLOY nicht da — Runner-Config pruefen. Skip."
|
echo "Mount $DEPLOY missing - check runner config. Skip."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
BUNDLE="release/demo-epb-${TAG}"
|
BUNDLE="release/demo-epb-${TAG}"
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install dependencies (Linux)
|
- name: Install dependencies (Linux)
|
||||||
if: matrix.os == 'ubuntu-latest'
|
if: matrix.os == 'ubuntu-latest'
|
||||||
@@ -58,6 +60,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -164,7 +168,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
mkdir -p "$DEPLOY"/{docs,coverage,traceability,diagrams,api-doc,reports/cppcheck,src,misra/records}
|
mkdir -p "$DEPLOY"/{docs,coverage,traceability,diagrams,api-doc,reports/cppcheck,src,misra/records}
|
||||||
cp build/index.html "$DEPLOY/index.html"
|
cp build/index.html "$DEPLOY/index.html"
|
||||||
cp -r docs/plaene docs/safety docs/manuals docs/reviews docs/non-conformities "$DEPLOY/docs/"
|
cp -r docs/plans docs/safety docs/manuals docs/reviews docs/non-conformities "$DEPLOY/docs/"
|
||||||
cp -r build/coverage-html/. "$DEPLOY/coverage/" 2>/dev/null || true
|
cp -r build/coverage-html/. "$DEPLOY/coverage/" 2>/dev/null || true
|
||||||
cp -r docs/traceability/. "$DEPLOY/traceability/"
|
cp -r docs/traceability/. "$DEPLOY/traceability/"
|
||||||
cp -r docs/diagrams/. "$DEPLOY/diagrams/"
|
cp -r docs/diagrams/. "$DEPLOY/diagrams/"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Minimal Doxygen-Konfiguration fuer demo-epb
|
# Minimal Doxygen configuration for demo-epb
|
||||||
# Generiert HTML-API-Dokumentation aus src/
|
# Generiert HTML-API-Dokumentation aus src/
|
||||||
|
|
||||||
PROJECT_NAME = "demo-epb"
|
PROJECT_NAME = "demo-epb"
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ python3 tools/render_plantuml.py
|
|||||||
## Guided tour (~30 min)
|
## Guided tour (~30 min)
|
||||||
|
|
||||||
### 1. Project planning (Word)
|
### 1. Project planning (Word)
|
||||||
`docs/plaene/`:
|
`docs/plans/`:
|
||||||
- **Project-Manual.docx** — Navigation guide, reading order, roles
|
- **Project-Manual.docx** — Navigation guide, reading order, roles
|
||||||
- **PID.docx** — What is built and why
|
- **PID.docx** — What is built and why
|
||||||
- **SWE-Plan.docx** — Language, standards, branching, reviews, coverage targets
|
- **SWE-Plan.docx** — Language, standards, branching, reviews, coverage targets
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ The following artefacts are under configuration control:
|
|||||||
| Requirements | `reqs/{sys,swe}/*.md` | Git + Doorstop item hash |
|
| Requirements | `reqs/{sys,swe}/*.md` | Git + Doorstop item hash |
|
||||||
| Architecture | `arch/{sys,swe}/*.md` | Git + Doorstop item hash |
|
| Architecture | `arch/{sys,swe}/*.md` | Git + Doorstop item hash |
|
||||||
| Safety Goals | `safety/sg/*.md` | Git |
|
| Safety Goals | `safety/sg/*.md` | Git |
|
||||||
| Plans (Word) | `docs/plaene/*.docx` | Git + document version block |
|
| Plans (Word) | `docs/plans/*.docx` | Git + document version block |
|
||||||
| Safety docs (Word) | `docs/safety/*.docx` | Git |
|
| Safety docs (Word) | `docs/safety/*.docx` | Git |
|
||||||
| Manuals (Word) | `docs/manuals/*.docx` | Git |
|
| Manuals (Word) | `docs/manuals/*.docx` | Git |
|
||||||
| Reviews + NCs | `docs/reviews/`, `docs/non-conformities/` | Git |
|
| Reviews + NCs | `docs/reviews/`, `docs/non-conformities/` | Git |
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ This Project Manual is the entry point to the demo-epb project. It answers:
|
|||||||
|
|
||||||
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.
|
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`.
|
Detail: `docs/plans/PID.docx`.
|
||||||
|
|
||||||
## 3. Reading order for new project members
|
## 3. Reading order for new project members
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ Detail: `docs/plaene/PID.docx`.
|
|||||||
|
|
||||||
```
|
```
|
||||||
demo-epb/
|
demo-epb/
|
||||||
├── docs/plaene/ ← PID, PM Plan, QA Plan, SWE Plan, Test Plan, CM Plan, RM Plan
|
├── docs/plans/ ← 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/safety/ ← HARA, Safety Case, FMEDA, MISRA Compliance, Verification Report, Tool Qualification
|
||||||
├── docs/manuals/ ← User Manual, Service Manual
|
├── docs/manuals/ ← User Manual, Service Manual
|
||||||
├── docs/reviews/ ← Review minutes
|
├── docs/reviews/ ← Review minutes
|
||||||
|
|||||||
+7
-7
@@ -1,13 +1,13 @@
|
|||||||
# Stubs — nicht implementierte Komponenten
|
# Stubs — components not implemented
|
||||||
|
|
||||||
Diese Komponenten sind in der Software-Architektur (`arch/swe/`) vollstaendig
|
These components are fully specified in the software architecture
|
||||||
spezifiziert, aber in dieser Demo nicht ausimplementiert. Sie zeigen nur die
|
(`arch/swe/`) but are not implemented in this demo. Only the header
|
||||||
Header-Schnittstellen.
|
interfaces are shown.
|
||||||
|
|
||||||
Im Real-Projekt wuerden hier vollstaendige `.c`-Implementierungen plus
|
In a real project, full `.c` implementations and unit tests would
|
||||||
Unit-Tests stehen.
|
live here.
|
||||||
|
|
||||||
| Komponente | ASIL | SWA |
|
| Component | ASIL | SWA |
|
||||||
|-------------------------|------|-----------|
|
|-------------------------|------|-----------|
|
||||||
| Safety Manager | D | SWA-001 |
|
| Safety Manager | D | SWA-001 |
|
||||||
| Wheel Speed Plausi | B | SWA-004 |
|
| Wheel Speed Plausi | B | SWA-004 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file diag_manager.h
|
* @file diag_manager.h
|
||||||
* @brief UDS-Diagnose nach ISO 14229.
|
* @brief UDS diagnostics per ISO 14229.
|
||||||
*
|
*
|
||||||
* @arch SWA-008
|
* @arch SWA-008
|
||||||
* @reqs SWE-018 SWE-019
|
* @reqs SWE-018 SWE-019
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file display_manager.h
|
* @file display_manager.h
|
||||||
* @brief LED + CAN-Status-Frame Steuerung.
|
* @brief LED + CAN status frame control.
|
||||||
*
|
*
|
||||||
* @arch SWA-007
|
* @arch SWA-007
|
||||||
* @reqs SWE-020 SWE-021
|
* @reqs SWE-020 SWE-021
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file inclinometer.h
|
* @file inclinometer.h
|
||||||
* @brief Inclinometer-Tiefpass-Filter.
|
* @brief Inclinometer low-pass filter.
|
||||||
*
|
*
|
||||||
* @arch SWA-005
|
* @arch SWA-005
|
||||||
* @reqs SWE-024
|
* @reqs SWE-024
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file logger.h
|
* @file logger.h
|
||||||
* @brief Logger — Ringpuffer + EEPROM-Persistenz.
|
* @brief Logger - ring buffer + EEPROM persistence.
|
||||||
*
|
*
|
||||||
* @arch SWA-010
|
* @arch SWA-010
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file service_mode.h
|
* @file service_mode.h
|
||||||
* @brief Service-Modus fuer Werkstatt (Bremsbelag-Wechsel).
|
* @brief Service mode for workshop (brake-pad change).
|
||||||
*
|
*
|
||||||
* @arch SWA-009
|
* @arch SWA-009
|
||||||
* @reqs SWE-016 SWE-017
|
* @reqs SWE-016 SWE-017
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file wheel_speed_plausi.h
|
* @file wheel_speed_plausi.h
|
||||||
* @brief Wheel-Speed-Plausibilisierung + Stillstands-Erkennung.
|
* @brief Wheel-speed plausibility + standstill detection.
|
||||||
*
|
*
|
||||||
* @arch SWA-004
|
* @arch SWA-004
|
||||||
* @reqs SWE-022 SWE-023
|
* @reqs SWE-022 SWE-023
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ static void test_hillhold_armed_to_idle_if_grade_drops(void)
|
|||||||
TEST_END();
|
TEST_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---- Mutually exclusive: nicht in beiden Modi gleichzeitig ---- */
|
/* ---- Mutually exclusive: never in both modes at once ---- */
|
||||||
|
|
||||||
/* ---- Drive-Away-Assist (SWE-011 + SWE-012) ---- */
|
/* ---- Drive-Away-Assist (SWE-011 + SWE-012) ---- */
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* @file unit_test_framework.h
|
* @file unit_test_framework.h
|
||||||
* @brief Minimaler Test-Runner fuer demo-epb.
|
* @brief Minimal test runner for demo-epb.
|
||||||
*
|
*
|
||||||
* In Produktion wuerde hier CppUTest oder Google Test stehen
|
* In production CppUTest or Google Test would go here
|
||||||
* (siehe docs/SWE-Plan.docx, Abschnitt 7). Fuer die Demo
|
* (see docs/SWE-Plan.docx, section 7). For the demo, the framework
|
||||||
* bleibt das Framework klein, damit es ohne externe Abhaengigkeiten baut.
|
* stays small so it builds without external dependencies.
|
||||||
*/
|
*/
|
||||||
#ifndef UNIT_TEST_FRAMEWORK_H
|
#ifndef UNIT_TEST_FRAMEWORK_H
|
||||||
#define UNIT_TEST_FRAMEWORK_H
|
#define UNIT_TEST_FRAMEWORK_H
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ def main() -> int:
|
|||||||
n_stubs = sum(1 for f in (REPO / "src" / "stubs").glob("*.h"))
|
n_stubs = sum(1 for f in (REPO / "src" / "stubs").glob("*.h"))
|
||||||
|
|
||||||
# Word docs
|
# Word docs
|
||||||
plans = collect_docs("docs/plaene")
|
plans = collect_docs("docs/plans")
|
||||||
safety = collect_docs("docs/safety")
|
safety = collect_docs("docs/safety")
|
||||||
manuals = collect_docs("docs/manuals")
|
manuals = collect_docs("docs/manuals")
|
||||||
reviews = collect_docs("docs/reviews")
|
reviews = collect_docs("docs/reviews")
|
||||||
@@ -228,12 +228,12 @@ footer {{ text-align: center; color: #888; padding: 30px; font-size: 13px; }}
|
|||||||
"Machine-readable format for your own tools")
|
"Machine-readable format for your own tools")
|
||||||
html_body += "</ul></section>"
|
html_body += "</ul></section>"
|
||||||
|
|
||||||
# Diagrams
|
# Diagrams (bundle layout: SVGs are at <bundle>/diagrams/, not docs/diagrams/)
|
||||||
diagrams = sorted((REPO / "docs" / "diagrams").glob("*.svg"))
|
diagrams = sorted((REPO / "docs" / "diagrams").glob("*.svg"))
|
||||||
if diagrams:
|
if diagrams:
|
||||||
html_body += "<section><h2>Architecture Diagrams (PlantUML)</h2><ul>"
|
html_body += "<section><h2>Architecture Diagrams (PlantUML)</h2><ul>"
|
||||||
for d in diagrams:
|
for d in diagrams:
|
||||||
href = os.path.relpath(d, REPO)
|
href = f"diagrams/{d.name}"
|
||||||
html_body += f" <li><a href='{html.escape(href)}'>{html.escape(d.stem)}</a></li>\n"
|
html_body += f" <li><a href='{html.escape(href)}'>{html.escape(d.stem)}</a></li>\n"
|
||||||
html_body += "</ul></section>"
|
html_body += "</ul></section>"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Erzeugt einen Test-Summary-Report aus dem Output unserer Unit-Tests.
|
Generate a test-summary report from the output of our unit tests.
|
||||||
|
|
||||||
Reads the test-output file (build/test-output.txt) and produces:
|
Reads the test-output file (build/test-output.txt) and produces:
|
||||||
- build/test-report.md
|
- build/test-report.md
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Rendert alle @startuml ... @enduml Bloecke aus arch/**/*.md als SVG.
|
Render all @startuml ... @enduml blocks from arch/**/*.md as SVG.
|
||||||
|
|
||||||
Verwendet einen erreichbaren PlantUML-HTTP-Server (Default: www.plantuml.com).
|
Uses a reachable PlantUML HTTP server (default: www.plantuml.com).
|
||||||
In CI kann die Server-URL ueber PLANTUML_SERVER ueberschrieben werden.
|
In CI the server URL can be overridden via PLANTUML_SERVER.
|
||||||
|
|
||||||
Output: docs/diagrams/<file>-<index>.svg
|
Output: docs/diagrams/<file>-<index>.svg
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user