fix signals for CAN-FD (#116)

* remove event signals

* fix signal values for signalSize < 32 with CAN-FD

* fix get signal value, use BigInt

* fix plot for bigint

* fix signed values

* fix tests

* add 64 bit signal test

* fix more tests
main
Joost Wooning 2022-03-08 16:08:40 +01:00 committed by GitHub
parent 6d07fa48e7
commit 4d113409ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 100 additions and 1078 deletions

View File

@ -13,6 +13,6 @@
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }]
},
"env": {
"browser": true
"browser": true
}
}

View File

@ -11,18 +11,10 @@
"@commaai/pandajs": "^0.3.7",
"@craco/craco": "^5.5.0",
"aphrodite": "^1.2.1",
"babel-eslint": "^10.0.3",
"classnames": "^2.2.5",
"clipboard": "^1.7.1",
"cuint": "^0.2.2",
"enzyme": "^3.2.0",
"enzyme-adapter-react-16": "^1.1.0",
"eslint": "^6.5.1",
"eslint-config-airbnb": "^18.0.1",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.16.0",
"eslint-plugin-react-hooks": "^2.1.2",
"file-saver": "^1.3.3",
"font-awesome": "^4.7.0",
"github-api": "^3.0.0",

View File

@ -42,8 +42,6 @@ describe('demo mode', () => {
});
it('should load data', async () => {
await expect(page).toClick('.t-capline input[type="checkbox"]');
await delay(500);
await expect(page).toClick('.cabana-meta-messages-list-item');
await delay(500);
await expect(page).toClick('.button--tiny.button--alpha');

View File

@ -158,11 +158,10 @@ const steerTorqueSignal = new Signal({
unit: ''
});
function dbcInt32SignalValue(dbc, signalSpec, hex) {
// expects hex string to represent 8 bytes, left-justified with zeroes if frame size is smaller
const buffer = Buffer.from(hex, 'hex');
return dbc.valueForInt32Signal(signalSpec, buffer);
function dbcIntSignalValue(dbc, signalSpec, hex) {
const buffer = Uint8Array.from(Buffer.from(hex, 'hex'))
const view = new DataView(buffer.buffer);
return dbc.valueForIntSignal(signalSpec, view);
}
test('DBC parses steering control message', () => {
@ -267,7 +266,7 @@ test('int32 parser produces correct value for steer torque signal', () => {
const dbc = new DBC(DBC_MESSAGE_DEF);
const hex = 'e2d62a0bd0d3b5e5';
const value = dbcInt32SignalValue(
const value = dbcIntSignalValue(
dbc,
dbc.getMessageFrame(228).signals.STEER_TORQUE,
hex
@ -276,41 +275,32 @@ test('int32 parser produces correct value for steer torque signal', () => {
expect(value).toBe(-7466);
});
test('int64 parser produces correct value for steer torque signal', () => {
const dbc = new DBC(DBC_MESSAGE_DEF);
const hex = 'e2d62a0bd0d3b5e5';
const value = dbc.valueForInt64Signal(steerTorqueSignal, hex);
expect(value).toBe(-7466);
});
test('int32 parser produces correct value for wheel speeds', () => {
const dbc = new DBC(DBC_WHEEL_SPEEDS);
const hex = '36806cd8d8f1b0b7';
const rearRight = dbcInt32SignalValue(
const rearRight = dbcIntSignalValue(
dbc,
dbc.getMessageFrame(464).signals.WHEEL_SPEED_RR,
hex
);
expect(rearRight).toBe(69.23);
const rearLeft = dbcInt32SignalValue(
const rearLeft = dbcIntSignalValue(
dbc,
dbc.getMessageFrame(464).signals.WHEEL_SPEED_RL,
hex
);
expect(rearLeft).toBe(69.42);
const frontLeft = dbcInt32SignalValue(
const frontLeft = dbcIntSignalValue(
dbc,
dbc.getMessageFrame(464).signals.WHEEL_SPEED_FL,
hex
);
expect(frontLeft).toBe(69.76);
const frontRight = dbcInt32SignalValue(
const frontRight = dbcIntSignalValue(
dbc,
dbc.getMessageFrame(464).signals.WHEEL_SPEED_FR,
hex
@ -330,8 +320,8 @@ test('int32 parsers produces correct value for binary little endian signal', ()
const hexDataSet = '0000000020000000';
const hexDataNotSet = '0000000000000000';
const setValue = dbcInt32SignalValue(dbc, signalSpec, hexDataSet, 8);
const notSetValue = dbcInt32SignalValue(dbc, signalSpec, hexDataNotSet, 8);
const setValue = dbcIntSignalValue(dbc, signalSpec, hexDataSet);
const notSetValue = dbcIntSignalValue(dbc, signalSpec, hexDataNotSet);
expect(setValue).toEqual(1);
expect(notSetValue).toEqual(0);
@ -347,7 +337,7 @@ test('int32 parser produces correct value for 2-bit little endian signal spannin
const hexData = '00000001f8000000';
const value = dbcInt32SignalValue(dbc, signalSpec, hexData, 8);
const value = dbcIntSignalValue(dbc, signalSpec, hexData);
expect(value).toEqual(3);
});
@ -361,12 +351,12 @@ test('int32 parser produces correct value for 4-bit little endian signal', () =>
// this data is symmetric, the data bits are 1111
const hexDataSymmetric = 'f00f000000000000';
const symValue = dbcInt32SignalValue(dbc, signalSpec, hexDataSymmetric, 8);
const symValue = dbcIntSignalValue(dbc, signalSpec, hexDataSymmetric);
expect(symValue).toEqual(15);
// this data is asymmetric, the data bits are 1101
const hexDataAsymmetric = 'f002000000000000';
const aSymValue = dbcInt32SignalValue(dbc, signalSpec, hexDataAsymmetric, 8);
const aSymValue = dbcIntSignalValue(dbc, signalSpec, hexDataAsymmetric);
expect(aSymValue).toEqual(11);
});
@ -391,7 +381,7 @@ test('int32 parser produces correct value for 4-bit little endian signal within
const signalSpec = frame.signals.CF_Clu_AliveCnt1;
const hexData = '2000662000000000';
const value = dbcInt32SignalValue(dbc, signalSpec, hexData, frame.size);
const value = dbcIntSignalValue(dbc, signalSpec, hexData);
expect(value).toEqual(2);
});
@ -409,11 +399,11 @@ test('int32 parser produces correct value for 2-byte signed little endian signal
const signalSpec = frame.signals.SAS_Angle;
const hexData = '000000fafe000700';
const value = dbcInt32SignalValue(dbc, signalSpec, hexData, frame.size);
const value = dbcIntSignalValue(dbc, signalSpec, hexData);
expect(value).toEqual(0.0);
const hexData2 = '0b000907d8b30000';
const value2 = dbcInt32SignalValue(dbc, signalSpec, hexData2, frame.size);
const value2 = dbcIntSignalValue(dbc, signalSpec, hexData2);
expect(value2).toEqual(1.1);
});
@ -433,3 +423,28 @@ test('dbc parser parses top-level comment with chffr metric', () => {
'CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180'
);
});
const DBC_64_BIT_STUFF = `
BO_ 468 LARGE_SIGNALS: 32 VSA
SG_ LARGE_NORMAL : 7|64@0+ (1,0) [0|1.84467E+019] "" XXX
SG_ LARGE_LITTLE : 64|64@1+ (1,0) [0|1.84467E+019] "" XXX
SG_ LARGE_SIGNED : 135|64@0- (1,0) [0|1.84467E+019] "" XXX
SG_ LARGE_OFFSET : 197|62@0+ (1,0) [0|4.61169E+018] "" XXX
`;
test('int64 parser produces correct values', () => {
const dbc = new DBC(DBC_64_BIT_STUFF);
const hex = '63d637b340535839' + 'a23f215451e52f7b' + 'a1adff50c4e8eedb' + 'fd071d2c474ac2d4';
const normal = dbcIntSignalValue(dbc, dbc.getMessageFrame(468).signals.LARGE_NORMAL, hex).toString();
expect(normal).toEqual("7193998697788823609");
const little = dbcIntSignalValue(dbc, dbc.getMessageFrame(468).signals.LARGE_LITTLE, hex).toString();
expect(little).toBe("8876565528037113762");
const signed = dbcIntSignalValue(dbc, dbc.getMessageFrame(468).signals.LARGE_SIGNED, hex).toString();
expect(signed).toBe("-6796495540266144037");
const offset = dbcIntSignalValue(dbc, dbc.getMessageFrame(468).signals.LARGE_OFFSET, hex).toString();
expect(offset).toBe("4397515637162427092");
});

View File

@ -8,7 +8,7 @@ import Signal from '../../models/can/signal';
const SAMPLE_MESSAGE = {
address: 0x10,
busTime: 0,
data: Buffer.from('abababababababab', 'hex'),
data: Uint8Array.from(Buffer.from('abababababababab', 'hex')),
bus: 1
};
const SAMPLE_MESSAGE_ID = '1:10';

View File

@ -1,61 +0,0 @@
/* eslint-env jest */
import {
signedShortToByteArray,
shortToByteArray,
longToByteArray,
signedLongToByteArray,
getThermalFlags,
// getHealthFlags,
// getFlags,
// getUbloxGnss,
// getEgoData,
// getCarStateControls,
// getWheelSpeeds,
// getThermalFreeSpace,
// getThermalData,
// getThermalCPU,
// getHealth
} from '../../workers/rlog-utils';
describe('byte array methods', () => {
test('signedShortToByteArray', () => {
expect(signedShortToByteArray(123)).toMatchObject([0, 123]);
expect(signedShortToByteArray(-123)).toMatchObject([255, 133]);
});
test('shortToByteArray', () => {
expect(shortToByteArray(123)).toMatchObject([0, 123]);
expect(shortToByteArray(-123)).toMatchObject([255, 133]);
});
test('longToByteArray', () => {
expect(longToByteArray(123)).toMatchObject([0, 0, 0, 123]);
expect(longToByteArray(-123)).toMatchObject([255, 255, 255, 133]);
});
test('signedLongToByteArray', () => {
expect(signedLongToByteArray(123)).toMatchObject([0, 0, 0, 123]);
expect(signedLongToByteArray(-123)).toMatchObject([255, 255, 255, 133]);
});
});
describe('flags', () => {
test('getThermalFlags', () => {
expect(getThermalFlags({
UsbOnline: false,
Started: false
})).toBe(0x00);
expect(getThermalFlags({
UsbOnline: true,
Started: false
})).toBe(0x01);
expect(getThermalFlags({
UsbOnline: false,
Started: true
})).toBe(0x02);
expect(getThermalFlags({
UsbOnline: true,
Started: true
})).toBe(0x03);
});
});

View File

@ -103,6 +103,9 @@ export default class CanLog extends Component {
if (signal.isFloat) {
return value.toFixed(3);
}
if (typeof value === 'bigint') {
return value.toString();
}
return value;
}

View File

@ -385,21 +385,6 @@ export default class Meta extends Component {
</div>
</div>
<div className="cabana-meta-messages-header">
<div
style={{
display: 'inline-block',
float: 'right'
}}
>
<h5 className="t-capline">
Show log events
<input
type="checkbox"
onChange={this.toggleShowLogEvents}
checked={!!this.state.showLogEvents}
/>
</h5>
</div>
<h5 className="t-capline">Available messages</h5>
</div>
<div className="cabana-meta-messages-filter">

View File

@ -3,9 +3,6 @@ import Signal from './signal';
import Frame from './frame';
import BoardUnit from './BoardUnit';
import DbcUtils from '../../utils/dbc';
import * as LogSignals from './logSignals';
const { UINT64 } = require('cuint');
const DBC_COMMENT_RE = /^CM_ *"(.*)";/;
const DBC_COMMENT_MULTI_LINE_RE = /^CM_ *"(.*)/;
@ -38,6 +35,8 @@ const FOLLOW_UP_SIGNAL_COMMENT = 'FollowUpSignalComment';
const FOLLOW_UP_MSG_COMMENT = 'FollowUpMsgComment';
const FOLLOW_UP_BOARD_UNIT_COMMENT = 'FollowUpBoardUnitComment';
/* global BigInt */
function floatOrInt(numericStr) {
if (Number.isInteger(numericStr)) {
return parseInt(numericStr, 10);
@ -71,9 +70,6 @@ export default class DBC {
}
getMessageFrame(address) {
if (LogSignals.isLogAddress(address)) {
return LogSignals.frameForAddress(address);
}
return this.messages.get(address);
}
@ -175,7 +171,6 @@ export default class DBC {
}
createFrame(msgId, size=64) {
console.log(this.messages, msgId);
const msg = new Frame({
name: this.nextNewFrameName(),
id: msgId,
@ -538,99 +533,58 @@ export default class DBC {
this.valueTables = valueTables;
}
valueForInt64Signal(signalSpec, hexData) {
const blen = hexData.length * 4;
let value;
let startBit;
let dataBitPos;
valueForIntSignal(signalSpec, view) {
let sig_lsb, sig_msb;
if (signalSpec.isLittleEndian) {
value = UINT64(swapOrder(hexData, 16, 2), 16);
startBit = signalSpec.startBit;
dataBitPos = UINT64(startBit);
sig_lsb = signalSpec.startBit;
sig_msb = signalSpec.startBit + signalSpec.size - 1;
} else {
// big endian
value = UINT64(hexData, 16);
startBit = DbcUtils.bigEndianBitIndex(signalSpec.startBit);
dataBitPos = UINT64(blen - (startBit + signalSpec.size));
}
if (dataBitPos < 0) {
return null;
sig_lsb = DbcUtils.matrixBitNumber(DbcUtils.bigEndianBitIndex(signalSpec.startBit) + signalSpec.size - 1);
sig_msb = signalSpec.startBit;
}
const rightHandAnd = UINT64(Math.pow(2, signalSpec.size) - 1);
let ival = value
.shiftr(dataBitPos)
.and(rightHandAnd)
.toNumber();
let ret = signalSpec.size > 32 ? 0n : 0;
let i = Math.floor(sig_msb / 8);
let bits = signalSpec.size;
while (i >= 0 && i < view.byteLength && bits > 0) {
let lsb = Math.floor(sig_lsb / 8) === i ? sig_lsb : i*8;
let msb = Math.floor(sig_msb / 8) === i ? sig_msb : (i+1)*8 - 1;
let size = msb - lsb + 1;
if (signalSpec.isSigned && ival & Math.pow(2, signalSpec.size - 1)) {
ival -= Math.pow(2, signalSpec.size);
}
ival = ival * signalSpec.factor + signalSpec.offset;
return ival;
}
valueForInt32Signal(signalSpec, buf) {
let startBit;
if (signalSpec.isLittleEndian) {
startBit = 64 - signalSpec.startBit - signalSpec.size;
} else {
let bitPos = (-signalSpec.startBit - 1) % 8;
if (bitPos < 0) {
bitPos += 8; // mimic python modulo behavior
let d = (view.getUint8(i) >>> (lsb - (i*8))) & ((1 << size) - 1);
if (signalSpec.size > 32) {
ret |= BigInt(d) << BigInt(bits - size);
} else {
ret |= d << (bits - size);
}
startBit = Math.floor(signalSpec.startBit / 8) * 8 + bitPos;
bits -= size;
i = signalSpec.isLittleEndian ? i-1 : i+1;
}
let shiftAmount;
let signalValue;
const byteOffset = Math.min(4, Math.floor(signalSpec.startBit / 8));
if (signalSpec.isLittleEndian) {
signalValue = buf.readUInt32LE(byteOffset);
shiftAmount = signalSpec.startBit - 8 * byteOffset;
if (signalSpec.size > 32) {
ret = signalSpec.isSigned ? BigInt.asIntN(64, ret) : ret;
return ret * BigInt(signalSpec.factor) + BigInt(signalSpec.offset);
} else {
signalValue = buf.readUInt32BE(byteOffset);
shiftAmount = 32 - (startBit - 8 * byteOffset + signalSpec.size);
if (signalSpec.isSigned) {
ret -= ((ret >> (signalSpec.size-1)) & 1) ? (1 << signalSpec.size) : 0;
}
return ret * signalSpec.factor + signalSpec.offset;
}
signalValue = (signalValue >>> shiftAmount) & ((1 << signalSpec.size) - 1);
if (signalSpec.isSigned && signalValue >>> (signalSpec.size - 1)) {
signalValue -= 1 << signalSpec.size;
}
return signalValue * signalSpec.factor + signalSpec.offset;
}
getSignalValues(messageId, data) {
if (!this.messages.has(messageId) && !LogSignals.isLogAddress(messageId)) {
if (!this.messages.has(messageId)) {
return {};
}
const frame = this.getMessageFrame(messageId);
const buffer = Buffer.from(data);
let paddedBuffer = buffer;
if (buffer.length !== 8) {
// pad data it's 64 bits long
const paddedDataHex = buffer.toString('hex').padEnd(16, '0');
paddedBuffer = Buffer.from(paddedDataHex, 'hex');
}
const hexData = paddedBuffer.toString('hex');
const view = new DataView(data.buffer);
const signalValuesByName = {};
Object.values(frame.signals).forEach((signalSpec) => {
if (isNaN(signalSpec.startBit)) {
return;
}
let value;
if (signalSpec.size > 32) {
value = this.valueForInt64Signal(signalSpec, hexData);
} else {
value = this.valueForInt32Signal(signalSpec, paddedBuffer);
}
signalValuesByName[signalSpec.name] = value;
signalValuesByName[signalSpec.name] = this.valueForIntSignal(signalSpec, view);
});
return signalValuesByName;

View File

@ -1,336 +0,0 @@
import Frame from './frame';
import Signal from './signal';
export const wheelSpeeds = {
FrontLeftWheel: shortSignal({
index: 0,
factor: 0.001
}),
FrontRightWheel: shortSignal({
index: 1,
factor: 0.001
}),
RearLeftWheel: shortSignal({
index: 2,
factor: 0.001
}),
RearRightWheel: shortSignal({
index: 3,
factor: 0.001
})
};
export const ego = {
VEgo: shortSignal({
index: 0,
factor: 0.001
}),
AEgo: shortSignal({
index: 1,
factor: 0.001
}),
VEgoRaw: shortSignal({
index: 2,
factor: 0.001
}),
YawRate: shortSignal({
index: 3,
factor: 0.001
})
};
export const controls = {
SteeringAngle: longSignal({
index: 0,
factor: 0.001
}),
Brake: shortSignal({
index: 2,
factor: 0.001
}),
Gas: shortSignal({
index: 3,
factor: 0.001
})
};
export const actuators = {
Steer: shortSignal({
index: 0,
factor: 0.001
}),
SteerAngle: shortSignal({
index: 1,
factor: 0.001
}),
Brake: shortSignal({
index: 2,
factor: 0.001
}),
Gas: shortSignal({
index: 3,
factor: 0.001
})
};
export const leadOne = {
DRel: shortSignal({
index: 0,
factor: 0.001
}),
VRel: shortSignal({
index: 1,
factor: 0.001
}),
};
export const leadTwo = {
DRel: shortSignal({
index: 0,
factor: 0.001
}),
VRel: shortSignal({
index: 1,
factor: 0.001
}),
};
export const flags = {
LeftBlinker: boolSignal({
index: 0
}),
RightBlinker: boolSignal({
index: 1
}),
GenericToggle: boolSignal({
index: 2
}),
DoorOpen: boolSignal({
index: 3
}),
SeatbeltUnlatched: boolSignal({
index: 4
}),
GasPressed: boolSignal({
index: 5
}),
BrakeLights: boolSignal({
index: 6
}),
SteeringPressed: boolSignal({
index: 7
}),
Standstill: boolSignal({
index: 8
}),
'CruiseState.Enabled': boolSignal({
index: 9
}),
'CruiseState.Available': boolSignal({
index: 10
}),
'CruiseState.Standstill': boolSignal({
index: 11
}),
GearShifter: {
startBit: 15,
size: 4,
unsigned: true
},
'CruiseState.Speed': charSignal({
index: 2
})
};
export const ubloxGnss = {
RcvTow: longSignal({
index: 0
}),
GpsWeek: shortSignal({
index: 2
}),
LeapSeconds: {
startBit: 55,
size: 8
},
NumMeas: {
startBit: 63,
size: 8
}
};
export const health = {
Voltage: shortSignal({
index: 0
}),
Current: charSignal({
index: 2
}),
Started: boolSignal({
index: 24
}),
ControlsAllowed: boolSignal({
index: 25
}),
GasInterceptorDetected: boolSignal({
index: 26
}),
StartedSignalDetected: boolSignal({
index: 27
})
};
export const thermalCPU = {
Cpu0: shortSignal({
index: 0,
unsigned: true
}),
Cpu1: shortSignal({
index: 1,
unsigned: true
}),
Cpu2: shortSignal({
index: 2,
unsigned: true
}),
Cpu3: shortSignal({
index: 3,
unsigned: true
})
};
export const thermalData = {
Mem: shortSignal({
index: 0,
unsigned: true
}),
Gpu: shortSignal({
index: 1,
unsigned: true
}),
FanSpeed: shortSignal({
index: 2,
unsigned: true
}),
BatteryPercent: charSignal({
index: 6,
unsigned: true
}),
UsbOnline: boolSignal({
index: 56
}),
Started: boolSignal({
index: 57
})
};
export const thermalFreeSpace = {
FreeSpace: longSignal({
index: 0,
unsigned: true,
factor: 0.000000001
})
};
export const signalMap = {
'CarState:WheelSpeeds': wheelSpeeds,
'CarState:Ego': ego,
'CarState:Controls': controls,
'CarState:Flags': flags,
'CarControl:Actuators': actuators,
'RadarState:LeadOne': leadOne,
'RadarState:LeadTwo': leadTwo,
'UbloxGnss:MeasurementReport': ubloxGnss,
'Health:Data': health,
'Thermal:CPU': thermalCPU,
'Thermal:Data': thermalData,
'Thermal:FreeSpace': thermalFreeSpace
};
const ADDRESS_LIST = [];
Object.keys(signalMap).forEach((name) => {
Object.keys(signalMap[name]).forEach((signal) => {
signalMap[name][signal] = createSignalEntry({
name: signal,
...signalMap[name][signal]
});
});
addressForName(name);
});
function createSignalEntry(options) {
return new Signal({
name: options.name,
startBit: options.startBit,
size: options.size,
isLittleEndian: false,
isSigned: !options.unsigned,
factor: options.factor || 1,
offset: options.offset || 0,
unit: options.unit || ''
});
}
function longSignal(options) {
return {
...options,
size: 32,
startBit: options.index * 32 + 7
};
}
function shortSignal(options) {
return {
...options,
size: 16,
startBit: options.index * 16 + 7
};
}
function charSignal(options) {
return {
...options,
size: 8,
startBit: options.index * 8 + 7
};
}
function boolSignal(options) {
return {
...options,
size: 1,
startBit: options.index,
unsigned: true
};
}
export function addressForName(name) {
const i = ADDRESS_LIST.indexOf(name);
if (i === -1) {
ADDRESS_LIST.push(name);
return ADDRESS_LIST.indexOf(name) + 0x1000;
}
return i + 0x1000;
}
export function nameForAddress(address) {
if (address >= 0x1000) {
return ADDRESS_LIST[address - 0x1000];
}
return null;
}
export function isLogAddress(address) {
return !!nameForAddress(address);
}
export function frameForAddress(address) {
const name = nameForAddress(address);
return new Frame({
id: name,
name,
size: 8,
signals: signalMap[name]
});
}

View File

@ -51,7 +51,7 @@ function _calcGraphData(msg, signalUid, firstCanTime) {
return {
x: entry.time,
relTime: entry.relTime,
y: entry.signals[signal.name],
y: parseInt(entry.signals[signal.name]),
unit: signal.unit,
color: `rgba(${colors.join(',')}, 0.5)`,
signalName: signal.name,

View File

@ -7,7 +7,7 @@ import DbcUtils from '../utils/dbc';
const window = self;
function reparseEntry(entry, address, dbc, canStartTime, prevMsgEntry) {
const data = Buffer.from(entry.hexData, 'hex');
const data = Uint8Array.from(Buffer.from(entry.hexData, 'hex'));
return DbcUtils.parseMessage(
dbc,
entry.time,

View File

@ -6,21 +6,6 @@ import { timeout } from 'thyming';
import { getLogPart } from '../api/rlog';
import DbcUtils from '../utils/dbc';
import DBC from '../models/can/dbc';
import { addressForName } from '../models/can/logSignals';
import {
getFlags,
getUbloxGnss,
getEgoData,
getCarStateControls,
getWheelSpeeds,
getCarControlActuators,
getRadarStateLeadOne,
getRadarStateLeadTwo,
getThermalFreeSpace,
getThermalData,
getThermalCPU,
getHealth
} from './rlog-utils';
const DEBOUNCE_DELAY = 100;
@ -67,42 +52,6 @@ function queueBatch(entry) {
}
}
function getPrevMsgEntry(messages, prevMsgEntries, id) {
if (messages[id].entries.length) {
return messages[id].entries[messages[id].entries.length - 1];
}
return prevMsgEntries[id] || null;
}
function insertEventData(src, part, entry, logTime, getData) {
const id = `${src}:${part}`;
const address = addressForName(id);
if (!entry.messages[id]) {
entry.messages[id] = DbcUtils.createMessageSpec(
entry.dbc,
address,
id,
src
);
entry.messages[id].isLogEvent = true;
}
const prevMsgEntry = getPrevMsgEntry(
entry.messages,
entry.options.prevMsgEntries,
id
);
const msgEntry = {
time: logTime,
address,
data: getData(),
timeStart: entry.options.routeInitTime
};
entry.messages[id].entries.push(msgEntry);
}
function insertCanMessage(entry, logTime, msg) {
const src = msg.Src;
const address = Number(msg.Address);
@ -118,16 +67,11 @@ function insertCanMessage(entry, logTime, msg) {
);
entry.messages[id].isLogEvent = false;
}
const prevMsgEntry = getPrevMsgEntry(
entry.messages,
entry.options.prevMsgEntries,
id
);
const msgEntry = {
time: logTime,
address,
data: msg.Dat,
data: new Uint8Array(msg.Dat),
timeStart: entry.options.routeInitTime
};
@ -177,104 +121,6 @@ async function loadData(entry) {
} else if ('Can' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
msg.Can.forEach((m) => insertCanMessage(entry, monoTime, m));
} else if ('CarState' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
insertEventData(
'CarState',
'Ego',
entry,
monoTime,
(m) => getEgoData(msg.CarState, m)
);
insertEventData(
'CarState',
'Controls',
entry,
monoTime,
(m) => getCarStateControls(msg.CarState, m)
);
insertEventData(
'CarState',
'Flags',
entry,
monoTime,
(m) => getFlags(msg.CarState, m)
);
insertEventData(
'CarState',
'WheelSpeeds',
entry,
monoTime,
(m) => getWheelSpeeds(msg.CarState, m)
);
} else if ('CarControl' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
insertEventData(
'CarControl',
'Actuators',
entry,
monoTime,
(m) => getCarControlActuators(msg.CarControl, m)
);
} else if ('RadarState' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
insertEventData(
'RadarState',
'LeadOne',
entry,
monoTime,
(m) => getRadarStateLeadOne(msg.RadarState, m)
);
insertEventData(
'RadarState',
'LeadTwo',
entry,
monoTime,
(m) => getRadarStateLeadTwo(msg.RadarState, m)
);
} else if ('UbloxGnss' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
if (msg.UbloxGnss.MeasurementReport) {
insertEventData(
'UbloxGnss',
'MeasurementReport',
entry,
monoTime,
(m) => getUbloxGnss(msg.UbloxGnss.MeasurementReport, m)
);
}
} else if ('Health' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
insertEventData(
'Health',
'Data',
entry,
monoTime,
(m) => getHealth(msg.Health, m)
);
} else if ('Thermal' in msg) {
const monoTime = msg.LogMonoTime / 1000000000;
insertEventData(
'Thermal',
'CPU',
entry,
monoTime,
(m) => getThermalCPU(msg.Thermal, m)
);
insertEventData(
'Thermal',
'Data',
entry,
monoTime,
(m) => getThermalData(msg.Thermal, m)
);
insertEventData(
'Thermal',
'FreeSpace',
entry,
monoTime,
(m) => getThermalFreeSpace(msg.Thermal, m)
);
} else if ('Thumbnail' in msg) {
const monoTime = msg.LogMonoTime / 1000000000 - entry.options.routeInitTime;
const data = new Uint8Array(msg.Thumbnail.Thumbnail);

View File

@ -1,211 +0,0 @@
/* eslint-disable no-param-reassign, no-bitwise */
export function signedShortToByteArray(short) {
const byteArray = [0, 0];
const isNegative = short < 0;
if (isNegative) {
short += 2 ** (8 * byteArray.length);
}
for (let index = byteArray.length - 1; index >= 0; --index) {
const byte = short & 0xff;
byteArray[index] = byte;
short >>= 8;
}
return byteArray;
}
export function shortToByteArray(short) {
const byteArray = [0, 0];
for (let index = byteArray.length - 1; index >= 0; --index) {
const byte = short & 0xff;
byteArray[index] = byte;
short >>= 8;
}
return byteArray;
}
export function longToByteArray(long) {
const byteArray = [0, 0, 0, 0];
for (let index = byteArray.length - 1; index >= 0; --index) {
const byte = long & 0xff;
byteArray[index] = byte;
long >>= 8;
}
return byteArray;
}
export function signedLongToByteArray(long) {
const byteArray = [0, 0, 0, 0];
const isNegative = long < 0;
if (isNegative) {
long += 2 ** (8 * byteArray.length);
}
for (let index = byteArray.length - 1; index >= 0; --index) {
const byte = long & 0xff;
byteArray[index] = byte;
long >>= 8;
}
return byteArray;
}
export function getThermalFlags(state) {
let flags = 0x00;
if (state.UsbOnline) {
flags |= 0x01;
}
if (state.Started) {
flags |= 0x02;
}
return flags;
}
export function getHealthFlags(state) {
let flags = 0x00;
if (state.Started) {
flags |= 0x01;
}
if (state.ControlsAllowed) {
flags |= 0x02;
}
if (state.GasInterceptorDetected) {
flags |= 0x04;
}
if (state.StartedSignalDetected) {
flags |= 0x08;
}
return flags;
}
export function getFlags(state) {
let flags = 0x00;
const arr = [0, 0, 0];
if (state.LeftBlinker) {
flags |= 0x01;
}
if (state.RightBlinker) {
flags |= 0x02;
}
if (state.GenericToggle) {
flags |= 0x04;
}
if (state.DoorOpen) {
flags |= 0x08;
}
if (state.SeatbeltUnlatched) {
flags |= 0x10;
}
if (state.GasPressed) {
flags |= 0x20;
}
if (state.BrakeLights) {
flags |= 0x40;
}
if (state.SteeringPressed) {
flags |= 0x80;
}
arr[0] = flags;
flags = 0x00;
if (state.Standstill) {
flags |= 0x01;
}
if (state.CruiseState.Enabled) {
flags |= 0x02;
}
if (state.CruiseState.Available) {
flags |= 0x04;
}
if (state.CruiseState.Standstill) {
flags |= 0x08;
}
if (state.GearShifter) {
flags |= state.GearShifter << 4;
}
arr[1] = flags;
arr[2] = state.CruiseState.Speed;
return arr;
}
export function getUbloxGnss(state) {
return signedLongToByteArray(state.RcvTow / 1000)
.concat(signedShortToByteArray(state.GpsWeek))
.concat([state.LeapSeconds])
.concat([state.NumMeas]);
}
export function getEgoData(state) {
return signedShortToByteArray(state.VEgo * 1000)
.concat(signedShortToByteArray(state.AEgo * 1000))
.concat(signedShortToByteArray(state.VEgoRaw * 1000))
.concat(signedShortToByteArray(state.YawRate * 1000));
}
export function getCarStateControls(state) {
return signedLongToByteArray(state.SteeringAngle * 1000)
.concat(signedShortToByteArray(state.Brake * 1000))
.concat(signedShortToByteArray(state.Gas * 1000));
}
export function getWheelSpeeds(state) {
return signedShortToByteArray(state.WheelSpeeds.Fl * 100)
.concat(signedShortToByteArray(state.WheelSpeeds.Fr * 100))
.concat(signedShortToByteArray(state.WheelSpeeds.Rl * 100))
.concat(signedShortToByteArray(state.WheelSpeeds.Rr * 100));
}
export function getCarControlActuators(state) {
return signedShortToByteArray(state.Actuators.Steer * 1000)
.concat(signedShortToByteArray(state.Actuators.SteerAngle * 1000))
.concat(signedShortToByteArray(state.Actuators.Brake * 1000))
.concat(signedShortToByteArray(state.Actuators.Gas * 1000));
}
export function getRadarStateLeadOne(state) {
return signedShortToByteArray(state.LeadOne.DRel * 1000)
.concat(signedShortToByteArray(state.LeadOne.VRel * 1000));
}
export function getRadarStateLeadTwo(state) {
return signedShortToByteArray(state.LeadTwo.DRel * 1000)
.concat(signedShortToByteArray(state.LeadTwo.VRel * 1000));
}
export function getThermalFreeSpace(state) {
return longToByteArray(state.FreeSpace * 1000000000);
}
export function getThermalData(state) {
return shortToByteArray(state.Mem)
.concat(shortToByteArray(state.Gpu))
.concat(shortToByteArray(state.FanSpeed))
.concat(state.BatteryPercent)
.concat(getThermalFlags(state));
}
export function getThermalCPU(state) {
return shortToByteArray(state.Cpu0)
.concat(shortToByteArray(state.Cpu1))
.concat(shortToByteArray(state.Cpu2))
.concat(shortToByteArray(state.Cpu3));
}
export function getHealth(state) {
return signedShortToByteArray(state.Voltage)
.concat(state.Current)
.concat(getHealthFlags(state));
}

199
yarn.lock
View File

@ -1139,7 +1139,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-typescript" "^7.9.0"
"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.12.1":
"@babel/runtime-corejs3@^7.12.1":
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz#fdca2cd05fba63388babe85d349b6801b008fd13"
integrity sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==
@ -1154,7 +1154,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.0.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
@ -1847,11 +1847,6 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
"@types/minimatch@*":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
@ -2427,14 +2422,6 @@ aria-query@^3.0.0:
ast-types-flow "0.0.7"
commander "^2.11.0"
aria-query@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b"
integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==
dependencies:
"@babel/runtime" "^7.10.2"
"@babel/runtime-corejs3" "^7.10.2"
arity-n@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745"
@ -2487,7 +2474,7 @@ array-flatten@^2.1.0:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.3, array-includes@^3.1.4:
array-includes@^3.0.3, array-includes@^3.1.1:
version "3.1.4"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
@ -2545,7 +2532,7 @@ array.prototype.find@^2.1.1:
define-properties "^1.1.3"
es-abstract "^1.19.0"
array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.5:
array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==
@ -2554,15 +2541,6 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^
define-properties "^1.1.3"
es-abstract "^1.19.0"
array.prototype.flatmap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446"
integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==
dependencies:
call-bind "^1.0.0"
define-properties "^1.1.3"
es-abstract "^1.19.0"
arraybuffer.slice@~0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
@ -2683,11 +2661,6 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
axe-core@^4.3.5:
version "4.4.1"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413"
integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==
axios@^0.21.1:
version "0.21.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
@ -2695,7 +2668,7 @@ axios@^0.21.1:
dependencies:
follow-redirects "^1.14.0"
axobject-query@^2.0.2, axobject-query@^2.2.0:
axobject-query@^2.0.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
@ -2709,7 +2682,7 @@ babel-code-frame@^6.22.0:
esutils "^2.0.2"
js-tokens "^3.0.2"
babel-eslint@10.1.0, babel-eslint@^10.0.3:
babel-eslint@10.1.0:
version "10.1.0"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
@ -3804,7 +3777,7 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.9:
confusing-browser-globals@^1.0.9:
version "1.0.11"
resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81"
integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==
@ -4285,11 +4258,6 @@ csstype@^3.0.2:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
cuint@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=
cwd@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567"
@ -4434,7 +4402,7 @@ d@1, d@^1.0.1:
es5-ext "^0.10.50"
type "^1.0.1"
damerau-levenshtein@^1.0.4, damerau-levenshtein@^1.0.7:
damerau-levenshtein@^1.0.4:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
@ -4909,11 +4877,6 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@ -5183,24 +5146,6 @@ escodegen@^1.11.0, escodegen@^1.9.1:
optionalDependencies:
source-map "~0.6.1"
eslint-config-airbnb-base@^14.2.1:
version "14.2.1"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e"
integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==
dependencies:
confusing-browser-globals "^1.0.10"
object.assign "^4.1.2"
object.entries "^1.1.2"
eslint-config-airbnb@^18.0.1:
version "18.2.1"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9"
integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==
dependencies:
eslint-config-airbnb-base "^14.2.1"
object.assign "^4.1.2"
object.entries "^1.1.2"
eslint-config-react-app@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df"
@ -5208,7 +5153,7 @@ eslint-config-react-app@^5.2.1:
dependencies:
confusing-browser-globals "^1.0.9"
eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.6:
eslint-import-resolver-node@^0.3.2:
version "0.3.6"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
@ -5227,7 +5172,7 @@ eslint-loader@3.0.3:
object-hash "^2.0.1"
schema-utils "^2.6.1"
eslint-module-utils@^2.4.1, eslint-module-utils@^2.7.2:
eslint-module-utils@^2.4.1:
version "2.7.3"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee"
integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==
@ -5260,25 +5205,6 @@ eslint-plugin-import@2.20.1:
read-pkg-up "^2.0.0"
resolve "^1.12.0"
eslint-plugin-import@^2.18.2:
version "2.25.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1"
integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==
dependencies:
array-includes "^3.1.4"
array.prototype.flat "^1.2.5"
debug "^2.6.9"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.6"
eslint-module-utils "^2.7.2"
has "^1.0.3"
is-core-module "^2.8.0"
is-glob "^4.0.3"
minimatch "^3.0.4"
object.values "^1.1.5"
resolve "^1.20.0"
tsconfig-paths "^3.12.0"
eslint-plugin-jsx-a11y@6.2.3:
version "6.2.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa"
@ -5294,34 +5220,11 @@ eslint-plugin-jsx-a11y@6.2.3:
has "^1.0.3"
jsx-ast-utils "^2.2.1"
eslint-plugin-jsx-a11y@^6.2.3:
version "6.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8"
integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==
dependencies:
"@babel/runtime" "^7.16.3"
aria-query "^4.2.2"
array-includes "^3.1.4"
ast-types-flow "^0.0.7"
axe-core "^4.3.5"
axobject-query "^2.2.0"
damerau-levenshtein "^1.0.7"
emoji-regex "^9.2.2"
has "^1.0.3"
jsx-ast-utils "^3.2.1"
language-tags "^1.0.5"
minimatch "^3.0.4"
eslint-plugin-react-hooks@^1.6.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04"
integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==
eslint-plugin-react-hooks@^2.1.2:
version "2.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0"
integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==
eslint-plugin-react@7.19.0:
version "7.19.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
@ -5340,26 +5243,6 @@ eslint-plugin-react@7.19.0:
string.prototype.matchall "^4.0.2"
xregexp "^4.3.0"
eslint-plugin-react@^7.16.0:
version "7.28.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf"
integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==
dependencies:
array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5"
doctrine "^2.1.0"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.0.4"
object.entries "^1.1.5"
object.fromentries "^2.0.5"
object.hasown "^1.1.0"
object.values "^1.1.5"
prop-types "^15.7.2"
resolve "^2.0.0-next.3"
semver "^6.3.0"
string.prototype.matchall "^4.0.6"
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
@ -5395,7 +5278,7 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint@^6.5.1, eslint@^6.6.0:
eslint@^6.6.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
@ -5471,7 +5354,7 @@ estraverse@^4.1.1, estraverse@^4.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
@ -7291,7 +7174,7 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1:
is-core-module@^2.5.0, is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
@ -7417,7 +7300,7 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@ -8396,14 +8279,6 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
array-includes "^3.1.1"
object.assign "^4.1.0"
"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==
dependencies:
array-includes "^3.1.3"
object.assign "^4.1.2"
key-difference@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/key-difference/-/key-difference-1.0.0.tgz#7ede6f69bfff08010b5612885303b688a30008cc"
@ -8453,18 +8328,6 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
language-subtag-registry@~0.3.2:
version "0.3.21"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a"
integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==
language-tags@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a"
integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=
dependencies:
language-subtag-registry "~0.3.2"
last-call-webpack-plugin@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
@ -9650,7 +9513,7 @@ object.assign@^4.1.0, object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.5:
object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
@ -9659,7 +9522,7 @@ object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2, object.entr
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.fromentries@^2.0.2, object.fromentries@^2.0.3, object.fromentries@^2.0.5:
object.fromentries@^2.0.2, object.fromentries@^2.0.3:
version "2.0.5"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251"
integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==
@ -9677,14 +9540,6 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.hasown@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5"
integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.omit@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@ -9700,7 +9555,7 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.5:
object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
@ -11797,14 +11652,6 @@ resolve@^1.1.10, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.1
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^2.0.0-next.3:
version "2.0.0-next.3"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46"
integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==
dependencies:
is-core-module "^2.2.0"
path-parse "^1.0.6"
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@ -12742,7 +12589,7 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.6:
string.prototype.matchall@^4.0.2:
version "4.0.6"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa"
integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==
@ -13242,16 +13089,6 @@ ts-pnp@^1.1.6:
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
tsconfig-paths@^3.12.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b"
integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"
tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"