From 4d113409eda5f260d30b8e50c7fcfc77937839b2 Mon Sep 17 00:00:00 2001 From: Joost Wooning Date: Tue, 8 Mar 2022 16:08:40 +0100 Subject: [PATCH] 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 --- .eslintrc | 2 +- package.json | 8 - src/__puppeteer__/demo.test.js | 2 - src/__tests__/can/dbc.parse.test.js | 69 +++-- src/__tests__/utils/dbc.test.js | 2 +- src/__tests__/workers/rlog-utils.test.js | 61 ---- src/components/CanLog.js | 3 + src/components/Meta.js | 15 - src/models/can/dbc.js | 110 +++----- src/models/can/logSignals.js | 336 ----------------------- src/models/graph-data.js | 2 +- src/workers/message-parser.worker.js | 2 +- src/workers/rlog-downloader.worker.js | 156 +---------- src/workers/rlog-utils.js | 211 -------------- yarn.lock | 199 ++------------ 15 files changed, 100 insertions(+), 1078 deletions(-) delete mode 100644 src/__tests__/workers/rlog-utils.test.js delete mode 100644 src/models/can/logSignals.js delete mode 100644 src/workers/rlog-utils.js diff --git a/.eslintrc b/.eslintrc index e57356e..7ed7565 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,6 +13,6 @@ "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }] }, "env": { - "browser": true + "browser": true } } diff --git a/package.json b/package.json index 7fec03b..164a685 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/__puppeteer__/demo.test.js b/src/__puppeteer__/demo.test.js index 6dcf944..3f320b2 100644 --- a/src/__puppeteer__/demo.test.js +++ b/src/__puppeteer__/demo.test.js @@ -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'); diff --git a/src/__tests__/can/dbc.parse.test.js b/src/__tests__/can/dbc.parse.test.js index 1e7fb31..9f5d13e 100644 --- a/src/__tests__/can/dbc.parse.test.js +++ b/src/__tests__/can/dbc.parse.test.js @@ -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"); +}); diff --git a/src/__tests__/utils/dbc.test.js b/src/__tests__/utils/dbc.test.js index a6391ad..29169c9 100644 --- a/src/__tests__/utils/dbc.test.js +++ b/src/__tests__/utils/dbc.test.js @@ -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'; diff --git a/src/__tests__/workers/rlog-utils.test.js b/src/__tests__/workers/rlog-utils.test.js deleted file mode 100644 index f66956b..0000000 --- a/src/__tests__/workers/rlog-utils.test.js +++ /dev/null @@ -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); - }); -}); diff --git a/src/components/CanLog.js b/src/components/CanLog.js index 8aeb6cc..6345ee6 100644 --- a/src/components/CanLog.js +++ b/src/components/CanLog.js @@ -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; } diff --git a/src/components/Meta.js b/src/components/Meta.js index b860136..e79eda3 100644 --- a/src/components/Meta.js +++ b/src/components/Meta.js @@ -385,21 +385,6 @@ export default class Meta extends Component {
-
-
- Show log events - -
-
Available messages
diff --git a/src/models/can/dbc.js b/src/models/can/dbc.js index cd225b0..a0f237a 100644 --- a/src/models/can/dbc.js +++ b/src/models/can/dbc.js @@ -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; diff --git a/src/models/can/logSignals.js b/src/models/can/logSignals.js deleted file mode 100644 index 1362841..0000000 --- a/src/models/can/logSignals.js +++ /dev/null @@ -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] - }); -} diff --git a/src/models/graph-data.js b/src/models/graph-data.js index 3eb4c98..f9a6e59 100644 --- a/src/models/graph-data.js +++ b/src/models/graph-data.js @@ -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, diff --git a/src/workers/message-parser.worker.js b/src/workers/message-parser.worker.js index 938d983..9a80281 100644 --- a/src/workers/message-parser.worker.js +++ b/src/workers/message-parser.worker.js @@ -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, diff --git a/src/workers/rlog-downloader.worker.js b/src/workers/rlog-downloader.worker.js index b67b453..afb4c74 100644 --- a/src/workers/rlog-downloader.worker.js +++ b/src/workers/rlog-downloader.worker.js @@ -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); diff --git a/src/workers/rlog-utils.js b/src/workers/rlog-utils.js deleted file mode 100644 index 6d571b2..0000000 --- a/src/workers/rlog-utils.js +++ /dev/null @@ -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)); -} diff --git a/yarn.lock b/yarn.lock index 0c150cd..0ee409b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"