Add Dangerous Pi MVP implementation - complete backend and system integration
This commit adds the complete Dangerous Pi web management interface with all MVP features implemented and tested locally. ## New Features ### Backend (Python + FastAPI) - Complete FastAPI backend with async support - 40+ API endpoints (Health, PM3, WiFi, Updates, UPS, BLE, Plugins) - 6 managers: Session, WiFi, Update, UPS, BLE, Plugin - SQLite database with sessions, config, history, crash reports - Server-Sent Events (SSE) for real-time notifications - Mock PM3 worker for development without hardware ### WiFi Manager - Interface detection (USB vs built-in) - Network scanning with signal strength - Mode switching (AP/Client/Dual/Auto/Off) - Network connection with password support - Hidden SSID and saved networks support - Static IP and DHCP configuration - 10 WiFi API endpoints ### Update Manager - GitHub releases API integration - Automatic periodic update checks - Semantic version comparison - Update download with progress tracking - SHA256 checksum verification - Automatic installation with backup and rollback - PM3 client rebuild after updates - 6 Update API endpoints ### UPS Manager - I2C battery monitoring (MAX17040-compatible) - Battery percentage, voltage, current tracking - Power source detection (AC/Battery) - Safe shutdown triggers at configurable thresholds - Event callbacks for battery warnings - SSE and BLE notification integration - 3 UPS API endpoints ### BLE Manager - Bluetooth Low Energy notification support - Auto-detects BLE capability - Multiple notification types (updates, battery, shutdown, etc.) - BLE advertising management - Device connection tracking - 4 BLE API endpoints ### Plugin Framework - Dynamic plugin loading/unloading - Plugin lifecycle management (load, enable, disable, unload) - Hook system for extensibility - JSON-based metadata - Example "Hello World" plugin included - 7 Plugin API endpoints ### Frontend (Remix.js + React) - Cyberpunk-themed responsive UI - Dashboard with system status - PM3 command interface with history - Settings page with WiFi and Update management - Command logs viewer - Theme toggle (Dark/Light/Auto) - Server-side rendering (SSR) - Mobile-first responsive design ### System Integration - Systemd service with security hardening - Automated install/uninstall scripts - Environment configuration template - Hardware access groups (i2c, bluetooth, gpio, dialout) - Pi-gen stage 04 integration for OS image building - Port conflict resolution with ttyd-bash - I2C interface auto-enable for UPS HAT ### Testing - test_backend.py - Backend API tests - test_ups.py - UPS manager tests - test_ble.py - BLE manager tests - test_plugins.py - Plugin manager tests - All tests passing locally ### Documentation - 12 comprehensive documentation files - claude.md - AI development guide - WIFI_MANAGER.md - WiFi management guide - UPDATE_MANAGER.md - Update system guide - PORT_CONFLICT.md - Port conflict resolution guide - MVP_COMPLETE.md - MVP implementation summary - PROJECT_STATUS.md - Project status and roadmap - systemd/README.md - Service management docs - pi-gen integration documentation ## Technical Details - ~5,000+ lines of backend code - 11 Python dependencies (smbus2 added for UPS) - FastAPI with async/await throughout - Type hints and docstrings on all functions - RESTful API design with SSE for notifications - Security hardening (non-root, protected dirs, resource limits) ## Next Steps - Deploy to Raspberry Pi Zero 2 W hardware - Test with real Proxmark3 device - Test UPS HAT integration - Test BLE on Pi hardware - Build custom OS image with pi-gen - Performance optimization for Pi Zero 2 W 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
76
test_ble.py
Normal file
76
test_ble.py
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Test script for BLE manager."""
|
||||
import asyncio
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add backend to path
|
||||
sys.path.insert(0, str(Path(__file__).parent / "app"))
|
||||
|
||||
from backend.managers.ble_manager import get_ble_manager, NotificationType
|
||||
|
||||
|
||||
async def test_ble_manager():
|
||||
"""Test BLE manager functionality."""
|
||||
print("Testing BLE Manager...")
|
||||
print("-" * 50)
|
||||
|
||||
ble_manager = get_ble_manager()
|
||||
|
||||
# Test initialization
|
||||
print("\n1. Testing initialization...")
|
||||
success = await ble_manager.initialize()
|
||||
if success:
|
||||
print("✅ BLE initialized successfully")
|
||||
else:
|
||||
print("⚠️ BLE not available (expected on non-Pi hardware)")
|
||||
|
||||
# Test getting status
|
||||
print("\n2. Testing status retrieval...")
|
||||
status = await ble_manager.get_status()
|
||||
print(f" Enabled: {status['enabled']}")
|
||||
print(f" Available: {status['available']}")
|
||||
print(f" Advertising: {status['advertising']}")
|
||||
print(f" Connected devices: {status['connected_devices']}")
|
||||
print(f" Device name: {status['device_name']}")
|
||||
print(f" Queued notifications: {status['queued_notifications']}")
|
||||
|
||||
# Test advertising (if available)
|
||||
if ble_manager.is_available():
|
||||
print("\n3. Testing advertising...")
|
||||
await ble_manager.start_advertising()
|
||||
print("✅ Advertising started")
|
||||
|
||||
# Wait a moment
|
||||
await asyncio.sleep(1)
|
||||
|
||||
await ble_manager.stop_advertising()
|
||||
print("✅ Advertising stopped")
|
||||
else:
|
||||
print("\n3. Skipping advertising test (BLE not available)")
|
||||
|
||||
# Test sending notifications
|
||||
print("\n4. Testing notifications...")
|
||||
test_notifications = [
|
||||
(NotificationType.UPDATE_AVAILABLE, "Update v1.2.0 available"),
|
||||
(NotificationType.BATTERY_WARNING, "Battery at 20%"),
|
||||
(NotificationType.BATTERY_CRITICAL, "Battery critical: 10%"),
|
||||
]
|
||||
|
||||
for notif_type, message in test_notifications:
|
||||
await ble_manager.send_notification(
|
||||
notif_type,
|
||||
message,
|
||||
{"test": True}
|
||||
)
|
||||
print(f" Sent: {notif_type.value}")
|
||||
|
||||
# Check queued notifications
|
||||
status = await ble_manager.get_status()
|
||||
print(f" Queued notifications: {status['queued_notifications']}")
|
||||
|
||||
print("\n✅ BLE manager test complete!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(test_ble_manager())
|
||||
Reference in New Issue
Block a user