feat: Add dynamic lock ratio icon with thresholds

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
Chris Frankland-Wright 2025-08-08 00:42:43 +01:00
parent fffc123475
commit fbae58fb1d
4 changed files with 19 additions and 3 deletions

View file

@ -34,5 +34,10 @@ const iconMap = {
'29.97': { src: 'assets/timeturner_2997.png', tooltip: '29.97 frames per second' }, '29.97': { src: 'assets/timeturner_2997.png', tooltip: '29.97 frames per second' },
'30.00': { src: 'assets/timeturner_30.png', tooltip: '30.00 frames per second' }, '30.00': { src: 'assets/timeturner_30.png', tooltip: '30.00 frames per second' },
'default': { src: 'assets/timeturner_25.png', tooltip: 'Unknown frame rate' } 'default': { src: 'assets/timeturner_25.png', tooltip: 'Unknown frame rate' }
},
lockRatio: {
'good': { src: 'assets/timeturner_lockratio_green.png', tooltip: 'Lock ratio is 100%.' },
'average': { src: 'assets/timeturner_lockratio_orange.png', tooltip: 'Lock ratio is 90% or higher.' },
'bad': { src: 'assets/timeturner_lockratio_red.png', tooltip: 'Lock ratio is below 90%.' }
} }
}; };

View file

@ -26,7 +26,7 @@
<p id="ltc-timecode">--:--:--:--</p> <p id="ltc-timecode">--:--:--:--</p>
<p id="ltc-status">--</p> <p id="ltc-status">--</p>
<p><span id="frame-rate">-- fps</span></p> <p><span id="frame-rate">-- fps</span></p>
<p>Lock Ratio: <span id="lock-ratio">--</span>%</p> <p><span id="lock-ratio">Lock Ratio: --%</span></p>
</div> </div>
<!-- System Clock & Sync --> <!-- System Clock & Sync -->

View file

@ -90,7 +90,18 @@ document.addEventListener('DOMContentLoaded', () => {
const frameRateIconInfo = iconMap.frameRate[frameRate] || iconMap.frameRate.default; const frameRateIconInfo = iconMap.frameRate[frameRate] || iconMap.frameRate.default;
statusElements.frameRate.innerHTML = `<img src="${frameRateIconInfo.src}" class="status-icon" alt="" title="${frameRateIconInfo.tooltip}"><span>${frameRate} fps</span>`; statusElements.frameRate.innerHTML = `<img src="${frameRateIconInfo.src}" class="status-icon" alt="" title="${frameRateIconInfo.tooltip}"><span>${frameRate} fps</span>`;
statusElements.lockRatio.textContent = data.lock_ratio.toFixed(2); const lockRatio = data.lock_ratio;
let lockRatioCategory;
if (lockRatio === 100) {
lockRatioCategory = 'good';
} else if (lockRatio >= 90) {
lockRatioCategory = 'average';
} else {
lockRatioCategory = 'bad';
}
const lockRatioIconInfo = iconMap.lockRatio[lockRatioCategory];
const lockRatioText = `Lock Ratio: ${lockRatio.toFixed(2)}%`;
statusElements.lockRatio.innerHTML = `<img src="${lockRatioIconInfo.src}" class="status-icon" alt="" title="${lockRatioIconInfo.tooltip}"><span>${lockRatioText}</span>`;
statusElements.systemClock.textContent = data.system_clock; statusElements.systemClock.textContent = data.system_clock;
statusElements.systemDate.textContent = data.system_date; statusElements.systemDate.textContent = data.system_date;

View file

@ -99,7 +99,7 @@ button:hover {
color: #555; color: #555;
} }
#ltc-status, #ntp-active, #sync-status, #jitter-status, #delta-status, #frame-rate { #ltc-status, #ntp-active, #sync-status, #jitter-status, #delta-status, #frame-rate, #lock-ratio {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: 0.5em; gap: 0.5em;