From 41d1b8e56d4a91082375376d2ee52dabd169c40b Mon Sep 17 00:00:00 2001 From: Niklas Jensen Date: Tue, 30 Dec 2025 01:15:03 +0100 Subject: [PATCH] Start of svelte socket rewrite --- .../lib/platform_shared/websocket_message.ts | 1269 +++++++++++++++++ app/src/lib/stores/socket.ts | 47 +- compile_proto_TEMP | 10 + .../platform_shared/websocket_message.pb.c | 60 + .../platform_shared/websocket_message.pb.h | 352 +++++ platform_shared/example.proto | 13 - platform_shared/websocket_message.proto | 49 + 7 files changed, 1769 insertions(+), 31 deletions(-) create mode 100644 app/src/lib/platform_shared/websocket_message.ts create mode 100644 esp32/src/platform_shared/websocket_message.pb.c create mode 100644 esp32/src/platform_shared/websocket_message.pb.h delete mode 100644 platform_shared/example.proto create mode 100644 platform_shared/websocket_message.proto diff --git a/app/src/lib/platform_shared/websocket_message.ts b/app/src/lib/platform_shared/websocket_message.ts new file mode 100644 index 0000000..e7f2a8a --- /dev/null +++ b/app/src/lib/platform_shared/websocket_message.ts @@ -0,0 +1,1269 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.10.1 +// protoc v6.33.2 +// source: platform_shared/websocket_message.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = ""; + +/** Individual message data types */ +export interface IMUData { + x: number; + y: number; + z: number; + temp: number; +} + +export interface IMUCalibrateData { +} + +export interface ModeData { + mode: number; +} + +export interface InputData { +} + +export interface AnalyticsData { +} + +export interface PositionData { +} + +export interface AnglesData { + angles: number[]; +} + +export interface I2CScanData { +} + +export interface PeripheralSettingsData { +} + +export interface OTAStatusData { +} + +export interface GaitData { +} + +export interface ServoStateData { +} + +export interface ServoPWMData { +} + +export interface WifiSettingsData { +} + +export interface SonarData { +} + +export interface RSSIData { + rssi: number; +} + +/** + * WebSocket message wrapper + * Only ONE field will be set at a time (oneof ensures this) + */ +export interface WebsocketMessage { + imu?: IMUData | undefined; + imuCalibrate?: IMUCalibrateData | undefined; + mode?: ModeData | undefined; + input?: InputData | undefined; + analytics?: AnalyticsData | undefined; + position?: PositionData | undefined; + angles?: AnglesData | undefined; + i2cScan?: I2CScanData | undefined; + peripheralSettings?: PeripheralSettingsData | undefined; + otaStatus?: OTAStatusData | undefined; + gait?: GaitData | undefined; + servoState?: ServoStateData | undefined; + servoPwm?: ServoPWMData | undefined; + wifiSettings?: WifiSettingsData | undefined; + sonar?: SonarData | undefined; + rssi?: RSSIData | undefined; +} + +function createBaseIMUData(): IMUData { + return { x: 0, y: 0, z: 0, temp: 0 }; +} + +export const IMUData: MessageFns = { + encode(message: IMUData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.x !== 0) { + writer.uint32(13).float(message.x); + } + if (message.y !== 0) { + writer.uint32(21).float(message.y); + } + if (message.z !== 0) { + writer.uint32(29).float(message.z); + } + if (message.temp !== 0) { + writer.uint32(37).float(message.temp); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): IMUData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIMUData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 13) { + break; + } + + message.x = reader.float(); + continue; + } + case 2: { + if (tag !== 21) { + break; + } + + message.y = reader.float(); + continue; + } + case 3: { + if (tag !== 29) { + break; + } + + message.z = reader.float(); + continue; + } + case 4: { + if (tag !== 37) { + break; + } + + message.temp = reader.float(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): IMUData { + return { + x: isSet(object.x) ? globalThis.Number(object.x) : 0, + y: isSet(object.y) ? globalThis.Number(object.y) : 0, + z: isSet(object.z) ? globalThis.Number(object.z) : 0, + temp: isSet(object.temp) ? globalThis.Number(object.temp) : 0, + }; + }, + + toJSON(message: IMUData): unknown { + const obj: any = {}; + if (message.x !== 0) { + obj.x = message.x; + } + if (message.y !== 0) { + obj.y = message.y; + } + if (message.z !== 0) { + obj.z = message.z; + } + if (message.temp !== 0) { + obj.temp = message.temp; + } + return obj; + }, + + create, I>>(base?: I): IMUData { + return IMUData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): IMUData { + const message = createBaseIMUData(); + message.x = object.x ?? 0; + message.y = object.y ?? 0; + message.z = object.z ?? 0; + message.temp = object.temp ?? 0; + return message; + }, +}; + +function createBaseIMUCalibrateData(): IMUCalibrateData { + return {}; +} + +export const IMUCalibrateData: MessageFns = { + encode(_: IMUCalibrateData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): IMUCalibrateData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIMUCalibrateData(); + 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): IMUCalibrateData { + return {}; + }, + + toJSON(_: IMUCalibrateData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): IMUCalibrateData { + return IMUCalibrateData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): IMUCalibrateData { + const message = createBaseIMUCalibrateData(); + return message; + }, +}; + +function createBaseModeData(): ModeData { + return { mode: 0 }; +} + +export const ModeData: MessageFns = { + encode(message: ModeData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.mode !== 0) { + writer.uint32(8).int32(message.mode); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ModeData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseModeData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.mode = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ModeData { + return { mode: isSet(object.mode) ? globalThis.Number(object.mode) : 0 }; + }, + + toJSON(message: ModeData): unknown { + const obj: any = {}; + if (message.mode !== 0) { + obj.mode = Math.round(message.mode); + } + return obj; + }, + + create, I>>(base?: I): ModeData { + return ModeData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ModeData { + const message = createBaseModeData(); + message.mode = object.mode ?? 0; + return message; + }, +}; + +function createBaseInputData(): InputData { + return {}; +} + +export const InputData: MessageFns = { + encode(_: InputData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): InputData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseInputData(); + 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): InputData { + return {}; + }, + + toJSON(_: InputData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): InputData { + return InputData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): InputData { + const message = createBaseInputData(); + return message; + }, +}; + +function createBaseAnalyticsData(): AnalyticsData { + return {}; +} + +export const AnalyticsData: MessageFns = { + encode(_: AnalyticsData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AnalyticsData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAnalyticsData(); + 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): AnalyticsData { + return {}; + }, + + toJSON(_: AnalyticsData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): AnalyticsData { + return AnalyticsData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): AnalyticsData { + const message = createBaseAnalyticsData(); + return message; + }, +}; + +function createBasePositionData(): PositionData { + return {}; +} + +export const PositionData: MessageFns = { + encode(_: PositionData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PositionData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePositionData(); + 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): PositionData { + return {}; + }, + + toJSON(_: PositionData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): PositionData { + return PositionData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): PositionData { + const message = createBasePositionData(); + return message; + }, +}; + +function createBaseAnglesData(): AnglesData { + return { angles: [] }; +} + +export const AnglesData: MessageFns = { + encode(message: AnglesData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + writer.uint32(10).fork(); + for (const v of message.angles) { + writer.float(v); + } + writer.join(); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AnglesData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAnglesData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag === 13) { + message.angles.push(reader.float()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.angles.push(reader.float()); + } + + continue; + } + + break; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AnglesData { + return { + angles: globalThis.Array.isArray(object?.angles) ? object.angles.map((e: any) => globalThis.Number(e)) : [], + }; + }, + + toJSON(message: AnglesData): unknown { + const obj: any = {}; + if (message.angles?.length) { + obj.angles = message.angles; + } + return obj; + }, + + create, I>>(base?: I): AnglesData { + return AnglesData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AnglesData { + const message = createBaseAnglesData(); + message.angles = object.angles?.map((e) => e) || []; + return message; + }, +}; + +function createBaseI2CScanData(): I2CScanData { + return {}; +} + +export const I2CScanData: MessageFns = { + encode(_: I2CScanData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): I2CScanData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseI2CScanData(); + 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): I2CScanData { + return {}; + }, + + toJSON(_: I2CScanData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): I2CScanData { + return I2CScanData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): I2CScanData { + const message = createBaseI2CScanData(); + return message; + }, +}; + +function createBasePeripheralSettingsData(): PeripheralSettingsData { + return {}; +} + +export const PeripheralSettingsData: MessageFns = { + encode(_: PeripheralSettingsData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PeripheralSettingsData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePeripheralSettingsData(); + 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): PeripheralSettingsData { + return {}; + }, + + toJSON(_: PeripheralSettingsData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): PeripheralSettingsData { + return PeripheralSettingsData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): PeripheralSettingsData { + const message = createBasePeripheralSettingsData(); + return message; + }, +}; + +function createBaseOTAStatusData(): OTAStatusData { + return {}; +} + +export const OTAStatusData: MessageFns = { + encode(_: OTAStatusData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OTAStatusData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOTAStatusData(); + 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): OTAStatusData { + return {}; + }, + + toJSON(_: OTAStatusData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): OTAStatusData { + return OTAStatusData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): OTAStatusData { + const message = createBaseOTAStatusData(); + return message; + }, +}; + +function createBaseGaitData(): GaitData { + return {}; +} + +export const GaitData: MessageFns = { + encode(_: GaitData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GaitData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGaitData(); + 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): GaitData { + return {}; + }, + + toJSON(_: GaitData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): GaitData { + return GaitData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): GaitData { + const message = createBaseGaitData(); + return message; + }, +}; + +function createBaseServoStateData(): ServoStateData { + return {}; +} + +export const ServoStateData: MessageFns = { + encode(_: ServoStateData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ServoStateData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseServoStateData(); + 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): ServoStateData { + return {}; + }, + + toJSON(_: ServoStateData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): ServoStateData { + return ServoStateData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): ServoStateData { + const message = createBaseServoStateData(); + return message; + }, +}; + +function createBaseServoPWMData(): ServoPWMData { + return {}; +} + +export const ServoPWMData: MessageFns = { + encode(_: ServoPWMData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ServoPWMData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseServoPWMData(); + 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): ServoPWMData { + return {}; + }, + + toJSON(_: ServoPWMData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): ServoPWMData { + return ServoPWMData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): ServoPWMData { + const message = createBaseServoPWMData(); + return message; + }, +}; + +function createBaseWifiSettingsData(): WifiSettingsData { + return {}; +} + +export const WifiSettingsData: MessageFns = { + encode(_: WifiSettingsData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): WifiSettingsData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseWifiSettingsData(); + 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): WifiSettingsData { + return {}; + }, + + toJSON(_: WifiSettingsData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): WifiSettingsData { + return WifiSettingsData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): WifiSettingsData { + const message = createBaseWifiSettingsData(); + return message; + }, +}; + +function createBaseSonarData(): SonarData { + return {}; +} + +export const SonarData: MessageFns = { + encode(_: SonarData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SonarData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSonarData(); + 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): SonarData { + return {}; + }, + + toJSON(_: SonarData): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): SonarData { + return SonarData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): SonarData { + const message = createBaseSonarData(); + return message; + }, +}; + +function createBaseRSSIData(): RSSIData { + return { rssi: 0 }; +} + +export const RSSIData: MessageFns = { + encode(message: RSSIData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.rssi !== 0) { + writer.uint32(8).int32(message.rssi); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): RSSIData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseRSSIData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.rssi = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): RSSIData { + return { rssi: isSet(object.rssi) ? globalThis.Number(object.rssi) : 0 }; + }, + + toJSON(message: RSSIData): unknown { + const obj: any = {}; + if (message.rssi !== 0) { + obj.rssi = Math.round(message.rssi); + } + return obj; + }, + + create, I>>(base?: I): RSSIData { + return RSSIData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): RSSIData { + const message = createBaseRSSIData(); + message.rssi = object.rssi ?? 0; + return message; + }, +}; + +function createBaseWebsocketMessage(): WebsocketMessage { + return { + imu: undefined, + imuCalibrate: undefined, + mode: undefined, + input: undefined, + analytics: undefined, + position: undefined, + angles: undefined, + i2cScan: undefined, + peripheralSettings: undefined, + otaStatus: undefined, + gait: undefined, + servoState: undefined, + servoPwm: undefined, + wifiSettings: undefined, + sonar: undefined, + rssi: undefined, + }; +} + +export const WebsocketMessage: MessageFns = { + encode(message: WebsocketMessage, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.imu !== undefined) { + IMUData.encode(message.imu, writer.uint32(82).fork()).join(); + } + if (message.imuCalibrate !== undefined) { + IMUCalibrateData.encode(message.imuCalibrate, writer.uint32(162).fork()).join(); + } + if (message.mode !== undefined) { + ModeData.encode(message.mode, writer.uint32(242).fork()).join(); + } + if (message.input !== undefined) { + InputData.encode(message.input, writer.uint32(322).fork()).join(); + } + if (message.analytics !== undefined) { + AnalyticsData.encode(message.analytics, writer.uint32(402).fork()).join(); + } + if (message.position !== undefined) { + PositionData.encode(message.position, writer.uint32(482).fork()).join(); + } + if (message.angles !== undefined) { + AnglesData.encode(message.angles, writer.uint32(562).fork()).join(); + } + if (message.i2cScan !== undefined) { + I2CScanData.encode(message.i2cScan, writer.uint32(642).fork()).join(); + } + if (message.peripheralSettings !== undefined) { + PeripheralSettingsData.encode(message.peripheralSettings, writer.uint32(722).fork()).join(); + } + if (message.otaStatus !== undefined) { + OTAStatusData.encode(message.otaStatus, writer.uint32(802).fork()).join(); + } + if (message.gait !== undefined) { + GaitData.encode(message.gait, writer.uint32(882).fork()).join(); + } + if (message.servoState !== undefined) { + ServoStateData.encode(message.servoState, writer.uint32(962).fork()).join(); + } + if (message.servoPwm !== undefined) { + ServoPWMData.encode(message.servoPwm, writer.uint32(1042).fork()).join(); + } + if (message.wifiSettings !== undefined) { + WifiSettingsData.encode(message.wifiSettings, writer.uint32(1122).fork()).join(); + } + if (message.sonar !== undefined) { + SonarData.encode(message.sonar, writer.uint32(1202).fork()).join(); + } + if (message.rssi !== undefined) { + RSSIData.encode(message.rssi, writer.uint32(1282).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): WebsocketMessage { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseWebsocketMessage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 10: { + if (tag !== 82) { + break; + } + + message.imu = IMUData.decode(reader, reader.uint32()); + continue; + } + case 20: { + if (tag !== 162) { + break; + } + + message.imuCalibrate = IMUCalibrateData.decode(reader, reader.uint32()); + continue; + } + case 30: { + if (tag !== 242) { + break; + } + + message.mode = ModeData.decode(reader, reader.uint32()); + continue; + } + case 40: { + if (tag !== 322) { + break; + } + + message.input = InputData.decode(reader, reader.uint32()); + continue; + } + case 50: { + if (tag !== 402) { + break; + } + + message.analytics = AnalyticsData.decode(reader, reader.uint32()); + continue; + } + case 60: { + if (tag !== 482) { + break; + } + + message.position = PositionData.decode(reader, reader.uint32()); + continue; + } + case 70: { + if (tag !== 562) { + break; + } + + message.angles = AnglesData.decode(reader, reader.uint32()); + continue; + } + case 80: { + if (tag !== 642) { + break; + } + + message.i2cScan = I2CScanData.decode(reader, reader.uint32()); + continue; + } + case 90: { + if (tag !== 722) { + break; + } + + message.peripheralSettings = PeripheralSettingsData.decode(reader, reader.uint32()); + continue; + } + case 100: { + if (tag !== 802) { + break; + } + + message.otaStatus = OTAStatusData.decode(reader, reader.uint32()); + continue; + } + case 110: { + if (tag !== 882) { + break; + } + + message.gait = GaitData.decode(reader, reader.uint32()); + continue; + } + case 120: { + if (tag !== 962) { + break; + } + + message.servoState = ServoStateData.decode(reader, reader.uint32()); + continue; + } + case 130: { + if (tag !== 1042) { + break; + } + + message.servoPwm = ServoPWMData.decode(reader, reader.uint32()); + continue; + } + case 140: { + if (tag !== 1122) { + break; + } + + message.wifiSettings = WifiSettingsData.decode(reader, reader.uint32()); + continue; + } + case 150: { + if (tag !== 1202) { + break; + } + + message.sonar = SonarData.decode(reader, reader.uint32()); + continue; + } + case 160: { + if (tag !== 1282) { + break; + } + + message.rssi = RSSIData.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): WebsocketMessage { + return { + imu: isSet(object.imu) ? IMUData.fromJSON(object.imu) : undefined, + imuCalibrate: isSet(object.imuCalibrate) ? IMUCalibrateData.fromJSON(object.imuCalibrate) : undefined, + mode: isSet(object.mode) ? ModeData.fromJSON(object.mode) : undefined, + input: isSet(object.input) ? InputData.fromJSON(object.input) : undefined, + analytics: isSet(object.analytics) ? AnalyticsData.fromJSON(object.analytics) : undefined, + position: isSet(object.position) ? PositionData.fromJSON(object.position) : undefined, + angles: isSet(object.angles) ? AnglesData.fromJSON(object.angles) : undefined, + i2cScan: isSet(object.i2cScan) ? I2CScanData.fromJSON(object.i2cScan) : undefined, + peripheralSettings: isSet(object.peripheralSettings) + ? PeripheralSettingsData.fromJSON(object.peripheralSettings) + : undefined, + otaStatus: isSet(object.otaStatus) ? OTAStatusData.fromJSON(object.otaStatus) : undefined, + gait: isSet(object.gait) ? GaitData.fromJSON(object.gait) : undefined, + servoState: isSet(object.servoState) ? ServoStateData.fromJSON(object.servoState) : undefined, + servoPwm: isSet(object.servoPwm) ? ServoPWMData.fromJSON(object.servoPwm) : undefined, + wifiSettings: isSet(object.wifiSettings) ? WifiSettingsData.fromJSON(object.wifiSettings) : undefined, + sonar: isSet(object.sonar) ? SonarData.fromJSON(object.sonar) : undefined, + rssi: isSet(object.rssi) ? RSSIData.fromJSON(object.rssi) : undefined, + }; + }, + + toJSON(message: WebsocketMessage): unknown { + const obj: any = {}; + if (message.imu !== undefined) { + obj.imu = IMUData.toJSON(message.imu); + } + if (message.imuCalibrate !== undefined) { + obj.imuCalibrate = IMUCalibrateData.toJSON(message.imuCalibrate); + } + if (message.mode !== undefined) { + obj.mode = ModeData.toJSON(message.mode); + } + if (message.input !== undefined) { + obj.input = InputData.toJSON(message.input); + } + if (message.analytics !== undefined) { + obj.analytics = AnalyticsData.toJSON(message.analytics); + } + if (message.position !== undefined) { + obj.position = PositionData.toJSON(message.position); + } + if (message.angles !== undefined) { + obj.angles = AnglesData.toJSON(message.angles); + } + if (message.i2cScan !== undefined) { + obj.i2cScan = I2CScanData.toJSON(message.i2cScan); + } + if (message.peripheralSettings !== undefined) { + obj.peripheralSettings = PeripheralSettingsData.toJSON(message.peripheralSettings); + } + if (message.otaStatus !== undefined) { + obj.otaStatus = OTAStatusData.toJSON(message.otaStatus); + } + if (message.gait !== undefined) { + obj.gait = GaitData.toJSON(message.gait); + } + if (message.servoState !== undefined) { + obj.servoState = ServoStateData.toJSON(message.servoState); + } + if (message.servoPwm !== undefined) { + obj.servoPwm = ServoPWMData.toJSON(message.servoPwm); + } + if (message.wifiSettings !== undefined) { + obj.wifiSettings = WifiSettingsData.toJSON(message.wifiSettings); + } + if (message.sonar !== undefined) { + obj.sonar = SonarData.toJSON(message.sonar); + } + if (message.rssi !== undefined) { + obj.rssi = RSSIData.toJSON(message.rssi); + } + return obj; + }, + + create, I>>(base?: I): WebsocketMessage { + return WebsocketMessage.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): WebsocketMessage { + const message = createBaseWebsocketMessage(); + message.imu = (object.imu !== undefined && object.imu !== null) ? IMUData.fromPartial(object.imu) : undefined; + message.imuCalibrate = (object.imuCalibrate !== undefined && object.imuCalibrate !== null) + ? IMUCalibrateData.fromPartial(object.imuCalibrate) + : undefined; + message.mode = (object.mode !== undefined && object.mode !== null) ? ModeData.fromPartial(object.mode) : undefined; + message.input = (object.input !== undefined && object.input !== null) + ? InputData.fromPartial(object.input) + : undefined; + message.analytics = (object.analytics !== undefined && object.analytics !== null) + ? AnalyticsData.fromPartial(object.analytics) + : undefined; + message.position = (object.position !== undefined && object.position !== null) + ? PositionData.fromPartial(object.position) + : undefined; + message.angles = (object.angles !== undefined && object.angles !== null) + ? AnglesData.fromPartial(object.angles) + : undefined; + message.i2cScan = (object.i2cScan !== undefined && object.i2cScan !== null) + ? I2CScanData.fromPartial(object.i2cScan) + : undefined; + message.peripheralSettings = (object.peripheralSettings !== undefined && object.peripheralSettings !== null) + ? PeripheralSettingsData.fromPartial(object.peripheralSettings) + : undefined; + message.otaStatus = (object.otaStatus !== undefined && object.otaStatus !== null) + ? OTAStatusData.fromPartial(object.otaStatus) + : undefined; + message.gait = (object.gait !== undefined && object.gait !== null) ? GaitData.fromPartial(object.gait) : undefined; + message.servoState = (object.servoState !== undefined && object.servoState !== null) + ? ServoStateData.fromPartial(object.servoState) + : undefined; + message.servoPwm = (object.servoPwm !== undefined && object.servoPwm !== null) + ? ServoPWMData.fromPartial(object.servoPwm) + : undefined; + message.wifiSettings = (object.wifiSettings !== undefined && object.wifiSettings !== null) + ? WifiSettingsData.fromPartial(object.wifiSettings) + : undefined; + message.sonar = (object.sonar !== undefined && object.sonar !== null) + ? SonarData.fromPartial(object.sonar) + : undefined; + message.rssi = (object.rssi !== undefined && object.rssi !== null) ? RSSIData.fromPartial(object.rssi) : undefined; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/app/src/lib/stores/socket.ts b/app/src/lib/stores/socket.ts index 2f86aba..802e0d7 100644 --- a/app/src/lib/stores/socket.ts +++ b/app/src/lib/stores/socket.ts @@ -1,30 +1,38 @@ import { writable } from 'svelte/store' import { encode, decode } from '@msgpack/msgpack' +import { WebsocketMessage } from '$lib/platform_shared/websocket_message' const socketEvents = ['open', 'close', 'error', 'message', 'unresponsive'] as const type SocketEvent = (typeof socketEvents)[number] -type SocketMessage = [string, ArrayBuffer] +type TaggedSocketMessage = [string, WebsocketMessage] let useBinary = false -const decodeMessage = (data: ArrayBuffer): SocketMessage | null => { +const decodeMessage = (data: ArrayBuffer): TaggedSocketMessage => { - try { - const view = new Uint8Array(data); - let comma_index: number = 0; - let tag: string = ""; - for (comma_index = 0; view[comma_index] != 0x2c; comma_index++) { // 0x2c is the ascii code for a comma! - tag += String.fromCharCode(view[comma_index]); - if (comma_index >= data.byteLength) { throw new RangeError("Comma index exceeded")} - } - - return [ tag, data.slice(comma_index+1) ] - } catch (error) { - console.error(`Could not decode data: ${new Uint8Array(data as ArrayBuffer)} - ${error}`) + const decoded = WebsocketMessage.decode(new Uint8Array(data)); + const values = Object.entries(decoded).filter(([, value]) => value !== undefined) // Filter all values which are not undefined + if (values.length != 1) { + throw new Error("Message included either 0 or more than 1 data point") } + const [tag, value] = values[0] + return [tag, decoded] + // try { + // const view = new Uint8Array(data); + // let comma_index: number = 0; + // let tag: string = ""; + // for (comma_index = 0; view[comma_index] != 0x2c; comma_index++) { // 0x2c is the ascii code for a comma! + // tag += String.fromCharCode(view[comma_index]); + // if (comma_index >= data.byteLength) { throw new RangeError("Comma index exceeded")} + // } + + // return [ tag, data.slice(comma_index+1) ] + // } catch (error) { + // console.error(`Could not decode data: ${new Uint8Array(data as ArrayBuffer)} - ${error}`) + // } return null } @@ -76,10 +84,8 @@ function createWebSocket() { } ws.onmessage = frame => { resetUnresponsiveCheck() - const message = decodeMessage(frame.data) - if (!message) return - const [event, payload] = message - if (event) listeners.get(event)?.forEach(listener => listener(payload)) + const [tag, message] = decodeMessage(frame.data) + if (tag) listeners.get(tag)?.forEach(listener => listener(message)) } ws.onerror = ev => disconnect('error', ev) ws.onclose = ev => disconnect('close', ev) @@ -143,6 +149,11 @@ function createWebSocket() { sendEvent, init, on: (event: string, listener: (data: T) => void): (() => void) => { + + if (event !in Object.keys(WebsocketMessage.create())) { + throw new Error("Event not found in 'WebsocketMessage' type, message can never be decoded, and the listener has not been added"); + } + let eventListeners = listeners.get(event) if (!eventListeners) { if (!socketEvents.includes(event as SocketEvent)) { diff --git a/compile_proto_TEMP b/compile_proto_TEMP index cdd0200..8f54b83 100644 --- a/compile_proto_TEMP +++ b/compile_proto_TEMP @@ -5,6 +5,16 @@ Make sure to actually create the output directories before executing the command TS: protoc --plugin="protoc-gen-ts_proto=$(Resolve-Path app\node_modules\.bin\protoc-gen-ts_proto.CMD)" --ts_proto_out="./app/src/lib" "platform_shared\example.proto" +NEW TS (USING PROTOBUFJS): +cd app +pnpm install protobufjs-cli +pnpm install -D protobufjs-cli +pnpm exec pbjs -t static-module -w es6 -o src\lib\platform_shared\compiled.js ..\platform_shared\websocket_message.proto +pnpm exec pbts -o src\lib\platform_shared\compiled.d.ts src\lib\platform_shared\compiled.js + +pnpm exec pbjs -t json-module -o src\lib\platform_shared\compiled.d.json ..\platform_shared\websocket_message.proto + + C++: protoc -I=platform_shared --cpp_out=esp32/src/platform_shared platform_shared/example.proto diff --git a/esp32/src/platform_shared/websocket_message.pb.c b/esp32/src/platform_shared/websocket_message.pb.c new file mode 100644 index 0000000..d98b3a6 --- /dev/null +++ b/esp32/src/platform_shared/websocket_message.pb.c @@ -0,0 +1,60 @@ +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-1.0.0-dev */ + +#include "platform_shared/websocket_message.pb.h" +#if PB_PROTO_HEADER_VERSION != 40 +#error Regenerate this file with the current version of nanopb generator. +#endif + +PB_BIND(IMUData, IMUData, AUTO) + + +PB_BIND(IMUCalibrateData, IMUCalibrateData, AUTO) + + +PB_BIND(ModeData, ModeData, AUTO) + + +PB_BIND(InputData, InputData, AUTO) + + +PB_BIND(AnalyticsData, AnalyticsData, AUTO) + + +PB_BIND(PositionData, PositionData, AUTO) + + +PB_BIND(AnglesData, AnglesData, AUTO) + + +PB_BIND(I2CScanData, I2CScanData, AUTO) + + +PB_BIND(PeripheralSettingsData, PeripheralSettingsData, AUTO) + + +PB_BIND(OTAStatusData, OTAStatusData, AUTO) + + +PB_BIND(GaitData, GaitData, AUTO) + + +PB_BIND(ServoStateData, ServoStateData, AUTO) + + +PB_BIND(ServoPWMData, ServoPWMData, AUTO) + + +PB_BIND(WifiSettingsData, WifiSettingsData, AUTO) + + +PB_BIND(SonarData, SonarData, AUTO) + + +PB_BIND(RSSIData, RSSIData, AUTO) + + +PB_BIND(WebsocketMessage, WebsocketMessage, 2) + + + diff --git a/esp32/src/platform_shared/websocket_message.pb.h b/esp32/src/platform_shared/websocket_message.pb.h new file mode 100644 index 0000000..85113f0 --- /dev/null +++ b/esp32/src/platform_shared/websocket_message.pb.h @@ -0,0 +1,352 @@ +/* Automatically generated nanopb header */ +/* Generated by nanopb-1.0.0-dev */ + +#ifndef PB_PLATFORM_SHARED_WEBSOCKET_MESSAGE_PB_H_INCLUDED +#define PB_PLATFORM_SHARED_WEBSOCKET_MESSAGE_PB_H_INCLUDED +#include + +#if PB_PROTO_HEADER_VERSION != 40 +#error Regenerate this file with the current version of nanopb generator. +#endif + +/* Struct definitions */ +/* Individual message data types */ +typedef struct _IMUData { + float x; + float y; + float z; + float temp; +} IMUData; + +typedef struct _IMUCalibrateData { + char dummy_field; +} IMUCalibrateData; + +typedef struct _ModeData { + int32_t mode; +} ModeData; + +typedef struct _InputData { + char dummy_field; +} InputData; + +typedef struct _AnalyticsData { + char dummy_field; +} AnalyticsData; + +typedef struct _PositionData { + char dummy_field; +} PositionData; + +typedef struct _AnglesData { + pb_callback_t angles; +} AnglesData; + +typedef struct _I2CScanData { + char dummy_field; +} I2CScanData; + +typedef struct _PeripheralSettingsData { + char dummy_field; +} PeripheralSettingsData; + +typedef struct _OTAStatusData { + char dummy_field; +} OTAStatusData; + +typedef struct _GaitData { + char dummy_field; +} GaitData; + +typedef struct _ServoStateData { + char dummy_field; +} ServoStateData; + +typedef struct _ServoPWMData { + char dummy_field; +} ServoPWMData; + +typedef struct _WifiSettingsData { + char dummy_field; +} WifiSettingsData; + +typedef struct _SonarData { + char dummy_field; +} SonarData; + +typedef struct _RSSIData { + int32_t rssi; +} RSSIData; + +/* WebSocket message wrapper + Only ONE field will be set at a time (oneof ensures this) */ +typedef struct _WebsocketMessage { + pb_size_t which_message; + union _WebsocketMessage_message { + IMUData imu; + IMUCalibrateData imu_calibrate; + ModeData mode; + InputData input; + AnalyticsData analytics; + PositionData position; + AnglesData angles; + I2CScanData i2c_scan; + PeripheralSettingsData peripheral_settings; + OTAStatusData ota_status; + GaitData gait; + ServoStateData servo_state; + ServoPWMData servo_pwm; + WifiSettingsData wifi_settings; + SonarData sonar; + RSSIData rssi; + } message; +} WebsocketMessage; + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Initializer values for message structs */ +#define IMUData_init_default {0, 0, 0, 0} +#define IMUCalibrateData_init_default {0} +#define ModeData_init_default {0} +#define InputData_init_default {0} +#define AnalyticsData_init_default {0} +#define PositionData_init_default {0} +#define AnglesData_init_default {{{NULL}, NULL}} +#define I2CScanData_init_default {0} +#define PeripheralSettingsData_init_default {0} +#define OTAStatusData_init_default {0} +#define GaitData_init_default {0} +#define ServoStateData_init_default {0} +#define ServoPWMData_init_default {0} +#define WifiSettingsData_init_default {0} +#define SonarData_init_default {0} +#define RSSIData_init_default {0} +#define WebsocketMessage_init_default {0, {IMUData_init_default}} +#define IMUData_init_zero {0, 0, 0, 0} +#define IMUCalibrateData_init_zero {0} +#define ModeData_init_zero {0} +#define InputData_init_zero {0} +#define AnalyticsData_init_zero {0} +#define PositionData_init_zero {0} +#define AnglesData_init_zero {{{NULL}, NULL}} +#define I2CScanData_init_zero {0} +#define PeripheralSettingsData_init_zero {0} +#define OTAStatusData_init_zero {0} +#define GaitData_init_zero {0} +#define ServoStateData_init_zero {0} +#define ServoPWMData_init_zero {0} +#define WifiSettingsData_init_zero {0} +#define SonarData_init_zero {0} +#define RSSIData_init_zero {0} +#define WebsocketMessage_init_zero {0, {IMUData_init_zero}} + +/* Field tags (for use in manual encoding/decoding) */ +#define IMUData_x_tag 1 +#define IMUData_y_tag 2 +#define IMUData_z_tag 3 +#define IMUData_temp_tag 4 +#define ModeData_mode_tag 1 +#define AnglesData_angles_tag 1 +#define RSSIData_rssi_tag 1 +#define WebsocketMessage_imu_tag 10 +#define WebsocketMessage_imu_calibrate_tag 20 +#define WebsocketMessage_mode_tag 30 +#define WebsocketMessage_input_tag 40 +#define WebsocketMessage_analytics_tag 50 +#define WebsocketMessage_position_tag 60 +#define WebsocketMessage_angles_tag 70 +#define WebsocketMessage_i2c_scan_tag 80 +#define WebsocketMessage_peripheral_settings_tag 90 +#define WebsocketMessage_ota_status_tag 100 +#define WebsocketMessage_gait_tag 110 +#define WebsocketMessage_servo_state_tag 120 +#define WebsocketMessage_servo_pwm_tag 130 +#define WebsocketMessage_wifi_settings_tag 140 +#define WebsocketMessage_sonar_tag 150 +#define WebsocketMessage_rssi_tag 160 + +/* Struct field encoding specification for nanopb */ +#define IMUData_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, FLOAT, x, 1) \ +X(a, STATIC, SINGULAR, FLOAT, y, 2) \ +X(a, STATIC, SINGULAR, FLOAT, z, 3) \ +X(a, STATIC, SINGULAR, FLOAT, temp, 4) +#define IMUData_CALLBACK NULL +#define IMUData_DEFAULT NULL + +#define IMUCalibrateData_FIELDLIST(X, a) \ + +#define IMUCalibrateData_CALLBACK NULL +#define IMUCalibrateData_DEFAULT NULL + +#define ModeData_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, INT32, mode, 1) +#define ModeData_CALLBACK NULL +#define ModeData_DEFAULT NULL + +#define InputData_FIELDLIST(X, a) \ + +#define InputData_CALLBACK NULL +#define InputData_DEFAULT NULL + +#define AnalyticsData_FIELDLIST(X, a) \ + +#define AnalyticsData_CALLBACK NULL +#define AnalyticsData_DEFAULT NULL + +#define PositionData_FIELDLIST(X, a) \ + +#define PositionData_CALLBACK NULL +#define PositionData_DEFAULT NULL + +#define AnglesData_FIELDLIST(X, a) \ +X(a, CALLBACK, REPEATED, FLOAT, angles, 1) +#define AnglesData_CALLBACK pb_default_field_callback +#define AnglesData_DEFAULT NULL + +#define I2CScanData_FIELDLIST(X, a) \ + +#define I2CScanData_CALLBACK NULL +#define I2CScanData_DEFAULT NULL + +#define PeripheralSettingsData_FIELDLIST(X, a) \ + +#define PeripheralSettingsData_CALLBACK NULL +#define PeripheralSettingsData_DEFAULT NULL + +#define OTAStatusData_FIELDLIST(X, a) \ + +#define OTAStatusData_CALLBACK NULL +#define OTAStatusData_DEFAULT NULL + +#define GaitData_FIELDLIST(X, a) \ + +#define GaitData_CALLBACK NULL +#define GaitData_DEFAULT NULL + +#define ServoStateData_FIELDLIST(X, a) \ + +#define ServoStateData_CALLBACK NULL +#define ServoStateData_DEFAULT NULL + +#define ServoPWMData_FIELDLIST(X, a) \ + +#define ServoPWMData_CALLBACK NULL +#define ServoPWMData_DEFAULT NULL + +#define WifiSettingsData_FIELDLIST(X, a) \ + +#define WifiSettingsData_CALLBACK NULL +#define WifiSettingsData_DEFAULT NULL + +#define SonarData_FIELDLIST(X, a) \ + +#define SonarData_CALLBACK NULL +#define SonarData_DEFAULT NULL + +#define RSSIData_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, INT32, rssi, 1) +#define RSSIData_CALLBACK NULL +#define RSSIData_DEFAULT NULL + +#define WebsocketMessage_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, MESSAGE, (message,imu,message.imu), 10) \ +X(a, STATIC, ONEOF, MESSAGE, (message,imu_calibrate,message.imu_calibrate), 20) \ +X(a, STATIC, ONEOF, MESSAGE, (message,mode,message.mode), 30) \ +X(a, STATIC, ONEOF, MESSAGE, (message,input,message.input), 40) \ +X(a, STATIC, ONEOF, MESSAGE, (message,analytics,message.analytics), 50) \ +X(a, STATIC, ONEOF, MESSAGE, (message,position,message.position), 60) \ +X(a, STATIC, ONEOF, MESSAGE, (message,angles,message.angles), 70) \ +X(a, STATIC, ONEOF, MESSAGE, (message,i2c_scan,message.i2c_scan), 80) \ +X(a, STATIC, ONEOF, MESSAGE, (message,peripheral_settings,message.peripheral_settings), 90) \ +X(a, STATIC, ONEOF, MESSAGE, (message,ota_status,message.ota_status), 100) \ +X(a, STATIC, ONEOF, MESSAGE, (message,gait,message.gait), 110) \ +X(a, STATIC, ONEOF, MESSAGE, (message,servo_state,message.servo_state), 120) \ +X(a, STATIC, ONEOF, MESSAGE, (message,servo_pwm,message.servo_pwm), 130) \ +X(a, STATIC, ONEOF, MESSAGE, (message,wifi_settings,message.wifi_settings), 140) \ +X(a, STATIC, ONEOF, MESSAGE, (message,sonar,message.sonar), 150) \ +X(a, STATIC, ONEOF, MESSAGE, (message,rssi,message.rssi), 160) +#define WebsocketMessage_CALLBACK NULL +#define WebsocketMessage_DEFAULT NULL +#define WebsocketMessage_message_imu_MSGTYPE IMUData +#define WebsocketMessage_message_imu_calibrate_MSGTYPE IMUCalibrateData +#define WebsocketMessage_message_mode_MSGTYPE ModeData +#define WebsocketMessage_message_input_MSGTYPE InputData +#define WebsocketMessage_message_analytics_MSGTYPE AnalyticsData +#define WebsocketMessage_message_position_MSGTYPE PositionData +#define WebsocketMessage_message_angles_MSGTYPE AnglesData +#define WebsocketMessage_message_i2c_scan_MSGTYPE I2CScanData +#define WebsocketMessage_message_peripheral_settings_MSGTYPE PeripheralSettingsData +#define WebsocketMessage_message_ota_status_MSGTYPE OTAStatusData +#define WebsocketMessage_message_gait_MSGTYPE GaitData +#define WebsocketMessage_message_servo_state_MSGTYPE ServoStateData +#define WebsocketMessage_message_servo_pwm_MSGTYPE ServoPWMData +#define WebsocketMessage_message_wifi_settings_MSGTYPE WifiSettingsData +#define WebsocketMessage_message_sonar_MSGTYPE SonarData +#define WebsocketMessage_message_rssi_MSGTYPE RSSIData + +extern const pb_msgdesc_t IMUData_msg; +extern const pb_msgdesc_t IMUCalibrateData_msg; +extern const pb_msgdesc_t ModeData_msg; +extern const pb_msgdesc_t InputData_msg; +extern const pb_msgdesc_t AnalyticsData_msg; +extern const pb_msgdesc_t PositionData_msg; +extern const pb_msgdesc_t AnglesData_msg; +extern const pb_msgdesc_t I2CScanData_msg; +extern const pb_msgdesc_t PeripheralSettingsData_msg; +extern const pb_msgdesc_t OTAStatusData_msg; +extern const pb_msgdesc_t GaitData_msg; +extern const pb_msgdesc_t ServoStateData_msg; +extern const pb_msgdesc_t ServoPWMData_msg; +extern const pb_msgdesc_t WifiSettingsData_msg; +extern const pb_msgdesc_t SonarData_msg; +extern const pb_msgdesc_t RSSIData_msg; +extern const pb_msgdesc_t WebsocketMessage_msg; + +/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ +#define IMUData_fields &IMUData_msg +#define IMUCalibrateData_fields &IMUCalibrateData_msg +#define ModeData_fields &ModeData_msg +#define InputData_fields &InputData_msg +#define AnalyticsData_fields &AnalyticsData_msg +#define PositionData_fields &PositionData_msg +#define AnglesData_fields &AnglesData_msg +#define I2CScanData_fields &I2CScanData_msg +#define PeripheralSettingsData_fields &PeripheralSettingsData_msg +#define OTAStatusData_fields &OTAStatusData_msg +#define GaitData_fields &GaitData_msg +#define ServoStateData_fields &ServoStateData_msg +#define ServoPWMData_fields &ServoPWMData_msg +#define WifiSettingsData_fields &WifiSettingsData_msg +#define SonarData_fields &SonarData_msg +#define RSSIData_fields &RSSIData_msg +#define WebsocketMessage_fields &WebsocketMessage_msg + +/* Maximum encoded size of messages (where known) */ +/* AnglesData_size depends on runtime parameters */ +/* WebsocketMessage_size depends on runtime parameters */ +#define AnalyticsData_size 0 +#define GaitData_size 0 +#define I2CScanData_size 0 +#define IMUCalibrateData_size 0 +#define IMUData_size 20 +#define InputData_size 0 +#define ModeData_size 11 +#define OTAStatusData_size 0 +#define PLATFORM_SHARED_WEBSOCKET_MESSAGE_PB_H_MAX_SIZE IMUData_size +#define PeripheralSettingsData_size 0 +#define PositionData_size 0 +#define RSSIData_size 11 +#define ServoPWMData_size 0 +#define ServoStateData_size 0 +#define SonarData_size 0 +#define WifiSettingsData_size 0 + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/platform_shared/example.proto b/platform_shared/example.proto deleted file mode 100644 index e7e6929..0000000 --- a/platform_shared/example.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - - -enum IMUType { - IMU_NONE = 0; - IMU_ACCEL = 1; - IMU_GYRO = 2; -} - -message IMUReport { - IMUType type = 1; - double x_val = 2; -} \ No newline at end of file diff --git a/platform_shared/websocket_message.proto b/platform_shared/websocket_message.proto new file mode 100644 index 0000000..00b6c30 --- /dev/null +++ b/platform_shared/websocket_message.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; + +// Individual message data types +message IMUData { + float x = 1; + float y = 2; + float z = 3; + float temp = 4; +} + +message IMUCalibrateData {} +message ModeData { int32 mode = 1; } +message InputData {} +message AnalyticsData {} +message PositionData {} +message AnglesData { repeated float angles = 1; } +message I2CScanData {} +message PeripheralSettingsData {} +message OTAStatusData {} +message GaitData {} +message ServoStateData {} +message ServoPWMData {} +message WifiSettingsData {} +message SonarData {} +message RSSIData { int32 rssi = 1; } + + +// WebSocket message wrapper +// Only ONE field will be set at a time (oneof ensures this) +message WebsocketMessage { + oneof message { + IMUData imu = 10; + IMUCalibrateData imu_calibrate = 20; + ModeData mode = 30; + InputData input = 40; + AnalyticsData analytics = 50; + PositionData position = 60; + AnglesData angles = 70; + I2CScanData i2c_scan = 80; + PeripheralSettingsData peripheral_settings = 90; + OTAStatusData ota_status = 100; + GaitData gait = 110; + ServoStateData servo_state = 120; + ServoPWMData servo_pwm = 130; + WifiSettingsData wifi_settings = 140; + SonarData sonar = 150; + RSSIData rssi = 160; + } +}