Skip to content

Releases: fiverecords/TallyCCUPro

TallyCCU Pro v3.7.1

27 Feb 06:27

Choose a tag to compare

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 getTallyMap endpoint and automatic loading on page open.

🟡 Medium Fixes

  • SD card deadlock in presetsapplyPreset() 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.255 as IP address. Now detects both 0x00 and 0xFF as uninitialized and applies safe defaults.
  • MAC address generationrandom() range was off-by-one, byte value 0xFF was 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/touchend handlers.
  • Safe mode page deletablesafemode.html was 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.txt broke 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 escapinglistFiles endpoint now uses printJsonSafe() 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

  1. Flash the Arduino sketch from the Arduino/ folder
  2. Copy the 4 HTML files from sdcard/ to your SD card (replace existing)
  3. 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

29 Jan 20:59
a4f0553

Choose a tag to compare

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:

  1. Arduino boots → tries to initialize SDI Shield
  2. Shield blocks on I2C communication
  3. Watchdog triggers reset after 8 seconds
  4. 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 diagnostics
  • POST /safemode-exit - Clears safe mode flag and restarts

Technical Details

New Files

  • SafeMode.h - Header with EEPROM addresses and API
  • SafeMode.cpp - Boot failure detection and recovery logic
  • safemode.html - Diagnostic web interface (copy to SD card)

Modified Files

  • TallyCCUPro.ino - SafeMode integration, dual boot paths
  • TallyManager.cpp - Skip SDI Shield init in Safe Mode
  • WebServer.h - New handler declarations
  • WebServer.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

  1. Upload new firmware to Arduino
  2. Copy safemode.html to SD card root
  3. System will boot normally

To test Safe Mode:

  1. Send safemode via serial
  2. Send reset or power cycle
  3. System enters Safe Mode
  4. Access web interface to see diagnostic page
  5. 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

28 Jan 17:21
d72a8ca

Choose a tag to compare

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

27 Jan 19:48
487798f

Choose a tag to compare

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 needed
  • CCUState.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

26 Jan 16:14
750d81f

Choose a tag to compare

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

25 Jan 18:03
95d6d05

Choose a tag to compare

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

20 Jan 16:58
945952c

Choose a tag to compare

Full WEB GUI update

TallyCCUPro V3.0

16 Jan 23:14
934ce6f

Choose a tag to compare

Initial Public Release