доработка отображения пик холдера в прогресс баре
This commit is contained in:
@@ -9,7 +9,7 @@ import {
|
|||||||
resetBufferTracking,
|
resetBufferTracking,
|
||||||
updatePeakHolder,
|
updatePeakHolder,
|
||||||
updateSignalPeakHolder,
|
updateSignalPeakHolder,
|
||||||
forceResetPeak
|
setPeakHolderListener
|
||||||
} from "./state.js";
|
} from "./state.js";
|
||||||
import {
|
import {
|
||||||
initDOM,
|
initDOM,
|
||||||
@@ -36,6 +36,13 @@ window.addEventListener("DOMContentLoaded", () => {
|
|||||||
initAccordion();
|
initAccordion();
|
||||||
initResize();
|
initResize();
|
||||||
initCamera();
|
initCamera();
|
||||||
|
|
||||||
|
setPeakHolderListener(() => {
|
||||||
|
if (!connectionLost) {
|
||||||
|
setBars(state.peakValue);
|
||||||
|
setSignal(state.peakSignalLevel);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
document.addEventListener("keydown", (e: KeyboardEvent) => {
|
document.addEventListener("keydown", (e: KeyboardEvent) => {
|
||||||
|
|||||||
@@ -11,12 +11,17 @@ interface AppState {
|
|||||||
peakTimer: number | null; // Таймер для сброса пика амплитуды
|
peakTimer: number | null; // Таймер для сброса пика амплитуды
|
||||||
peakHoldTime: number; // Время удержания пика в миллисекундах
|
peakHoldTime: number; // Время удержания пика в миллисекундах
|
||||||
|
|
||||||
peakSignalLevel: number; // Текущий удерживаемый пиковый уровень сигнала (0-3)
|
// Peak Holder для уровня сигнала
|
||||||
currentSignalLevel: number; // Текущий реальный уровень сигнала
|
peakSignalLevel: number;
|
||||||
signalPeakTimer: number | null; // Таймер для сброса пика сигнала
|
currentSignalLevel: number;
|
||||||
signalPeakHoldTime: number; // Время удержания пика сигнала
|
signalPeakTimer: number | null;
|
||||||
|
signalPeakHoldTime: number;
|
||||||
|
|
||||||
|
hasPeak: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PeakHolderListener = () => void;
|
||||||
|
|
||||||
export const state: AppState = {
|
export const state: AppState = {
|
||||||
maxPoints: 1000,
|
maxPoints: 1000,
|
||||||
signalHistory: [],
|
signalHistory: [],
|
||||||
@@ -30,9 +35,59 @@ export const state: AppState = {
|
|||||||
peakSignalLevel: 0,
|
peakSignalLevel: 0,
|
||||||
currentSignalLevel: 0,
|
currentSignalLevel: 0,
|
||||||
signalPeakTimer: null,
|
signalPeakTimer: null,
|
||||||
signalPeakHoldTime: 3000, // 3 секунды
|
signalPeakHoldTime: 3000,
|
||||||
|
|
||||||
|
hasPeak: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let peakHolderListener: PeakHolderListener | null = null;
|
||||||
|
|
||||||
|
/** Обновление UI при сбросе peak holder по таймеру (между опросами API). */
|
||||||
|
export function setPeakHolderListener(listener: PeakHolderListener | null): void {
|
||||||
|
peakHolderListener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifyPeakHolderChange(): void {
|
||||||
|
if (peakHolderListener) {
|
||||||
|
peakHolderListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleAmplitudePeakRelease(): void {
|
||||||
|
// Сбрасываем старый таймер
|
||||||
|
if (state.peakTimer !== null) {
|
||||||
|
clearTimeout(state.peakTimer);
|
||||||
|
state.peakTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запускаем новый таймер на 3 секунды
|
||||||
|
state.peakTimer = window.setTimeout(() => {
|
||||||
|
state.peakValue = state.currentValue;
|
||||||
|
state.peakTimer = null;
|
||||||
|
state.hasPeak = false;
|
||||||
|
console.log(`[Peak] Сброс пика до: ${state.peakValue}`);
|
||||||
|
notifyPeakHolderChange();
|
||||||
|
}, state.peakHoldTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleSignalPeakRelease(): void {
|
||||||
|
// Сбрасываем старый таймер
|
||||||
|
if (state.signalPeakTimer !== null) {
|
||||||
|
clearTimeout(state.signalPeakTimer);
|
||||||
|
state.signalPeakTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запускаем новый таймер на 3 секунды
|
||||||
|
state.signalPeakTimer = window.setTimeout(() => {
|
||||||
|
// Сбрасываем пик к текущему уровню
|
||||||
|
state.peakSignalLevel = state.currentSignalLevel;
|
||||||
|
state.signalPeakTimer = null;
|
||||||
|
state.hasPeak = false;
|
||||||
|
console.log(`[SignalPeak] Сброс пика до: ${state.peakSignalLevel}`);
|
||||||
|
notifyPeakHolderChange();
|
||||||
|
}, state.signalPeakHoldTime);
|
||||||
|
}
|
||||||
|
|
||||||
// ========== ФУНКЦИИ ДЛЯ АМПЛИТУДЫ ==========
|
// ========== ФУНКЦИИ ДЛЯ АМПЛИТУДЫ ==========
|
||||||
|
|
||||||
export function updatePeakHolder(target: number): number {
|
export function updatePeakHolder(target: number): number {
|
||||||
@@ -43,127 +98,52 @@ export function updatePeakHolder(target: number): number {
|
|||||||
if (target > state.peakValue) {
|
if (target > state.peakValue) {
|
||||||
// Устанавливаем новый пик
|
// Устанавливаем новый пик
|
||||||
state.peakValue = target;
|
state.peakValue = target;
|
||||||
|
state.hasPeak = true;
|
||||||
// Сбрасываем и перезапускаем таймер
|
scheduleAmplitudePeakRelease();
|
||||||
resetPeakTimer();
|
} else if (target < state.peakValue && state.peakTimer === null) {
|
||||||
startPeakTimer();
|
// Пик выше текущего значения, но таймер пропал — перезапускаем удержание
|
||||||
|
scheduleAmplitudePeakRelease();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Возвращаем текущий пик для отображения
|
// Возвращаем текущий пик
|
||||||
return state.peakValue;
|
return state.peakValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// ========== ФУНКЦИИ ДЛЯ УРОВНЯ СИГНАЛА ==========
|
||||||
* Запуск таймера сброса пика
|
|
||||||
*/
|
|
||||||
function startPeakTimer(): void {
|
|
||||||
if (state.peakTimer !== null) {
|
|
||||||
clearTimeout(state.peakTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
state.peakTimer = window.setTimeout(() => {
|
|
||||||
resetPeak();
|
|
||||||
}, state.peakHoldTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сброс таймера пика
|
|
||||||
*/
|
|
||||||
function resetPeakTimer(): void {
|
|
||||||
if (state.peakTimer !== null) {
|
|
||||||
clearTimeout(state.peakTimer);
|
|
||||||
state.peakTimer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сброс пикового значения до текущего уровня
|
|
||||||
*/
|
|
||||||
function resetPeak(): void {
|
|
||||||
state.peakValue = state.currentValue;
|
|
||||||
state.peakTimer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Обновление пикового уровня сигнала (peak holder для strength)
|
|
||||||
* @param level - новый уровень сигнала (0-3)
|
|
||||||
* @returns пиковый уровень для отображения
|
|
||||||
*/
|
|
||||||
export function updateSignalPeakHolder(level: number): number {
|
export function updateSignalPeakHolder(level: number): number {
|
||||||
// Обновляем текущее значение
|
// Обновляем текущее значение
|
||||||
state.currentSignalLevel = level;
|
state.currentSignalLevel = level;
|
||||||
|
|
||||||
// Если новый уровень выше текущего пика
|
// Если новый уровень больше пика — устанавливаем новый пик
|
||||||
if (level > state.peakSignalLevel) {
|
if (level > state.peakSignalLevel) {
|
||||||
// Устанавливаем новый пик
|
|
||||||
state.peakSignalLevel = level;
|
state.peakSignalLevel = level;
|
||||||
|
state.hasPeak = true;
|
||||||
// Сбрасываем и перезапускаем таймер
|
scheduleSignalPeakRelease();
|
||||||
resetSignalPeakTimer();
|
} else if (level < state.peakSignalLevel && state.signalPeakTimer === null) {
|
||||||
startSignalPeakTimer();
|
scheduleSignalPeakRelease();
|
||||||
|
|
||||||
// Опционально: лог для отладки
|
|
||||||
// console.log(`[SignalPeak] Новый пик сигнала: ${state.peakSignalLevel}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Возвращаем текущий пик для отображения
|
// Возвращаем текущий пик
|
||||||
return state.peakSignalLevel;
|
return state.peakSignalLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// ========== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ==========
|
||||||
* Запуск таймера сброса пика сигнала
|
|
||||||
*/
|
|
||||||
function startSignalPeakTimer(): void {
|
|
||||||
if (state.signalPeakTimer !== null) {
|
|
||||||
clearTimeout(state.signalPeakTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
state.signalPeakTimer = window.setTimeout(() => {
|
export function forceResetSignalPeak(): void {
|
||||||
resetSignalPeak();
|
|
||||||
}, state.signalPeakHoldTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сброс таймера пика сигнала
|
|
||||||
*/
|
|
||||||
function resetSignalPeakTimer(): void {
|
|
||||||
if (state.signalPeakTimer !== null) {
|
if (state.signalPeakTimer !== null) {
|
||||||
clearTimeout(state.signalPeakTimer);
|
clearTimeout(state.signalPeakTimer);
|
||||||
state.signalPeakTimer = null;
|
state.signalPeakTimer = null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сброс пикового уровня сигнала до текущего уровня
|
|
||||||
*/
|
|
||||||
function resetSignalPeak(): void {
|
|
||||||
state.peakSignalLevel = state.currentSignalLevel;
|
|
||||||
state.signalPeakTimer = null;
|
|
||||||
|
|
||||||
// Опционально: лог для отладки
|
|
||||||
// console.log(`[SignalPeak] Сброс пика сигнала до: ${state.peakSignalLevel}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Принудительный сброс пика сигнала (например, при потере связи)
|
|
||||||
*/
|
|
||||||
export function forceResetSignalPeak(): void {
|
|
||||||
resetSignalPeakTimer();
|
|
||||||
state.peakSignalLevel = 0;
|
state.peakSignalLevel = 0;
|
||||||
state.currentSignalLevel = 0;
|
state.currentSignalLevel = 0;
|
||||||
|
state.hasPeak = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Обновление времени удержания пика сигнала
|
|
||||||
* @param ms - время в миллисекундах
|
|
||||||
*/
|
|
||||||
export function setSignalPeakHoldTime(ms: number): void {
|
export function setSignalPeakHoldTime(ms: number): void {
|
||||||
state.signalPeakHoldTime = ms;
|
state.signalPeakHoldTime = ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Получение текущего состояния пика сигнала (для отладки)
|
|
||||||
*/
|
|
||||||
export function getSignalPeakInfo(): { peak: number; current: number; timerActive: boolean } {
|
export function getSignalPeakInfo(): { peak: number; current: number; timerActive: boolean } {
|
||||||
return {
|
return {
|
||||||
peak: state.peakSignalLevel,
|
peak: state.peakSignalLevel,
|
||||||
@@ -172,13 +152,14 @@ export function getSignalPeakInfo(): { peak: number; current: number; timerActiv
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== ОБНОВЛЕННЫЕ ФУНКЦИИ ДЛЯ СБРОСА ==========
|
|
||||||
|
|
||||||
export function forceResetPeak(): void {
|
export function forceResetPeak(): void {
|
||||||
resetPeakTimer();
|
if (state.peakTimer !== null) {
|
||||||
|
clearTimeout(state.peakTimer);
|
||||||
|
state.peakTimer = null;
|
||||||
|
}
|
||||||
state.peakValue = 0;
|
state.peakValue = 0;
|
||||||
state.currentValue = 0;
|
state.currentValue = 0;
|
||||||
|
state.hasPeak = false;
|
||||||
forceResetSignalPeak();
|
forceResetSignalPeak();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,5 +190,5 @@ export function addSignals(values: number[], bufferSize: number): void {
|
|||||||
|
|
||||||
export function resetBufferTracking(): void {
|
export function resetBufferTracking(): void {
|
||||||
state.lastBufferSize = 0;
|
state.lastBufferSize = 0;
|
||||||
forceResetPeak(); // Сбрасываем оба пика
|
forceResetPeak();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user