Commit graph

6 commits

Author SHA1 Message Date
jedarden
5d78e08441 fix: correct test expected responses to include newline
The writeJSON function uses json.NewEncoder which adds a newline
character. Changed raw string literals to interpreted strings
so \n becomes an actual newline character.
2026-04-11 10:34:31 -04:00
jedarden
a984576be9 feat: complete fleet status page implementation
- Added dropdown menu for More actions button with options:
  - Re-assign Role
  - View Health History
  - View Event History
  - Remove from Fleet

- Added CSS styles for dropdown menus with proper positioning
  and hover states

- Extended FleetHandler with additional API endpoints:
  - PATCH /api/nodes/{mac}/label - update node label
  - POST /api/nodes/{mac}/locate - send identify command
  - POST /api/nodes/{mac}/role - assign new role
  - DELETE /api/nodes/{mac} - remove from fleet

- Added label validation (max 32 characters)

- Improved test code quality with helper functions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:34:31 -04:00
jedarden
2824affde7 feat: crowd flow visualization implementation
Implements comprehensive crowd flow visualization for the Spaxel
WiFi CSI-based indoor positioning system. The feature tracks movement
patterns over time and renders them as directional flow maps and dwell
hotspot heatmaps.

Key components:
- FlowAccumulator: Subscribes to TrackManager updates (10 Hz) and
  accumulates trajectory data with 0.2m sampling threshold
- SQLite tables: trajectory_segments, dwell_accumulator, detected_corridors
- Flow map computation: Bresenham's line algorithm for grid traversal,
  5-minute cache, time/person filtering
- Dwell heatmap: Stationary detection (< 0.1 m/s), normalized 0-1
- Corridor detection: Circular variance analysis, connected components
- 3D visualization: Animated arrows (flow), heatmap patches (dwell),
  raised platforms (corridors)
- REST API: /api/analytics/flow, /api/analytics/dwell, /api/analytics/corridors
- Dashboard controls: Time/person filters, layer toggles, auto-refresh

Background tasks:
- Daily pruning of trajectory segments older than 90 days
- Weekly corridor detection and recomputation

Load shedding integration:
- Suspends crowd flow accumulation at Level 1 (≥80ms iteration time)
- Respects ShouldAccumulateCrowdFlow() flag from loadshed package

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:54:10 -04:00
jedarden
a97960bf67 fix: resolve analytics API test failures and improve corridor response format
- Fix TestAnalyticsHandler_ErrorHandling to use proper in-memory database
  instead of nil database which caused nil pointer dereference
- Update handleGetCorridors to return corridors wrapped in {corridors: [...]}
  for consistency with frontend expectations from crowdflow.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:34:24 -04:00
jedarden
1266c4c0b1 test: add comprehensive tests for auto-away/disarm and system mode endpoints
Added tests for:
- Auto-away activation when all registered BLE devices absent for 15+ minutes
- Auto-disarm triggering when registered BLE device returns with strong RSSI
- Manual override pausing auto-away detection
- System mode GET/PUT REST API endpoints
- Edge cases: no registered devices, weak BLE signals, unregistered devices

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 07:26:34 -04:00
jedarden
72e155391f feat: implement REST API endpoint for node identify
- POST /api/nodes/{mac}/identify endpoint with {duration_ms: 5000} body
- Forwards identify message as WebSocket JSON to target node
- Returns 404 if node not connected; 200 on success
- Includes table-driven tests for all edge cases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 07:15:20 -04:00