Skip to content
Andrey Voroshkov edited this page Apr 6, 2017 · 39 revisions

Welcome to the Chorus-RF-Laptimer wiki!

Device communication protocol

Each Solo device Receives and Transmits data. Here's how the communication flow is organized from a Solo device standpoint.

Basic concepts:

  1. Each Solo device connected into a Chorus has its ID (order number), which is assigned dynamically upon initialization of the Chorus device from a communicating application. Normally enumeration starts with 0.
  2. Each data chunk is a plain string terminated with "\n" character (ASCII=10) and having a predefined structure.
  3. There are 3 types of data chunks:
  • Requests
  • Responses
  • Pass-through data
  1. Almost each Request produces a Response
  2. Pass-through data is either a request to a different Solo device, or response which needs to pass through current device to reach the Bluetooth dongle and be transmitted to App.

Requests

There are 3 types of requests:

  1. Device enumeration: (3 characters) "N" + <first_ID> + "\n". Example: "N0\n"
  2. Command/Request: (4 characters) "R" + <device_ID> + <command> + "\n". Example: "R1T\n"
  3. Calibration: (11 characters) "C" + <device_ID> + <time_long_HEX_value> + "\n". Example: "C00000010A\n"

In any "R" request: <device_ID> may be set to "*", which means the request is addressed to all devices (broadcast), and each should provide a response. Example: "R*A\n"

Note: for broadcast requests the order of responses from different devices is not defined. Example: "S1R1\nS0R1\nS2R1\n"

Responses

Response structure: "S" + <device_ID> + <response_type> + <data> + "\n" Each response type has its own predefined length depending on size of data to be transmitted.

Correspondence of Requests to Responses:

Description Request Response Description Example (request -> response)
Enumeration ----- ----- ----- -----
Enumerate Devices N N Number of Devices N0\n -> N3\n (3 devices found)
Calibration ----- ----- ----- -----
Set Calibration Value C i Calibration State (half-byte, 1 = Calibrated, 0 = Not Calibrated) C100000006\n -> S1i1\n
Commands ----- ----- ----- -----
Start Race R R Race Status (half-byte; 1 = On, 0 = Off) R*R\n -> S0R1\nS1R1\n...
End Race r R Race Status (half-byte; 1 = On, 0 = Off) R*r\n -> S0R0\nS1R0\n...
Increase Min Lap Time M M Minimal Lap Time (1 byte, in seconds) R0M\n -> S0M0A\n
Decrease Min Lap Time m M Minimal Lap Time (1 byte, in seconds) R1m\n -> S1M0A\n
Next RF Band B B Current Band (half-byte; 0 - 5) R0B\n -> S0B5\n
Previous RF Band b B Current Band (half-byte; 0 - 5) R0b\n -> S0B4\n
Next Channel C C Current Channel (half-byte; 0 - 7) R0C\n -> S0C5\n
Previous Channel c C Current Channel (half-byte; 0 - 7) R0c\n -> S0C4\n
Increase Threshold T T Current Threshold (2 bytes) R0T\n -> S0T010A\n
Decrease Threshold t T Current Threshold (2 bytes) R0t\n -> S0T0109\n
Set/Clear Threshold S T Current Threshold (2 bytes) R0S\n -> S0T0000\n
Enable/Disable Sounds D D Sound State (half-byte; 1 = On, 0 = Off) R1D\n -> S1D0\n
Start Calibration I No Response R*I\n ->
End Calibration i I Calibration Time (4 bytes) R*i\n -> S1I00002710\nS0I00002715\n...
RSSI Monitor On V V RSSI Monitor State (half-byte; 1 = On, 0 = Off) R0V\n -> S0V1\n
RSSI Monitor Off v V RSSI Monitor State (half-byte; 1 = On, 0 = Off) R0v\n -> S0V0\n
Skip/Enable First Lap F F First Lap State (half-byte; 1 = Skip, 0 = Count) R*F\n -> S0F1\nS1F0\n...
--- --- S Current RSSI Value; sent each 100ms when RSSI Monitor is On (2 bytes) -> S0S0111\n
--- --- L Lap Time; last Lap Time is automatically sent in race mode when drone passes the gate; All Lap Times sent as a response to Bulk Device State (see below); Format: (1 byte: lap number + 4 bytes: lap time) -> L010000025C\n
Bulk Device State A CRMTSLDBVF + X All states corresponding to specified letters (see above) plus 'X' meaning the end of state transmission for each device R0A\n -> S0C2\nS0R1\nS0M10\n...S0X1\n
Clone this wiki locally