@rflafla/f1-udp-parser
Version:
The F1 series of games support the outputting of key game data via a UDP data stream. This data can be interpreted by external apps or connected peripherals for a range of different uses, including providing additional telemetry information, customised HU
346 lines • 15.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PacketEventDataParser = exports.CollisionParser = exports.SafetyCarParser = exports.OvertakeParser = exports.ButtonsParser = exports.FlashbackParser = exports.StopGoPenaltyServedParser = exports.DriveThroughPenaltyServedParser = exports.StartLightsParser = exports.SpeedTrapParser = exports.PenaltyParser = exports.RaceWinnerParser = exports.TeamMateInPitsParser = exports.DRSDisabledParser = exports.RetirementParser = exports.FastestLapParser = void 0;
const binary_parser_1 = require("binary-parser");
const constants_1 = require("../../constants");
const F1Parser_1 = require("../F1Parser");
const PacketHeaderParser_1 = require("./PacketHeaderParser");
class FastestLapParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('vehicleIdx').floatle('lapTime');
}
}
exports.FastestLapParser = FastestLapParser;
class RetirementParser extends F1Parser_1.F1Parser {
constructor(packetFormat) {
super();
this.endianess('little').uint8('vehicleIdx');
if (packetFormat >= 2025) {
this.floatle('reason');
}
}
}
exports.RetirementParser = RetirementParser;
class DRSDisabledParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.floatle('reason');
}
}
exports.DRSDisabledParser = DRSDisabledParser;
class TeamMateInPitsParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('vehicleIdx');
}
}
exports.TeamMateInPitsParser = TeamMateInPitsParser;
class RaceWinnerParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('vehicleIdx');
}
}
exports.RaceWinnerParser = RaceWinnerParser;
class PenaltyParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little')
.uint8('penaltyType')
.uint8('infringementType')
.uint8('vehicleIdx')
.uint8('otherVehicleIdx')
.uint8('time')
.uint8('lapNum')
.uint8('placesGained');
}
}
exports.PenaltyParser = PenaltyParser;
class SpeedTrapParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little')
.uint8('vehicleIdx')
.floatle('speed')
.uint8('isOverallFastestInSession')
.uint8('isDriverFastestInSession')
.uint8('fastestVehicleIdxInSession')
.floatle('fastestSpeedInSession');
}
}
exports.SpeedTrapParser = SpeedTrapParser;
class StartLightsParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('numLights');
}
}
exports.StartLightsParser = StartLightsParser;
class DriveThroughPenaltyServedParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('vehicleIdx');
}
}
exports.DriveThroughPenaltyServedParser = DriveThroughPenaltyServedParser;
class StopGoPenaltyServedParser extends F1Parser_1.F1Parser {
constructor(packetFormat) {
super();
this.endianess('little').uint8('vehicleIdx');
if (packetFormat >= 2025) {
this.floatle('stopTime');
}
}
}
exports.StopGoPenaltyServedParser = StopGoPenaltyServedParser;
class FlashbackParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little')
.uint32le('flashbackFrameIdentifier')
.floatle('flashbackSessionTime');
}
}
exports.FlashbackParser = FlashbackParser;
class ButtonsParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint32le('buttonStatus');
}
}
exports.ButtonsParser = ButtonsParser;
class OvertakeParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little')
.uint8('overtakingVehicleIdx')
.uint8('beingOvertakenVehicleIdx');
}
}
exports.OvertakeParser = OvertakeParser;
class SafetyCarParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('safetyCarType').uint8('eventType');
}
}
exports.SafetyCarParser = SafetyCarParser;
class CollisionParser extends F1Parser_1.F1Parser {
constructor() {
super();
this.endianess('little').uint8('vehicle1Idx').uint8('vehicle2Idx');
}
}
exports.CollisionParser = CollisionParser;
class PacketEventDataParser extends F1Parser_1.F1Parser {
data;
constructor(buffer, packetFormat) {
super();
this.endianess('little').nest('m_header', {
type: new PacketHeaderParser_1.PacketHeaderParser(packetFormat),
});
this.string('m_eventStringCode', { length: 4 });
if (packetFormat === 2022) {
this.unpack2022Format(buffer, packetFormat);
}
if (packetFormat === 2023) {
this.unpack2023Format(buffer, packetFormat);
}
if (packetFormat === 2024) {
this.unpack2024Format(buffer, packetFormat);
}
if (packetFormat === 2025) {
this.unpack2025Format(buffer, packetFormat);
}
this.data = this.fromBuffer(buffer);
}
unpack2022Format = (buffer, packetFormat) => {
const eventStringCode = this.getEventStringCode(buffer, packetFormat);
if (eventStringCode === constants_1.EVENT_CODES.FastestLap) {
this.nest('m_eventDetails', { type: new FastestLapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Retirement) {
this.nest('m_eventDetails', { type: new RetirementParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.TeammateInPits) {
this.nest('m_eventDetails', { type: new TeamMateInPitsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.RaceWinner) {
this.nest('m_eventDetails', { type: new RaceWinnerParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.PenaltyIssued) {
this.nest('m_eventDetails', { type: new PenaltyParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SpeedTrapTriggered) {
this.nest('m_eventDetails', { type: new SpeedTrapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.StartLights) {
this.nest('m_eventDetails', { type: new StartLightsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.DriveThroughServed) {
this.nest('m_eventDetails', {
type: new DriveThroughPenaltyServedParser(),
});
}
else if (eventStringCode === constants_1.EVENT_CODES.StopGoServed) {
this.nest('m_eventDetails', { type: new StopGoPenaltyServedParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.Flashback) {
this.nest('m_eventDetails', { type: new FlashbackParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.ButtonStatus) {
this.nest('m_eventDetails', { type: new ButtonsParser() });
}
};
unpack2023Format = (buffer, packetFormat) => {
const eventStringCode = this.getEventStringCode(buffer, packetFormat);
if (eventStringCode === constants_1.EVENT_CODES.FastestLap) {
this.nest('m_eventDetails', { type: new FastestLapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Retirement) {
this.nest('m_eventDetails', { type: new RetirementParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.TeammateInPits) {
this.nest('m_eventDetails', { type: new TeamMateInPitsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.RaceWinner) {
this.nest('m_eventDetails', { type: new RaceWinnerParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.PenaltyIssued) {
this.nest('m_eventDetails', { type: new PenaltyParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SpeedTrapTriggered) {
this.nest('m_eventDetails', { type: new SpeedTrapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.StartLights) {
this.nest('m_eventDetails', { type: new StartLightsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.DriveThroughServed) {
this.nest('m_eventDetails', {
type: new DriveThroughPenaltyServedParser(),
});
}
else if (eventStringCode === constants_1.EVENT_CODES.StopGoServed) {
this.nest('m_eventDetails', { type: new StopGoPenaltyServedParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.Flashback) {
this.nest('m_eventDetails', { type: new FlashbackParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.ButtonStatus) {
this.nest('m_eventDetails', { type: new ButtonsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Overtake) {
this.nest('m_eventDetails', { type: new OvertakeParser() });
}
};
unpack2024Format = (buffer, packetFormat) => {
const eventStringCode = this.getEventStringCode(buffer, packetFormat);
if (eventStringCode === constants_1.EVENT_CODES.FastestLap) {
this.nest('m_eventDetails', { type: new FastestLapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Retirement) {
this.nest('m_eventDetails', { type: new RetirementParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.TeammateInPits) {
this.nest('m_eventDetails', { type: new TeamMateInPitsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.RaceWinner) {
this.nest('m_eventDetails', { type: new RaceWinnerParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.PenaltyIssued) {
this.nest('m_eventDetails', { type: new PenaltyParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SpeedTrapTriggered) {
this.nest('m_eventDetails', { type: new SpeedTrapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.StartLights) {
this.nest('m_eventDetails', { type: new StartLightsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.DriveThroughServed) {
this.nest('m_eventDetails', {
type: new DriveThroughPenaltyServedParser(),
});
}
else if (eventStringCode === constants_1.EVENT_CODES.StopGoServed) {
this.nest('m_eventDetails', { type: new StopGoPenaltyServedParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.Flashback) {
this.nest('m_eventDetails', { type: new FlashbackParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.ButtonStatus) {
this.nest('m_eventDetails', { type: new ButtonsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Overtake) {
this.nest('m_eventDetails', { type: new OvertakeParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SafetyCar) {
this.nest('m_eventDetails', { type: new SafetyCarParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Collision) {
this.nest('m_eventDetails', { type: new CollisionParser() });
}
};
unpack2025Format = (buffer, packetFormat) => {
const eventStringCode = this.getEventStringCode(buffer, packetFormat);
if (eventStringCode === constants_1.EVENT_CODES.FastestLap) {
this.nest('m_eventDetails', { type: new FastestLapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Retirement) {
this.nest('m_eventDetails', { type: new RetirementParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.DRSDisabled) {
this.nest('m_eventDetails', { type: new DRSDisabledParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.TeammateInPits) {
this.nest('m_eventDetails', { type: new TeamMateInPitsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.RaceWinner) {
this.nest('m_eventDetails', { type: new RaceWinnerParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.PenaltyIssued) {
this.nest('m_eventDetails', { type: new PenaltyParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SpeedTrapTriggered) {
this.nest('m_eventDetails', { type: new SpeedTrapParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.StartLights) {
this.nest('m_eventDetails', { type: new StartLightsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.DriveThroughServed) {
this.nest('m_eventDetails', {
type: new DriveThroughPenaltyServedParser(),
});
}
else if (eventStringCode === constants_1.EVENT_CODES.StopGoServed) {
this.nest('m_eventDetails', { type: new StopGoPenaltyServedParser(packetFormat) });
}
else if (eventStringCode === constants_1.EVENT_CODES.Flashback) {
this.nest('m_eventDetails', { type: new FlashbackParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.ButtonStatus) {
this.nest('m_eventDetails', { type: new ButtonsParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Overtake) {
this.nest('m_eventDetails', { type: new OvertakeParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.SafetyCar) {
this.nest('m_eventDetails', { type: new SafetyCarParser() });
}
else if (eventStringCode === constants_1.EVENT_CODES.Collision) {
this.nest('m_eventDetails', { type: new CollisionParser() });
}
};
getEventStringCode = (buffer, packetFormat) => {
const headerParser = new binary_parser_1.Parser()
.endianess('little')
.nest('m_header', {
type: new PacketHeaderParser_1.PacketHeaderParser(packetFormat),
})
.string('m_eventStringCode', { length: 4 });
const { m_eventStringCode } = headerParser.parse(buffer);
return m_eventStringCode;
};
}
exports.PacketEventDataParser = PacketEventDataParser;
//# sourceMappingURL=PacketEventDataParser.js.map