Skip to content

Commit 345f0d8

Browse files
mherboldclaude
andcommitted
Automatically select and load the steering effects calibration file
Removes the calibration file setting and combo box - the first calibration file found for the current car is now loaded automatically when the simulator loads. A banner on the calibration graph and the understeer / oversteer warnings indicate when no calibration file is available for the car. Also removes the current car setup line above the calibration graph. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 173b0b8 commit 345f0d8

45 files changed

Lines changed: 167 additions & 504 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

MarvinsAIRARefactored/Components/Simulator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ private void OnSessionInfo()
621621

622622
#if !ADMINBOXX
623623

624-
MainWindow._steeringEffectsPage.UpdateCalibrationFileNameOptions();
624+
app.SteeringEffects.LoadCalibration();
625625

626626
#endif
627627

MarvinsAIRARefactored/Components/SteeringEffects.cs

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public enum SeatOfPantsAlgorithm
3939
public bool IsCalibrating => _calibrationPhase != CalibrationPhase.NotCalibrating;
4040
public bool RedrawCalibrationGraph { private get; set; } = false;
4141

42+
public string CalibrationFileName { get; private set; } = string.Empty;
43+
4244
private enum CalibrationPhase
4345
{
4446
NotCalibrating,
@@ -132,11 +134,11 @@ public SteeringEffects()
132134

133135
public void SimulatorDisconnected()
134136
{
135-
DataContext.DataContext.Instance.Settings.SteeringEffectsCalibrationFileName = string.Empty;
136-
137137
ClearCalibration();
138138

139-
MainWindow._steeringEffectsPage.UpdateCalibrationFileNameOptions();
139+
// the car is gone, so this hides the calibration file banners
140+
141+
LoadCalibration();
140142
}
141143

142144
public static void SendChatMessage( string groupKey, string labelKey, string? value = null )
@@ -971,16 +973,6 @@ private void SaveCalibration()
971973

972974
writer.Close();
973975

974-
// update the combo box options
975-
976-
MainWindow._steeringEffectsPage.UpdateCalibrationFileNameOptions();
977-
978-
// update setting to use this calibration file
979-
980-
var settings = DataContext.DataContext.Instance.Settings;
981-
982-
settings.SteeringEffectsCalibrationFileName = Path.GetFileNameWithoutExtension( filePath );
983-
984976
//
985977

986978
app.Logger.WriteLine( "[SteeringEffects] <<< SaveCalibration" );
@@ -1019,42 +1011,39 @@ public void LoadCalibration()
10191011
}
10201012
else
10211013
{
1022-
// figure out which calibration file we need to load
1014+
// clear the current calibration
10231015

1024-
var settings = DataContext.DataContext.Instance.Settings;
1016+
ClearCalibration();
10251017

1026-
if ( settings.SteeringEffectsCalibrationFileName == null )
1027-
{
1028-
app.Logger.WriteLine( $"[SteeringEffects] Calibration file name property value is null (shouldn't be possible!)" );
1018+
CalibrationFileName = string.Empty;
10291019

1030-
ClearCalibration();
1031-
}
1032-
else if ( settings.SteeringEffectsCalibrationFileName == string.Empty )
1033-
{
1034-
app.Logger.WriteLine( $"[SteeringEffects] No calibration file selected" );
1020+
// keep track of whether a calibration file for the current car is missing, and whether the file load was good or not
1021+
1022+
var calibrationFileIsMissing = false;
1023+
var calibrationDataSeemsGood = false;
10351024

1036-
ClearCalibration();
1025+
if ( app.Simulator.CarScreenName == string.Empty )
1026+
{
1027+
app.Logger.WriteLine( "[SteeringEffects] The simulator is not running or the car is not known yet" );
10371028
}
10381029
else
10391030
{
1040-
// clear the current calibration
1031+
// automatically select the first calibration file found for the current car
10411032

1042-
ClearCalibration();
1033+
var filePath = Directory.Exists( CalibrationDirectory ) ? Directory.GetFiles( CalibrationDirectory, $"{app.Simulator.CarScreenName} - *.csv" ).Order().FirstOrDefault() : null;
10431034

1044-
// keep track of whether the file load was good or not
1045-
1046-
var calibrationDataSeemsGood = false;
1047-
1048-
// open file
1049-
1050-
var filePath = Path.Combine( CalibrationDirectory, $"{settings.SteeringEffectsCalibrationFileName}.csv" );
1051-
1052-
if ( !File.Exists( filePath ) )
1035+
if ( filePath == null )
10531036
{
1054-
app.Logger.WriteLine( $"[SteeringEffects] Calibration file not found: {filePath}" );
1037+
app.Logger.WriteLine( $"[SteeringEffects] No calibration file found for this car: {app.Simulator.CarScreenName}" );
1038+
1039+
calibrationFileIsMissing = true;
10551040
}
10561041
else
10571042
{
1043+
CalibrationFileName = Path.GetFileNameWithoutExtension( filePath );
1044+
1045+
app.Logger.WriteLine( $"[SteeringEffects] Loading calibration file: {filePath}" );
1046+
10581047
using var reader = new StreamReader( filePath );
10591048

10601049
// skip the first two lines
@@ -1266,8 +1255,13 @@ public void LoadCalibration()
12661255

12671256
app.Dispatcher.Invoke( () =>
12681257
{
1269-
MainWindow._steeringEffectsPage.InvalidConfigurationFile_Border.Visibility = ( ( settings.SteeringEffectsCalibrationFileName == string.Empty ) || _calibrationIsValid ) ? Visibility.Hidden : Visibility.Visible;
1258+
MainWindow._steeringEffectsPage.CalibrationFileNotAvailable_Border.Visibility = calibrationFileIsMissing ? Visibility.Visible : Visibility.Hidden;
1259+
MainWindow._steeringEffectsPage.InvalidConfigurationFile_Border.Visibility = ( ( CalibrationFileName == string.Empty ) || _calibrationIsValid ) ? Visibility.Hidden : Visibility.Visible;
12701260
} );
1261+
1262+
// show the warnings in the understeer and oversteer sections only when a car is active but we don't have a valid calibration
1263+
1264+
MainWindow._steeringEffectsPage.UpdateCalibrationFileWarnings( ( app.Simulator.CarScreenName != string.Empty ) && !_calibrationIsValid );
12711265
}
12721266

12731267
//
@@ -1287,23 +1281,14 @@ public void Tick( App app )
12871281
{
12881282
var localization = DataContext.DataContext.Instance.Localization;
12891283

1290-
if ( app.Simulator.CarSetupName == string.Empty )
1291-
{
1292-
MainWindow._steeringEffectsPage.CarSetupName_TextBlock.Visibility = Visibility.Collapsed;
1293-
}
1294-
else
1295-
{
1296-
MainWindow._steeringEffectsPage.CarSetupName_TextBlock.Text = $"{localization[ "CurrentCarSetup" ]} {app.Simulator.CarSetupName.ToUpper()}";
1297-
MainWindow._steeringEffectsPage.CarSetupName_TextBlock.Visibility = Visibility.Visible;
1298-
}
1299-
13001284
if ( _calibrationPhase == CalibrationPhase.NotCalibrating )
13011285
{
13021286
MainWindow._steeringEffectsPage.CalibrationProgress_Border.Visibility = Visibility.Collapsed;
13031287
MainWindow._steeringEffectsPage.LiveInfo_Border.Visibility = Visibility.Collapsed;
13041288
}
13051289
else
13061290
{
1291+
MainWindow._steeringEffectsPage.CalibrationFileNotAvailable_Border.Visibility = Visibility.Hidden;
13071292
MainWindow._steeringEffectsPage.InvalidConfigurationFile_Border.Visibility = Visibility.Hidden;
13081293
MainWindow._steeringEffectsPage.CalibrationProgress_TextBlock.Text = $"{localization[ "Progress:" ]} {_calibrationProgress * 100f:F0}{localization[ "Percent" ]}";
13091294
MainWindow._steeringEffectsPage.CalibrationProgress_Border.Visibility = Visibility.Visible;

MarvinsAIRARefactored/Components/Telemetry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ public void Tick( App app )
480480

481481
// steering effects settings telemetry
482482

483-
dataBuffer.SetSteeringEffectsCalibrationFileName( settings.SteeringEffectsCalibrationFileName.ToString() );
483+
dataBuffer.SetSteeringEffectsCalibrationFileName( app.SteeringEffects.CalibrationFileName );
484484

485485
dataBuffer.steeringEffectsUndersteerMinThreshold = settings.SteeringEffectsUndersteerMinimumThreshold;
486486
dataBuffer.steeringEffectsUndersteerMaxThreshold = settings.SteeringEffectsUndersteerMaximumThreshold;

MarvinsAIRARefactored/DataContext/ContextSettings.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@ public class ContextSettings
5454

5555
#endregion
5656

57-
#region Steering effects - General
58-
59-
public string SteeringEffectsCalibrationFileName { get; set; } = string.Empty;
60-
61-
#endregion
62-
6357
#region Steering effects - Understeer
6458

6559
public bool SteeringEffectsUndersteerEnabled { get; set; } = false;

MarvinsAIRARefactored/DataContext/Settings.cs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3310,43 +3310,6 @@ public bool RacingWheelSimpleModeEnabled
33103310

33113311
#endregion
33123312

3313-
#region Steering effects - Calibration file name
3314-
3315-
private string _steeringEffectsCalibrationFileName = string.Empty;
3316-
3317-
public string SteeringEffectsCalibrationFileName
3318-
{
3319-
get => _steeringEffectsCalibrationFileName;
3320-
3321-
set
3322-
{
3323-
var app = App.Instance!;
3324-
3325-
if ( !app.SettingsFile.PauseSerialization )
3326-
{
3327-
if ( value == null )
3328-
{
3329-
value = string.Empty;
3330-
}
3331-
3332-
if ( value != _steeringEffectsCalibrationFileName )
3333-
{
3334-
_steeringEffectsCalibrationFileName = value;
3335-
3336-
OnPropertyChanged();
3337-
3338-
app.SteeringEffects.LoadCalibration();
3339-
3340-
MainWindow._steeringEffectsPage.CalibrationFileNameChanged( _steeringEffectsCalibrationFileName != string.Empty );
3341-
}
3342-
}
3343-
}
3344-
}
3345-
3346-
public ContextSwitches SteeringEffectsCalibrationFileNameContextSwitches { get; set; } = new( false, true, false, false, false );
3347-
3348-
#endregion
3349-
33503313
#region Steering effects - Understeer enabled
33513314

33523315
private bool _steeringEffectsUndersteerEnabled = false;

MarvinsAIRARefactored/Pages/SteeringEffectsPage.xaml

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,6 @@
2323

2424
<Grid>
2525

26-
<Grid.ColumnDefinitions>
27-
<ColumnDefinition Width="*" />
28-
<ColumnDefinition Width="40" />
29-
<ColumnDefinition Width="*" />
30-
<ColumnDefinition Width="40" />
31-
<ColumnDefinition Width="*" />
32-
</Grid.ColumnDefinitions>
33-
34-
<Grid.RowDefinitions>
35-
<RowDefinition Height="Auto" />
36-
<RowDefinition Height="5" />
37-
<RowDefinition Height="Auto" />
38-
</Grid.RowDefinitions>
39-
40-
<controls:MairaComboBox x:Name="CalibrationFileName_MairaComboBox"
41-
Grid.Row="0"
42-
Grid.Column="0"
43-
Grid.ColumnSpan="3"
44-
Label=""
45-
SelectedValue="{Binding Settings.SteeringEffectsCalibrationFileName, Mode=TwoWay}" />
46-
47-
<TextBlock x:Name="CarSetupName_TextBlock"
48-
Grid.Row="2"
49-
Grid.Column="0"
50-
Grid.ColumnSpan="3"
51-
FontSize="20"
52-
d:Text="Just a test to see what this line looks like."
53-
Foreground="#ff5b2e" />
54-
55-
</Grid>
56-
57-
<Grid Margin="0,20,0,0">
58-
5926
<Border BorderThickness="2"
6027
BorderBrush="{DynamicResource Brush.Border.Normal}"
6128
Background="{DynamicResource Brush.Background.Popup}"
@@ -90,6 +57,22 @@
9057

9158
</Border>
9259

60+
<Border x:Name="CalibrationFileNotAvailable_Border"
61+
HorizontalAlignment="Center"
62+
VerticalAlignment="Top"
63+
Padding="10,1"
64+
Background="{DynamicResource Brush.Background.Popup}"
65+
BorderBrush="{DynamicResource Brush.Border.Normal}"
66+
BorderThickness="2"
67+
CornerRadius="8"
68+
Margin="0,82,0,0"
69+
Visibility="Hidden">
70+
71+
<TextBlock Style="{StaticResource MairaTextBlockStyle}"
72+
Text="{Binding Localization[SteeringEffectsCalibrationFileNotAvailable]}" />
73+
74+
</Border>
75+
9376
<Border x:Name="InvalidConfigurationFile_Border"
9477
HorizontalAlignment="Center"
9578
VerticalAlignment="Top"
@@ -209,8 +192,9 @@
209192
Grid.Column="0"
210193
Grid.ColumnSpan="5"
211194
FontSize="20"
212-
Text="{Binding Localization[SteeringEffectsCalibrationFileNotSelected]}"
195+
Text="{Binding Localization[SteeringEffectsCalibrationFileNotAvailable]}"
213196
Foreground="#ff5b2e"
197+
Visibility="Collapsed"
214198
Margin="0,0,0,20" />
215199

216200
<controls:MairaSwitch Grid.Column="0"
@@ -506,8 +490,9 @@
506490
Grid.Column="0"
507491
Grid.ColumnSpan="5"
508492
FontSize="20"
509-
Text="{Binding Localization[SteeringEffectsCalibrationFileNotSelected]}"
493+
Text="{Binding Localization[SteeringEffectsCalibrationFileNotAvailable]}"
510494
Foreground="#ff5b2e"
495+
Visibility="Collapsed"
511496
Margin="0,0,0,20" />
512497

513498
<controls:MairaSwitch Grid.Column="0"

MarvinsAIRARefactored/Pages/SteeringEffectsPage.xaml.cs

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
using System.IO;
32
using System.Linq;
43
using System.Windows;
54
using System.Windows.Controls;
@@ -116,52 +115,6 @@ private void MaxBrake_MairaButton_Click( object sender, RoutedEventArgs e )
116115

117116
#region Logic
118117

119-
public void UpdateCalibrationFileNameOptions()
120-
{
121-
var app = App.Instance!;
122-
123-
app.Logger.WriteLine( "[SteeringEffectsPage] UpdateCalibrationFileNameOptions >>>" );
124-
125-
var localization = MarvinsAIRARefactored.DataContext.DataContext.Instance.Localization;
126-
var settings = MarvinsAIRARefactored.DataContext.DataContext.Instance.Settings;
127-
128-
var dictionary = new Dictionary<string, string>()
129-
{
130-
{ string.Empty, localization[ "CalibrationFileNotSelected" ] }
131-
};
132-
133-
var autoSelectedValue = string.Empty;
134-
135-
if ( app.Simulator.CarScreenName != string.Empty )
136-
{
137-
foreach ( var filePath in Directory.GetFiles( SteeringEffects.CalibrationDirectory, $"{app.Simulator.CarScreenName} - *.csv" ) )
138-
{
139-
var option = Path.GetFileNameWithoutExtension( filePath );
140-
141-
dictionary.Add( option, option );
142-
143-
if ( settings.SteeringEffectsCalibrationFileName == string.Empty )
144-
{
145-
autoSelectedValue = option;
146-
}
147-
}
148-
}
149-
150-
app.Dispatcher.Invoke( () =>
151-
{
152-
CalibrationFileName_MairaComboBox.ItemsSource = dictionary.ToList();
153-
154-
if ( autoSelectedValue != string.Empty )
155-
{
156-
settings.SteeringEffectsCalibrationFileName = autoSelectedValue;
157-
}
158-
159-
CalibrationFileName_MairaComboBox.OffValue = string.Empty;
160-
} );
161-
162-
app.Logger.WriteLine( "[SteeringEffectsPage] <<< UpdateCalibrationFileNameOptions" );
163-
}
164-
165118
public void UpdateVibrationPatternOptions()
166119
{
167120
var app = App.Instance!;
@@ -233,14 +186,14 @@ public void UpdateSeatOfPantsAlgorithmOptions()
233186
app.Logger.WriteLine( "[SteeringEffectsPage] <<< UpdateSeatOfPantsAlgorithmOptions" );
234187
}
235188

236-
public void CalibrationFileNameChanged( bool isSelected )
189+
public void UpdateCalibrationFileWarnings( bool showWarnings )
237190
{
238191
var app = App.Instance!;
239192

240193
app.Dispatcher.InvokeAsync( () =>
241194
{
242-
Understeer_CalibrationFileWarning.Visibility = isSelected ? Visibility.Collapsed : Visibility.Visible;
243-
Oversteer_CalibrationFileWarning.Visibility = isSelected ? Visibility.Collapsed : Visibility.Visible;
195+
Understeer_CalibrationFileWarning.Visibility = showWarnings ? Visibility.Visible : Visibility.Collapsed;
196+
Oversteer_CalibrationFileWarning.Visibility = showWarnings ? Visibility.Visible : Visibility.Collapsed;
244197
} );
245198
}
246199

0 commit comments

Comments
 (0)