mirror of
https://github.com/jwetzell/rttrp-js.git
synced 2026-08-18 13:33:59 +00:00
Merge branch 'main' into feat/motion-decode
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
const { Encoders } = require('../');
|
||||
const dgram = require('dgram');
|
||||
|
||||
const motionBytes = Encoders.RTTrPM(0x01, 0x12345678, [
|
||||
Encoders.Trackable(
|
||||
'Test',
|
||||
[
|
||||
Encoders.CentroidPosition(100, 1.0, 2.0, 3.0),
|
||||
Encoders.CentroidAccelVelocity(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
|
||||
Encoders.TrackedPointPosition(100, 1.0, 2.0, 3.0, 1),
|
||||
Encoders.TrackedPointAccelVelocity(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 1),
|
||||
Encoders.TrackedPointPosition(100, 1.0, 2.0, 3.0, 2),
|
||||
Encoders.TrackedPointAccelVelocity(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 2),
|
||||
Encoders.OrientationEuler(100, 0x0123, 1, 2, 3),
|
||||
Encoders.OrientationQuaternion(100, 1, 2, 3, 4),
|
||||
],
|
||||
Math.floor(Date.now() / 1000)
|
||||
),
|
||||
]);
|
||||
console.log(motionBytes);
|
||||
+21
-1
@@ -1,5 +1,25 @@
|
||||
import RTTrPHeader from './rttrp';
|
||||
import CentroidAccelVelocity from './motion/centroid-accel-velocity';
|
||||
import CentroidPosition from './motion/centroid-position';
|
||||
import OrientationEuler from './motion/orientation-euler';
|
||||
import OrientationQuaternion from './motion/orientation-quaternion';
|
||||
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 = {
|
||||
RTTrPHeader,
|
||||
RTTrPM,
|
||||
Trackable,
|
||||
CentroidPosition,
|
||||
OrientationQuaternion,
|
||||
OrientationEuler,
|
||||
TrackedPointPosition,
|
||||
CentroidAccelVelocity,
|
||||
TrackedPointAccelVelocity,
|
||||
ZoneCollisionDetection,
|
||||
ZoneObject,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
export default (
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
accelX: number,
|
||||
accelY: number,
|
||||
accelZ: number,
|
||||
velocityX: number,
|
||||
velocityY: number,
|
||||
velocityZ: number,
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
const bytes = new Uint8Array(51);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x20);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
|
||||
view.setFloat64(dataOffset, x, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, y, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, z, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
|
||||
view.setFloat32(dataOffset, accelX, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, accelY, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, accelZ, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
|
||||
view.setFloat32(dataOffset, velocityX, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, velocityY, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, velocityZ, isLittleEndian);
|
||||
|
||||
return bytes;
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
export default (latency: number, x: number, y: number, z: number, isLittleEndian: boolean = false): Uint8Array => {
|
||||
const bytes = new Uint8Array(29);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x02);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setUint16(dataOffset, latency, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setFloat64(dataOffset, x, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, y, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, z, isLittleEndian);
|
||||
return bytes;
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
export default (
|
||||
latency: number,
|
||||
order: number,
|
||||
R1: number,
|
||||
R2: number,
|
||||
R3: number,
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
const bytes = new Uint8Array(31);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x04);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setUint16(dataOffset, latency, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setUint16(dataOffset, order, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setFloat64(dataOffset, R1, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, R2, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, R3, isLittleEndian);
|
||||
return bytes;
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
export default (
|
||||
latency: number,
|
||||
Qx: number,
|
||||
Qy: number,
|
||||
Qz: number,
|
||||
Qw: number,
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
const bytes = new Uint8Array(37);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x03);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setUint16(dataOffset, latency, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setFloat64(dataOffset, Qx, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, Qy, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, Qz, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, Qw, isLittleEndian);
|
||||
return bytes;
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
import RTTrPHeader from '../rttrp-header';
|
||||
|
||||
export default (
|
||||
packetId: number,
|
||||
context: number,
|
||||
trackables: Uint8Array[],
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
let totalPacketSize = 18; //header size
|
||||
|
||||
trackables.forEach((trackable) => {
|
||||
totalPacketSize += trackable.length;
|
||||
});
|
||||
const bytes = new Uint8Array(totalPacketSize);
|
||||
|
||||
let dataOffset = 0;
|
||||
|
||||
const headerBytes = RTTrPHeader(0x4334, 0x02, packetId, 0x00, context, trackables, isLittleEndian);
|
||||
|
||||
bytes.set(headerBytes, dataOffset);
|
||||
dataOffset += headerBytes.length;
|
||||
trackables.forEach((trackable) => {
|
||||
bytes.set(trackable, dataOffset);
|
||||
dataOffset += trackable.length;
|
||||
});
|
||||
return bytes;
|
||||
};
|
||||
@@ -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);
|
||||
};
|
||||
@@ -0,0 +1,46 @@
|
||||
export default (
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
accelX: number,
|
||||
accelY: number,
|
||||
accelZ: number,
|
||||
velocityX: number,
|
||||
velocityY: number,
|
||||
velocityZ: number,
|
||||
index: number,
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
const bytes = new Uint8Array(52);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x21);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
|
||||
view.setFloat64(dataOffset, x, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, y, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, z, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
|
||||
view.setFloat32(dataOffset, accelX, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, accelY, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, accelZ, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
|
||||
view.setFloat32(dataOffset, velocityX, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, velocityY, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setFloat32(dataOffset, velocityZ, isLittleEndian);
|
||||
dataOffset += 4;
|
||||
view.setUint8(dataOffset, index);
|
||||
|
||||
return bytes;
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
export default (
|
||||
latency: number,
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
index: number,
|
||||
isLittleEndian: boolean = false
|
||||
): Uint8Array => {
|
||||
const bytes = new Uint8Array(30);
|
||||
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
||||
|
||||
let dataOffset = 0;
|
||||
view.setUint8(dataOffset, 0x06);
|
||||
dataOffset += 1;
|
||||
view.setUint16(dataOffset, bytes.byteLength, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setUint16(dataOffset, latency, isLittleEndian);
|
||||
dataOffset += 2;
|
||||
view.setFloat64(dataOffset, x, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, y, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setFloat64(dataOffset, z, isLittleEndian);
|
||||
dataOffset += 8;
|
||||
view.setUint8(dataOffset, index);
|
||||
|
||||
return bytes;
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
@@ -12,6 +12,23 @@ const goodTests = [
|
||||
return Encoders.RTTrPHeader(0x4334, 2, 0x12345678, 0, 0x12345678, [], false);
|
||||
},
|
||||
},
|
||||
{
|
||||
description: 'RTTrP Header Little Endian',
|
||||
expected: new Uint8Array([
|
||||
0x54, 0x41, 0x34, 0x43, 0x00, 0x02, 0x78, 0x56, 0x34, 0x12, 0x00, 0x12, 0x00, 0x78, 0x56, 0x34, 0x12, 0x00,
|
||||
]),
|
||||
bytes: () => {
|
||||
return Encoders.RTTrPHeader(0x4334, 2, 0x12345678, 0, 0x12345678, [], true);
|
||||
},
|
||||
},
|
||||
{
|
||||
description: 'Empty RTTrPM',
|
||||
expected: new Uint8Array([
|
||||
65, 84, 67, 52, 0, 2, 0, 0, 0, 1, 0, 0, 27, 18, 52, 86, 120, 1, 1, 0, 9, 4, 84, 101, 115, 116, 0,
|
||||
]),
|
||||
bytes: () => {
|
||||
return Encoders.RTTrPM(0x01, 0x12345678, [Encoders.Trackable('Test', [])]);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user