From f35648659f929845dd844d0f557b4ddfc7bc059f Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sat, 15 Mar 2025 08:51:20 -0500 Subject: [PATCH] add encoder for zone sub modules --- src/encoders/index.ts | 4 ++++ .../motion/zone-collision-detection.ts | 23 +++++++++++++++++++ src/encoders/motion/zone-object.ts | 20 ++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/encoders/motion/zone-collision-detection.ts create mode 100644 src/encoders/motion/zone-object.ts diff --git a/src/encoders/index.ts b/src/encoders/index.ts index bde4ce3..77121f3 100644 --- a/src/encoders/index.ts +++ b/src/encoders/index.ts @@ -6,6 +6,8 @@ import RTTrPM from './motion/rttrpm'; import Trackable from './motion/trackable'; import TrackedPointAccelVelocity from './motion/tracked-point-accel-velocity'; import TrackedPointPosition from './motion/tracked-point-position'; +import ZoneCollisionDetection from './motion/zone-collision-detection'; +import ZoneObject from './motion/zone-object'; import RTTrPHeader from './rttrp-header'; export const Encoders = { @@ -18,4 +20,6 @@ export const Encoders = { TrackedPointPosition, CentroidAccelVelocity, TrackedPointAccelVelocity, + ZoneCollisionDetection, + ZoneObject, }; diff --git a/src/encoders/motion/zone-collision-detection.ts b/src/encoders/motion/zone-collision-detection.ts new file mode 100644 index 0000000..8c37ddc --- /dev/null +++ b/src/encoders/motion/zone-collision-detection.ts @@ -0,0 +1,23 @@ +export default (zoneObjectModules: Uint8Array[], isLittleEndian: boolean = false): Uint8Array => { + let totalZoneModuleSize = 1 + 2 + 1; + + zoneObjectModules.forEach((zoneObjectModule) => { + totalZoneModuleSize += zoneObjectModule.byteLength; + }); + + const bytes = new Uint8Array(totalZoneModuleSize); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + + let dataOffset = 0; + view.setUint8(dataOffset, 0x22); + dataOffset += 1; + view.setUint16(dataOffset, bytes.byteLength, isLittleEndian); + dataOffset += 2; + view.setUint8(dataOffset, zoneObjectModules.length); + dataOffset += 1; + zoneObjectModules.forEach((zoneObjectModule) => { + bytes.set(zoneObjectModule, dataOffset); + dataOffset += zoneObjectModule.length; + }); + return bytes; +}; diff --git a/src/encoders/motion/zone-object.ts b/src/encoders/motion/zone-object.ts new file mode 100644 index 0000000..e9731c1 --- /dev/null +++ b/src/encoders/motion/zone-object.ts @@ -0,0 +1,20 @@ +const textEncoder = new TextEncoder(); + +export default (name: string): Uint8Array => { + const totalZoneObjectModuleSize = 1 + 1 + name.length; + const bytes = new Uint8Array(totalZoneObjectModuleSize); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + + let dataOffset = 0; + view.setUint8(dataOffset, totalZoneObjectModuleSize); + dataOffset += 1; + view.setUint8(dataOffset, name.length); + dataOffset += 1; + + const nameBytes = textEncoder.encode(name); + nameBytes.forEach((byte) => { + view.setUint8(dataOffset, byte); + dataOffset += 1; + }); + return bytes; +};