From a31e001eb5b452e0cddd9ea8a7caf24f13cc96b5 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Sat, 3 Jan 2026 17:41:42 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Moves=20analytics=20subscr?= =?UTF-8?q?iption=20handling=20to=20store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/package.json | 3 +- app/src/lib/stores/analytics.ts | 29 +++++-- app/src/lib/types/models.ts | 50 +++++++++++ app/src/routes/+layout.svelte | 36 +++----- .../system/metrics/SystemMetrics.svelte | 9 +- app/src/routes/wifi/sta/Wifi.svelte | 82 +++++++++---------- 6 files changed, 128 insertions(+), 81 deletions(-) diff --git a/app/package.json b/app/package.json index 3c156be..c58e555 100644 --- a/app/package.json +++ b/app/package.json @@ -47,8 +47,7 @@ "typescript-eslint": "^8.51.0", "unplugin-icons": "^22.4.2", "vite": "^7.1.9", - "vitest": "^3.2.4", - "ws": "^8.18.3" + "vitest": "^3.2.4" }, "type": "module", "dependencies": { diff --git a/app/src/lib/stores/analytics.ts b/app/src/lib/stores/analytics.ts index 4016466..d4e0baf 100644 --- a/app/src/lib/stores/analytics.ts +++ b/app/src/lib/stores/analytics.ts @@ -1,19 +1,34 @@ import { AnalyticsData } from '$lib/platform_shared/message' import { writable } from 'svelte/store' - -const analytics_data: AnalyticsData[] = [] +import { socket } from './socket' const maxAnalyticsData = 100 function createAnalytics() { - const { subscribe, update } = writable(analytics_data) + const { subscribe, update } = writable([]) + + let unsubscribe: (() => void) | null = null + let listenerCount = 0 + + const addData = (content: AnalyticsData) => { + update(data => [...data, content].slice(-maxAnalyticsData)) + } return { subscribe, - addData: (content: AnalyticsData) => { - update(analytics_data => { - return [...analytics_data, content].slice(-maxAnalyticsData) - }) + addData, + listen: () => { + listenerCount++ + if (!unsubscribe) { + unsubscribe = socket.on(AnalyticsData, addData) + } + }, + stop: () => { + listenerCount = Math.max(0, listenerCount - 1) + if (listenerCount === 0 && unsubscribe) { + unsubscribe() + unsubscribe = null + } } } } diff --git a/app/src/lib/types/models.ts b/app/src/lib/types/models.ts index 744f2ae..2827afe 100644 --- a/app/src/lib/types/models.ts +++ b/app/src/lib/types/models.ts @@ -1,3 +1,53 @@ +export enum MessageTopic { + imu = 'imu', + imuCalibrate = 'imuCalibrate', + mode = 'mode', + input = 'input', + analytics = 'analytics', + position = 'position', + angles = 'angles', + i2cScan = 'i2cScan', + peripheralSettings = 'peripheralSettings', + otastatus = 'otastatus', + gait = 'walk_gait', + servoState = 'servoState', + servoPWM = 'servoPWM', + WiFiSettings = 'WiFiSettings', + sonar = 'sonar', + rssi = 'rssi' +} + +export type WifiStatus = { + status: number + local_ip: string + mac_address: string + rssi: number + ssid: string + bssid: string + channel: number + subnet_mask: string + gateway_ip: string + dns_ip_1: string + dns_ip_2?: string +} + +export type KnownNetworkItem = { + ssid: string + password: string + static_ip_config: boolean + local_ip?: string + subnet_mask?: string + gateway_ip?: string + dns_ip_1?: string + dns_ip_2?: string +} + +export type WifiSettings = { + hostname: string + priority_RSSI: boolean + wifi_networks: KnownNetworkItem[] +} + export type vector = { x: number; y: number } export type GithubRelease = { diff --git a/app/src/routes/+layout.svelte b/app/src/routes/+layout.svelte index ade79c7..9a1caa9 100644 --- a/app/src/routes/+layout.svelte +++ b/app/src/routes/+layout.svelte @@ -10,7 +10,6 @@ import Statusbar from '../lib/components/statusbar/statusbar.svelte' import { telemetry, - analytics, kinematicData, mode, input, @@ -22,13 +21,11 @@ walkGait } from '$lib/stores' import { - AnalyticsData, AnglesData, DownloadOTAData, HumanInputData, KinematicData, ModeData, - PingMsg, RSSIData, SonarData, WalkGaitData @@ -68,23 +65,14 @@ const eventListeners: (() => void)[] = [] const addEventListeners = () => { eventListeners.push( - ...[ - socket.onEvent('open', handleOpen), - socket.onEvent('close', handleClose), - socket.onEvent('error', handleError), - socket.on(RSSIData, data => telemetry.setRSSI(data)), - socket.on(ModeData, data => mode.set(data)), - socket.on(AnalyticsData, data => { - // console.log(data); - analytics.addData(data) - }), - socket.on(AnglesData, data => { - servoAngles.set(data) - }), - socket.on(PingMsg, data => { - console.log('Ping received!') - }) - ] + socket.onEvent('open', handleOpen), + socket.onEvent('close', handleClose), + socket.onEvent('error', handleError), + socket.on(RSSIData, data => telemetry.setRSSI(data)), + socket.on(ModeData, data => mode.set(data)), + socket.on(AnglesData, data => { + servoAngles.set(data) + }) ) features.subscribe(data => { if (data?.download_firmware) @@ -96,14 +84,10 @@ } const removeEventListeners = () => { - for (let offFunction of eventListeners) { - offFunction() - } + eventListeners.forEach(offFunction => offFunction()) } - const handleOpen = () => { - notifications.success('Connection to device established', 5000) - } + const handleOpen = () => notifications.success('Connection to device established', 5000) const handleClose = () => { notifications.error('Connection to device lost', 5000) diff --git a/app/src/routes/system/metrics/SystemMetrics.svelte b/app/src/routes/system/metrics/SystemMetrics.svelte index 7965c33..7f1cd7f 100644 --- a/app/src/routes/system/metrics/SystemMetrics.svelte +++ b/app/src/routes/system/metrics/SystemMetrics.svelte @@ -1,5 +1,5 @@