| Both sides previous revisionPrevious revision | |
| en:dev:tailcontrol-release-notes [2026/10/23 15:36] – [TailControl v5.4.9] darkgrue | en:dev:tailcontrol-release-notes [2026/10/23 15:38] (current) – darkgrue |
|---|
| ==== Fixed ==== | ==== Fixed ==== |
| * Removed duplicated line in console banner logo. | * Removed duplicated line in console banner logo. |
| | * **A move command sent while the previous move was homing could be dropped.** At the end of a move, ''taskMovesUpdate()'' decides to home and then calls ''setMove(&SERVO_MOVE_HOME, true)''. A command handled by ''taskTerminal()'' in between replied ''<CMD> BEGIN'' but was immediately overwritten by ''TAILHM''; the tail only went home. The ''vTaskSuspend(tMove)'' in ''setMove()'' didn't stop ''updateMove()'' partway through, and on UART builds (no core affinity) both tasks can run at once. Move state changes are now serialized by a recursive mutex held across ''updateMove()'', ''setMove()'', ''setDSSPMove()'' and ''stopServos()''. |
| | * **Autonomous and No-phone Mode: ''taskMovesUpdate()'' suspended itself** when it started a random move (''setRandMove()'' → ''setMove()'' → ''vTaskSuspend(tMove)'' from the same task). The suspend/resume pair is replaced by the mutex above. |
| * **Serial console dropping characters and lines on ESP32-S3 boards (EarGear 2 v4.1, ClawGear v4.1).** The Arduino-ESP32 3.3.7 HW USB CDC driver silently discards up to 64 bytes when ''Serial'' is written from a task running on the other core from its interrupt handler. Its ISR ignores a short FIFO write while ''HWCDC::write()'' commits the FIFO from the calling core. All console output now goes through a single writer task pinned to the ISR core, and application tasks are pinned to ''ARDUINO_RUNNING_CORE'' on USB CDC builds. | * **Serial console dropping characters and lines on ESP32-S3 boards (EarGear 2 v4.1, ClawGear v4.1).** The Arduino-ESP32 3.3.7 HW USB CDC driver silently discards up to 64 bytes when ''Serial'' is written from a task running on the other core from its interrupt handler. Its ISR ignores a short FIFO write while ''HWCDC::write()'' commits the FIFO from the calling core. All console output now goes through a single writer task pinned to the ISR core, and application tasks are pinned to ''ARDUINO_RUNNING_CORE'' on USB CDC builds. |
| * **Console lines losing their beginning after brief USB link dropouts.** The HW USB CDC TX buffer is increased from 256 to 2048 bytes (''USB_CDC_TX_BUFFER_SIZE''), which absorbs the periodic 2–6 ms host SOF dropouts instead of evicting queued output. | * **Console lines losing their beginning after brief USB link dropouts.** The HW USB CDC TX buffer is increased from 256 to 2048 bytes (''USB_CDC_TX_BUFFER_SIZE''), which absorbs the periodic 2–6 ms host SOF dropouts instead of evicting queued output. |
| * **PD library status output** goes through ''Log.h'' instead of ''PD_UFP.print_status(Serial)'', which wrote to ''Serial'' directly. Output is deferred while FUSB302 events are pending, so it never delays a reply. | * **PD library status output** goes through ''Log.h'' instead of ''PD_UFP.print_status(Serial)'', which wrote to ''Serial'' directly. Output is deferred while FUSB302 events are pending, so it never delays a reply. |
| * The console stack report includes ''taskPDUpdate()''. | * The console stack report includes ''taskPDUpdate()''. |
| | * ''updateMove()'' no longer calls ''logFlush()'' before homing (FDEBUG builds). The log queue already preserves output order. The flush was a leftover from the old ''Serial.flush()'' and delayed homing, and with the new mutex any incoming command, by up to the 1 s flush timeout. |
| |
| ==== Removed ==== | ==== Removed ==== |