доработка текущего времени raspberry на экране
This commit is contained in:
@@ -42,6 +42,8 @@ func (a *API) HandleHealth(w http.ResponseWriter, r *http.Request) {
|
|||||||
status = "Нет связи"
|
status = "Нет связи"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
writeJSON(w, map[string]any{
|
writeJSON(w, map[string]any{
|
||||||
"status": status,
|
"status": status,
|
||||||
"uptime_sec": time.Since(a.startTime).Seconds(),
|
"uptime_sec": time.Since(a.startTime).Seconds(),
|
||||||
@@ -50,6 +52,7 @@ func (a *API) HandleHealth(w http.ResponseWriter, r *http.Request) {
|
|||||||
"has_data": ok,
|
"has_data": ok,
|
||||||
"latest": latest,
|
"latest": latest,
|
||||||
"stats": a.buf.Stats(),
|
"stats": a.buf.Stats(),
|
||||||
|
"server_time": now.Format("02.01.2006 15:04"),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ body {
|
|||||||
|
|
||||||
/* ===== HEADER BAR ===== */
|
/* ===== HEADER BAR ===== */
|
||||||
.header-bar {
|
.header-bar {
|
||||||
display: flex;
|
display: grid;
|
||||||
|
grid-template-columns: 1fr auto 1fr;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,20 @@ body {
|
|||||||
h1 {
|
h1 {
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
flex: 1;
|
}
|
||||||
|
|
||||||
|
.header-time {
|
||||||
|
font-size: 16px;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border: 1px solid rgba(0, 255, 136, 0.35);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: rgba(0, 255, 136, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-bar .cam-btn {
|
||||||
|
justify-self: end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===== CAMERA BUTTON (теперь в header) ===== */
|
/* ===== CAMERA BUTTON (теперь в header) ===== */
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
<div class="header-bar">
|
<div class="header-bar">
|
||||||
<h1>GPIO МОНИТОРИНГ В РЕАЛЬНОМ ВРЕМЕНИ</h1>
|
<h1>GPIO МОНИТОРИНГ В РЕАЛЬНОМ ВРЕМЕНИ</h1>
|
||||||
|
<div id="server-time" class="header-time">--:--:--</div>
|
||||||
<button id="camToggle" class="cam-btn">
|
<button id="camToggle" class="cam-btn">
|
||||||
<span class="cam-btn-icon">📷</span>
|
<span class="cam-btn-icon">📷</span>
|
||||||
<span class="cam-btn-text">Камера</span>
|
<span class="cam-btn-text">Камера</span>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import {
|
|||||||
} from "./state.js";
|
} from "./state.js";
|
||||||
import {
|
import {
|
||||||
initDOM,
|
initDOM,
|
||||||
|
setServerTime,
|
||||||
setStatus,
|
setStatus,
|
||||||
setMeta,
|
setMeta,
|
||||||
setBars,
|
setBars,
|
||||||
@@ -82,6 +83,10 @@ async function update(): Promise<void> {
|
|||||||
|
|
||||||
consecutiveErrors = 0;
|
consecutiveErrors = 0;
|
||||||
|
|
||||||
|
if (health.server_time) {
|
||||||
|
setServerTime(health.server_time);
|
||||||
|
}
|
||||||
|
|
||||||
if (connectionLost) {
|
if (connectionLost) {
|
||||||
console.log("[app] Соединение восстановлено");
|
console.log("[app] Соединение восстановлено");
|
||||||
}
|
}
|
||||||
@@ -147,6 +152,7 @@ async function update(): Promise<void> {
|
|||||||
if (consecutiveErrors === 1) console.warn("[app] Сервер недоступен, ждём...");
|
if (consecutiveErrors === 1) console.warn("[app] Сервер недоступен, ждём...");
|
||||||
|
|
||||||
setStatus("СЕРВЕР НЕДОСТУПЕН", true);
|
setStatus("СЕРВЕР НЕДОСТУПЕН", true);
|
||||||
|
setServerTime("--:--:--");
|
||||||
setBars(0, true);
|
setBars(0, true);
|
||||||
setSignal(0, true);
|
setSignal(0, true);
|
||||||
resetBufferTracking();
|
resetBufferTracking();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ interface HealthResponse {
|
|||||||
pipe_alive: boolean;
|
pipe_alive: boolean;
|
||||||
has_data: boolean;
|
has_data: boolean;
|
||||||
latest: number;
|
latest: number;
|
||||||
|
server_time?: string;
|
||||||
stats: {
|
stats: {
|
||||||
filled: number;
|
filled: number;
|
||||||
bytes_per_sec: number;
|
bytes_per_sec: number;
|
||||||
|
|||||||
@@ -103,9 +103,7 @@ export function updatePeakHolder(target: number): number {
|
|||||||
} else if (target < state.peakValue && state.peakTimer === null) {
|
} else if (target < state.peakValue && state.peakTimer === null) {
|
||||||
// Пик выше текущего значения, но таймер пропал — перезапускаем удержание
|
// Пик выше текущего значения, но таймер пропал — перезапускаем удержание
|
||||||
scheduleAmplitudePeakRelease();
|
scheduleAmplitudePeakRelease();
|
||||||
}
|
} // Возвращаем текущий пик
|
||||||
|
|
||||||
// Возвращаем текущий пик
|
|
||||||
return state.peakValue;
|
return state.peakValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// ui.ts (DOM слой)
|
// ui.ts (DOM слой)
|
||||||
export interface DOMElements {
|
export interface DOMElements {
|
||||||
|
serverTime: HTMLElement | null;
|
||||||
status: HTMLElement | null;
|
status: HTMLElement | null;
|
||||||
meta: HTMLElement | null;
|
meta: HTMLElement | null;
|
||||||
latest: HTMLElement | null;
|
latest: HTMLElement | null;
|
||||||
@@ -13,6 +14,7 @@ export interface DOMElements {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const DOM: DOMElements = {
|
export const DOM: DOMElements = {
|
||||||
|
serverTime: null,
|
||||||
status: null,
|
status: null,
|
||||||
meta: null,
|
meta: null,
|
||||||
latest: null,
|
latest: null,
|
||||||
@@ -26,6 +28,7 @@ export const DOM: DOMElements = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export function initDOM(): void {
|
export function initDOM(): void {
|
||||||
|
DOM.serverTime = document.getElementById("server-time");
|
||||||
DOM.status = document.getElementById("status");
|
DOM.status = document.getElementById("status");
|
||||||
DOM.meta = document.getElementById("meta");
|
DOM.meta = document.getElementById("meta");
|
||||||
DOM.latest = document.getElementById("latest");
|
DOM.latest = document.getElementById("latest");
|
||||||
@@ -38,6 +41,10 @@ export function initDOM(): void {
|
|||||||
DOM.bars = document.querySelectorAll(".sig-bar");
|
DOM.bars = document.querySelectorAll(".sig-bar");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setServerTime(v: string): void {
|
||||||
|
if (DOM.serverTime) DOM.serverTime.textContent = v;
|
||||||
|
}
|
||||||
|
|
||||||
export function setStatus(v: string, isError: boolean = false): void {
|
export function setStatus(v: string, isError: boolean = false): void {
|
||||||
if (!DOM.status) return;
|
if (!DOM.status) return;
|
||||||
DOM.status.textContent = v;
|
DOM.status.textContent = v;
|
||||||
|
|||||||
Reference in New Issue
Block a user