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; +};