Skip to content

Commit 6c29a41

Browse files
authored
change relative logic to rely on lap distpct instead of esttime (#14)
1 parent a90d742 commit 6c29a41

File tree

5 files changed

+79
-35
lines changed

5 files changed

+79
-35
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ typings/
9292
out/
9393

9494
*storybook.log
95-
test-data/*.png
95+
test-data/**/*.png
9696
test-data/unused
9797
src/**/tracks/*.svg
9898
asset-data

src/app/bridge/iracingSdk/dumpTelemetry.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@ export async function dumpCurrentTelemetry() {
2424
await writeFile(`${dirPath}/session.json`, session, 'utf-8'),
2525
]);
2626
console.log(`Saved to: ${dirPath}`);
27+
return { dirPath };
2728
} else {
2829
console.warn('No telemetry data received');
2930
}
3031
}
32+
33+
return { dirPath: null };
3134
}

src/app/setupTaskbar.ts

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { nativeImage, Tray, Menu, app, globalShortcut } from 'electron';
1+
import { nativeImage, Tray, Menu, app, globalShortcut, desktopCapturer } from 'electron';
22
import { TelemetrySink } from './bridge/iracingSdk/telemetrySink';
33
import { OverlayManager } from './overlayManager';
4+
import { writeFile } from 'node:fs/promises';
5+
import path from 'node:path';
46

57
class Taskbar {
68
private tray: Tray;
@@ -65,11 +67,34 @@ class Taskbar {
6567
this.overlayManager.toggleLockOverlays();
6668
}
6769

68-
private saveTelemetry(): void {
69-
if (process.platform === 'darwin') return;
70-
import('./bridge/iracingSdk/dumpTelemetry').then(
71-
async ({ dumpCurrentTelemetry }) => await dumpCurrentTelemetry()
72-
);
70+
private async saveTelemetry(): Promise<void> {
71+
try {
72+
// First, import and call dumpTelemetry to get the directory path
73+
const { dumpCurrentTelemetry } = await import('./bridge/iracingSdk/dumpTelemetry');
74+
const telemetryResult = await dumpCurrentTelemetry();
75+
76+
// Check if dirPath exists and is not null
77+
const dirPath = telemetryResult && 'dirPath' in telemetryResult ? telemetryResult.dirPath : null;
78+
if (dirPath) {
79+
// Capture all screens
80+
const sources = await desktopCapturer.getSources({
81+
types: ['screen'],
82+
thumbnailSize: { width: 1920, height: 1080 } // Use a standard resolution
83+
});
84+
85+
// Save each screen as a separate file
86+
await Promise.all(sources.map(async (source, index) => {
87+
if (source.thumbnail) {
88+
const screenshotPath = path.join(dirPath, `screenshot_${index + 1}.png`);
89+
const pngData = source.thumbnail.toPNG();
90+
await writeFile(screenshotPath, pngData);
91+
console.log(`Screenshot ${index + 1} saved to: ${screenshotPath}`);
92+
}
93+
}));
94+
}
95+
} catch (error) {
96+
console.error('Error capturing screenshots:', error);
97+
}
7398
}
7499

75100
private registerShortcuts(): void {
Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,56 @@
11
import { useMemo } from 'react';
22
import {
33
useDriverCarIdx,
4+
useSessionStore,
45
useTelemetryValues,
56
} from '@irdashies/context';
67
import { useDriverStandings } from './useDriverPositions';
78

89
export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
9-
const carIdxEstTime = useTelemetryValues('CarIdxEstTime');
1010
const drivers = useDriverStandings();
1111
const carIdxLapDistPct = useTelemetryValues('CarIdxLapDistPct');
12+
const carIdxLap = useTelemetryValues('CarIdxLap');
13+
1214
const playerIndex = useDriverCarIdx();
15+
const driverCarEstLapTime = useSessionStore(
16+
(s) => s.session?.DriverInfo?.DriverCarEstLapTime ?? 0
17+
);
1318

1419
const standings = useMemo(() => {
15-
const player = drivers.find((d) => d.carIdx === playerIndex);
16-
if (!player) {
17-
return [];
18-
}
20+
const calculateDelta = (otherCarIdx: number) => {
21+
const playerCarIdx = playerIndex ?? 0;
1922

20-
const driverEstLapTime = player.carClass.estLapTime ?? 0;
23+
const playerLapNum = carIdxLap?.[playerCarIdx];
24+
const playerDistPct = carIdxLapDistPct?.[playerCarIdx];
2125

22-
const calculateDelta = (carIdx: number, isAhead: boolean) => {
23-
const playerEstTime = carIdxEstTime?.[playerIndex ?? 0];
24-
const oppositionEstTime = carIdxEstTime?.[carIdx];
25-
const opposition = drivers.find((d) => d.carIdx === carIdx);
26+
const otherLapNum = carIdxLap?.[otherCarIdx];
27+
const otherDistPct = carIdxLapDistPct?.[otherCarIdx];
2628

27-
if (!opposition) {
28-
return 0;
29+
if (
30+
playerLapNum === undefined || playerLapNum < 0 ||
31+
playerDistPct === undefined || playerDistPct < 0 || playerDistPct > 1 ||
32+
otherLapNum === undefined || otherLapNum < 0 ||
33+
otherDistPct === undefined || otherDistPct < 0 || otherDistPct > 1 ||
34+
driverCarEstLapTime <= 0
35+
) {
36+
return NaN;
2937
}
3038

31-
let delta = (oppositionEstTime - playerEstTime);
39+
let distPctDifference = otherDistPct - playerDistPct;
3240

33-
if (isAhead) {
34-
// For cars ahead, use their lap time since they determine the full lap duration
35-
while (delta < 0) delta += driverEstLapTime;
36-
while (delta > 0.5 * driverEstLapTime) delta -= driverEstLapTime;
37-
} else {
38-
// For cars behind, use player's lap time since we're measuring against our lap
39-
while (delta > 0) delta -= driverEstLapTime;
40-
while (delta < -0.5 * driverEstLapTime) delta += driverEstLapTime;
41+
if (distPctDifference > 0.5) {
42+
distPctDifference -= 1.0;
43+
} else if (distPctDifference < -0.5) {
44+
distPctDifference += 1.0;
4145
}
46+
47+
const timeDelta = distPctDifference * driverCarEstLapTime;
4248

43-
return delta;
49+
return timeDelta;
4450
};
4551

4652
const isHalfLapDifference = (car1: number, car2: number) => {
47-
const diff = (car1 - car2 + 1) % 1; // Normalize the difference to [0, 1)
53+
const diff = (car1 - car2 + 1) % 1;
4854
return diff <= 0.5;
4955
};
5056

@@ -60,7 +66,7 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
6066
})
6167
.map((result) => ({
6268
...result,
63-
delta: calculateDelta(result.carIdx, isAhead),
69+
delta: calculateDelta(result.carIdx),
6470
}))
6571
.filter((result) => (isAhead ? result.delta > 0 : result.delta < 0))
6672
.sort((a, b) => (isAhead ? a.delta - b.delta : b.delta - a.delta))
@@ -69,14 +75,24 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
6975
};
7076

7177
const carsAhead = filterAndMapDrivers(true);
78+
const player = drivers.find((result) => result.carIdx === playerIndex);
7279
const carsBehind = filterAndMapDrivers(false);
7380

74-
const relatives = [...carsAhead, { ...player, delta: 0 }, ...carsBehind];
81+
if (!player) {
82+
return [];
83+
}
7584

76-
// TODO: remove pace car if not under caution or pacing
85+
const relatives = [...carsAhead, { ...player, delta: 0 }, ...carsBehind];
7786

7887
return relatives;
79-
}, [drivers, buffer, carIdxEstTime, playerIndex, carIdxLapDistPct]);
88+
}, [
89+
drivers,
90+
buffer,
91+
playerIndex,
92+
driverCarEstLapTime,
93+
carIdxLapDistPct,
94+
carIdxLap,
95+
]);
8096

8197
return standings;
8298
};

src/frontend/components/TrackMap/hooks/useTrackId.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useSessionStore } from '@irdashies/context';
22

33
export const useTrackId = () => {
44
const trackId = useSessionStore(
5-
(state) => state.session?.WeekendInfo.TrackID
5+
(state) => state.session?.WeekendInfo?.TrackID
66
);
77
return trackId;
88
};

0 commit comments

Comments
 (0)