Skip to content

Protokół Control

Protokół Control służy do konfiguracji modułów urządzenia.
Klient wysyła komendy Write na charakterystykę Control, urządzenie odpowiada Indicate.

Typy komend

Komenda Wartość Opis
CONTROL_CMD_SET 1
CONTROL_CMD_GET 2

Format ramek

SET Command (Klient → Urządzenie)

[transaction_id][module_id][SET=1][key][value_0 .. value_n]
Offset Pole Rozmiar Opis
0 transaction_id 1B Identyfikator transakcji (klient wybiera, odpowiedź zwraca ten sam)
1 module_id 1B ID modułu docelowego — patrz Moduły
2 command 1B 1 (SET)
3 key 1B Klucz parametru — patrz Klucze
4+ value 0–239B Wartość do ustawienia (format zależy od klucza)

SET Reply (Urządzenie → Klient)

[transaction_id][module_id][SET=1][key][status]
Offset Pole Rozmiar Opis
0–3 nagłówek 4B Taki sam jak w komendzie
4 status 1B Kod statusu — patrz niżej

GET Command (Klient → Urządzenie)

[transaction_id][module_id][GET=2][key]
Offset Pole Rozmiar Opis
0–3 nagłówek 4B Jak wyżej, command = 2 (GET)

GET Reply (Urządzenie → Klient)

[transaction_id][module_id][GET=2][key][status][value_0 .. value_n]
Offset Pole Rozmiar Opis
0–3 nagłówek 4B Echo z komendy
4 status 1B Kod statusu
5+ value 0–239B Wartość (tylko jeśli status = OK)

Kody statusu

Status Wartość Opis
CONTROL_STATUS_OK 1 Operacja zakończona sukcesem
CONTROL_STATUS_UNKNOWN_ERROR 2 Nieznany błąd
CONTROL_STATUS_NOT_CALIBRATED 3 Moduł nie skalibrowany
CONTROL_STATUS_UNKNOWN_COMMAND 4 Nieznana komenda
CONTROL_STATUS_UNSUPPORTED_KEY 5 Moduł nie obsługuje tego klucza
CONTROL_STATUS_INVALID_VALUE 6 Wartość poza zakresem / niepoprawna
CONTROL_STATUS_BUSY 7 Operacja w toku (np. kalibracja)
CONTROL_STATUS_NOT_READY 8 Moduł nie zainicjalizowany
CONTROL_STATUS_HARDWARE_ERROR 9 Błąd sprzętowy (np. I2C/SPI)

Stałe rozmiarów

Stała Wartość Opis
CONTROL_HEADER_SIZE 4 tid + mod + cmd + key
CONTROL_SET_REPLY_SIZE 5 header + status
CONTROL_GET_REPLY_HEADER 5 header + status (before values)
CONTROL_VALUE_MAX_SIZE 239 244 - 5 (worst-case GET reply)

Przykłady

Włączenie modułu Magnetometer

Komenda SET:

TX: [0x01] [0x06] [0x01] [0x02] [0x01]
      tid    mag    SET   ENABLE  value=1

Odpowiedź:

RX: [0x01] [0x06] [0x01] [0x02] [0x01]
      tid    mag    SET   ENABLE  OK

Odczyt informacji o module Magnetometer

Komenda GET:

TX: [0x02] [0x06] [0x02] [0x01]
      tid    mag    GET   INFO

Odpowiedź:

RX: [0x02] [0x06] [0x02] [0x01] [0x00] [MMC5983MA\0]
      tid    mag    GET   INFO   OK      model_name
    [0x10] [0x04] [0x01,0x00] [0x32,0x00] [0x64,0x00] [0xC8,0x00]
     ODR    4 val   1 Hz        50 Hz       100 Hz       200 Hz
    [0x14] [0x02] [0x32,0x00] [0xC8,0x00]
    FILTER  2 val   50 Hz       200 Hz

KEY_CTRL_INFO — Format odpowiedzi TLV

Komenda GET z kluczem KEY_CTRL_INFO (0x01) zwraca opis modułu oraz listę konfigurowalnych parametrów z dozwolonymi wartościami.

Format wartości w reply

[model_name '\0'] [TLV_0] [TLV_1] ... [TLV_N]

Każdy wpis TLV:

[key_id (1B)] [count (1B)] [value_0 (2B LE)] ... [value_{count-1} (2B LE)]
Pole Rozmiar Opis
model_name N+1 B Null-terminated nazwa sensora/modułu (np. "LSM6DSV32X")
key_id 1 B Klucz konfiguracji (np. 0x10 = KEY_CFG_ODR)
count 1 B Liczba dozwolonych wartości (0 = dowolna wartość)
value_i 2 B (LE) Dozwolona wartość fizyczna (uint16)

Interpretacja przez klienta

  • count > 0 → lista dozwolonych opcji → wyświetl jako dropdown/menu
  • count = 0 → klucz istnieje, wartość dowolna → wyświetl jako input field
  • Brak TLV dla danego klucza → moduł nie obsługuje tego parametru

Moduły i ich parametry

Moduł Model Parametry w INFO
AccGyro (2) LSM6DSV32X ODR (0x10), Acc range (0x11), Gyro range (0x12)
Barometer (3) BMP581 Oversampling (0x13), Filter (0x14)
Battery (4) Battery — (tylko model_name)
GNSS (5) ZED-F9P Update rate (0x80), Dynamic model (0x81)
Magnetometer (6) MMC5983MA ODR (0x10), Filter (0x14)
Selector (7) TMAG5273 Hysteresis (0x80, freeform)
Trigger (8) TMAG5273 Sensitivity (0x80), Mode (0x81)
Quaternion (9) Madgwick — (tylko model_name)
UI (11) UI — (tylko model_name)
Kickback (12) Kickback Timing (0x80, freeform)
Displacement (13) Displacement Soft R (0x81, freeform)

Transaction ID

transaction_id jest wybierany przez klienta i kopiowany do odpowiedzi. Pozwala to dopasować odpowiedź do komendy, gdy wysyłasz wiele komend jednocześnie.