TallyCCU Pro v3.7.1 — Bug Fixes & Stability Improvements
This release focuses on reliability, touch device support, and fixing edge cases discovered during thorough code review of the entire codebase (~12,400 lines across 25 files).
🔴 Critical Fixes
- vMix reconnection loop — Previous versions hammered the vMix server with rapid reconnection attempts when it was unreachable, flooding the network and serial log. Now uses progressive backoff (20s → up to 2 min) and resets on success.
- Tally lights stuck ON — When vMix disconnected, the last tally state remained active on cameras indefinitely. Tally data is now cleared on disconnect.
- CCU Broadcast truncation — TCP message buffer was 64 bytes, too small for long parameter names with values. Increased to 128 bytes to prevent silent truncation to Companion.
- Tally mappings not loading — The tally configuration page always showed default 1:1 mappings on load, even when custom mappings were saved in EEPROM. Added
getTallyMapendpoint and automatic loading on page open.
🟡 Medium Fixes
- SD card deadlock in presets —
applyPreset()could lock the SD bus without releasing it on certain error paths. - Virgin EEPROM network config — First boot on new hardware could load
255.255.255.255as IP address. Now detects both0x00and0xFFas uninitialized and applies safe defaults. - MAC address generation —
random()range was off-by-one, byte value0xFFwas unreachable. - Touch controls broken — Knobs, color wheels, and PTZ joystick only had mouse events. Now fully functional on tablets and touch screens with proper
touchstart/touchmove/touchendhandlers. - Safe mode page deletable —
safemode.htmlwas missing from the protected files list in the SD card manager. Could be accidentally deleted, breaking recovery. - Filenames with apostrophes — Files like
Mike's preset.txtbroke action buttons in the SD card manager. Single quotes are now escaped in onclick handlers. - Uninitialized EEPROM tally values — Loading mappings from virgin EEPROM showed 255 in all fields. Now validates range and falls back to defaults.
🟢 Minor Fixes
- Reboot endpoint — Added watchdog reset before the infinite loop to prevent premature reset before the HTTP response is sent.
- handleParam heap fragmentation — Replaced dynamic String allocation with static buffer for URL-decoded parameter values.
- Silent fetch failures — Network errors from the web interface to Arduino were silently swallowed. Added
.catch()handlers and a global unhandled rejection handler. - Color wheel performance — Drag events now throttled to ~30fps to reduce lag on slower hardware.
- Unnecessary String objects — Removed 3
String()wrapper calls in serial commands that created temporary heap allocations. - JSON filename escaping —
listFilesendpoint now usesprintJsonSafe()for filenames, preventing broken JSON if a file contains quotes.
📋 Version Bump
All 22 source files updated to version 3.7.1, including FIRMWARE_VERSION define and serial boot banner.
Upgrade Instructions
- Flash the Arduino sketch from the
Arduino/folder - Copy the 4 HTML files from
sdcard/to your SD card (replace existing) - Power cycle the device
The firmware version will show as 3.7.1 in the serial monitor and web interface.
Full Changelog: v3.7...v3.7.1