доработка текущего времени raspberry на экране

This commit is contained in:
Maxim
2026-06-16 13:22:17 +03:00
parent 875aa8a054
commit bc40c1437a
7 changed files with 35 additions and 6 deletions

View File

@@ -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"),
}) })
} }

View File

@@ -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) ===== */

View File

@@ -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>

View File

@@ -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();

View File

@@ -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;

View File

@@ -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;
} }

View File

@@ -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;