initial commit

This commit is contained in:
2023-09-10 20:38:49 -05:00
commit 7a1366303f
16 changed files with 3268 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
const Parser = require('binary-parser').Parser;
const PSN_PACKET_HEADER_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.uint64le('packet_timestamp')
.uint8('version_high')
.uint8('version_low')
.uint8('frame_id')
.uint8('frame_packet_count')
.seek(4);
module.exports = {
PSN_PACKET_HEADER_PARSER,
};
+77
View File
@@ -0,0 +1,77 @@
const { PSN_PACKET_HEADER_PARSER } = require('../common');
const Parser = require('binary-parser').Parser;
const PSN_DATA_TRACKER_FIELD_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.choice('data', {
tag: 'id',
choices: {
0x0000: new Parser().floatle('pos_x').floatle('pos_y').floatle('pos_z'),
0x0001: new Parser().floatle('speed_x').floatle('speed_y').floatle('speed_z'),
0x0002: new Parser().floatle('ori_x').floatle('ori_y').floatle('ori_z'),
0x0003: new Parser().floatle('validity'),
0x0004: new Parser().floatle('accel_x').floatle('accel_y').floatle('accel_z'),
0x0005: new Parser().floatle('trgtpos_x').floatle('trgtpos_y').floatle('trgtpos_z'),
0x0006: new Parser().uint64le('tracker_timestamp'),
},
});
const PSN_DATA_TRACKER_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.buffer('data', {
length: 'data_len',
});
const PSN_DATA_TRACKER_LIST_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.array('trackers', { type: PSN_DATA_TRACKER_PARSER, lengthInBytes: 'data_len' });
const PSN_DATA_CHUNK_DATA_PARSER = new Parser()
.nest('packet_header', { type: PSN_PACKET_HEADER_PARSER })
.nest('tracker_list', { type: PSN_DATA_TRACKER_LIST_PARSER });
module.exports = {
PSN_DATA_CHUNK_DATA_PARSER,
PSN_DATA_TRACKER_FIELD_PARSER,
PSN_DATA_TRACKER_LIST_PARSER,
PSN_DATA_TRACKER_PARSER,
};
+29
View File
@@ -0,0 +1,29 @@
const { PSN_DATA_CHUNK_DATA_PARSER } = require('./data');
const { PSN_INFO_CHUNK_DATA_PARSER } = require('./info');
const Parser = require('binary-parser').Parser;
const PSN_PACKET_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.choice('chunk_data', {
tag: 'id',
choices: {
0x6755: PSN_DATA_CHUNK_DATA_PARSER,
0x6756: PSN_INFO_CHUNK_DATA_PARSER,
},
});
module.exports = (buffer) => PSN_PACKET_PARSER.parse(buffer);
+86
View File
@@ -0,0 +1,86 @@
const { PSN_PACKET_HEADER_PARSER } = require('../common');
const Parser = require('binary-parser').Parser;
const PSN_INFO_SYSTEM_NAME_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.string('system_name', { length: 'data_len' });
const PSN_INFO_TRACKER_NAME_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.string('tracker_name', { length: 'data_len' });
const PSN_INFO_TRACKER_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.nest('tracker_name', {
type: PSN_INFO_TRACKER_NAME_PARSER,
});
const PSN_INFO_TRACKER_LIST_PARSER = new Parser()
.uint16le('id')
.uint16le('data_len', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return Number.parseInt(binary.substring(1), 2);
},
})
.seek(-2)
.uint16le('has_subchunks', {
formatter: (item) => {
const binary = item.toString(2).padStart(16, '0');
return binary.charAt(0) === '1';
},
})
.array('trackers', { type: PSN_INFO_TRACKER_PARSER, lengthInBytes: 'data_len' });
const PSN_INFO_CHUNK_DATA_PARSER = new Parser()
.nest('packet_header', { type: PSN_PACKET_HEADER_PARSER })
.nest('system_name', { type: PSN_INFO_SYSTEM_NAME_PARSER })
.nest('tracker_list', { type: PSN_INFO_TRACKER_LIST_PARSER });
module.exports = {
PSN_INFO_SYSTEM_NAME_PARSER,
PSN_INFO_TRACKER_NAME_PARSER,
PSN_INFO_TRACKER_PARSER,
PSN_INFO_TRACKER_LIST_PARSER,
PSN_INFO_CHUNK_DATA_PARSER,
};