🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.1 KiB
Dangerous Pi - Refactoring Roadmap
Last Updated: 2025-12-30 Overall Status: ✅ 100% Complete - All Sprints Done
This document consolidates all refactoring efforts into a single source of truth.
Executive Summary
| Refactor | Status | Details |
|---|---|---|
| Service Layer Pattern | ✅ Complete | REST + BLE share 100% business logic |
| BLE GATT Handlers | ✅ Complete | 22+ characteristics, all handlers ready |
| Multi-PM3 Device Manager | ✅ Complete | Discovery, enumeration, status tracking |
| Multi-PM3 API Endpoints | ✅ Complete | 6 device management endpoints |
| Multi-PM3 Frontend | ✅ Complete | DeviceSelector component |
| SessionManager Per-Device | ✅ Complete | Per-device sessions working |
| Switch to SWIG Worker | ✅ Complete | SWIG bindings working on Pi |
| BLE/BlueZ Integration | ✅ Complete | bless library, BlueZGATTAdapter |
Completed Work (Reference Only)
1. Service Layer Pattern ✅
Completed: 2025-11-26
All business logic centralized in service layer. Both REST API and BLE GATT use identical code paths.
Files created:
app/backend/services/pm3_service.py- PM3 command executionapp/backend/services/system_service.py- System operationsapp/backend/services/wifi_service.py- WiFi managementapp/backend/services/update_service.py- Software updatesapp/backend/services/container.py- Dependency injection
Test coverage: 115+ tests, 94% coverage
See: docs/archive/REFACTORING_PLAN.md for original design
2. BLE GATT Handlers ✅
Completed: 2025-11-26
All GATT characteristic handlers implemented as thin adapters calling service layer.
Files created:
app/backend/ble/gatt_server.py- 22+ characteristic handlersapp/backend/ble/characteristics.py- UUID definitions
See: docs/archive/BLUETOOTH_REFACTORING_COMPLETE.md for details
3. Multi-PM3 Device Manager ✅
Completed: 2025-11-26
Full device discovery, status tracking, and management.
Files created:
app/backend/managers/pm3_device_manager.py- Device managementapp/frontend/app/components/DeviceSelector.tsx- UI component- Database schema:
devices,sessions.device_id,firmware_flash_logtables
See: docs/archive/MULTI_PM3_REFACTORING_PLAN.md for design decisions
All Sprints Complete
All refactoring work has been completed. The following sections document what was done for reference.
Sprint A: SessionManager Per-Device Support ✅
Completed: Per-device session isolation for multi-PM3 support.
Sprint B: Switch to SWIG Worker ✅
Completed: SWIG bindings for faster PM3 communication.
Sprint C: BLE/BlueZ Integration ✅
Completed: 2025-12-30
Full BLE GATT server operational with BlueZ via the bless library.
Implementation:
- Added
bless>=0.2.5to requirements.txt - Created
app/backend/ble/bluez_adapter.py- BlueZGATTAdapter class usingadd_gatt()dictionary pattern - Fixed UUID format in
characteristics.py(was generating invalid 13-char segments) - Integrated with existing
ble_manager.pyfor seamless startup - All 4 GATT services registered (PM3, WiFi, System, Update)
- Notification sending implemented via bless
- Automatic fallback to basic advertising if bless unavailable
Tested: Successfully started/stopped GATT server on local machine with BlueZ
Service UUIDs:
- PM3:
d4c3b2a1-0000-1000-8000-00805f9b0000 - WiFi:
d4c3b2a1-0000-1000-8000-00805f9b0010 - System:
d4c3b2a1-0000-1000-8000-00805f9b0020 - Update:
d4c3b2a1-0000-1000-8000-00805f9b0030
Files created/modified:
requirements.txt- Added bless dependencyapp/backend/ble/bluez_adapter.py- New BlueZ adapterapp/backend/ble/characteristics.py- Fixed UUID formatapp/backend/ble/__init__.py- Updated exportsapp/backend/managers/ble_manager.py- Integrated GATT adapter
Hardware Testing Checklist
Environment: Raspberry Pi Zero 2 W with PM3 Easy (Iceman firmware)
Basic Validation
- Device discovery:
curl http://localhost:8000/api/pm3/devices - Command execution:
curl -X POST http://localhost:8000/api/pm3/command -d '{"command":"hw version"}' - Session creation with device_id
- Session timeout and auto-release
LED Identification
- Test
hw led --led a --brightness 100on real hardware - Verify LED control works for device identification
- Document any firmware-specific quirks
BLE Testing
Local Testing (completed on dev machine):
- GATT server starts successfully with bless library
- All 4 services registered (PM3, WiFi, System, Update)
- Server stops cleanly
- BlueZ D-Bus integration working
Pi Hardware Testing (2025-12-30):
- bless library installed on Pi (v0.3.0)
- Standalone bless test script runs successfully (30s advertising, no errors)
- GATT services registered in BlueZ (visible via
bluetoothctl show) - BLE manager integrated with dangerous-pi service
- Bluetooth auto-enable configured in
/etc/bluetooth/main.conf - Scan from nearby phone/laptop to verify discovery (confirmed via Ubuntu BT settings)
- Connect via gatttool and browse GATT services - all 4 services discovered
- Read characteristics successfully (PM3 STATUS, WiFi MODE, etc.)
- Write to PM3 COMMAND characteristic successfully
- Receive notification with command result (requires PM3 attached)
- Test with actual PM3 device attached
API Compatibility Fixes (2025-12-30):
- bless 0.3.0 changed callback registration:
on_read→read_request_func,on_write→write_request_func - bless 0.3.0 changed
update_value()from async to sync - Fixed UUID case sensitivity (UUIDs must be lowercase to match our definitions)
- Fixed async deadlock: BLE callbacks cannot block on event loop, so reads return cached values
- Fixed GATT handler to handle multi-device PM3 response format
Known Issues:
- Bluetooth was blocked by rfkill on first boot; fixed by adding
AutoEnable=trueto BlueZ config - Pi Zero 2 W has limited BLE range (~5-10m indoors) - ensure proximity during testing
- Standard
bluetoothctl connecttries classic Bluetooth, not BLE - usegatttoolfor LE connections
Quick Reference: Key Files
Service Layer
app/backend/services/pm3_service.pyapp/backend/services/container.py
Device Management
app/backend/managers/pm3_device_manager.pyapp/backend/managers/session_manager.py
BLE (full GATT server)
app/backend/ble/gatt_server.py- GATT handlersapp/backend/ble/bluez_adapter.py- bless integrationapp/backend/managers/ble_manager.py- startup/lifecycle
API Endpoints
app/backend/api/pm3.py
Database
app/backend/models/database.py
Configuration Decisions
Recorded from user during planning session:
| Decision | Choice | Rationale |
|---|---|---|
| PM3 Worker Type | SWIG Bindings | Faster, direct hardware access |
| Session Model | Per-device | Allow concurrent use of multiple PM3s |
| BLE Priority | High | Mobile app and field use without WiFi |
| PM3 Firmware | Iceman/RRG | Has hw led commands for identification |
Archived Documents
Moved to docs/archive/ - can be deleted when no longer needed:
| Document | Content |
|---|---|
docs/archive/REFACTORING_PLAN.md |
Service layer design |
docs/archive/REFACTORING_SUMMARY.md |
Service layer summary |
docs/archive/BLUETOOTH_REFACTORING_COMPLETE.md |
BLE handlers details |
docs/archive/MULTI_PM3_REFACTORING_PLAN.md |
Multi-PM3 design (86KB) |
docs/archive/MULTI_PM3_PROGRESS.md |
Old progress tracker |
Version History
| Date | Changes |
|---|---|
| 2025-12-30 | Deployed and tested BLE on Pi hardware; bless works, configured auto-enable |
| 2025-12-30 | Fixed UUID format in characteristics.py, tested BLE server locally |
| 2025-12-30 | Sprint C complete: BLE/BlueZ integration with bless library |
| 2025-12-30 | Created unified roadmap, consolidated 5 documents |
| 2025-11-26 | Service layer + BLE handlers completed |
| 2025-11-26 | Multi-PM3 device manager + API completed |