From 07f46432c619e76ccb32aa182851589fa0e89370 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sat, 15 Mar 2025 08:32:19 -0500 Subject: [PATCH] add encoder for trackable sub module --- src/encoders/index.ts | 2 ++ src/encoders/motion/trackable.ts | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/encoders/motion/trackable.ts diff --git a/src/encoders/index.ts b/src/encoders/index.ts index 1fd0c55..b9f358a 100644 --- a/src/encoders/index.ts +++ b/src/encoders/index.ts @@ -1,7 +1,9 @@ import RTTrPM from './motion/rttrpm'; +import Trackable from './motion/trackable'; import RTTrPHeader from './rttrp-header'; export const Encoders = { RTTrPHeader, RTTrPM, + Trackable, }; diff --git a/src/encoders/motion/trackable.ts b/src/encoders/motion/trackable.ts new file mode 100644 index 0000000..3349ae6 --- /dev/null +++ b/src/encoders/motion/trackable.ts @@ -0,0 +1,47 @@ +const textEncoder = new TextEncoder(); + +export default ( + name: string, + subModules: Uint8Array[], + timestamp?: number, + isLittleEndian: boolean = false +): Uint8Array => { + let totalTrackableSize = 1 + 2 + 1 + name.length + 1; + let type = 0x01; + if (timestamp !== undefined) { + totalTrackableSize += 4; + type = 0x51; + } + subModules.forEach((subModule) => { + totalTrackableSize += subModule.length; + }); + const bytes = new Uint8Array(totalTrackableSize); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + + let dataOffset = 0; + view.setUint8(dataOffset, type); + dataOffset += 1; + view.setUint16(dataOffset, totalTrackableSize, isLittleEndian); + dataOffset += 2; + const nameBytes = textEncoder.encode(name); + view.setUint8(dataOffset, nameBytes.length); + dataOffset += 1; + + nameBytes.forEach((byte) => { + view.setUint8(dataOffset, byte); + dataOffset += 1; + }); + + if (timestamp !== undefined) { + view.setUint32(dataOffset, timestamp, isLittleEndian); + dataOffset += 4; + } + + view.setUint8(dataOffset, subModules.length); + dataOffset += 1; + subModules.forEach((subModule) => { + bytes.set(subModule, dataOffset); + dataOffset += subModule.length; + }); + return new Uint8Array(view.buffer, view.byteOffset, view.byteLength); +};