Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:dev:tailcontrol-command-protocol [2024/10/19 16:21] – [Directly Set Servo Position] darkgrue | en:dev:tailcontrol-command-protocol [2025/11/04 16:46] (current) – darkgrue | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== |
| - | Command list for the Tail Company | + | Command list for the Tail Company |
| All commands are case-sensitive. Trailing whitespace (e.g., `NULL`, `CR`, etc.) are ignored. The space between a command keyword and the parameters is mandatory. | All commands are case-sensitive. Trailing whitespace (e.g., `NULL`, `CR`, etc.) are ignored. The space between a command keyword and the parameters is mandatory. | ||
| - | <WRAP round todo> | + | <WRAP round todo 90%> |
| - | **IMPORTANT NOTICE: | + | **IMPORTANT NOTICE: |
| </ | </ | ||
| + | |||
| ===== Bluetooth Low Energy (BLE) ===== | ===== Bluetooth Low Energy (BLE) ===== | ||
| Line 28: | Line 29: | ||
| * TX Characteristic is '' | * TX Characteristic is '' | ||
| * Battery Voltage is '' | * Battery Voltage is '' | ||
| - | |||
| - | <WRAP round important> | ||
| - | For tail-series v3.6 controller hardware, the battery charging characteristic is unset (charging state is not available). | ||
| - | </ | ||
| - | |||
| The BLE Device Service for the EarGear 2 is '' | The BLE Device Service for the EarGear 2 is '' | ||
| Line 39: | Line 35: | ||
| * Battery Voltage is '' | * Battery Voltage is '' | ||
| + | <WRAP round todo 90%> | ||
| + | TailControl will use a new Service and Characteristics UUIDs going forward, to distinguish it from previous firmwares (and to further enforce the “forklift upgrade” required). | ||
| + | |||
| + | The BLE Device Service for TailControl is '' | ||
| + | * RX Characteristic is '' | ||
| + | * TX Characteristic is '' | ||
| + | * Battery Voltage is '' | ||
| + | </ | ||
| + | |||
| + | <WRAP round important 90%> | ||
| + | For tail-series (MiTail, MiTail Mini, and FlutterWings) v3.6 controller hardware, the battery charging characteristic is unset (charging state is not available). | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== TailControl Device Indicators ===== | ||
| - | ===== TailCoNTROL Device Indicators ===== | ||
| ==== Blue LED ==== | ==== Blue LED ==== | ||
| Line 53: | Line 63: | ||
| - **Blink fast three times** when the button is held for more than 3 seconds (but less than 13), indicates the device is ready to power off when the button is released. | - **Blink fast three times** when the button is held for more than 3 seconds (but less than 13), indicates the device is ready to power off when the button is released. | ||
| - **Blink fast continuously** when the button is held for more than 13 seconds, indicates the device is ready to factory reset when the button is released. | - **Blink fast continuously** when the button is held for more than 13 seconds, indicates the device is ready to factory reset when the button is released. | ||
| + | |||
| ==== Red LED ==== | ==== Red LED ==== | ||
| Line 74: | Line 85: | ||
| **Note:** Unlike the DIGITAiL, MiTail, MiTail Mini, and FlutterWings devices **can** be used while charging. | **Note:** Unlike the DIGITAiL, MiTail, MiTail Mini, and FlutterWings devices **can** be used while charging. | ||
| + | |||
| ==== Green LED ==== | ==== Green LED ==== | ||
| Line 88: | Line 100: | ||
| ==== Automatic Actions ==== | ==== Automatic Actions ==== | ||
| - | TailCoNTROL | + | TailControl |
| Additional automatic actions are described in [[en: | Additional automatic actions are described in [[en: | ||
| - | ===== Tail Moves ===== | + | ===== Move Commands |
| Move commands return ''< | Move commands return ''< | ||
| Line 145: | Line 157: | ||
| ===== EarGear 2-only Commands ===== | ===== EarGear 2-only Commands ===== | ||
| - | | **LISTENMODE** | Starts Listen Mode; [[#Listen Mode|see below]], returns '' | + | | **LISTENMODE** |
| - | | **STOPLISTEN** | Stops Listen Mode; [[#Listen Mode|see below]], returns '' | + | | **STOPLISTEN** |
| - | | **STOPTILT** | Stops Tilt Mode; [[#Tilt Mode|see below]], returns '' | + | | **STOPTILT** |
| - | | **TILTMODE** | Starts Tilt Mode; [[#Tilt Mode|see below]], returns '' | + | | **TILTMODE** |
| + | |||
| + | |||
| + | ===== RGB LED Commands ===== | ||
| + | |||
| + | | **RGBOFF** | **RGB** LEDs **OFF**, returns '' | ||
| + | | **RGBRBO** | **RGB** **R**ain**B**ow pattern, returns '' | ||
| + | | **RGBRB2** | **RGB** **R**ain**B**ow pattern with random sparkly glitter, returns '' | ||
| + | | **RGBCON** | **RGB** **CON**fetti; | ||
| + | | **RGBSIN** | **RGB** **SIN**e; a colored dot sweeping back and forth, with fading trails, returns '' | ||
| + | | **RGBJUG** | **RGB** **JUG**gle; eight colored dots, weaving in and out of sync with each other, returns '' | ||
| + | | **RGBBPM** | **RGB** **BPM**; colored stripes pulsing at a defined Beats-Per-Minute, | ||
| + | | **RGBDMO** | **RGB** **DE**m**O**; | ||
| + | | **RGBTST** | **RGB** **TE**s**T**; | ||
| + | | **SETRGB** | **SET** **RGB** configuration; | ||
| ===== Other Commands ===== | ===== Other Commands ===== | ||
| - | | **AUTOMODE** | **AUTO**nomous **MO**de; [[# | + | | **AUTOMODE** | **AUTO**nomous **MO**de |
| - | | **DSSP** | **D**irectly **S**et **S**ervo **P**osition; [[#Directly Set Servo Position|see below]], returns '' | + | | **DSSP** | **D**irectly **S**et **S**ervo **P**osition |
| | **HWVER** | Returns **H**ard**W**are **VER**sion; | | **HWVER** | Returns **H**ard**W**are **VER**sion; | ||
| | **PING** | Keepalive heartbeat (from application), | | **PING** | Keepalive heartbeat (from application), | ||
| - | | **SETPUSSKEY** | **SET** **P**a**SSKEY**, enable Conference Mode, and restart | + | | **SETPUSSKEY** | **SET** **P**a**SSKEY**; enable Conference Mode, returns '' |
| - | | **SHUTDOWN** | **SHUT DOWN** the unit (will lose the BLE connection), | + | | **SHUTDOWN** | **SHUT DOWN** the unit (will lose the BLE connection), |
| | **STOPAUTO** | **STOP AUTO**nomous Mode, returns '' | | **STOPAUTO** | **STOP AUTO**nomous Mode, returns '' | ||
| | **STOPNPM** | **STOP** **N**o-**P**hone **M**ode and disables it in NVS configuration; | | **STOPNPM** | **STOP** **N**o-**P**hone **M**ode and disables it in NVS configuration; | ||
| - | | **USERMOVE** | [[# | + | | **USERMOVE** | Set user-defined move ([[# |
| - | | **STOPPUSSKEY** | **STOP** **P**a**SSKEY**, disable Conference Mode and restart | + | | **STOPPUSSKEY** | **STOP** **P**a**SSKEY**; disable Conference Mode, returns '' |
| - | | **USERLEDS** | [[# | + | | **USERLEDS** | Set user-defined Glow Tip pattern ([[# |
| - | | **VER** | Returns the firmware **VER**sion number; '' | + | | **VER** | Returns the firmware **VER**sion number; |
| Line 170: | Line 196: | ||
| | **BATT** | **BATT**ery percentage, returns the integer value of estimated battery capacity remaining | | **BATT** | **BATT**ery percentage, returns the integer value of estimated battery capacity remaining | ||
| - | | **FORMATNVS** | **FORMAT** **NVS** (erase all contents of the default NVS partition, including BLE bonds) and reboot | | + | | **READCONF** | **READ** running **CONF**iguration; |
| - | | **OTA** | Starts firmware **O**ver **T**he **A**ir update process (e.g., '' | + | | **WRITECONF** | **WRITE** **CONF**iguration |
| - | | **READCONF** | **READ** running **CONF**iguration; | + | | **SETDISCONNECTEDCOUNT** | **SET** BLE **DISCONNECTED** power off **COUNT**down parameter in NVS and running configuration (in minutes, '' |
| - | | **READNVS** | **READ** **CONF**iguration | + | | **SETHOLDONSTOP** | **SET** servo **HOLD** is maintained when the servos **STOP** (maintains servo PWM when not moving, default for EarGear 2); returns '' |
| - | | **REBOOT** | **REBOOT** after 3 seconds, returns '' | + | | **UNSETHOLDONSTOP** | **UNSET** servo **HOLD** when the servos **STOP** (servo PWM is dropped when not moving, default for tail-based devices); |
| | **SETHOME** | **SET** **HOME** position (0 through 8) for each servo (e.g., '' | | **SETHOME** | **SET** **HOME** position (0 through 8) for each servo (e.g., '' | ||
| - | | **TASKU** | Prints | + | | **SETLISTENMOVES** | **SET** internal **LISTEN** Mode **MOVES** |
| - | | **WRITECONF** | **WRITE** **CONF**iguration | + | | **UNSETLISTENMOVES** | **UNSET** internal **LISTEN** Mode **MOVES** to play on a listen event, only an event notification will be sent and it is the responsibility of the connected application to send commands to react to events; returns '' |
| + | | **SETTILTMOVES** | **SET** internal **LISTEN** Mode **MOVES** to play on a tilt event in addition | ||
| + | | **UNSETTILTMOVES** | **UNSET** internal **LISTEN** Mode **MOVES** to play on a listen event, only an event notification will be sent and it is the responsibility of the connected application to send commands to react to events; returns '' | ||
| + | | **OTA** | Starts firmware **O**ver **T**he **A**ir update process (e.g., '' | ||
| + | | **FORMATNVS** | **FORMAT** **NVS** (erase all contents of the default NVS partition, including BLE bonds), returns '' | ||
| + | | **READNVS** | **READ** **CONF**iguration | ||
| + | | **REBOOT** | **REBOOT**; returns '' | ||
| + | | **TASKU** | Prints to the hardware serial console the minimum amount of remaining stack space that was available to the task since the task started executing (high water mark), returns '' | ||
| ===== Directly Set Servo Position ===== | ===== Directly Set Servo Position ===== | ||
| Line 200: | Line 234: | ||
| * Parameters can be separated by any character that is not a number or a letter (e.g., space, comma, semicolon). However, the letters themselves act as separators, and it is recommended that no additional characters are used, as the serial buffer has a limited capacity and may not be able to store the whole instruction. | * Parameters can be separated by any character that is not a number or a letter (e.g., space, comma, semicolon). However, the letters themselves act as separators, and it is recommended that no additional characters are used, as the serial buffer has a limited capacity and may not be able to store the whole instruction. | ||
| * Depending on the tail and position, it can sag out of the commanded position when servo power is released at the end of the DSSP move. This may cause a visual defect of jerking back into the previous position when the next move starts. | * Depending on the tail and position, it can sag out of the commanded position when servo power is released at the end of the DSSP move. This may cause a visual defect of jerking back into the previous position when the next move starts. | ||
| + | |||
| ==== DSSP Example ==== | ==== DSSP Example ==== | ||
| Line 207: | Line 242: | ||
| - | ===== User-defined | + | ===== User-defined Moves and Glow Tip Patterns ===== |
| - | Up to 4 user-defined move definitions and 4 LED patterns can be sent over the BT/BLE connection and assigned to user | + | Up to 4 user-defined move definitions and 4 Glow Tip LED patterns can be sent over the BT/BLE connection and assigned to user |
| presets (callable with the '' | presets (callable with the '' | ||
| - | The two instructions used to send a tail move or a Glow Tip LED pattern definition follow the same syntax and consist of a | + | The two instructions used to send a move or a Glow Tip LED pattern definition follow the same syntax and consist of a |
| keyword ('' | keyword ('' | ||
| defines the type of parameter (see table, below). | defines the type of parameter (see table, below). | ||
| Line 220: | Line 255: | ||
| ^ Prefix ^ Parameter Type ^ Range of Values for Moves ^ | ^ Prefix ^ Parameter Type ^ Range of Values for Moves ^ | ||
| | **U** | User preset number | <1 ... 4> | | | **U** | User preset number | <1 ... 4> | | ||
| - | | **E** | Easing function to apply to Servo 1 | Default is Linear, if not specified.\\ | + | | **E** | Easing function to apply to Servo 1 | Default is Linear |
| | **F** | Easing function to apply to Servo 2 | (Same as **E**) | | | **F** | Easing function to apply to Servo 2 | (Same as **E**) | | ||
| | **A** | Point for Servo 1 | <0 ... 8>\\ 0 -> 25 degrees\\ 1 -> 41 degrees\\ 2 -> 58 degrees\\ ...\\ 8 -> 160 degrees | | | **A** | Point for Servo 1 | <0 ... 8>\\ 0 -> 25 degrees\\ 1 -> 41 degrees\\ 2 -> 58 degrees\\ ...\\ 8 -> 160 degrees | | ||
| Line 246: | Line 281: | ||
| {{: | {{: | ||
| + | |||
| ==== USERMOVE Examples ==== | ==== USERMOVE Examples ==== | ||
| + | |||
| === Example 1 – Slow Wag 1 (same as the '' | === Example 1 – Slow Wag 1 (same as the '' | ||
| Line 265: | Line 302: | ||
| * **L75L75** Position 2 is reached in 75 * 20 ms = 1.5 s; return to Position 1 in the same time | * **L75L75** Position 2 is reached in 75 * 20 ms = 1.5 s; return to Position 1 in the same time | ||
| * **H1** Home at end of move | * **H1** Home at end of move | ||
| + | |||
| === Example 2 – Test Servos === | === Example 2 – Test Servos === | ||
| Line 282: | Line 320: | ||
| * **H1** Home at end of move | * **H1** Home at end of move | ||
| - | <WRAP round info> | + | <WRAP round info 90%> |
| Because no easing parameters ('' | Because no easing parameters ('' | ||
| </ | </ | ||
| + | |||
| ==== USERLEDS Examples ==== | ==== USERLEDS Examples ==== | ||
| + | |||
| === Example 1 – Beacon (same as the '' | === Example 1 – Beacon (same as the '' | ||
| Line 312: | Line 352: | ||
| * **A0A8** Start off, finish at full brightness | * **A0A8** Start off, finish at full brightness | ||
| * **L100L100** Each brightness point is reached in 100 * 20 ms = 2 s | * **L100L100** Each brightness point is reached in 100 * 20 ms = 2 s | ||
| - | |||
| - | |||
| - | ===== Autonomous Mode ===== | ||
| - | |||
| - | Defines a sequence of random moves, selected from any of three groups as below; interval between moves varies randomly | ||
| - | from T1 to T2. | ||
| - | |||
| - | **AUTOMODE G< | ||
| - | |||
| - | The tail will select a random move from the specified group(s), pausing for a random number of seconds between each move (min and max specified by the first and second '' | ||
| - | |||
| - | Autonomous Mode is ended (after completing any ongoing move) if a BLE connection is made. | ||
| - | |||
| - | ^ Group ^ Move Group Name ^ Move List ^ | ||
| - | | 1 | Calm and Relaxed | Slow Wag 1, Slow Wag 2, Slow Wag 3 | | ||
| - | | 2 | Fast and Excited | Fast Wag, Short Wag, Happy Wag, Erect | | ||
| - | | 3 | Frustrated and Tense | Tremble 1, Tremble 2, Tremble Erect, High Wag | | ||
| - | |||
| - | The parameter order is not important, except that the three '' | ||
| - | |||
| - | ^ Prefix | ||
| - | | **G** | Move Group (see table above) | <1 ... 3> | | ||
| - | | **T1** | Minimum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| - | | **T2** | Maximum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| - | | **T3** | Total duration in 15-second increments | <1 ... 240> (15 s ... 60 min); <251 ... 254> are reserved, see [[en: | ||
| - | |||
| - | **STOPAUTO** | ||
| - | |||
| - | '' | ||
| ===== Conference Mode ===== | ===== Conference Mode ===== | ||
| - | Conference mode pairs the user's phone with the TailCoNTROL | + | Conference mode pairs the user's phone with the TailControl |
| * **Authentication: | * **Authentication: | ||
| * **MITM (Man In The Middle):** process by which a third device impersonates the other two legitimate devices, in order to fool them into connecting to it. Both BLE central and peripheral will connect to the malicious device, which in turn routes the communication between the other two devices. The malicious device intercepts all data being sent and can inject false data or remove data before it reaches its recipient. | * **MITM (Man In The Middle):** process by which a third device impersonates the other two legitimate devices, in order to fool them into connecting to it. Both BLE central and peripheral will connect to the malicious device, which in turn routes the communication between the other two devices. The malicious device intercepts all data being sent and can inject false data or remove data before it reaches its recipient. | ||
| * **Replay Attack:** a type of network attack in which an attacker captures a valid network transmission and then retransmits it later. The main objective is to trick the system into accepting the retransmission of the data as legitimate. | * **Replay Attack:** a type of network attack in which an attacker captures a valid network transmission and then retransmits it later. The main objective is to trick the system into accepting the retransmission of the data as legitimate. | ||
| + | |||
| + | <WRAP round important 90%> | ||
| + | Do **NOT** attempt to use Conference Mode on TailControl firmware prior to 5.3.0, or a condition requiring repair of the control board can occur.</ | ||
| + | |||
| ==== Enabling Conference Mode (Pairing and Binding) ==== | ==== Enabling Conference Mode (Pairing and Binding) ==== | ||
| - | Pairing is performed with a 6-digit number entered on each of the devices. In the case of TailCoNTROL, the passkey is set on the device in a " | + | Pairing is performed with a 6-digit number entered on each of the devices. In the case of TailControl, the passkey is set on the device in a " |
| **SETPUSSKEY < | **SETPUSSKEY < | ||
| - | The device will then reboot | + | The device will then reboot |
| ==== Disabling Conference Mode ==== | ==== Disabling Conference Mode ==== | ||
| Line 365: | Line 381: | ||
| **STOPPUSSKEY** | **STOPPUSSKEY** | ||
| - | The device will then reboot | + | The device will then reboot |
| ==== Unbinding ==== | ==== Unbinding ==== | ||
| - | Resetting/ | + | Resetting/ |
| - | There are two different methods of factory-resetting a TailCoNTROL | + | There are two different methods of factory-resetting a TailControl |
| - | * Sending a '' | + | * Sending a '' |
| * Performing a factory reset using the single button: | * Performing a factory reset using the single button: | ||
| - Press and hold the power button. | - Press and hold the power button. | ||
| - | - At approximately 3 seconds, the blue LED will flash three times and turn off. Continue to hold without releasing the button. If you Wish to cancel the factory reset, release at any time before the next step and the device will power off. | + | - At approximately 3 seconds, the blue LED will flash three times and turn off. Continue to hold without releasing the button. If you wish to cancel the factory reset, release at any time before the next step and the device will power off. |
| - Ten seconds after the triple-flash (13 seconds total of continuous holding), the blue LED will blink quickly continuously, | - Ten seconds after the triple-flash (13 seconds total of continuous holding), the blue LED will blink quickly continuously, | ||
| - | <WRAP round info> | + | <WRAP round info 90%> |
| - | The bond will also need to be removed on the phone or other device as well, or it will attempt to continue to use the bond (which will fail, because those stored credentials | + | Note that the bond will also need to be removed on the phone or other device as well, or it will attempt to continue to use the bond (which will fail, because those stored credentials |
| * On Android, enter Settings, Connections, | * On Android, enter Settings, Connections, | ||
| Line 386: | Line 403: | ||
| </ | </ | ||
| - | |||
| - | |||
| - | ===== iOS Casual Mode ===== | ||
| - | |||
| - | <WRAP round todo> | ||
| - | This feature is pending removal in a future release. | ||
| - | </ | ||
| - | |||
| - | Because the CRUMPET application is not currently permitted to manage the tail while the iOS application is in the background, the application uses the '' | ||
| - | |||
| - | **AUTOMODEG1 | ||
| - | |||
| - | Note that the '' | ||
| - | |||
| - | Important! The minimum random pause cannot be less that 15 seconds. | ||
| - | |||
| - | ==== iOS Casual Mode Example ==== | ||
| - | |||
| - | **AUTOMODE T15T60T240 G1G2** | ||
| - | |||
| - | * **T15** 15-second minimum random pause between moves | ||
| - | * **T60** 60-second (1 minute) maximum random pause between moves | ||
| - | * **T240** 3600-second (240 * 15 = 3600 s = 1 hour) total duration of Autonomous Mode | ||
| - | * **G1G2** Randomly select a move from groups 1 and 2 | ||
| Line 426: | Line 419: | ||
| ===== No-phone Mode ===== | ===== No-phone Mode ===== | ||
| - | No-phone mode is a feature exclusive | + | Perform random moves while disconnected from a BLE client, selected from any of three groups as below; interval between moves varies randomly from T1 to T2. This feature is comparable to Casual Mode in the app. |
| - | **AUTOMODE G< | + | **AUTOMODE G< |
| + | |||
| + | The tail will select a random move from the specified group(s), pausing for a random number of seconds between each move (min and max specified by the first and second '' | ||
| + | |||
| + | No-phone Mode is suspended (after completing any ongoing move) if a BLE connection is made. It will resume after BLE is disconnected. | ||
| + | |||
| + | ^ Group ^ Move Group Name ^ Move List ^ | ||
| + | | 1 | Calm and Relaxed | Slow Wag 1, Slow Wag 2, Slow Wag 3 | | ||
| + | | 2 | Fast and Excited | Fast Wag, Short Wag, Happy Wag, Erect | | ||
| + | | 3 | Frustrated and Tense | Tremble 1, Tremble 2, Tremble Erect, High Wag | | ||
| + | |||
| + | The parameter order is not important, except that the three '' | ||
| + | |||
| + | ^ Prefix | ||
| + | | **G** | Move Group (see table above) | <1 ... 3> | | ||
| + | | **T1** | Minimum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| + | | **T2** | Maximum random pause between moves in 1-second increments | <1 ... 240> (1 s ... 4 min) | | ||
| + | | **T3** | Delay to wait for BLE connection before starting NPM | <25**1** ... 25**4**> (1 ... 4 min) | | ||
| No-phone Mode (NPM) will cause the tail to delay one to four minutes (based on the setting of the third '' | No-phone Mode (NPM) will cause the tail to delay one to four minutes (based on the setting of the third '' | ||
| Line 437: | Line 447: | ||
| Stops No-phone mode and disables it in NVS configuration. | Stops No-phone mode and disables it in NVS configuration. | ||
| + | |||
| + | |||
| + | ==== No-phone Mode Example ==== | ||
| + | |||
| + | **AUTOMODE T15T60T243 G1G2** | ||
| + | |||
| + | * **T15** 15-second minimum random pause between moves | ||
| + | * **T60** 60-second (1 minute) maximum random pause between moves | ||
| + | * **T240** 3600-second (240 * 15 = 3600 s = 1 hour) total duration of Autonomous Mode | ||
| + | * **G1G2** Randomly select a move from groups 1 and 2 | ||
| Line 446: | Line 466: | ||
| - | == Copyright 2024 © The Mechanical Tail Company Limited contact@thetailcompany.com. All Rights Reserved. == | + | == Copyright 2024-2025 © The Mechanical Tail Company Limited contact@thetailcompany.com. All Rights Reserved. The Mechanical Tail Company Limited also claims trademark rights in the following: TailControl, |