This is an old revision of the document!


TailControl Release Notes

TailControl v5.4.7

New Features

  • Added ClawGear hardware platform.
    • Split move systems between servo and stepper.
  • Added RGB support.
    • Add RGB LED strip support for MiTail Mini on Servo 2 port.
    • Add RGB LED strip support for ClawGear on Servo 2 port.
    • Added RGB LED strip support on serial port RX pin for MiTail products, based on suggestion from Code-L (good idea 👍).
    • Added terminal RX status.
    • Added `remapConsoleRXtoGPIO` to NVS settings commands.
    • Added per-product RGB setting defaults (number of LEDs, current limits, etc.).
    • Added `SETRGB` to NVS settings commands to set RGB LED parameters.
    • Added `SETBRT` to NVS settings commands to set RGB LED default global brightness parameter.
    • All RGB commmands support brightness override (and can set hue, where appropriate).
  • Added servo hold on stop to NVS settings commands (`SETHOLDONSTOP` / `UNSETHOLDONSTOP`).
  • Added BLE disconnected countdown disable/enable functionality to NVS settings commands (`SETDISCONNECTEDCOUNT`).
  • Added internal move enable/disable for Listen and Tilt Mode moves to NVS settings commands (`SETLISTENMOVES` / `UNSETLISTENMOVES` and `SETTILTMOVES` / `UNSETTILTMOVES`).
  • Added `myColor` setting (request from Code-L) - device “remembers” it's set UI color to report back to app.
    • Added `SETMYCOLOR` command.
    • `MYCOLOR` returned as part of `VER` response.

Bugfixes / Refactoring

  • Refactor to move PlatformIO platform to `pioarduino-stable`.
  • Migrated to new I2S driver.
  • Implemented unit testing for `taskconsole()` function.
  • Minor shutdown code cleanup.
  • Removed unused servo speed parameter.
  • Fixed CRITICAL Conference Mode kernel panic, reported by SnowOwlX (thank you!)
    • Increased stack size margins to be closer to 50% free at worst case.
  • Refactored `platformio.ini` file.
  • Re-baselined tilt mode zero points for EarGear 2.
  • `TILTMODE` cooldown reduced to 3 seconds, down from 4.
  • Renamed `timersTask` to be consistent with other task names.
  • Fixed `WRITECONF`, `READCONF`, and `READNVS` commands.
  • Updated functionality for Python extra scripts to improve maintainability of the PlatformIO build process.
  • Adjusted `.gitignore` file.
    • Removed `extensions.json` from inclusion, as it's auto-generated.
    • Stop including `esp-web-tools/firmware/*.bin` files.
  • Change internal move references to `MOVE_HOME`, and `MOVE1` through `MOVE11` (console command naming mapping remains the same).
  • Fix `build_unify_binary.py` script not triggering reliably.
  • `patch_libdeps.py` handles already-patched files more robustly.
  • Performed code hygiene review:
    • Fixed null-check `strtok()` results before calling `startOTA()`.
    • Fixed reset OTA byte counter at the start of each OTA session.
    • Fixed null-check `malloc()/calloc()` results in `createMovingAverage()`.
    • Fixed clamp BLE RX `memcpy()` length to actual string length.
    • Replaced `xQueuePeekFromISR()` with `xQueuePeek()` in task context.
    • Guard Autonomous Mode group bit shift against out-of-range index.
    • Use `>=` instead of `==` for serial RX buffer overflow check.
    • Removed contradictory signaling and makes the OTA state machine unambiguous.
    • Robust null-handling for moving-average allocation and use is implemented in EG2 listen-mode processing.
    • Correctly map `AUTOMODE` groups and guard bitflag generation.
    • Skip zero-length BLE writes in `execOTA()` to prevent duplicate ACK.
    • Guard against re-entrant `startOTA()` while a transfer is already active.
    • Release OTA flash write handle when BLE disconnects mid-transfer.
    • Pass actual BLE connection handle to `updateConnParams()`.
    • Switch `p_characteristicRX` from `INDICATE` to `NOTIFY`.
    • Replace blocking `delay()`/`esp_restart()` in BLE callback with `esp_timer`.
    • Abort and restart on `Update.end()`/`Update.isFinished()` failures.
    • Enforce 60-second inactivity timeout during OTA transfer.
    • `ota.py` subscribe to TX characteristic for firmware status notifications.
    • Fix multifunction button LED animations.

Library Updates

  • Updated ESP32Servo library to v3.2.0.
  • Updated NimBLE-Arduino library to v2.5.1.
  • Updated ServoEasing library to v3.6.0.
  • Added NeoPixelBus#CORE3 (for RGB support).
  • Replaced JLed libary with custom class (`LedFx`) built on Core v3's native API.

Updated Documentation

  • Added new Move Reference Wiki page.
  • Bumped copyright year to 2026.
  • Added notes about flying with devices that contain LiOn batteries to documentation.
  • Added move mappings for FlutterWings.
  • Documented new commands and command changes.

