48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
// state.js (вся логика состояния)
|
|
interface AppState {
|
|
maxPoints: number;
|
|
signalHistory: number[];
|
|
smoothValue: number;
|
|
lastBufferSize: number;
|
|
}
|
|
|
|
export const state: AppState = {
|
|
maxPoints: 1000,
|
|
signalHistory: [],
|
|
smoothValue: 0,
|
|
lastBufferSize: 0,
|
|
};
|
|
|
|
export function smooth(target: number): number {
|
|
state.smoothValue += 0.2 * (target - state.smoothValue);
|
|
return state.smoothValue;
|
|
}
|
|
|
|
export function addSignal(value: number): void {
|
|
state.signalHistory.push(value);
|
|
if (state.signalHistory.length > state.maxPoints) {
|
|
state.signalHistory = state.signalHistory.slice(-state.maxPoints);
|
|
}
|
|
}
|
|
|
|
export function addSignals(values: number[], bufferSize: number): void {
|
|
if (!Array.isArray(values) || values.length === 0) return;
|
|
|
|
const newBytes = bufferSize - state.lastBufferSize;
|
|
|
|
if (newBytes > 0 && newBytes <= values.length) {
|
|
const fresh = values.slice(-newBytes);
|
|
const decoded = fresh.map(b => b & 0x3F);
|
|
state.signalHistory.push(...decoded);
|
|
}
|
|
|
|
state.lastBufferSize = bufferSize;
|
|
|
|
if (state.signalHistory.length > state.maxPoints) {
|
|
state.signalHistory = state.signalHistory.slice(-state.maxPoints);
|
|
}
|
|
}
|
|
|
|
export function resetBufferTracking(): void {
|
|
state.lastBufferSize = 0;
|
|
} |