Add doc/device-signals.md

This commit is contained in:
Ghassan Yusuf 2025-07-23 15:32:41 +03:00
parent e7ab7afb66
commit abb6312c61

390
doc/device-signals.md Normal file
View File

@ -0,0 +1,390 @@
# 📡 Taekwondo Scoring System Device Signals & Communication Protocol
> **Version:** 2.0 (Full Device Coverage)
> **Last Updated:** July 2025
> **Target Developer:** Embedded (ESP32) & Android (.NET) Developers
> **Purpose:** Define **two-way communication** for **all battery-powered devices**: joysticks, hogu, and headgear
---
## 📌 Table of Contents
- [1. Overview](#1-overview)
- [2. Device Types](#2-device-types)
- [3. Communication Model (TCP Full-Duplex)](#3-communication-model-tcp-full-duplex)
- [4. Common Device Signals](#4-common-device-signals)
- [5. Referee Joystick](#5-referee-joystick)
- [6. Hogu (Trunk Protector)](#6-hogu-trunk-protector)
- [7. Headgear](#7-headgear)
- [8. OLED Display (128x64, I2C 0x3C)](#8-oled-display-128x64-i2c-0x3c)
- [9. Telemetry: Battery & Health Monitoring](#9-telemetry-battery--health-monitoring)
- [10. Feedback: Vibration, LED, Buzzer](#10-feedback-vibration-led-buzzer)
- [11. Command & Response Format](#11-command--response-format)
- [12. ESP32 Code Structure (Modular)](#12-esp32-code-structure-modular)
- [13. Android .NET Server Integration](#13-android-net-server-integration)
- [14. Best Practices](#14-best-practices)
---
## 1. Overview
All **battery-powered devices** in the system support **two-way TCP communication**:
- ✅ **Send**: Sensor data, telemetry, events
- ✅ **Receive**: Feedback commands, display updates, calibration
- ✅ **Device Types**:
- **Referee Joysticks** (4 units)
- **Hogu (Trunk Protector)** Red & Blue
- **Headgear** Red & Blue
Each device identifies itself with:
```
DEVICE:NAME=...,TYPE=...,MAC=...
```
---
## 2. Device Types
| Device | Type | Key Features |
|-------|------|-------------|
| **Joystick** | `JOYSTICK` | Button, OLED, vibration, LED, buzzer, battery telemetry |
| **Hogu** | `SENSOR` | Force sensor (FSR), MPU6050 (spinning), OLED, vibration, battery |
| **Headgear** | `SENSOR` | Force sensor, MPU6050, OLED, vibration, battery |
> All use **ESP32-C3**, **LiPo battery**, and **I2C OLED (0x3C)**.
---
## 3. Communication Model (TCP Full-Duplex)
```
[All Devices] ↔ [Android Tablet: TCP Server (Port 5000)]
```
- Devices connect to `192.168.4.1:5000` (hotspot mode)
- First message: `DEVICE:NAME=...,TYPE=...,MAC=...`
- Subsequent messages: JSON `\n`-terminated
- Server can send commands at any time
> Full-duplex: **Send and receive on same connection**.
---
## 4. Common Device Signals
### 4.1 Device Identity (Mandatory First Message)
```
DEVICE:NAME=HOGU_RED,TYPE=SENSOR,MAC=30:85:A9:12:34:56
```
### 4.2 Telemetry (Periodic, Every 60 sec)
```json
{
"type": "telemetry",
"device": "HOGU_RED",
"battery_level": 88,
"battery_voltage": 4.02,
"rssi": -65,
"uptime": 3420,
"timestamp": 1712345679000
}
```
### 4.3 Command Acknowledgment
```json
{"ack": "vibrate", "time": 1712345679100}
```
---
## 5. Referee Joystick
### 📥 Outgoing
- `button` press
- `telemetry`
### 📤 Incoming Commands
- `vibrate` tactile feedback
- `buzz` audible alert
- `led` status indication
- `display` show text
- `ping` liveness check
### Example Button Press
```json
{"type":"button","device":"JOYSTICK_CORNER_1","pressed":true,"time":1712345678905}
```
---
## 6. Hogu (Trunk Protector)
### 📥 Outgoing
#### 6.1 Impact Detection
```json
{
"type": "impact",
"device": "hogu_red",
"force": 850,
"spinning": true,
"time": 1712345678901
}
```
- `force`: 01023 (analog read)
- `spinning`: from MPU6050 (rotation > 180°)
#### 6.2 Telemetry
Same as joystick, includes sensor health.
---
### 📤 Incoming Commands
| Command | Effect |
|--------|--------|
| `vibrate` | Confirm impact registered |
| `led` | Flash green/red for status |
| `display` | Show "HOGU RED", battery, status |
| `calibrate` | Recalibrate force sensor |
| `ping` | Liveness check |
#### Example: Calibrate Command
```json
{"cmd": "calibrate", "mode": "zero"}
```
---
## 7. Headgear
### 📥 Outgoing
#### 7.1 Impact Detection
```json
{
"type": "impact",
"device": "head_blue",
"force": 720,
"spinning": false,
"time": 1712345678903
}
```
> Lower force threshold (safety).
#### 7.2 Telemetry
Same format, sent every 60 sec.
---
### 📤 Incoming Commands
| Command | Effect |
|--------|--------|
| `vibrate` | Confirm head kick detected |
| `led` | Status light (e.g., red = fault) |
| `display` | Show "HEAD BLUE", battery |
| `ping` | Liveness check |
> No `calibrate` — headgear is sealed.
---
## 8. OLED Display (128x64, I2C 0x3C)
All devices have the same OLED for **status and feedback**.
### 8.1 Display Modes
| Device | Normal | Active | Low Battery | Error |
|-------|--------|--------|-------------|-------|
| **Joystick** | `CORNER 1`<br>`READY` | `PRESSED!` | `⚠️ BATT: 20%` | `NO SIGNAL` |
| **Hogu** | `HOGU RED`<br>`OK` | `IMPACT!` | `⚠️ BATT: 15%` | `SENSOR FAULT` |
| **Headgear** | `HEAD BLUE`<br>`ACTIVE` | `HIT DETECTED` | `⚠️ BATT: 10%` | `DISCONNECTED` |
---
### 8.2 Server Command
```json
{
"cmd": "display",
"lines": [
{"text": "HOGU RED", "y": 0},
{"text": "IMPACT!", "y": 30, "color": "green"}
],
"refresh": true
}
```
---
## 9. Telemetry: Battery & Health Monitoring
### 9.1 Battery Measurement (All Devices)
```cpp
float readBatteryVoltage() {
int adc = analogRead(BATTERY_PIN);
float voltage = (adc / 4095.0) * 3.3 * 2.0; // 2:1 divider
return voltage;
}
int getBatteryLevel(float voltage) {
if (voltage >= 4.2) return 100;
if (voltage <= 3.3) return 0;
return (int)((voltage - 3.3) / 0.9 * 100);
}
```
### 9.2 Telemetry Frequency
- Every **60 seconds**
- Or on **significant change** (e.g., battery drop >5%)
---
## 10. Feedback: Vibration, LED, Buzzer
### 10.1 Pin Assignments (Shared)
| Component | GPIO |
|---------|------|
| Vibration Motor | 4 |
| Buzzer | 5 |
| LED (RGB) | 6 (R), 7 (G), 8 (B) |
| OLED (SDA) | 21 |
| OLED (SCL) | 22 |
| FSR (Hogu) | 34 |
| FSR (Head) | 35 |
| MPU6050 (SCL/SDA) | 21, 22 (shared with OLED) |
> Use **I2C multiplexer** if needed.
---
### 10.2 Feedback Examples
#### Vibrate (200ms)
```json
{"cmd": "vibrate", "duration": 200}
```
#### LED: Green Blink (3 times)
```json
{"cmd": "led", "color": "#00FF00", "mode": "blink", "count": 3}
```
#### Buzzer: Short beep
```json
{"cmd": "buzz", "tone": 1000, "duration": 150}
```
---
## 11. Command & Response Format
### 11.1 Outgoing (Device → Server)
```json
{"type":"impact","device":"head_blue","force":720,"spinning":false,"time":1712345678903}
```
```json
{"type":"telemetry","device":"HOGU_RED","battery_level":88,"rssi":-65,"timestamp":1712345679000}
```
### 11.2 Incoming (Server → Device)
```json
{"cmd":"vibrate","duration":200}
{"cmd":"led","color":"#0000FF","mode":"solid"}
{"cmd":"display","lines":[{"text":"IMPACT!","y":30}]}
{"cmd":"ping"}
```
> Device responds to `ping` with:
```json
{"ack":"ping","time":1712345679100}
```
---
## 12. ESP32 Code Structure (Modular)
Use a **modular design** with shared components:
```
/src/
├── main.cpp
├── wifi_manager.cpp
├── tcp_client.cpp
├── oled_display.cpp
├── battery_monitor.cpp
├── sensors/
│ ├── fsr.cpp
│ └── mpu6050.cpp
├── feedback/
│ ├── vibration.cpp
│ ├── buzzer.cpp
│ └── led.cpp
└── device_config.h
```
### Example: `device_config.h`
```cpp
#define DEVICE_NAME "HOGU_RED"
#define DEVICE_TYPE "SENSOR"
#define OLED_ADDR 0x3C
#define BATTERY_PIN 35
#define VIBRO_PIN 4
#define BUZZER_PIN 5
#define LED_PIN 6
```
---
## 13. Android .NET Server Integration
### Send Command to Any Device
```csharp
void SendCommand(string mac, string commandJson)
{
TcpClient client = GetDeviceByMac(mac);
if (client?.Connected == true)
{
var stream = client.GetStream();
var writer = new StreamWriter(stream);
await writer.WriteLineAsync(commandJson);
await writer.FlushAsync();
}
}
```
### Example: Confirm Impact
```csharp
// After auto-scoring
SendCommand("30:85:A9:12:34:56", "{\"cmd\":\"vibrate\",\"duration\":200}");
SendCommand("30:85:A9:12:34:56", "{\"cmd\":\"led\",\"color\":\"#00FF00\",\"mode\":\"blink\",\"count\":2}");
```
### Broadcast to All Sensors
```csharp
foreach (var device in GetAllSensors())
{
SendCommand(device.Mac, "{\"cmd\":\"display\",\"lines\":[{\"text\":\"MATCH START\"}]}");
}
```
---
## 14. Best Practices
| Practice | Why |
|--------|-----|
| Send telemetry every 60 sec | Monitor battery and health |
| Debounce sensor inputs | Prevent false triggers |
| Use I2C for OLED & MPU6050 | Save pins |
| Add `ping` command | Check device liveness |
| Log all commands | Debugging and auditing |
| Low-power mode | Extend battery life |
| Clear OLED on boot | Avoid ghosting |
| Validate MAC before sending | Prevent errors |