Releases: fiverecords/TallyCCUPro
TallyCCU Pro v3.7.1
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
TallyCCUPro V3.7
TallyCCU Pro v3.7 Release Notes
Safe Mode Recovery System
This release introduces a comprehensive Safe Mode system to automatically detect and recover from hardware-related boot failures, eliminating the frustrating boot loop scenarios that could occur with SDI Shield issues.
The Problem
Previously, if the SDI Shield encountered issues during initialization (missing 12V power, invalid SDI signal, or I2C problems), the system would enter an infinite boot loop:
- Arduino boots → tries to initialize SDI Shield
- Shield blocks on I2C communication
- Watchdog triggers reset after 8 seconds
- Loop repeats indefinitely
This made diagnosis difficult since the web interface never became available.
The Solution
The new Safe Mode system tracks boot attempts using EEPROM. After 3 consecutive boot failures, the system automatically enters Safe Mode, skipping SDI Shield initialization while keeping network services available for remote diagnosis.
New Features
Automatic Boot Loop Detection
- System tracks consecutive boot failures in EEPROM
- Clean boot resets the failure counter
- After 3 failed boots, Safe Mode activates automatically
Safe Mode Operation
When in Safe Mode:
- ✓ Web interface available (diagnostic page)
- ✓ Network configuration accessible
- ✓ vMix tally connection (receive only)
- ✓ Companion TCP integration
- ✓ Serial console
- ✗ SDI tally output (disabled)
- ✗ CCU camera control (disabled)
Diagnostic Web Interface
New safemode.html page provides:
- System status (reset count, uptime, free RAM, IP)
- Common causes and solutions
- One-click "Restart Normal Mode" button
- Clear indication of what works and what doesn't
New Serial Commands
safemode- Force safe mode on next boot (for testing)normalboot- Exit safe mode and restart
New API Endpoints
GET /safemode-status- Returns JSON with system diagnosticsPOST /safemode-exit- Clears safe mode flag and restarts
Technical Details
New Files
SafeMode.h- Header with EEPROM addresses and APISafeMode.cpp- Boot failure detection and recovery logicsafemode.html- Diagnostic web interface (copy to SD card)
Modified Files
TallyCCUPro.ino- SafeMode integration, dual boot pathsTallyManager.cpp- Skip SDI Shield init in Safe ModeWebServer.h- New handler declarationsWebServer.cpp- Safe Mode endpoints and redirects
EEPROM Usage
New addresses (310-314):
- 310: Reset counter
- 311-312: Boot flag magic (0xDEAD)
- 313: Last reset reason
- 314: Manual safe mode flag
Boot Sequence
Power On
↓
SafeMode::begin() ← Called FIRST, enables watchdog
↓
Check EEPROM boot flag
↓
┌─────────────────────┐
│ Flag present? │─NO─→ Clean boot, counter = 0
│ (previous crash) │
└──────────┬──────────┘
│YES
↓
Counter++
↓
┌─────────────────────┐
│ Counter >= 3? │─NO─→ Try normal boot
└──────────┬──────────┘
│YES
↓
SAFE MODE
- Skip CCUControl::begin()
- Skip sdiTallyControl.begin()
- Initialize network/web only
- Serve safemode.html
Installation
- Upload new firmware to Arduino
- Copy
safemode.htmlto SD card root - System will boot normally
To test Safe Mode:
- Send
safemodevia serial - Send
resetor power cycle - System enters Safe Mode
- Access web interface to see diagnostic page
- Click "Restart Normal Mode" to exit
Compatibility
- Fully backward compatible with v3.6
- No changes to Companion module required
- No changes to existing web interfaces (index.html, tally.html, sdcard.html)
TallyCCUPro V3.6
Overview
This patch release fixes the "Reset to Defaults" functionality to ensure all camera parameters are properly reset, matching the behavior of loading a preset with default values.
Bug Fix
Reset to Defaults - Missing Parameters
Problem: When using "Reset to Defaults", several parameters were not being sent to the camera, resulting in incomplete resets compared to loading a preset.
Solution: Added explicit reset handling for all missing parameters across their respective groups.
TallyCCUPro V3.5
TallyCCU Pro v3.5 Release Notes
Overview
This release introduces a completely redesigned real-time synchronization system using Server-Sent Events (SSE), replacing the previous polling-based approach. The new architecture provides instant bidirectional sync between the web interface, Companion module, and Arduino, while freeing up approximately 604 bytes of precious RAM.
New Features
Real-Time Synchronization via SSE
- Instant parameter sync: Changes made in Companion are immediately reflected in the web interface and vice versa
- Per-camera state storage: The web browser now maintains state for all 8 cameras, enabling seamless camera switching without losing parameter values
- Bidirectional sync on connect: When either the web interface or Companion connects, it automatically receives the current state from the other
Automatic State Recovery
- Web → Companion sync: When Companion connects after the web interface, it automatically receives all cached parameter values
- Companion → Web sync: When the web interface connects after Companion, it requests and receives all parameter values via the new REQUESTSYNC protocol
Live Preset Name Updates
- Preset names now sync instantly across all interfaces when saved or loaded
- No more manual refresh required to see updated preset names
Improvements
Performance
- Near-zero latency sync: Replaced 2.5-second polling interval with instant SSE push notifications
- Faster SSE connection: Optimized header reading for instant connection establishment
- Reduced network traffic: Only actual changes are transmitted instead of periodic full-state polls
Memory Optimization
- Removed CCUState module: Freed ~604 bytes of RAM by moving state storage to the web browser
- Eliminated LRU cache overhead: No longer needed with SSE-based architecture
User Interface
- Consistent number formatting: Fixed flickering between decimal formats when values sync
- New
formatNumber()function: Ensures consistent display of numeric values across all controls
Reliability
- Fixed override persistence bug: Resolved issue where Tally, CCU, and vMix override settings could become corrupted after power cycle
- Root cause: Variables were being reused incorrectly when loading/saving EEPROM values
- Each override now uses separate variables to prevent cross-contamination
Technical Changes
New Files
- None (consolidated into existing modules)
Removed Files
CCUState.h- No longer neededCCUState.cpp- No longer needed
Modified Files
Arduino Firmware
| File | Changes |
|---|---|
| webserver.h | Added SSE functions: sendSSEEvent(), sendSSEPresetLoaded(), sendSSEPresetSaved(), sendSSERequestSync(), hasSSEClient(), handleSyncStatePOST() |
| webserver.cpp | Implemented /events SSE endpoint, /syncState POST handler, preset notifications, optimized header reading |
| CCUBroadcast.h | Added requestSync() public method |
| CCUBroadcast.cpp | Added CCUSYNC message handling, REQUESTSYNC on client subscribe, WebServer integration |
| CCUControl.cpp | Removed CCUState dependency, added SSE event broadcasting, fixed override save bug |
| TallyManager.cpp | Fixed override save bug with separate variables |
| VmixConnector.cpp | Fixed override save bug with separate variables |
| SdUtils.cpp | Added preset load notifications to TCP and SSE clients |
| TallyCCUPro.ino | Removed CCUState references, updated status command for SSE |
Known Limitations
- Only one SSE client supported at a time (multiple browser tabs share the same connection)
- HTTPS not supported (Arduino Mega hardware limitation)
- Initial sync requires either web or Companion to be connected first
Acknowledgments
Thanks to the TallyCCU Pro community for feedback and bug reports that led to these improvements.
TallyCCUPro V3.3
Bug Fixes & Improvements in Web GUI
Parameter Precision
- All parameter values now limited to 2 decimal places for efficiency and Companion integration
- Applied to: sendParam, multiSubOnChange, sendContrastPivot, sendHueSat
Knob Reset Fix
- Fixed: Knobs now properly send values to cameras when using "Reset to Defaults"
Shutter Presets
- Third shutter preset now dynamic: changes based on frame rate (fps × 4)
- All three presets update when video mode changes: 1/fps, 1/(fps×2), 1/(fps×4)
- Example at 60fps: 1/60, 1/120, 1/240
- Example at 24fps: 1/24, 1/48, 1/96
Frame Guide Style
- Added all BMD protocol values: Off, 16:9, 14:9, 4:3, 2.4:1, 2.39:1, 2.35:1, 2:1, 1.85:1, 4:5, 1:1
TallyCCUPro V3.2
Web Interface Updates
Color Correction
- Range Selector: Added Fine (25%) / Normal (50%) / Full (100%) sensitivity for color wheels
- Hosford Sigmoid Curve: Improved contrast curve using mathematical formula - smooth transition from linear to S-curve to Z-curve at maximum
- Lum Mix: Relocated and centered below color wheels for better mobile usability
- Contrast/Pivot panel: Now same width as Hue/Saturation panel
- Fixed wheel pointer sync - positions now stay consistent during Arduino updates
Controls
- Knob +/- Buttons: Added touch-friendly increment/decrement buttons on all knobs
- Shutter: Now steps in multiples of current frame rate (e.g., 1/60 → 1/120 → 1/180 at 60fps)
- ND Filter: Steps of 2 stops (0, 2, 4, 6) matching real ND behavior
- Auto WB: Changed to on/off toggle switch
- Removed double-click reset on color wheels (use reset buttons instead)
Exposure & Focus Tools
- New workflow: Select tools → Select target displays → Click “Apply Tools”
- Prevents accidental changes during live production
Frame Guides & Overlays
- New defaults: Safe Area 90%, Thirds/Crosshairs/Horizon enabled
- Reset to Defaults now applies these values
Layout
- Video Settings panel moved before Video Mode
- Output tab icon changed to 📐
Parameter Ranges (BMD Official)
- Gain: -12 dB to +32 dB
- ND Filter: 0, 2, 4, 6 stops
TallyCCUPro V3.1
Full WEB GUI update
TallyCCUPro V3.0
Initial Public Release