Start Here
- Scroll down for the interactive showcase with metrics, code snippets, and process evidence.
- Use Decision Log Summary for a faster executive overview.
ISO 26262 ASIL D zonal vehicle platform with 7 ECUs, 475 requirements, 1,648 unit tests, and ~43,800 LOC of C firmware. Full safety lifecycle from HARA to unit verification.
7
ECU Nodes
4 physical + 3 simulated
475
Requirements
Full safety lifecycle
1,648
Unit Tests
Test-driven development
~43,800
Firmware LOC
Real C firmware
475
Traceability Links
SG to SWR to test
>=99%
SPFM
Exceeds ASIL D target
Portfolio project — firmware tested in SIL (software-in-loop), not yet on physical boards. STM32 is IEC 61508 certified (industrial), not ISO 26262 qualified.
Phase 0
Project Setup & Architecture Docs
Phase 1
Safety Concept (HARA, Safety Goals, FSC)
Phase 2
Safety Analysis (FMEA, DFA, HW Metrics)
Phase 3
Requirements & System Architecture
Phase 4
CAN Protocol & HSI Design
Phase 5
Shared BSW Layer (18 AUTOSAR-like modules)
Phase 6
CVC Firmware (12 SWCs, 254 tests)
Phase 7
FZC Firmware (steering, braking, lidar)
Phase 8
RZC Firmware (motor control, current, battery)
Phase 9
Safety Controller (TMS570 independent monitor)
Phase 10
BCM, ICU, TCU Firmware (simulated ECUs)
Phase 11
POSIX Port + Docker SIL (7 ECUs containerized)
Phase 12
DBC File + Plant Simulator (physics models)
Phase 13
CAN-to-MQTT Gateway + WebSocket Bridge
Phase 14
Live Telemetry Dashboard (/embedded)
Phase 15
SAP QM Mock API (OData endpoints)
Phase 16
Edge ML Anomaly Detection + Fault Injection
Phase 17
VPS Deployment + Live Demo
Phase 18
Physical Hardware Build + HIL Testing
Safety Goals (8) -> FSR (25) -> TSR (51) -> SSR (81) -> SWR (197)
-> HSR (25)
+ System Reqs (56) + Stakeholder Reqs (32) + FMEA (50 failure modes)
= 475 total requirements, 1,648 unit tests, 475 traced end-to-endPattern: Table-driven state machine — 6 states x 11 events
"Every transition is statically defined — no runtime surprises"
static const uint8 transition_table[CVC_STATE_COUNT][CVC_EVT_COUNT] = {
/* CVC_STATE_INIT */
{
CVC_STATE_RUN, /* EVT_SELF_TEST_PASS -> RUN */
CVC_STATE_SAFE_STOP, /* EVT_SELF_TEST_FAIL -> SAFE_STOP */
CVC_STATE_INVALID, /* EVT_PEDAL_FAULT_SINGLE -> (invalid) */
CVC_STATE_INVALID, /* EVT_PEDAL_FAULT_DUAL -> (invalid) */
...
},
/* CVC_STATE_RUN */
{
CVC_STATE_INVALID, /* EVT_SELF_TEST_PASS -> (invalid) */
CVC_STATE_INVALID, /* EVT_SELF_TEST_FAIL -> (invalid) */
CVC_STATE_DEGRADED, /* EVT_PEDAL_FAULT_SINGLE -> DEGRADED */
CVC_STATE_SAFE_STOP, /* EVT_PEDAL_FAULT_DUAL -> SAFE_STOP */
CVC_STATE_LIMP, /* EVT_CAN_TIMEOUT_SINGLE -> LIMP */
CVC_STATE_SAFE_STOP, /* EVT_CAN_TIMEOUT_DUAL -> SAFE_STOP */
CVC_STATE_SAFE_STOP, /* EVT_ESTOP -> SAFE_STOP */
CVC_STATE_SAFE_STOP, /* EVT_SC_KILL -> SAFE_STOP */
...
},
/* ... DEGRADED, LIMP, SAFE_STOP, SHUTDOWN */
};Pattern: Cross-check two independent sensors, debounce before fault
"Both AS5048A sensors must agree within threshold for N consecutive cycles"
/* Plausibility check (only if both sensors read OK) */
if (new_fault == CVC_PEDAL_NO_FAULT) {
delta = Pedal_AbsDiff16(raw1_local, raw2_local);
if (delta >= Pedal_CfgPtr->plausThreshold) {
Pedal_PlausDebounce++;
if (Pedal_PlausDebounce >= Pedal_CfgPtr->plausDebounce) {
new_fault = CVC_PEDAL_PLAUSIBILITY;
}
} else {
Pedal_PlausDebounce = 0u;
}
}Pattern: AUTOSAR E2E Profile P01 — CRC + counter packed into CAN PDU
"16 of 32 CAN messages are E2E-protected — detects corruption, loss, and replay"
Std_ReturnType E2E_Protect(const E2E_ConfigType* Config,
E2E_StateType* State,
uint8* DataPtr, uint16 Length)
{
uint8 crc;
if ((Config == NULL_PTR) || (State == NULL_PTR) || (DataPtr == NULL_PTR))
return E_NOT_OK;
if (Length < E2E_PAYLOAD_OFFSET)
return E_NOT_OK;
/* Increment alive counter (4-bit, wraps 0..15) */
State->Counter = (State->Counter + 1u) & 0x0Fu;
/* Write byte 0: [counter:4 | dataId:4] */
DataPtr[E2E_BYTE_COUNTER_ID] =
(uint8)((State->Counter << 4u) | (Config->DataId & 0x0Fu));
/* Compute CRC over payload (bytes 2..N-1) + DataId */
crc = E2E_ComputePduCrc(DataPtr, Length, Config->DataId);
DataPtr[E2E_BYTE_CRC] = crc;
return E_OK;
}~160 documents — draft (filled), complete content, not yet formally reviewed