diff --git a/src/decoder.ts b/src/decoder.ts index 9c115f8..d4baf09 100644 --- a/src/decoder.ts +++ b/src/decoder.ts @@ -1,8 +1,5 @@ -import { DataPacketChunk } from './decoders/data/data-packet-chunk'; -import { InfoPacketChunk } from './decoders/info/info-packet-chunk'; -import { InfoTrackerChunk } from './decoders/info/info-tracker-chunk'; -import packetDecoder from './decoders/packet'; -import { PacketHeaderChunk } from './decoders/packet-header-chunk'; +import { Decoders } from '.'; +import { DataPacketChunk, InfoPacketChunk, InfoTrackerChunk, PacketHeaderChunk } from './models'; export class Decoder { // TODO(jwetzell): check if these last packet headers are necessary to hold on to @@ -51,7 +48,7 @@ export class Decoder { // TODO(jwetzell): add invalid frame id decoding. Scenario where a frame id is reused before one is complete decode(packetBuf: Buffer): DataPacketChunk | InfoPacketChunk | undefined { - const packet = packetDecoder(packetBuf); + const packet = Decoders.Packet(packetBuf); if (packet === undefined) { return packet; } diff --git a/src/decoders/chunk.ts b/src/decoders/chunk.ts index b02ba9a..30c5371 100644 --- a/src/decoders/chunk.ts +++ b/src/decoders/chunk.ts @@ -1,9 +1,4 @@ -export interface Chunk { - id?: number; - has_subchunks?: boolean; - data_len?: number; - chunk_data?: Buffer; -} +import { Chunk } from '../models/chunk'; export default (buffer: Buffer, dataDecoder: Function): Chunk => { let offset = 0; diff --git a/src/decoders/data/data-packet-chunk.ts b/src/decoders/data/data-packet-chunk.ts index ea06699..b29ba72 100644 --- a/src/decoders/data/data-packet-chunk.ts +++ b/src/decoders/data/data-packet-chunk.ts @@ -1,12 +1,6 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import packetHeaderChunk, { PacketHeaderChunk } from '../packet-header-chunk'; -import dataTrackerListChunk, { DataTrackerListChunk } from './data-tracker-list-chunk'; - -export interface DataPacketChunk extends Chunk { - packet_header: PacketHeaderChunk; - tracker_list: DataTrackerListChunk; -} +import { DataPacketChunk } from '../../models/data/data-packet-chunk'; function decodeDataPacketChunk(dataPacketChunk: DataPacketChunk) { if (dataPacketChunk.has_subchunks && dataPacketChunk.chunk_data && dataPacketChunk.data_len) { @@ -15,14 +9,14 @@ function decodeDataPacketChunk(dataPacketChunk: DataPacketChunk) { const chunkId = dataPacketChunk.chunk_data.readUInt16LE(offset); switch (chunkId) { case 0x0000: - dataPacketChunk.packet_header = packetHeaderChunk(dataPacketChunk.chunk_data.subarray(offset)); + dataPacketChunk.packet_header = Decoders.PacketHeaderChunk(dataPacketChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (dataPacketChunk.packet_header?.data_len) { offset += dataPacketChunk.packet_header.data_len; } break; case 0x0001: - dataPacketChunk.tracker_list = dataTrackerListChunk(dataPacketChunk.chunk_data.subarray(offset)); + dataPacketChunk.tracker_list = Decoders.DataTrackerListChunk(dataPacketChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (dataPacketChunk.tracker_list.data_len) { offset += dataPacketChunk.tracker_list.data_len; @@ -35,4 +29,4 @@ function decodeDataPacketChunk(dataPacketChunk: DataPacketChunk) { } } -export default (buffer: Buffer): DataPacketChunk => chunk(buffer, decodeDataPacketChunk) as DataPacketChunk; +export default (buffer: Buffer): DataPacketChunk => Decoders.Chunk(buffer, decodeDataPacketChunk) as DataPacketChunk; diff --git a/src/decoders/data/data-tracker-chunk.ts b/src/decoders/data/data-tracker-chunk.ts index 65a2fd2..47d34e0 100644 --- a/src/decoders/data/data-tracker-chunk.ts +++ b/src/decoders/data/data-tracker-chunk.ts @@ -1,22 +1,12 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import dataTrackerFieldChunk, { DataTrackerFieldChunk } from './data-tracker-field-chunk'; - -export interface DataTrackerChunk extends Chunk { - pos: DataTrackerFieldChunk; - speed: DataTrackerFieldChunk; - ori: DataTrackerFieldChunk; - status: DataTrackerFieldChunk; - accel: DataTrackerFieldChunk; - trgtpos: DataTrackerFieldChunk; - timestamp: DataTrackerFieldChunk; -} +import { DataTrackerChunk } from '../../models/data/data-tracker-chunk'; function decodeTrackerChunk(trackerChunk: DataTrackerChunk) { if (trackerChunk.chunk_data && trackerChunk.data_len) { let offset = 0; while (offset < trackerChunk.data_len) { - const trackerFieldChunk = dataTrackerFieldChunk(trackerChunk.chunk_data.subarray(offset)); + const trackerFieldChunk = Decoders.DataTrackerFieldChunk(trackerChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (trackerFieldChunk.data_len) { offset += trackerFieldChunk.data_len; @@ -50,4 +40,4 @@ function decodeTrackerChunk(trackerChunk: DataTrackerChunk) { } } -export default (buffer: Buffer): DataTrackerChunk => chunk(buffer, decodeTrackerChunk) as DataTrackerChunk; +export default (buffer: Buffer): DataTrackerChunk => Decoders.Chunk(buffer, decodeTrackerChunk) as DataTrackerChunk; diff --git a/src/decoders/data/data-tracker-field-chunk.ts b/src/decoders/data/data-tracker-field-chunk.ts index bca40ac..fbc2327 100644 --- a/src/decoders/data/data-tracker-field-chunk.ts +++ b/src/decoders/data/data-tracker-field-chunk.ts @@ -1,9 +1,7 @@ /* eslint-disable no-case-declarations */ -import chunk, { Chunk } from '../chunk'; -export interface DataTrackerFieldChunk extends Chunk { - [key: string]: number | bigint | number[] | Buffer | undefined | boolean; -} +import { Decoders } from '..'; +import { DataTrackerFieldChunk } from '../../models/data/data-tracker-field-chunk'; function readXYZ(trackerFieldChunk: DataTrackerFieldChunk, prefix: string = '') { if (trackerFieldChunk.chunk_data) { @@ -47,4 +45,4 @@ function decodeTrackerFieldChunk(trackerFieldChunk: DataTrackerFieldChunk) { } export default (buffer: Buffer): DataTrackerFieldChunk => - chunk(buffer, decodeTrackerFieldChunk) as DataTrackerFieldChunk; + Decoders.Chunk(buffer, decodeTrackerFieldChunk) as DataTrackerFieldChunk; diff --git a/src/decoders/data/data-tracker-list-chunk.ts b/src/decoders/data/data-tracker-list-chunk.ts index 9d4022b..9eb42c7 100644 --- a/src/decoders/data/data-tracker-list-chunk.ts +++ b/src/decoders/data/data-tracker-list-chunk.ts @@ -1,12 +1,6 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import dataTrackerChunk, { DataTrackerChunk } from './data-tracker-chunk'; - -export interface DataTrackerListChunk extends Chunk { - trackers: { - [key: number]: DataTrackerChunk; - }; -} +import { DataTrackerListChunk } from '../../models/data/data-tracker-list-chunk'; function decodeDataTrackerListChunk(dataTrackerListChunk: DataTrackerListChunk) { dataTrackerListChunk.trackers = {}; @@ -15,7 +9,7 @@ function decodeDataTrackerListChunk(dataTrackerListChunk: DataTrackerListChunk) let offset = 0; if (dataTrackerListChunk.chunk_data) { while (offset < dataTrackerListChunk.chunk_data.length) { - const trackerChunk = dataTrackerChunk(dataTrackerListChunk.chunk_data.subarray(offset)); + const trackerChunk = Decoders.DataTrackerChunk(dataTrackerListChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (trackerChunk.data_len) { offset += trackerChunk.data_len; @@ -27,4 +21,4 @@ function decodeDataTrackerListChunk(dataTrackerListChunk: DataTrackerListChunk) } } export default (buffer: Buffer): DataTrackerListChunk => - chunk(buffer, decodeDataTrackerListChunk) as DataTrackerListChunk; + Decoders.Chunk(buffer, decodeDataTrackerListChunk) as DataTrackerListChunk; diff --git a/src/decoders/index.ts b/src/decoders/index.ts new file mode 100644 index 0000000..4f5d7b5 --- /dev/null +++ b/src/decoders/index.ts @@ -0,0 +1,29 @@ +import Chunk from './chunk'; +import Packet from './packet'; +import PacketHeaderChunk from './packet-header-chunk'; + +import DataPacketChunk from './data/data-packet-chunk'; +import DataTrackerChunk from './data/data-tracker-chunk'; +import DataTrackerFieldChunk from './data/data-tracker-field-chunk'; +import DataTrackerListChunk from './data/data-tracker-list-chunk'; + +import InfoPacketChunk from './info/info-packet-chunk'; +import InfoSystemNameChunk from './info/info-system-name-chunk'; +import InfoTrackerChunk from './info/info-tracker-chunk'; +import InfoTrackerListChunk from './info/info-tracker-list-chunk'; +import InfoTrackerNameChunk from './info/info-tracker-name-chunk'; + +export const Decoders = { + Chunk, + PacketHeaderChunk, + Packet, + DataPacketChunk, + DataTrackerChunk, + DataTrackerFieldChunk, + DataTrackerListChunk, + InfoPacketChunk, + InfoSystemNameChunk, + InfoTrackerChunk, + InfoTrackerListChunk, + InfoTrackerNameChunk, +}; diff --git a/src/decoders/info/info-packet-chunk.ts b/src/decoders/info/info-packet-chunk.ts index c16ac3c..c792da2 100644 --- a/src/decoders/info/info-packet-chunk.ts +++ b/src/decoders/info/info-packet-chunk.ts @@ -1,14 +1,6 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import packetHeaderChunk, { PacketHeaderChunk } from '../packet-header-chunk'; -import infoSystemNameChunk, { InfoSystemNameChunk } from './info-system-name-chunk'; -import infoTrackerListChunk, { InfoTrackerListChunk } from './info-tracker-list-chunk'; - -export interface InfoPacketChunk extends Chunk { - packet_header: PacketHeaderChunk; - system_name: InfoSystemNameChunk; - tracker_list: InfoTrackerListChunk; -} +import { InfoPacketChunk } from '../../models/info/info-packet-chunk'; function decodeInfoPacketChunk(infoPacketChunk: InfoPacketChunk) { if (infoPacketChunk.has_subchunks && infoPacketChunk.chunk_data && infoPacketChunk.data_len) { @@ -17,21 +9,21 @@ function decodeInfoPacketChunk(infoPacketChunk: InfoPacketChunk) { const chunkId = infoPacketChunk.chunk_data.readUInt16LE(offset); switch (chunkId) { case 0x0000: - infoPacketChunk.packet_header = packetHeaderChunk(infoPacketChunk.chunk_data.subarray(offset)); + infoPacketChunk.packet_header = Decoders.PacketHeaderChunk(infoPacketChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (infoPacketChunk.packet_header?.data_len) { offset += infoPacketChunk.packet_header.data_len; } break; case 0x0001: - infoPacketChunk.system_name = infoSystemNameChunk(infoPacketChunk.chunk_data.subarray(offset)); + infoPacketChunk.system_name = Decoders.InfoSystemNameChunk(infoPacketChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (infoPacketChunk.system_name?.data_len) { offset += infoPacketChunk.system_name.data_len; } break; case 0x0002: - infoPacketChunk.tracker_list = infoTrackerListChunk(infoPacketChunk.chunk_data.subarray(offset)); + infoPacketChunk.tracker_list = Decoders.InfoTrackerListChunk(infoPacketChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (infoPacketChunk.tracker_list?.data_len) { offset += infoPacketChunk.tracker_list.data_len; @@ -44,4 +36,4 @@ function decodeInfoPacketChunk(infoPacketChunk: InfoPacketChunk) { } } -export default (buffer: Buffer): InfoPacketChunk => chunk(buffer, decodeInfoPacketChunk) as InfoPacketChunk; +export default (buffer: Buffer): InfoPacketChunk => Decoders.Chunk(buffer, decodeInfoPacketChunk) as InfoPacketChunk; diff --git a/src/decoders/info/info-system-name-chunk.ts b/src/decoders/info/info-system-name-chunk.ts index 765bb88..0c5aab6 100644 --- a/src/decoders/info/info-system-name-chunk.ts +++ b/src/decoders/info/info-system-name-chunk.ts @@ -1,8 +1,5 @@ -import chunk, { Chunk } from '../chunk'; - -export interface InfoSystemNameChunk extends Chunk { - system_name: string; -} +import { Decoders } from '..'; +import { InfoSystemNameChunk } from '../../models/info/info-system-name-chunk'; function decodeSystemNameChunk(systemNameChunk: InfoSystemNameChunk) { if (systemNameChunk.chunk_data !== undefined && systemNameChunk.data_len !== undefined) { @@ -10,4 +7,5 @@ function decodeSystemNameChunk(systemNameChunk: InfoSystemNameChunk) { } } -export default (buffer: Buffer): InfoSystemNameChunk => chunk(buffer, decodeSystemNameChunk) as InfoSystemNameChunk; +export default (buffer: Buffer): InfoSystemNameChunk => + Decoders.Chunk(buffer, decodeSystemNameChunk) as InfoSystemNameChunk; diff --git a/src/decoders/info/info-tracker-chunk.ts b/src/decoders/info/info-tracker-chunk.ts index 5c2b5a6..ffc2faa 100644 --- a/src/decoders/info/info-tracker-chunk.ts +++ b/src/decoders/info/info-tracker-chunk.ts @@ -1,10 +1,6 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import infoTrackerNameChunk, { InfoTrackerNameChunk } from './info-tracker-name-chunk'; - -export interface InfoTrackerChunk extends Chunk { - tracker_name?: InfoTrackerNameChunk; -} +import { InfoTrackerChunk } from '../../models/info/info-tracker-chunk'; function decodeInfoTrackerChunk(infoTrackerChunk: InfoTrackerChunk) { if (infoTrackerChunk.has_subchunks && infoTrackerChunk.chunk_data && infoTrackerChunk.data_len) { @@ -13,7 +9,7 @@ function decodeInfoTrackerChunk(infoTrackerChunk: InfoTrackerChunk) { const chunkId = infoTrackerChunk.chunk_data.readUInt16LE(offset); switch (chunkId) { case 0x0000: - infoTrackerChunk.tracker_name = infoTrackerNameChunk(infoTrackerChunk.chunk_data.subarray(offset)); + infoTrackerChunk.tracker_name = Decoders.InfoTrackerNameChunk(infoTrackerChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (infoTrackerChunk.tracker_name?.data_len) { offset += infoTrackerChunk?.tracker_name?.data_len; @@ -27,4 +23,4 @@ function decodeInfoTrackerChunk(infoTrackerChunk: InfoTrackerChunk) { } } -export default (buffer: Buffer): InfoTrackerChunk => chunk(buffer, decodeInfoTrackerChunk); +export default (buffer: Buffer): InfoTrackerChunk => Decoders.Chunk(buffer, decodeInfoTrackerChunk); diff --git a/src/decoders/info/info-tracker-list-chunk.ts b/src/decoders/info/info-tracker-list-chunk.ts index b126883..193794f 100644 --- a/src/decoders/info/info-tracker-list-chunk.ts +++ b/src/decoders/info/info-tracker-list-chunk.ts @@ -1,19 +1,14 @@ +import { Decoders } from '..'; import { Constants } from '../../constants'; -import chunk, { Chunk } from '../chunk'; -import infoTrackerChunk, { InfoTrackerChunk } from './info-tracker-chunk'; +import { InfoTrackerListChunk } from '../../models/info/info-tracker-list-chunk'; -export interface InfoTrackerListChunk extends Chunk { - trackers: { - [key: number]: InfoTrackerChunk; - }; -} function decodeInfoTrackerListChunk(infoTrackerListChunk: InfoTrackerListChunk) { infoTrackerListChunk.trackers = {}; if (infoTrackerListChunk.has_subchunks && infoTrackerListChunk.chunk_data) { let offset = 0; if (infoTrackerListChunk.data_len) { while (offset < infoTrackerListChunk.data_len) { - const trackerChunk = infoTrackerChunk(infoTrackerListChunk.chunk_data.subarray(offset)); + const trackerChunk = Decoders.InfoTrackerChunk(infoTrackerListChunk.chunk_data.subarray(offset)); offset += Constants.CHUNK_HEADER_SIZE; if (trackerChunk.data_len) { offset += trackerChunk.data_len; @@ -26,4 +21,4 @@ function decodeInfoTrackerListChunk(infoTrackerListChunk: InfoTrackerListChunk) } } export default (buffer: Buffer): InfoTrackerListChunk => - chunk(buffer, decodeInfoTrackerListChunk) as InfoTrackerListChunk; + Decoders.Chunk(buffer, decodeInfoTrackerListChunk) as InfoTrackerListChunk; diff --git a/src/decoders/info/info-tracker-name-chunk.ts b/src/decoders/info/info-tracker-name-chunk.ts index 757673b..2b34dd2 100644 --- a/src/decoders/info/info-tracker-name-chunk.ts +++ b/src/decoders/info/info-tracker-name-chunk.ts @@ -1,11 +1,10 @@ -import chunk, { Chunk } from '../chunk'; -export interface InfoTrackerNameChunk extends Chunk { - tracker_name: string; -} +import { Decoders } from '..'; +import { InfoTrackerNameChunk } from '../../models/info/info-tracker-name-chunk'; function decodeTrackerNameChunk(trackerNameChunk: InfoTrackerNameChunk) { if (trackerNameChunk.chunk_data !== undefined && trackerNameChunk.data_len !== undefined) { trackerNameChunk.tracker_name = trackerNameChunk.chunk_data.subarray(0, trackerNameChunk.data_len).toString(); } } -export default (buffer: Buffer): InfoTrackerNameChunk => chunk(buffer, decodeTrackerNameChunk) as InfoTrackerNameChunk; +export default (buffer: Buffer): InfoTrackerNameChunk => + Decoders.Chunk(buffer, decodeTrackerNameChunk) as InfoTrackerNameChunk; diff --git a/src/decoders/packet-header-chunk.ts b/src/decoders/packet-header-chunk.ts index c68a77e..da77c18 100644 --- a/src/decoders/packet-header-chunk.ts +++ b/src/decoders/packet-header-chunk.ts @@ -1,14 +1,7 @@ -import chunk, { Chunk } from './chunk'; -export interface PacketHeaderChunk extends Chunk { - packet_timestamp?: bigint; - version_high?: number; - version_low?: number; - frame_id?: number; - frame_packet_count?: number; -} +import { Decoders } from '.'; +import { PacketHeaderChunk } from '../models/packet-header-chunk'; function decodePacketHeaderChunk(packetHeaderChunk: PacketHeaderChunk) { - // TODO(jwetzell): remove the string conversion if (packetHeaderChunk.chunk_data) { packetHeaderChunk.packet_timestamp = packetHeaderChunk.chunk_data.readBigUInt64LE(0); packetHeaderChunk.version_high = packetHeaderChunk.chunk_data.readUInt8(8); @@ -18,4 +11,4 @@ function decodePacketHeaderChunk(packetHeaderChunk: PacketHeaderChunk) { } } -export default (buffer: Buffer): PacketHeaderChunk => chunk(buffer, decodePacketHeaderChunk); +export default (buffer: Buffer): PacketHeaderChunk => Decoders.Chunk(buffer, decodePacketHeaderChunk); diff --git a/src/decoders/packet.ts b/src/decoders/packet.ts index fba1bf6..2995bff 100644 --- a/src/decoders/packet.ts +++ b/src/decoders/packet.ts @@ -1,14 +1,14 @@ -import infoPacketChunk, { InfoPacketChunk } from './info/info-packet-chunk'; - -import dataPacketChunk, { DataPacketChunk } from './data/data-packet-chunk'; +import { Decoders } from '.'; +import { DataPacketChunk } from '../models/data/data-packet-chunk'; +import { InfoPacketChunk } from '../models/info/info-packet-chunk'; export default (buffer: Buffer): InfoPacketChunk | DataPacketChunk | undefined => { const chunkId = buffer.readUInt16LE(); switch (chunkId) { case 0x6756: - return infoPacketChunk(buffer); + return Decoders.InfoPacketChunk(buffer); case 0x6755: - return dataPacketChunk(buffer); + return Decoders.DataPacketChunk(buffer); default: return undefined; } diff --git a/src/encoder.ts b/src/encoder.ts index 2866a5f..145d7ac 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -1,12 +1,7 @@ import { Tracker } from './models/tracker'; +import { Encoders } from '.'; import { Constants } from './constants'; -import dataPacketChunk from './encoders/data/data-packet-chunk'; -import dataTrackerListChunk from './encoders/data/data-tracker-list-chunk'; -import infoPacketChunk from './encoders/info/info-packet-chunk'; -import infoSystemNameChunk from './encoders/info/info-system-name-chunk'; -import infoTrackerListChunk from './encoders/info/info-tracker-list-chunk'; -import packetHeaderChunk from './encoders/packet-header-chunk'; export class Encoder { private systemName: string; @@ -20,6 +15,25 @@ export class Encoder { this.versionLow = versionLow; } + setSystemName(systemName: string) { + this.systemName = systemName; + } + setVersionHigh(versionHigh: number) { + this.versionHigh = versionHigh; + } + + setVersionLow(versionLow: number) { + this.versionLow = versionLow; + } + + resetDataFrameId() { + this.dataFrameId = 1; + } + + resetInfoFrameId() { + this.infoFrameId = 1; + } + getInfoPackets(timestamp: bigint, trackers: Tracker[], frameId?: number) { if (frameId !== undefined) { if (!Number.isInteger(frameId)) { @@ -31,7 +45,7 @@ export class Encoder { } } - const systemNameChunk = infoSystemNameChunk(this.systemName); + const systemNameChunk = Encoders.InfoSystemNameChunk(this.systemName); const trackerChunks = trackers.map((tracker: Tracker) => tracker.getInfoChunk()); @@ -52,7 +66,7 @@ export class Encoder { currentInfoPacketSize += trackerChunk.length; }); trackerChunksLists.push(currentTrackerList); - const header = packetHeaderChunk( + const header = Encoders.PacketHeaderChunk( timestamp, this.versionHigh, this.versionLow, @@ -60,7 +74,9 @@ export class Encoder { trackerChunksLists.length ); trackerChunksLists.forEach((trackerChunkList) => { - infoPackets.push(infoPacketChunk(header, systemNameChunk, infoTrackerListChunk(trackerChunkList))); + infoPackets.push( + Encoders.InfoPacketChunk(header, systemNameChunk, Encoders.InfoTrackerListChunk(trackerChunkList)) + ); }); this.infoFrameId += 1; if (this.infoFrameId > 255) { @@ -99,7 +115,7 @@ export class Encoder { }); trackerChunksLists.push(currentTrackerList); - const header = packetHeaderChunk( + const header = Encoders.PacketHeaderChunk( timestamp, this.versionHigh, this.versionLow, @@ -107,7 +123,7 @@ export class Encoder { trackerChunksLists.length ); trackerChunksLists.forEach((trackerChunks) => { - dataPackets.push(dataPacketChunk(header, dataTrackerListChunk(trackerChunks))); + dataPackets.push(Encoders.DataPacketChunk(header, Encoders.DataTrackerListChunk(trackerChunks))); }); this.dataFrameId += 1; if (this.dataFrameId > 255) { diff --git a/src/encoders/index.ts b/src/encoders/index.ts new file mode 100644 index 0000000..399ba18 --- /dev/null +++ b/src/encoders/index.ts @@ -0,0 +1,38 @@ +import Chunk from './chunk'; +import DataPacketChunk from './data/data-packet-chunk'; +import DataTrackerAccelChunk from './data/data-tracker-accel-chunk'; +import DataTrackerChunk from './data/data-tracker-chunk'; +import DataTrackerListChunk from './data/data-tracker-list-chunk'; +import DataTrackerOriChunk from './data/data-tracker-ori-chunk'; +import DataTrackerPosChunk from './data/data-tracker-pos-chunk'; +import DataTrackerSpeedChunk from './data/data-tracker-speed-chunk'; +import DataTrackerStatusChunk from './data/data-tracker-status-chunk'; +import DataTrackerTimestampChunk from './data/data-tracker-timestamp-chunk'; +import DataTrackerTrgtposChunk from './data/data-tracker-trgtpos-chunk'; +import PacketHeaderChunk from './packet-header-chunk'; + +import InfoPacketChunk from './info/info-packet-chunk'; +import InfoSystemNameChunk from './info/info-system-name-chunk'; +import InfoTrackerChunk from './info/info-tracker-chunk'; +import InfoTrackerListChunk from './info/info-tracker-list-chunk'; +import InfoTrackerNameChunk from './info/info-tracker-name-chunk'; + +export const Encoders = { + DataPacketChunk, + DataTrackerAccelChunk, + DataTrackerChunk, + DataTrackerListChunk, + DataTrackerOriChunk, + DataTrackerPosChunk, + DataTrackerSpeedChunk, + DataTrackerStatusChunk, + DataTrackerTimestampChunk, + DataTrackerTrgtposChunk, + InfoPacketChunk, + InfoSystemNameChunk, + InfoTrackerChunk, + InfoTrackerListChunk, + InfoTrackerNameChunk, + PacketHeaderChunk, + Chunk, +}; diff --git a/src/index.ts b/src/index.ts index 626f0ff..8a131da 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,6 @@ export { Decoder } from './decoder'; +export * from './decoders'; export { Encoder } from './encoder'; +export * from './encoders'; +export * from './models'; export { Tracker } from './models/tracker'; diff --git a/src/models/chunk.ts b/src/models/chunk.ts new file mode 100644 index 0000000..6372613 --- /dev/null +++ b/src/models/chunk.ts @@ -0,0 +1,6 @@ +export interface Chunk { + id?: number; + has_subchunks?: boolean; + data_len?: number; + chunk_data?: Buffer; +} diff --git a/src/models/data/data-packet-chunk.ts b/src/models/data/data-packet-chunk.ts new file mode 100644 index 0000000..34ea8f0 --- /dev/null +++ b/src/models/data/data-packet-chunk.ts @@ -0,0 +1,8 @@ +import { Chunk } from '../chunk'; +import { PacketHeaderChunk } from '../packet-header-chunk'; +import { DataTrackerListChunk } from './data-tracker-list-chunk'; + +export interface DataPacketChunk extends Chunk { + packet_header: PacketHeaderChunk; + tracker_list: DataTrackerListChunk; +} diff --git a/src/models/data/data-tracker-chunk.ts b/src/models/data/data-tracker-chunk.ts new file mode 100644 index 0000000..3d44932 --- /dev/null +++ b/src/models/data/data-tracker-chunk.ts @@ -0,0 +1,12 @@ +import { Chunk } from '../chunk'; +import { DataTrackerFieldChunk } from './data-tracker-field-chunk'; + +export interface DataTrackerChunk extends Chunk { + pos?: DataTrackerFieldChunk; + speed?: DataTrackerFieldChunk; + ori?: DataTrackerFieldChunk; + status?: DataTrackerFieldChunk; + accel?: DataTrackerFieldChunk; + trgtpos?: DataTrackerFieldChunk; + timestamp?: DataTrackerFieldChunk; +} diff --git a/src/models/data/data-tracker-field-chunk.ts b/src/models/data/data-tracker-field-chunk.ts new file mode 100644 index 0000000..42c5999 --- /dev/null +++ b/src/models/data/data-tracker-field-chunk.ts @@ -0,0 +1,5 @@ +import { Chunk } from '../chunk'; + +export interface DataTrackerFieldChunk extends Chunk { + [key: string]: number | bigint | number[] | Buffer | undefined | boolean; +} diff --git a/src/models/data/data-tracker-list-chunk.ts b/src/models/data/data-tracker-list-chunk.ts new file mode 100644 index 0000000..006ace2 --- /dev/null +++ b/src/models/data/data-tracker-list-chunk.ts @@ -0,0 +1,8 @@ +import { Chunk } from '../chunk'; +import { DataTrackerChunk } from './data-tracker-chunk'; + +export interface DataTrackerListChunk extends Chunk { + trackers: { + [key: number]: DataTrackerChunk; + }; +} diff --git a/src/models/index.ts b/src/models/index.ts new file mode 100644 index 0000000..568d83d --- /dev/null +++ b/src/models/index.ts @@ -0,0 +1,11 @@ +export * from './chunk'; +export * from './data/data-packet-chunk'; +export * from './data/data-tracker-chunk'; +export * from './data/data-tracker-field-chunk'; +export * from './data/data-tracker-list-chunk'; +export * from './info/info-packet-chunk'; +export * from './info/info-system-name-chunk'; +export * from './info/info-tracker-chunk'; +export * from './info/info-tracker-list-chunk'; +export * from './info/info-tracker-name-chunk'; +export * from './packet-header-chunk'; diff --git a/src/models/info/info-packet-chunk.ts b/src/models/info/info-packet-chunk.ts new file mode 100644 index 0000000..f7b5c53 --- /dev/null +++ b/src/models/info/info-packet-chunk.ts @@ -0,0 +1,10 @@ +import { Chunk } from '../chunk'; +import { PacketHeaderChunk } from '../packet-header-chunk'; +import { InfoSystemNameChunk } from './info-system-name-chunk'; +import { InfoTrackerListChunk } from './info-tracker-list-chunk'; + +export interface InfoPacketChunk extends Chunk { + packet_header: PacketHeaderChunk; + system_name: InfoSystemNameChunk; + tracker_list: InfoTrackerListChunk; +} diff --git a/src/models/info/info-system-name-chunk.ts b/src/models/info/info-system-name-chunk.ts new file mode 100644 index 0000000..400565a --- /dev/null +++ b/src/models/info/info-system-name-chunk.ts @@ -0,0 +1,5 @@ +import { Chunk } from '../chunk'; + +export interface InfoSystemNameChunk extends Chunk { + system_name: string; +} diff --git a/src/models/info/info-tracker-chunk.ts b/src/models/info/info-tracker-chunk.ts new file mode 100644 index 0000000..397be42 --- /dev/null +++ b/src/models/info/info-tracker-chunk.ts @@ -0,0 +1,6 @@ +import { Chunk } from '../chunk'; +import { InfoTrackerNameChunk } from './info-tracker-name-chunk'; + +export interface InfoTrackerChunk extends Chunk { + tracker_name?: InfoTrackerNameChunk; +} diff --git a/src/models/info/info-tracker-list-chunk.ts b/src/models/info/info-tracker-list-chunk.ts new file mode 100644 index 0000000..8cbf810 --- /dev/null +++ b/src/models/info/info-tracker-list-chunk.ts @@ -0,0 +1,8 @@ +import { Chunk } from '../chunk'; +import { InfoTrackerChunk } from './info-tracker-chunk'; + +export interface InfoTrackerListChunk extends Chunk { + trackers: { + [key: number]: InfoTrackerChunk; + }; +} diff --git a/src/models/info/info-tracker-name-chunk.ts b/src/models/info/info-tracker-name-chunk.ts new file mode 100644 index 0000000..2a5b4bd --- /dev/null +++ b/src/models/info/info-tracker-name-chunk.ts @@ -0,0 +1,5 @@ +import { Chunk } from '../chunk'; + +export interface InfoTrackerNameChunk extends Chunk { + tracker_name: string; +} diff --git a/src/models/packet-header-chunk.ts b/src/models/packet-header-chunk.ts new file mode 100644 index 0000000..7db2add --- /dev/null +++ b/src/models/packet-header-chunk.ts @@ -0,0 +1,9 @@ +import { Chunk } from './chunk'; + +export interface PacketHeaderChunk extends Chunk { + packet_timestamp?: bigint; + version_high?: number; + version_low?: number; + frame_id?: number; + frame_packet_count?: number; +}