230 lines
14 KiB
Markdown
230 lines
14 KiB
Markdown
# Requirements traceability matrix
|
||||
|
|
|
|||
|
|
Maps every section of `V2X_MicrOBU_Android_App_Requirements_v15.pdf` (37 pages, chapters 0–13) to
|
|||
|
|
its implementation and to the evidence that it works.
|
|||
|
|
|
|||
|
|
**Status as of 2026-08-25**, commit `cc35994`. Test counts refer to `app/src/test/` (41 tests,
|
|||
|
|
0 failures); bench measurements refer to `05-obu-bench-test-2026-08-25.md`.
|
|||
|
|
|
|||
|
|
## How to read this
|
|||
|
|
|
|||
|
|
The project began against the **consider it CiT One OBU** and later added the **ESP32-C5** as a
|
|||
|
|
second hardware path (requirements chapter 13). That transition is the single biggest source of
|
|||
|
|
divergence in this table, and it is deliberate rather than drift: chapter 13 was written to describe
|
|||
|
|
it. Where a requirement was authored assuming the CiT One, the ESP32-C5 path may satisfy it by a
|
|||
|
|
different mechanism, satisfy it only partly, or make it inapplicable.
|
|||
|
|
|
|||
|
|
Status values:
|
|||
|
|
|
|||
|
|
| status | meaning |
|
|||
|
|
|---|---|
|
|||
|
|
| **Done** | implemented and exercised on both hardware paths |
|
|||
|
|
| **Done (CiT One)** | implemented; applies only to the CiT One path by design |
|
|||
|
|
| **Done (ESP32-C5)** | implemented; applies only to the ESP32-C5 path by design |
|
|||
|
|
| **Partial** | implemented in part, with the remainder identified |
|
|||
|
|
| **Backlog** | explicitly deferred in the requirements themselves |
|
|||
|
|
| **Superseded** | the ESP32-C5 transition changed the answer; see the note |
|
|||
|
|
| **Not started** | no implementation |
|
|||
|
|
|
|||
|
|
"Cited" means a source file names the section in a KDoc comment — 23 files do. Absence of a citation
|
|||
|
|
is **not** absence of implementation; several well-covered areas were written before that convention
|
|||
|
|
and are mapped here by inspection.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 0. Project Context & Main Goal
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 0.1 | Technological Innovation Context | n/a | context, not a requirement | — |
|
|||
|
|
| 0.2 | Bicycle Safety Use Case Foundation (C2C-CC) | **Done** | `DenmUseCase.kt` *(cited)*, `UseCaseType.kt` | use cases 1.1/1.2 below |
|
|||
|
|
|
|||
|
|
**Note.** 0.2 is the origin of the project's central architectural rule: the CAM-based use cases
|
|||
|
|
never generate DENM. `DenmUseCase.kt` records this, and it survived the ESP32 transition unchanged.
|
|||
|
|
|
|||
|
|
## 1. Phase 01 — Data Collection
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 1.1 | Test Intersections & Use Cases | **Done** | `UseCaseDetectionEngine.kt`, `UseCaseType.kt` *(both cited)* | IMA-S observed firing on hardware, 2026-08-25 |
|
|||
|
|
| 1.2 | C2C-CC Use Case Mapping & Roadmap | **Done** | `UseCaseType.kt`, `UseCaseDetectionConfig.kt` *(both cited)* | 5 use cases enumerated: IMA-B, IMA-S, RTW-B, LTW-B, SMVA/BCW-B |
|
|||
|
|
|
|||
|
|
## 2. Functional Requirements
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 2.1 | Screens & Features | **Done** | `ui/screens/` — Dashboard, Record, Trips, V2X, Settings | bench screenshots |
|
|||
|
|
| 2.2 | User Interactions | **Done** | `UseCaseAlertPreferences.kt` *(cited)*, Settings screen | per-use-case toggles |
|
|||
|
|
| 2.3 | Backend, Database & Login | **Partial** | `data/db/` (Room: sessions, trips, events, V2X messages) | no login/backend; local-only by design |
|
|||
|
|
|
|||
|
|
**Gap.** 2.3's backend and login have no implementation. Everything is on-device. Worth stating
|
|||
|
|
explicitly in the thesis as a scope boundary rather than leaving it to be discovered.
|
|||
|
|
|
|||
|
|
## 3. Non-Functional Requirements
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 3.1 | Android Version & Target Devices | **Done** | `minSdk 29`, `targetSdk 36` | runs on Pixel 9 Pro |
|
|||
|
|
| 3.2 | Performance & Offline | **Done** | offline by construction on the ESP32-C5 path | 210 MB PSS, 43 threads, no GC pressure attributable to the app |
|
|||
|
|
|
|||
|
|
**ESP32-C5 note.** 3.2's offline requirement is *more* satisfied after the transition: the ESP32-C5
|
|||
|
|
path needs no MQTT broker and no network at all.
|
|||
|
|
|
|||
|
|
## 4. Technical Requirements
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 4.1 | Development Environment | **Done** | Gradle 8.10.2, AGP, Android Studio JBR | builds from CLI |
|
|||
|
|
| 4.2 | Architecture | **Done** | `UseCaseDetectionEngine.kt` *(cited)*; MVVM + Hilt + repositories | pure-domain classes unit-tested without Android |
|
|||
|
|
| 4.3 | Key Libraries | **Done** | Compose, Room, Hilt, osmdroid, usb-serial-for-android, Paho MQTT | — |
|
|||
|
|
| 4.4 | Security Requirements (future) | **Backlog** | — | see note |
|
|||
|
|
|
|||
|
|
**Security note (4.4).** ETSI TS 103 097 message signing is not implemented and is out of scope. The
|
|||
|
|
firmware rejects secured packets (GN `NextHeader=2`) rather than mis-parsing them; 75 such frames
|
|||
|
|
were observed on the bench. The OBU under test runs `ItsGnSecurity = 0`, so this has not blocked
|
|||
|
|
anything. **This is the most likely reviewer question and the answer should be pre-written.**
|
|||
|
|
|
|||
|
|
## 5. Design Requirements
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 5.1–5.4 | Visual language, system bars, UX, wireframes | **Done** | Compose Material 3, edge-to-edge | screenshots |
|
|||
|
|
| 5.5 | Alert Level Model (C2C-CC three-tier) | **Done** | `AlertLevel.kt`, `UseCaseDetectionConfig.kt`, `UseCaseDetectionEngine.kt` *(all cited)* | Info / Awareness / Warning; observed WARNING on hardware |
|
|||
|
|
|
|||
|
|
## 6. Sensor Data Streams (Phase 01)
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 6 | Sensor Data Streams | **Done** | `SensorRepository.kt`, `CamUseCaseRepository.kt` *(cited)* | GNSS, accel, gyro, magnetometer, barometer |
|
|||
|
|
|
|||
|
|
## 7. Recording Session & Data Export
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 7.1 | Recording Mode | **Done** | `TripRecordingService.kt`, `RecordingScreen.kt` | — |
|
|||
|
|
| 7.2 | CSV Export Format | **Done** | `CsvExporter.kt`, `TripExporter.kt` | export includes V2X messages and RSSI |
|
|||
|
|
|
|||
|
|
## 8. Connectivity
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 8.1 | Connection Phase Roadmap | **Superseded** | `ObuHardware.kt`, `TransportType.kt` | chapter 13 replaced the roadmap |
|
|||
|
|
| 8.2 | Transport Methods Detail | **Partial** | `UsbSerialTransport.kt`, `UsbNetworkDetector.kt`, `MqttRepository.kt` | USB-C both paths; **Bluetooth not implemented** (13.9 keeps it open) |
|
|||
|
|
|
|||
|
|
## 9. Phase 01 Key Design Principles
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 9 | Key Design Principles | **Done** | pure-domain `domain/` packages, no Android imports | `EventDetectorTest`, `UseCaseDetectionEngine` unit-testable |
|
|||
|
|
|
|||
|
|
## 10. Phase 02 — OBU Communication (CAM-based use cases)
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 10.1 | USB-C Wired Transport | **Done (CiT One)** | `UsbNetworkDetector.kt` (IP over USB tethering) | superseded on the ESP32-C5 path by USB serial |
|
|||
|
|
| 10.2 | CAM Reception & Use Case Detection | **Done** | `Cam.kt`, `CamUseCaseRepository.kt`, `MqttViewModel.kt`, `MqttTopicViewerScreen.kt` *(all cited)* | 1244 CAMs decoded in 305 s, 0 failures |
|
|||
|
|
| 10.2.1 | Detection Algorithm Detail | **Done** | `UseCaseDetectionEngine.kt`, `UseCaseDetectionConfig.kt` | IMA-S fired with TTC 4.8 s on hardware |
|
|||
|
|
| 10.3 | Test and Verification Procedure | **Done** | `CamParser.kt`, `UseCaseDetectionConfig.kt`, `UseCaseDetectionEngine.kt` *(all cited)* | extended well beyond the original procedure — see chapter 14 below |
|
|||
|
|
| 10.4 | New/Updated UI Elements | **Done** | `MqttTopicViewerScreen.kt` *(cited)* | alert panel, list/topics/map |
|
|||
|
|
| 10.5 | Phase 02 Key Technical Decisions | **Done** | `DenmUseCase.kt` | DENM decoupled from sensor triggers |
|
|||
|
|
|
|||
|
|
**Transition note (10.1).** Phase 02 assumed IP-over-USB tethering to the CiT One. The ESP32-C5 path
|
|||
|
|
uses a custom framed serial protocol over USB CDC instead. Both are "USB-C wired transport", but they
|
|||
|
|
share no code. The requirement is satisfied twice, by different means.
|
|||
|
|
|
|||
|
|
## 11. Phase A — Trip Recording & Cyclist Event Detection
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 11.1 | Orientation-Independent Sensor Strategy | **Done** | `SensorRepository.kt` (magnitude-based) | — |
|
|||
|
|
| 11.2 | Running Standard Deviation Event Detector | **Done** | `EventDetector.kt`, `RunningStats.kt` | **18 unit tests, 0 failures** |
|
|||
|
|
| 11.3 | Trip Recording Architecture | **Done** | `TripRepository.kt`, `TripRecordingService.kt` *(cited)* | — |
|
|||
|
|
| 11.4 | Data Model | **Done** | `data/db/` Room entities *(cited)* | — |
|
|||
|
|
| 11.5 | New UI Elements for Phase A | **Done** | `TripHistoryScreen.kt`, `TripReviewScreen.kt` | — |
|
|||
|
|
| 11.6 | Phase A Success Criteria | **Partial** | — | needs a real ride; see Open Items |
|
|||
|
|
|
|||
|
|
**Correction note (11.2).** Four `EventDetectorTest` cases had been failing since the initial commit.
|
|||
|
|
Investigation (2026-08-25) established the **detector was correct and the tests were wrong**: they
|
|||
|
|
described stimuli the detector cannot physically see, because they ignored the settling time of the
|
|||
|
|
rolling standard-deviation window. Tests corrected, assertions unchanged, detector untouched. This is
|
|||
|
|
worth reporting — it is a finding about test design, not a defect.
|
|||
|
|
|
|||
|
|
## 12. Future Architecture & Open Design Questions
|
|||
|
|
|
|||
|
|
| § | Title | Status | Notes |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 12.1 | Multi-Vehicle Handling & Notification Limits | **Partial** | engine tracks per-station history; no notification cap |
|
|||
|
|
| 12.2 | Intersection Ambiguity: Traffic-Light State | **Partial — advanced** | **SPATEM now decoded** (`SpatemUperCodec.kt`), see below |
|
|||
|
|
| 12.3 | Shared-Road / Bike Lane Awareness Dataset | **Not started** | would need MAPEM lane geometry |
|
|||
|
|
| 12.4 | Geo-Server for Crowdsourced Trajectory Data | **Not started** | related to the 2.3 backend gap |
|
|||
|
|
| 12.5 | Geofencing Around High-Risk Intersections | **Not started** | — |
|
|||
|
|
| 12.6 | Sensor Fusion Roadmap (Kalman Filter) | **Not started** | — |
|
|||
|
|
| 12.7 | EventDetector Evolution | **Not started** | — |
|
|||
|
|
|
|||
|
|
**12.2 is the notable movement.** The requirements listed traffic-light state as future/backlog. It
|
|||
|
|
is now partly delivered: SPATEM is received over the air and decoded to per-signal-group phase and
|
|||
|
|
timing, validated against 79,042 real messages. What remains is the *association* problem — knowing
|
|||
|
|
which signal group applies to the rider's lane — which needs MAPEM geometry (12.3). Worth presenting
|
|||
|
|
as a backlog item advanced ahead of schedule, with the remaining half named precisely.
|
|||
|
|
|
|||
|
|
## 13. Phase 03 — ESP32-C5 Dual-OBU & Phone-Generated CAM
|
|||
|
|
|
|||
|
|
The transition chapter. Cited by **16 source files**, more than any other.
|
|||
|
|
|
|||
|
|
| § | Title | Status | Implementation | Evidence |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| 13.1 | ESP32-C5 as a Second OBU Option | **Done** | `obu-firmware/`, `ObuHardware.kt` | bench campaign T1–T9 |
|
|||
|
|
| 13.2 | Transport: USB-C to ESP32 | **Done** | `SerialFrame.kt`, `serial_link.c` | 2868 frames / 305 s, 0 errors |
|
|||
|
|
| 13.3 | Settings: OBU Hardware Selection | **Done** | `ObuHardwarePreferences.kt`, Settings | both paths selectable |
|
|||
|
|
| 13.4 | DENM Trigger Retained for CiT One Only | **Done (CiT One)** | `MqttTopicViewerScreen.kt` gating | trigger hidden on the ESP32-C5 path |
|
|||
|
|
| 13.5 | Phone-Generated CAM | **Done (ESP32-C5)** | `PhoneCamBuilder.kt`, `CamUperCodec.kt`, `CamTransmitLoop.kt` | **golden-byte test**; 26 own CAMs verified off-air by an independent decoder |
|
|||
|
|
| 13.6 | Adaptive CAM Transmission Rate | **Partial** | `CamTransmitConfig.kt` | fixed 1 Hz pinger; adaptive rate not implemented |
|
|||
|
|
| 13.7 | UI Updates: Map View & Dashboard | **Done** | `V2xLiveMapView.kt`, `DashboardScreen.kt` | screenshots |
|
|||
|
|
| 13.8 | Detection Engine: Unchanged for Reception | **Done** | `UseCaseDetectionEngine.kt` | engine is transport-agnostic; confirmed by inspection — zero SPATEM/MAPEM references |
|
|||
|
|
| 13.9 | Bluetooth Transport (Open Discussion) | **Not started** | — | remains open, as the requirement says |
|
|||
|
|
|
|||
|
|
**13.8 is the load-bearing claim of the transition** and it holds: the same detection engine serves
|
|||
|
|
both hardware paths, fed by `CamUseCaseRepository` from either MQTT or serial. That is what makes the
|
|||
|
|
ESP32-C5 a drop-in second OBU rather than a fork of the application.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Beyond the requirements
|
|||
|
|
|
|||
|
|
Work delivered that chapter 13 does not cover, because it postdates v15 of the document. For a
|
|||
|
|
publication these are contributions rather than scope creep, and they need their own section.
|
|||
|
|
|
|||
|
|
| area | what | evidence |
|
|||
|
|
|---|---|---|
|
|||
|
|
| DENM over-the-air receive | GeoBroadcast unwrapping, `DenmUperCodec` | 1885 DENMs cross-checked, 0 mismatches |
|
|||
|
|
| SPATEM receive | `SpatemUperCodec`, live signal phase UI | 79,042 messages cross-checked, 0 mismatches |
|
|||
|
|
| RSU CAM support | `rsuContainerHighFrequency` decoding | 611 RSU CAMs decoded on the bench |
|
|||
|
|
| Verification methodology | independent ETSI oracle, golden bytes, real captures | three encoding bugs found that self-consistent tests structurally cannot catch |
|
|||
|
|
|
|||
|
|
## Open items
|
|||
|
|
|
|||
|
|
Ranked by what a reviewer is most likely to probe.
|
|||
|
|
|
|||
|
|
1. **11.6 Phase A success criteria** — needs a real ride. The bench proves reception; it cannot
|
|||
|
|
prove the use case behaves correctly with two genuinely moving stations. This is the main
|
|||
|
|
remaining evidence gap for the central claim.
|
|||
|
|
2. **4.4 Security** — no message signing. Pre-write the answer.
|
|||
|
|
3. **2.3 Backend & login** — not implemented; state as a scope boundary.
|
|||
|
|
4. **13.6 Adaptive CAM rate** — fixed 1 Hz.
|
|||
|
|
5. **8.2 / 13.9 Bluetooth** — not implemented; the requirements leave it open.
|
|||
|
|
6. **12.2 remainder** — signal-group-to-lane association needs MAPEM.
|
|||
|
|
|
|||
|
|
## Known limitations carried deliberately
|
|||
|
|
|
|||
|
|
Documented decisions, not oversights. Each has its reasoning recorded in the commit history and in
|
|||
|
|
`05-obu-bench-test-2026-08-25.md`.
|
|||
|
|
|
|||
|
|
- **512-byte serial payload cap.** ~70% of *road* RSU SPATEMs would be dropped. Accepted: the
|
|||
|
|
intersection use case is CAM-driven and needs none of it, and raising the cap would put a
|
|||
|
|
measured, zero-failure chain at risk for an add-on. CAM 26–211 B and DENM 402 B both fit.
|
|||
|
|
- **No MAPEM decoder.** Nothing on air transmits it; it exists only in recorded drive data.
|
|||
|
|
- **Secured messages rejected**, not mis-parsed.
|
|||
|
|
- **No auto-reconnect** after USB re-enumeration; requires a manual Connect.
|
|||
|
|
- **Station IDs rotate** (observed twice within one session), so they cannot identify a physical
|
|||
|
|
unit over time.
|