Aggiunta stili CSS per Kiosk, struttura HTML per la Mappa e Riferimenti ai Sensori

• Creato un nuovo file CSS per gli stili del chiosco (kiosk) con variabili, stili per le schede (card) e animazioni.
• Aggiunto un file HTML per l'interfaccia della mappa utilizzando Mapbox, inclusi gli stili e il JavaScript per le funzionalità della mappa.
• Introdotto un file JSON per i riferimenti ai sensori, definendo percorsi ed elementi per i dati di temperatura, vento, onde, posizione, batteria, motore e sistema.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Giuseppe Raffa
2026-04-23 16:19:11 +02:00
parent 41f33ce181
commit bb8d267cd4
85 changed files with 4293 additions and 5083 deletions

View File

@@ -0,0 +1,27 @@
const router = require('express').Router();
const {
FORECAST_CURRENT,
FORECAST_HOURLY,
MARINE_CURRENT,
MARINE_HOURLY,
LOG_PATHS
} = require('../../rules');
const api_url = process.env.API_URL || 'http://api-services:3003';
router.get('/status', (req, res) => {
res.json({ cloud: 'active', api: api_url, version: '2.0' });
});
// Ritorna la configurazione statica corrente
router.get('/config', (req, res) => {
res.json({
forecast_current: FORECAST_CURRENT,
forecast_hourly: FORECAST_HOURLY,
marine_current: MARINE_CURRENT,
marine_hourly: MARINE_HOURLY,
log_paths: LOG_PATHS
});
});
module.exports = router;

View File

@@ -0,0 +1,16 @@
const router = require('express').Router();
const express = require('express');
const path = require('path')
const kioskPath = path.join(__dirname, '../../tools/kiosk');
router.use('/', express.static(kioskPath));
router.get('/', (req, res) => {
res.sendFile(path.join(kioskPath, 'dashboard.html'));
});
router.get('/api/', (req, res) => {});
module.exports = router;

View File

@@ -0,0 +1,38 @@
const router = require('express').Router();
const db = require('../../config/skFlow')
const config = require('../../config/configManager.js')
router.get('/', (req, res) => {
const { path } = req.query;
const data = db.get(path);
res.json(data);
});
router.get('/', (req, res) => {
const { source } = req.query;
const data = db.getBySource(source);
res.json(data);
});
router.get('/info', (req, res) => {
const info = {
telegram: config.getTelegramToken(),
sensor: {
name: config.getSensorName(),
code: config.getSensorCode()
},
other: {
api_url: process.env.API_URL,
realtime_url: process.env.REALTIME_URL,
realtime_socket_url: process.env.REALTIME_SOCKET_URL,
reconnect_delay: config.getReconnectDelay()
}
}
res.json(info);
});
module.exports = router;

View File

@@ -0,0 +1,34 @@
const router = require('express').Router();
const express = require('express');
const path = require('path');
const fs = require('fs');
const configManager = require('../../config/configManager.js');
const kioskPath = path.join(__dirname, '../../tools/kiosk');
const htmlFile = path.join(kioskPath, 'kiosk.html');
router.use('/', express.static(kioskPath));
router.get('/', (req, res) => {
const apiUrl = process.env.API_URL || 'https://api.mebboat.it';
const realtimeUrl = process.env.REALTIME_URL || 'https://realtime.mebboat.it';
const realtimeWsUrl = process.env.REALTIME_SOCKET_URL || 'wss://realtime.mebboat.it';
const sensorCode = configManager.getSensorCode();
const sensorName = configManager.getSensorName();
const esc = (s) => String(s || '').replace(/"/g, '&quot;');
const metas = `
<meta name="api-url" content="${esc(apiUrl)}">
<meta name="realtime-url" content="${esc(realtimeUrl)}">
<meta name="realtime-ws-url" content="${esc(realtimeWsUrl)}">
<meta name="sensor-code" content="${esc(sensorCode)}">
<meta name="sensor-name" content="${esc(sensorName)}">
`;
let html;
try { html = fs.readFileSync(htmlFile, 'utf8'); }
catch (e) { return res.status(500).send('kiosk.html not found'); }
html = html.replace('</head>', metas + '</head>');
res.set('Content-Type', 'text/html').send(html);
});
module.exports = router;

View File

@@ -0,0 +1,9 @@
const router = require('express').Router();
const path = require('path')
//Endpoints per controllare lo stato di un servizio di mappe da implementare poi..
router.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../tools/map/map.html'));
});
module.exports = router;

View File

@@ -0,0 +1,55 @@
const core = require('../../cores/logs.local')
const router = require('express').Router();
router.post('/start', async (req, res) => {
const { name } = req.body;
const session = await core.startRecording(name);
res.status(200).send({
status: 'Started',
session: session
});
});
router.get('/', (req, res) => {
const session = core.getSession();
if (session) {
res.status(200).send(session);
} else {
res.status(404).send({ session: 'Nessuna sessione attiva' });
}
});
router.get('/list', async (req, res) => {
const logs = await core.listLogs();
res.status(200).send(logs);
});
router.get('/:log', async (req, res) => {
const { log } = req.params
const data = await core.getLog(log);
if (data) {
res.status(200).send(data);
} else {
res.status(404).send({ error: 'Log non trovato' });
}
});
router.get('/download/:name', (req, res) => {
const name = req.params.name;
const filePath = core.getLogFile(name);
if (filePath) {
res.download(filePath);
} else {
res.status(404).send({ error: 'File non trovato' });
}
});
router.post('/stop', async (req, res) => {
await core.stopRecording();
res.status(200).send({
status: 'Stopped'
});
});
module.exports = router;