From 72cde1a90a7c9d2db4bb2200104e6ef2fb3f2b4a Mon Sep 17 00:00:00 2001 From: Niklas Jensen Date: Fri, 2 Jan 2026 19:13:18 +0100 Subject: [PATCH] Fix i2c svelte --- .../lib/platform_shared/websocket_message.ts | 97 ++++++++++++++++++- app/src/lib/types/models.ts | 7 -- app/src/routes/peripherals/i2c/i2c.svelte | 47 ++++----- platform_shared/websocket_message.proto | 2 + 4 files changed, 117 insertions(+), 36 deletions(-) diff --git a/app/src/lib/platform_shared/websocket_message.ts b/app/src/lib/platform_shared/websocket_message.ts index 856d4ad..acd2586 100644 --- a/app/src/lib/platform_shared/websocket_message.ts +++ b/app/src/lib/platform_shared/websocket_message.ts @@ -199,6 +199,9 @@ export interface I2CScanData { devices: I2CDevice[]; } +export interface I2CScanDataRequest { +} + export interface PeripheralSettingsData { sda: number; scl: number; @@ -286,6 +289,7 @@ export interface WebsocketMessage { analytics?: AnalyticsData | undefined; angles?: AnglesData | undefined; i2cScan?: I2CScanData | undefined; + i2cScanDataRequest?: I2CScanDataRequest | undefined; peripheralSettings?: PeripheralSettingsData | undefined; peripheralSettingsDataRequest?: PeripheralSettingsDataRequest | undefined; kinematicData?: KinematicData | undefined; @@ -1856,6 +1860,49 @@ export const I2CScanData: MessageFns = { }, }; +function createBaseI2CScanDataRequest(): I2CScanDataRequest { + return {}; +} + +export const I2CScanDataRequest: MessageFns = { + encode(_: I2CScanDataRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): I2CScanDataRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseI2CScanDataRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): I2CScanDataRequest { + return {}; + }, + + toJSON(_: I2CScanDataRequest): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): I2CScanDataRequest { + return I2CScanDataRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): I2CScanDataRequest { + const message = createBaseI2CScanDataRequest(); + return message; + }, +}; + function createBasePeripheralSettingsData(): PeripheralSettingsData { return { sda: 0, scl: 0, frequency: 0, pins: [] }; } @@ -2932,6 +2979,7 @@ function createBaseWebsocketMessage(): WebsocketMessage { analytics: undefined, angles: undefined, i2cScan: undefined, + i2cScanDataRequest: undefined, peripheralSettings: undefined, peripheralSettingsDataRequest: undefined, kinematicData: undefined, @@ -2979,6 +3027,9 @@ export const WebsocketMessage: MessageFns = { if (message.i2cScan !== undefined) { I2CScanData.encode(message.i2cScan, writer.uint32(1442).fork()).join(); } + if (message.i2cScanDataRequest !== undefined) { + I2CScanDataRequest.encode(message.i2cScanDataRequest, writer.uint32(1450).fork()).join(); + } if (message.peripheralSettings !== undefined) { PeripheralSettingsData.encode(message.peripheralSettings, writer.uint32(1522).fork()).join(); } @@ -3103,6 +3154,14 @@ export const WebsocketMessage: MessageFns = { message.i2cScan = I2CScanData.decode(reader, reader.uint32()); continue; } + case 181: { + if (tag !== 1450) { + break; + } + + message.i2cScanDataRequest = I2CScanDataRequest.decode(reader, reader.uint32()); + continue; + } case 190: { if (tag !== 1522) { break; @@ -3176,6 +3235,9 @@ export const WebsocketMessage: MessageFns = { analytics: isSet(object.analytics) ? AnalyticsData.fromJSON(object.analytics) : undefined, angles: isSet(object.angles) ? AnglesData.fromJSON(object.angles) : undefined, i2cScan: isSet(object.i2cScan) ? I2CScanData.fromJSON(object.i2cScan) : undefined, + i2cScanDataRequest: isSet(object.i2cScanDataRequest) + ? I2CScanDataRequest.fromJSON(object.i2cScanDataRequest) + : undefined, peripheralSettings: isSet(object.peripheralSettings) ? PeripheralSettingsData.fromJSON(object.peripheralSettings) : undefined, @@ -3227,6 +3289,9 @@ export const WebsocketMessage: MessageFns = { if (message.i2cScan !== undefined) { obj.i2cScan = I2CScanData.toJSON(message.i2cScan); } + if (message.i2cScanDataRequest !== undefined) { + obj.i2cScanDataRequest = I2CScanDataRequest.toJSON(message.i2cScanDataRequest); + } if (message.peripheralSettings !== undefined) { obj.peripheralSettings = PeripheralSettingsData.toJSON(message.peripheralSettings); } @@ -3285,6 +3350,9 @@ export const WebsocketMessage: MessageFns = { message.i2cScan = (object.i2cScan !== undefined && object.i2cScan !== null) ? I2CScanData.fromPartial(object.i2cScan) : undefined; + message.i2cScanDataRequest = (object.i2cScanDataRequest !== undefined && object.i2cScanDataRequest !== null) + ? I2CScanDataRequest.fromPartial(object.i2cScanDataRequest) + : undefined; message.peripheralSettings = (object.peripheralSettings !== undefined && object.peripheralSettings !== null) ? PeripheralSettingsData.fromPartial(object.peripheralSettings) : undefined; @@ -4205,6 +4273,18 @@ export const protoMetadata: ProtoMetadata = { "reservedRange": [], "reservedName": [], "visibility": 0, + }, { + "name": "I2CScanDataRequest", + "field": [], + "extension": [], + "nestedType": [], + "enumType": [], + "extensionRange": [], + "oneofDecl": [], + "options": undefined, + "reservedRange": [], + "reservedName": [], + "visibility": 0, }, { "name": "PeripheralSettingsData", "field": [{ @@ -4855,6 +4935,18 @@ export const protoMetadata: ProtoMetadata = { "jsonName": "i2cScan", "options": undefined, "proto3Optional": false, + }, { + "name": "i2c_scan_data_request", + "number": 181, + "label": 1, + "type": 11, + "typeName": ".socket_message.I2CScanDataRequest", + "extendee": "", + "defaultValue": "", + "oneofIndex": 0, + "jsonName": "i2cScanDataRequest", + "options": undefined, + "proto3Optional": false, }, { "name": "peripheral_settings", "number": 190, @@ -4975,8 +5067,8 @@ export const protoMetadata: ProtoMetadata = { "trailingComments": "", "leadingDetachedComments": [], }, { - "path": [4, 27], - "span": [111, 0, 132, 1], + "path": [4, 28], + "span": [112, 0, 134, 1], "leadingComments": " WebSocket message wrapper\n Only ONE field will be set at a time (oneof ensures this)\n", "trailingComments": "", "leadingDetachedComments": [], @@ -5001,6 +5093,7 @@ export const protoMetadata: ProtoMetadata = { ".socket_message.AnalyticsData": AnalyticsData, ".socket_message.AnglesData": AnglesData, ".socket_message.I2CScanData": I2CScanData, + ".socket_message.I2CScanDataRequest": I2CScanDataRequest, ".socket_message.PeripheralSettingsData": PeripheralSettingsData, ".socket_message.PeripheralSettingsDataRequest": PeripheralSettingsDataRequest, ".socket_message.WifiSettingsData": WifiSettingsData, diff --git a/app/src/lib/types/models.ts b/app/src/lib/types/models.ts index c289675..a85a240 100644 --- a/app/src/lib/types/models.ts +++ b/app/src/lib/types/models.ts @@ -54,13 +54,6 @@ export type Rssi = { -export interface I2CDevice { - address: number - part_number: string - name: string -} - - export type CameraSettings = { framesize: number quality: number diff --git a/app/src/routes/peripherals/i2c/i2c.svelte b/app/src/routes/peripherals/i2c/i2c.svelte index fb7edd1..fd96699 100644 --- a/app/src/routes/peripherals/i2c/i2c.svelte +++ b/app/src/routes/peripherals/i2c/i2c.svelte @@ -2,50 +2,43 @@ import SettingsCard from '$lib/components/SettingsCard.svelte' import { onMount } from 'svelte' import { socket } from '$lib/stores' - import { type I2CDevice } from '$lib/types/models' import { Connection } from '$lib/components/icons' import I2CSetting from './i2cSetting.svelte' - import { I2CScanData } from '$lib/platform_shared/websocket_message' + import { I2CDevice, I2CScanData, I2CScanDataRequest } from '$lib/platform_shared/websocket_message' - const i2cDevices = [ - { address: 30, part_number: 'HMC5883', name: '3-Axis Digital Compass/Magnetometer IC' }, - { address: 41, part_number: 'BNO055', name: '9-Axis Absolute Orientation Sensor' }, - { address: 64, part_number: 'PCA9685', name: '16-channel PWM driver default address' }, - { address: 72, part_number: 'ADS1115', name: '4-channel 16-bit ADC' }, - { - address: 104, - part_number: 'MPU6050', - name: 'Six-Axis (Gyro + Accelerometer) MEMS MotionTracking™ Devices' - }, - { address: 115, part_number: 'PAJ7620U2', name: 'Gesture sensor' }, - { address: 119, part_number: 'BMP085', name: 'Temp/Barometric' } - ] + // TODO: Delete this completely, this should be done on esp side, as it decides what addresses are actually valid, as for example ICM20948 and MPU6050 can have same address + // const i2cDevices = [ + // { address: 30, part_number: 'HMC5883', name: '3-Axis Digital Compass/Magnetometer IC' }, + // { address: 41, part_number: 'BNO055', name: '9-Axis Absolute Orientation Sensor' }, + // { address: 64, part_number: 'PCA9685', name: '16-channel PWM driver default address' }, + // { address: 72, part_number: 'ADS1115', name: '4-channel 16-bit ADC' }, + // { + // address: 104, + // part_number: 'MPU6050', + // name: 'Six-Axis (Gyro + Accelerometer) MEMS MotionTracking™ Devices' + // }, + // { address: 115, part_number: 'PAJ7620U2', name: 'Gesture sensor' }, + // { address: 119, part_number: 'BMP085', name: 'Temp/Barometric' } + // ] let active_devices: I2CDevice[] = $state([]) let isLoading = $state(false) onMount(() => { - socket.on(I2CScanData, handleScan) + const unsub = socket.on(I2CScanData, handleScan) triggerScan() - return () => socket.off(I2CScanData, handleScan) + return () => unsub }) - const handleScan = (data: { addresses: number[] }) => { - active_devices = data.addresses.map( - (address: number) => - i2cDevices.find(device => device.address === address) || { - address, - part_number: 'Unknown', - name: 'Unknown' - } - ) + const handleScan = (data: I2CScanData) => { + active_devices = data.devices isLoading = false } const triggerScan = () => { isLoading = true - socket.sendEvent(I2CScanData, '') + socket.sendEvent(I2CScanDataRequest, {}) } diff --git a/platform_shared/websocket_message.proto b/platform_shared/websocket_message.proto index a2d7fc9..b357605 100644 --- a/platform_shared/websocket_message.proto +++ b/platform_shared/websocket_message.proto @@ -72,6 +72,7 @@ message AnalyticsData { } message AnglesData { repeated int32 angles = 1; } message I2CScanData { repeated I2CDevice devices = 1; } +message I2CScanDataRequest {} message PeripheralSettingsData { int32 sda = 1; int32 scl = 2; int32 frequency = 3; repeated PinConfig pins = 4; } message PeripheralSettingsDataRequest {} message WifiSettingsData { string hostname = 1; bool priority_rssi = 2; repeated KnownNetworkItem wifi_networks = 3; } @@ -123,6 +124,7 @@ message WebsocketMessage { AnalyticsData analytics = 150; AnglesData angles = 170; I2CScanData i2c_scan = 180; + I2CScanDataRequest i2c_scan_data_request = 181; PeripheralSettingsData peripheral_settings = 190; PeripheralSettingsDataRequest peripheral_settings_data_request = 191; KinematicData kinematic_data = 200;