ns-joycon
Version:
Extract data from connected Jon-Con of Nintendo Switch.
338 lines • 11.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// Node modules.
const mean_1 = __importDefault(require("lodash/mean"));
function calculateBatteryLevel(value) {
let level;
switch (value) {
case '8':
level = 'full';
break;
case '4':
level = 'medium';
break;
case '2':
level = 'low';
break;
case '1':
level = 'critical';
break;
case '0':
level = 'empty';
break;
default:
level = 'charging';
}
;
return level;
}
/**
* Check on [Documetation of Nintendo_Switch_Reverse_Engineering](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/imu_sensor_notes.md#accelerometer---acceleration-in-g)
* @param {Buffer} value
*/
function toAcceleration(value) {
return parseFloat((0.000244 * value.readInt16LE(0)).toFixed(6));
}
/**
* Check on [Documetation of Nintendo_Switch_Reverse_Engineering](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/imu_sensor_notes.md#gyroscope---rotation-in-degreess---dps)
* @param {Buffer} value
*/
function toDegreesPerSecond(value) {
return parseFloat((0.06103 * value.readInt16LE(0)).toFixed(6));
}
/**
* Check on [Documetation of Nintendo_Switch_Reverse_Engineering](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/imu_sensor_notes.md#gyroscope---rotation-in-revolutionss)
* @param {Buffer} value
*/
function toRevolutionsPerSecond(value) {
return parseFloat((0.0001694 * value.readInt16LE(0)).toFixed(6));
}
function parseInputReportID(rawData, data) {
const inputReportID = {
_raw: rawData.slice(0, 1),
_hex: data.slice(0, 1),
};
return inputReportID;
}
exports.parseInputReportID = parseInputReportID;
function parseTimer(rawData, data) {
const timer = {
_raw: rawData.slice(1, 2),
_hex: data.slice(1, 2),
};
return timer;
}
exports.parseTimer = parseTimer;
function parseBatteryLevel(rawData, data) {
const batteryLevel = {
_raw: rawData.slice(2, 3),
_hex: data[2][0],
level: calculateBatteryLevel(data[2][0]),
};
return batteryLevel;
}
exports.parseBatteryLevel = parseBatteryLevel;
function parseConnectionInfo(rawData, data) {
const connectionInfo = {
_raw: rawData.slice(2, 3),
_hex: data[2][1],
};
return connectionInfo;
}
exports.parseConnectionInfo = parseConnectionInfo;
function parseButtonStatus(rawData, data) {
const buttonStatus = {
_raw: rawData.slice(1, 3),
_hex: data.slice(1, 3),
};
return buttonStatus;
}
exports.parseButtonStatus = parseButtonStatus;
function parseCompleteButtonStatus(rawData, data) {
const buttonStatus = {
_raw: rawData.slice(3, 6),
_hex: data.slice(3, 6),
// Byte 3 (Right Joy-Con)
y: Boolean(0x01 & rawData[3]),
x: Boolean(0x02 & rawData[3]),
b: Boolean(0x04 & rawData[3]),
a: Boolean(0x08 & rawData[3]),
r: Boolean(0x40 & rawData[3]),
zr: Boolean(0x80 & rawData[3]),
// Byte 5 (Left Joy-Con)
down: Boolean(0x01 & rawData[5]),
up: Boolean(0x02 & rawData[5]),
right: Boolean(0x04 & rawData[5]),
left: Boolean(0x08 & rawData[5]),
l: Boolean(0x40 & rawData[5]),
zl: Boolean(0x80 & rawData[5]),
// Byte 3,5 (Shared)
sr: Boolean(0x10 & rawData[3]) || Boolean(0x10 & rawData[5]),
sl: Boolean(0x20 & rawData[3]) || Boolean(0x20 & rawData[5]),
// Byte 4 (Shared)
minus: Boolean(0x01 & rawData[4]),
plus: Boolean(0x02 & rawData[4]),
rightStick: Boolean(0x04 & rawData[4]),
leftStick: Boolean(0x08 & rawData[4]),
home: Boolean(0x10 & rawData[4]),
caputure: Boolean(0x20 & rawData[4]),
chargingGrip: Boolean(0x80 & rawData[4]),
};
return buttonStatus;
}
exports.parseCompleteButtonStatus = parseCompleteButtonStatus;
function parseAnalogStick(rawData, data) {
const analogStick = {
_raw: rawData.slice(3, 4),
_hex: data.slice(3, 4),
};
return analogStick;
}
exports.parseAnalogStick = parseAnalogStick;
function parseAnalogStickLeft(rawData, data) {
const analogStickLeft = {
_raw: rawData.slice(6, 9),
_hex: data.slice(6, 9),
horizontal: rawData[6] | ((rawData[7] & 0xF) << 8),
vertical: (rawData[7] >> 4) | (rawData[8] << 4),
};
return analogStickLeft;
}
exports.parseAnalogStickLeft = parseAnalogStickLeft;
function parseAnalogStickRight(rawData, data) {
const analogStickRight = {
_raw: rawData.slice(9, 12),
_hex: data.slice(9, 12),
horizontal: rawData[9] | ((rawData[10] & 0xF) << 8),
vertical: (rawData[10] >> 4) | (rawData[11] << 4),
};
return analogStickRight;
}
exports.parseAnalogStickRight = parseAnalogStickRight;
function parseFilter(rawData, data) {
const filter = {
_raw: rawData.slice(4),
_hex: data.slice(4),
};
return filter;
}
exports.parseFilter = parseFilter;
function parseVibrator(rawData, data) {
const vibrator = {
_raw: rawData.slice(12, 13),
_hex: data.slice(12, 13),
};
return vibrator;
}
exports.parseVibrator = parseVibrator;
function parseAck(rawData, data) {
const ack = {
_raw: rawData.slice(13, 14),
_hex: data.slice(13, 14),
};
return ack;
}
exports.parseAck = parseAck;
function parseSubcommandID(rawData, data) {
const subcommandID = {
_raw: rawData.slice(14, 15),
_hex: data.slice(14, 15),
};
return subcommandID;
}
exports.parseSubcommandID = parseSubcommandID;
function parseSubcommandReplyData(rawData, data) {
const subcommandReplyData = {
_raw: rawData.slice(15),
_hex: data.slice(15),
};
return subcommandReplyData;
}
exports.parseSubcommandReplyData = parseSubcommandReplyData;
function parseAccelerometers(rawData, data) {
const accelerometers = [
{
x: {
_raw: rawData.slice(13, 15),
_hex: data.slice(13, 15),
acc: toAcceleration(rawData.slice(13, 15)),
},
y: {
_raw: rawData.slice(15, 17),
_hex: data.slice(15, 17),
acc: toAcceleration(rawData.slice(15, 17)),
},
z: {
_raw: rawData.slice(17, 19),
_hex: data.slice(17, 19),
acc: toAcceleration(rawData.slice(17, 19)),
},
},
{
x: {
_raw: rawData.slice(25, 27),
_hex: data.slice(25, 27),
acc: toAcceleration(rawData.slice(25, 27)),
},
y: {
_raw: rawData.slice(27, 29),
_hex: data.slice(27, 29),
acc: toAcceleration(rawData.slice(27, 29)),
},
z: {
_raw: rawData.slice(29, 31),
_hex: data.slice(29, 31),
acc: toAcceleration(rawData.slice(29, 31)),
},
},
{
x: {
_raw: rawData.slice(37, 39),
_hex: data.slice(37, 39),
acc: toAcceleration(rawData.slice(37, 39)),
},
y: {
_raw: rawData.slice(39, 41),
_hex: data.slice(39, 41),
acc: toAcceleration(rawData.slice(39, 41)),
},
z: {
_raw: rawData.slice(41, 43),
_hex: data.slice(41, 43),
acc: toAcceleration(rawData.slice(41, 43)),
},
},
];
return accelerometers;
}
exports.parseAccelerometers = parseAccelerometers;
function parseGyroscopes(rawData, data) {
const gyroscopes = [
[
{
_raw: rawData.slice(19, 21),
_hex: data.slice(19, 21),
dps: toDegreesPerSecond(rawData.slice(19, 21)),
rps: toRevolutionsPerSecond(rawData.slice(19, 21)),
},
{
_raw: rawData.slice(21, 23),
_hex: data.slice(21, 23),
dps: toDegreesPerSecond(rawData.slice(21, 23)),
rps: toRevolutionsPerSecond(rawData.slice(21, 23)),
},
{
_raw: rawData.slice(23, 25),
_hex: data.slice(23, 25),
dps: toDegreesPerSecond(rawData.slice(23, 25)),
rps: toRevolutionsPerSecond(rawData.slice(23, 25)),
},
],
[
{
_raw: rawData.slice(31, 33),
_hex: data.slice(31, 33),
dps: toDegreesPerSecond(rawData.slice(31, 33)),
rps: toRevolutionsPerSecond(rawData.slice(31, 33)),
},
{
_raw: rawData.slice(33, 35),
_hex: data.slice(33, 35),
dps: toDegreesPerSecond(rawData.slice(33, 35)),
rps: toRevolutionsPerSecond(rawData.slice(33, 35)),
},
{
_raw: rawData.slice(35, 37),
_hex: data.slice(35, 37),
dps: toDegreesPerSecond(rawData.slice(35, 37)),
rps: toRevolutionsPerSecond(rawData.slice(35, 37)),
},
],
[
{
_raw: rawData.slice(43, 45),
_hex: data.slice(43, 45),
dps: toDegreesPerSecond(rawData.slice(43, 45)),
rps: toRevolutionsPerSecond(rawData.slice(43, 45)),
},
{
_raw: rawData.slice(45, 47),
_hex: data.slice(45, 47),
dps: toDegreesPerSecond(rawData.slice(45, 47)),
rps: toRevolutionsPerSecond(rawData.slice(45, 47)),
},
{
_raw: rawData.slice(47, 49),
_hex: data.slice(47, 49),
dps: toDegreesPerSecond(rawData.slice(47, 49)),
rps: toRevolutionsPerSecond(rawData.slice(47, 49)),
},
],
];
return gyroscopes;
}
exports.parseGyroscopes = parseGyroscopes;
function calculateActualAccelerometer(accelerometers) {
const elapsedTime = 0.005 * accelerometers.length; // Spent 5ms to collect each data.
const actualAccelerometer = {
x: parseFloat((mean_1.default(accelerometers.map(g => g[0])) * elapsedTime).toFixed(6)),
y: parseFloat((mean_1.default(accelerometers.map(g => g[1])) * elapsedTime).toFixed(6)),
z: parseFloat((mean_1.default(accelerometers.map(g => g[2])) * elapsedTime).toFixed(6)),
};
return actualAccelerometer;
}
exports.calculateActualAccelerometer = calculateActualAccelerometer;
function calculateActualGyroscope(gyroscopes) {
const elapsedTime = 0.005 * gyroscopes.length; // Spent 5ms to collect each data.
const actualGyroscopes = [
mean_1.default(gyroscopes.map(g => g[0])),
mean_1.default(gyroscopes.map(g => g[1])),
mean_1.default(gyroscopes.map(g => g[2])),
].map(v => parseFloat((v * elapsedTime).toFixed(6)));
return actualGyroscopes;
}
exports.calculateActualGyroscope = calculateActualGyroscope;
//# sourceMappingURL=packet-parser.js.map