diff --git a/src/decoders/rttrp.ts b/src/decoders/rttrp.ts index 0a6f2b8..192acf7 100644 --- a/src/decoders/rttrp.ts +++ b/src/decoders/rttrp.ts @@ -12,37 +12,35 @@ export default (bytes: Uint8Array): RTTrPHeader => { let isLittleEndian = false; const intHeader = view.getUint16(dataOffset, isLittleEndian); dataOffset += 2; - const fltHeader = view.getUint16(dataOffset, isLittleEndian); + const floatHeader = view.getUint16(dataOffset, isLittleEndian); dataOffset += 2; - if (intHeader === 0x4154) { - isLittleEndian = false; - } const version = view.getUint16(dataOffset, isLittleEndian); dataOffset += 2; if (version !== 0x0002) { throw new Error('Only version 2 of the RTTrP header is currently supported'); } - const pID = view.getUint32(dataOffset, isLittleEndian); + if (intHeader === 0x5441) { + isLittleEndian = true; + } + const packetID = view.getUint32(dataOffset, isLittleEndian); dataOffset += 4; - const pForm = view.getUint8(dataOffset); + const packetFormat = view.getUint8(dataOffset); dataOffset += 1; - const pktSize = view.getUint16(dataOffset, isLittleEndian); + const size = view.getUint16(dataOffset, isLittleEndian); dataOffset += 2; const context = view.getUint32(dataOffset, isLittleEndian); dataOffset += 4; - const numMods = view.getUint8(dataOffset); + const subModuleCount = view.getUint8(dataOffset); dataOffset += 1; - const data = bytes.slice(dataOffset); return { intHeader, - fltHeader, + floatHeader, version, - pID, - pForm, - pktSize, + packetID, + packetFormat, + size, context, - numMods, - data, + subModuleCount, }; }; diff --git a/src/encoders/rttrp-header.ts b/src/encoders/rttrp-header.ts new file mode 100644 index 0000000..77c1435 --- /dev/null +++ b/src/encoders/rttrp-header.ts @@ -0,0 +1,45 @@ +const HEADER_SIZE = 18; + +export default ( + floatSignature: number, + version: number, + packetID: number, + packetFormat: number, + context: number, + subModules: Uint8Array[], + isLittleEndian: boolean = false +): Uint8Array => { + if (version !== 2) { + throw new Error('Only version 2 of the RTTrP header is currently supported'); + } + const bytes = new Uint8Array(HEADER_SIZE); + + let totalPacketSize = bytes.byteLength; + subModules.forEach((subModule) => { + totalPacketSize += subModule.length; + }); + + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + let dataOffset = 0; + + view.setUint16(dataOffset, 0x4154, isLittleEndian); + dataOffset += 2; + view.setUint16(dataOffset, floatSignature, isLittleEndian); + dataOffset += 2; + view.setUint16(dataOffset, version); + dataOffset += 2; + + view.setUint32(dataOffset, packetID, isLittleEndian); + dataOffset += 4; + + view.setUint8(dataOffset, packetFormat); + dataOffset += 1; + view.setUint16(dataOffset, totalPacketSize, isLittleEndian); + dataOffset += 2; + view.setUint32(dataOffset, context, isLittleEndian); + dataOffset += 4; + view.setUint8(dataOffset, subModules.length); + dataOffset += 1; + + return bytes; +}; diff --git a/src/encoders/rttrp.ts b/src/encoders/rttrp.ts deleted file mode 100644 index 514ae07..0000000 --- a/src/encoders/rttrp.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { RTTrPHeader } from '../models'; - -export default (header: RTTrPHeader): Uint8Array => { - if (header.version !== 2) { - throw new Error('Only version 2 of the RTTrP header is currently supported'); - } - const bytes = new Uint8Array(18 + header.data.length); - bytes.set(header.data, 18); - - const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); - let dataOffset = 0; - - let isLittleEndian = false; - view.setUint16(dataOffset, header.intHeader, isLittleEndian); - dataOffset += 2; - view.setUint16(dataOffset, header.fltHeader, isLittleEndian); - dataOffset += 2; - if (header.intHeader === 0x4154) { - isLittleEndian = false; - } - view.setUint16(dataOffset, header.version, isLittleEndian); - dataOffset += 2; - - view.setUint32(dataOffset, header.pID, isLittleEndian); - dataOffset += 4; - - view.setUint8(dataOffset, header.pForm); - dataOffset += 1; - view.setUint16(dataOffset, header.pktSize, isLittleEndian); - dataOffset += 2; - view.setUint32(dataOffset, header.context, isLittleEndian); - dataOffset += 4; - view.setUint8(dataOffset, header.numMods); - dataOffset += 1; - - return bytes; -}; diff --git a/src/models.ts b/src/models.ts index 805c4e9..67745f7 100644 --- a/src/models.ts +++ b/src/models.ts @@ -1,11 +1,11 @@ export type RTTrPHeader = { - intHeader: number; - fltHeader: number; + intHeader?: number; + floatHeader: number; version: number; - pID: number; - pForm: number; - pktSize: number; + packetID: number; + packetFormat: number; + size: number; context: number; - numMods: number; - data: Uint8Array; + subModuleCount: number; +}; }; diff --git a/tests/decode.test.js b/tests/decode.test.js index 41314a1..fb57a0e 100644 --- a/tests/decode.test.js +++ b/tests/decode.test.js @@ -9,14 +9,13 @@ const goodTests = [ ]), expected: { intHeader: 0x4154, - fltHeader: 0x4334, + floatHeader: 0x4334, version: 2, - pID: 305419896, - pForm: 0, - pktSize: 18, + packetID: 305419896, + packetFormat: 0, + size: 18, context: 305419896, - numMods: 0, - data: new Uint8Array(), + subModuleCount: 0, }, decoder: Decoders.RTTrPHeader, }, diff --git a/tests/encode.test.js b/tests/encode.test.js index c1a3922..519c523 100644 --- a/tests/encode.test.js +++ b/tests/encode.test.js @@ -8,25 +8,17 @@ const goodTests = [ expected: new Uint8Array([ 0x41, 0x54, 0x43, 0x34, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x12, 0x12, 0x34, 0x56, 0x78, 0x00, ]), - message: { - intHeader: 0x4154, - fltHeader: 0x4334, - version: 2, - pID: 305419896, - pForm: 0, - pktSize: 18, - context: 305419896, - numMods: 0, - data: new Uint8Array(), + bytes: () => { + return Encoders.RTTrPHeader(0x4334, 2, 0x12345678, 0, 0x12345678, [], false); }, - encoder: Encoders.RTTrPHeader, + }, }, ]; describe('RTTrP Message Encoding', () => { goodTests.forEach((messageTest) => { it(messageTest.description, () => { - const actual = messageTest.encoder(messageTest.message); + const actual = messageTest.bytes(); deepEqual(actual, messageTest.expected); }); }); @@ -38,7 +30,7 @@ const badTests = []; describe('RTTrP Message Encoding Throws', () => { badTests.forEach((messageTest) => { it(messageTest.description, () => { - messageTest.encoder(messageTest.packet); + messageTest.bytes(); throws(() => {}, messageTest.throwsMessage); }); });