TailControl v5.2.8

  • Rebranded “TailCoNTROL” to “TailControl” (under duress).
  • Add full EarGear 2 support:
    • Add dedicated firmware moves for EarGear 2.
    • Set EarGear 2 to maintain servo holding at all times to facilitate assembly (as per staff request).
    • New I2S support added.
    • Set configuration item for Listen Mode to send responses only.
    • Set configuration item for Tilt Mode to send responses only.
    • Add I2S debug task for Ear Gear.
    • Add configuration parameter for Listen and Tilt mode to send triggers only (allows application to manage movements).
    • Add configuration parameter for Listen move group selection.
    • Support EG2 Tilt and Listen Mode in No-phone Mode.
  • Move TailCoNTROL to new BLE UUIDs.
  • Reorganized code units and functions to improve organization and readability.
  • Add Device Information Service (DIS) BLE characteristics.
  • Add SETHOLDONSTOP and RELEASEHOLDONSTOP commands.
  • Fixed BATT characteristic response truncation (thank you Code-L).
  • Implement simple message queue for ISR debug tracing.
  • Fixed unsigned long int sprintf format strings.
  • Improved commenting for hardware/platform variants.
  • Fixed JLed invocation to address timer conflict.
  • Clean up debug logging to make format consistent.
  • Added Conference Mode and associated configuration settings.
  • Fix move group selection logic.
  • Fix LIS2DW12 library to support non-hardcoded SPI bus wiring.
  • Rework button press servicing and visual indicators.
  • Add new function to perform factory reset on extended button hold.
  • Rename some variables and functions to better reflect their purpose.
  • Reverted undesirable MiTail easing function settings for some moves.
  • Refactored NVS options and compilation units.
  • Added persistent setting for automatic power off when BLE is disconnected (default is OFF).
  • Added persistent setting for home on POWEROFF command (default is ON).
  • CONFRD command removed, replaced by READCONF and READNVS.
  • CONFWR command replaced with WRITECONF.
  • Added SETHOME command (and persistent setting) for FlutterWings, and EarGear 2 [feature requested by @AleinaTravyre].
  • Added REBOOT command.
  • Improved BLE MTU settings for iOS.
  • Split RTOS tasks into separate unit files.
  • Fix race condition between updateMoves() and setMove() / setDSSPMove() that caused stuttering/short moves (thank you Mrs. Tailer for spotting this).
  • Improved debug messages.
  • Update ESP32Servo library to 1.2.1.
  • Updated JLed library to v4.15.0.
  • Updated NimBLE-Arduino library to v2.1.2 (made transitions for breaking changes).
  • Updated ServoEasing library to v3.4.0 (made transitions for breaking changes).
  • Updated BLE_OTA_Python scripts and documentation.
  • Added script to build unified binary for EarGear 2 firmware.
  • Added ESP Web Tools configuration for writing EarGear 2 firmware.
  • Fix PlatformIO $extra_scripts to be cumulative.
  • Update Tail Control Protocol to reflect as-built.
  • Add additional details to Service Notes about the Glow Tip.

TailControl v5.0.9

  • Reverted changes to easing modes in MiTail moves.

TailControl v5.0.8

Initial release of TailControl unified firmware.

  • Added #DEBUG compile-time flag to disable serial output.
  • Added firmware support for new product: FlutterWings.
  • Added firmware support for new product: MiTail Mini.
  • Tune MiTail Mini moves 1, 2, and 3.
  • Added firmware support for v3.6 tail board. Split out PD handling to support non-PD hardware.
  • Restructured moves so that independent strings of moves (with easing type, position, and duration triplets for each move) for each servo, and can be of different length.
  • Improved support for DSSP commands.
  • Fixed HWCDC blocking bug for EarGear 2 serial console.
  • Fixed uncommanded servo movement occurring at the end of a move when the servos detach from the PWM channel.
  • Fixed bug in move state machine.
  • Removed hazards created by unbracketed nested statements by adding explicit curly braces to single-line statements. (Findings 1 and 8.)
  • Pin support libraries to exact versions to eliminate hazard of unintended support library changes introducing faults unexpectedly. (Finding 6.)
  • Split setup() function into smaller logical calls to other functions. (Partial implementation for Finding 7.)
  • Identified variables impacted by ISR calls (because I can't even read my own notes in the ISR function descriptions!) and moved them to Mailboxes (queues) or Critical Sections. (Thread safety.)
  • Tagged globals touched in ISR context with g_ prefix for identification.
  • Reduced task priorities.
  • Add initial EG2 support for move system Proof of Concept.
  • Split functions/reorganize code to facilitate hardware differentiation.
  • Created new PlatformIO build env profiles for each product target.
  • Version number control moved to platformio.ini, instead of Definitions.h file.
  • Created build script to automatically name output binaries during build process (automatic firmware filename versioning).
  • Added additional code commenting for variables.
  • Fixed -Wformat-truncation warnings in PD_Micro library.
  • Fixed -Wunused-variable warnings in LIS2DW12-Arduino-Lib library.
  • Improved banner message.
  • Improved servo debug output.
  • Updated JLed library to 4.13.1.
  • Updated ESP32Servo library to v1.2.0.
  • Updated documentation.
Edit this page