Skip to content

Commit 2b84868

Browse files
committed
More SBT improvements and UI updates.
1 parent 27288b7 commit 2b84868

5 files changed

Lines changed: 417 additions & 178 deletions

File tree

Components/SeatBeltTensioner.cs

Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class SeatBeltTensioner
2929
private float _vertAccelSum = 0f;
3030
private float _pitchSum = 0f;
3131
private float _rollSum = 0f;
32-
private int _accelSampleCount = 0;
32+
private int _sampleCount = 0;
3333

3434
public SeatBeltTensioner()
3535
{
@@ -184,17 +184,17 @@ private void Update( App app )
184184
{
185185
var settings = DataContext.DataContext.Instance.Settings;
186186

187-
if ( _accelSampleCount == 0 )
187+
if ( !IsConnected || !settings.SeatBeltTensionerEnabled || _sampleCount == 0 )
188188
{
189189
return;
190190
}
191191

192-
var longAccelAvg = _longAccelSum / _accelSampleCount;
193-
var latAccelAvg = _latAccelSum / _accelSampleCount;
194-
var vertAccelAvg = _vertAccelSum / _accelSampleCount;
192+
var longAccelAvg = _longAccelSum / _sampleCount;
193+
var latAccelAvg = _latAccelSum / _sampleCount;
194+
var vertAccelAvg = _vertAccelSum / _sampleCount;
195195

196-
var pitch = _pitchSum / _accelSampleCount;
197-
var roll = _rollSum / _accelSampleCount;
196+
var pitch = _pitchSum / _sampleCount;
197+
var roll = _rollSum / _sampleCount;
198198

199199
_longAccelSum = 0f;
200200
_latAccelSum = 0f;
@@ -203,12 +203,7 @@ private void Update( App app )
203203
_pitchSum = 0f;
204204
_rollSum = 0f;
205205

206-
_accelSampleCount = 0;
207-
208-
if ( !settings.SeatBeltTensionerEnabled || !IsConnected )
209-
{
210-
return;
211-
}
206+
_sampleCount = 0;
212207

213208
// Get and sanitize settings
214209
var minimumTenths = Math.Clamp( (int) Math.Round( settings.SeatBeltTensionerMinimum * 10f ), 0, 900 );
@@ -231,29 +226,15 @@ private void Update( App app )
231226
var sinRoll = MathF.Sin( roll );
232227

233228
// Gravity component along each body axis (what iRacing adds to raw acceleration)
229+
var gravLong = MathZ.OneG * -sinPitch;
230+
var gravLat = MathZ.OneG * cosPitch * sinRoll;
234231
var gravVert = MathZ.OneG * cosPitch * cosRoll;
235232

236-
float longAccel;
237-
float latAccel;
238-
float vertAccel;
233+
var longAccel = settings.SeatBeltTensionerSurgeSubtractGravity ? longAccelAvg - gravLong : longAccelAvg;
234+
var latAccel = settings.SeatBeltTensionerSwaySubtractGravity ? latAccelAvg - gravLat : latAccelAvg;
235+
var vertAccel = settings.SeatBeltTensionerHeaveSubtractGravity ? vertAccelAvg - gravVert : vertAccelAvg;
239236

240-
if ( settings.SeatBeltTensionerSubtractFullGravity )
241-
{
242-
var gravLong = MathZ.OneG * -sinPitch;
243-
var gravLat = MathZ.OneG * cosPitch * sinRoll;
244-
245-
longAccel = longAccelAvg - gravLong;
246-
latAccel = latAccelAvg - gravLat;
247-
vertAccel = vertAccelAvg - gravVert;
248-
}
249-
else
250-
{
251-
longAccel = longAccelAvg;
252-
latAccel = latAccelAvg;
253-
vertAccel = vertAccelAvg - gravVert;
254-
}
255-
256-
// Surge normalized [-1..1]:
237+
// Surge normalized [-1..1]: braking tightens both belts, acceleration loosens both belts
257238
var surgeNormalized = Math.Clamp( -longAccel / MathZ.OneG / settings.SeatBeltTensionerSurgeMaxG, -1f, 1f );
258239

259240
// Sway normalized [-1..1]: positive biases right belt tighter, left belt looser
@@ -262,6 +243,12 @@ private void Update( App app )
262243
// Heave normalized [-1..1]: bumps and crests both tighten both belts
263244
var heaveNormalized = Math.Clamp( -vertAccel / MathZ.OneG / settings.SeatBeltTensionerHeaveMaxG, -1f, 1f );
264245

246+
// Apply inversion settings
247+
if ( settings.SeatBeltTensionerSurgeInvert ) surgeNormalized = -surgeNormalized;
248+
if ( settings.SeatBeltTensionerSwayInvert ) swayNormalized = -swayNormalized;
249+
if ( settings.SeatBeltTensionerHeaveInvert ) heaveNormalized = -heaveNormalized;
250+
251+
// Update graphs if on the SBT page
265252
if ( MairaAppMenuPopup.CurrentAppPage == MainWindow.AppPage.SeatBeltTensioner )
266253
{
267254
_surgeGraph.Advance( surgeNormalized );
@@ -273,28 +260,42 @@ private void Update( App app )
273260
_heaveGraph.WritePixels();
274261
}
275262

276-
// Combine into per-arm normalized signal and offset by neutral position
277-
var leftCombinedNormalized = surgeNormalized + heaveNormalized - swayNormalized + neutralPositionNormalized;
278-
var rightCombinedNormalized = surgeNormalized + heaveNormalized + swayNormalized + neutralPositionNormalized;
263+
// Combine into per-arm normalized signal
264+
var leftCombinedNormalized = surgeNormalized + heaveNormalized - swayNormalized;
265+
var rightCombinedNormalized = surgeNormalized + heaveNormalized + swayNormalized;
279266

280267
// Apply soft limiter
281268
var limitedLeftNormalized = MathZ.SoftLimiter( leftCombinedNormalized );
282269
var limitedRightNormalized = MathZ.SoftLimiter( rightCombinedNormalized );
283270

284271
// Map to tenths of degrees and clamp to minimum / maximum
285-
var leftTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedLeftNormalized * rangeTenths + 900 ), minimumTenths, maximumTenths );
286-
var rightTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedRightNormalized * rangeTenths + 900 ), minimumTenths, maximumTenths );
272+
int leftTargetPositionTenths;
273+
int rightTargetPositionTenths;
287274

275+
if ( limitedLeftNormalized >= 0f )
276+
{
277+
leftTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedLeftNormalized * ( maximumTenths - neutralTenths ) + neutralTenths ), minimumTenths, maximumTenths );
278+
}
279+
else
280+
{
281+
leftTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedLeftNormalized * ( neutralTenths - minimumTenths ) + neutralTenths ), minimumTenths, maximumTenths );
282+
}
283+
284+
if ( rightCombinedNormalized >= 0f )
285+
{
286+
rightTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedRightNormalized * ( maximumTenths - neutralTenths ) + neutralTenths ), minimumTenths, maximumTenths );
287+
}
288+
else
289+
{
290+
rightTargetPositionTenths = Math.Clamp( (int) MathF.Round( limitedRightNormalized * ( neutralTenths - minimumTenths ) + neutralTenths ), minimumTenths, maximumTenths );
291+
}
292+
293+
// Update shoulder graphs if on the SBT page
288294
if ( MairaAppMenuPopup.CurrentAppPage == MainWindow.AppPage.SeatBeltTensioner )
289295
{
290296
// Remap tenths to [-1..1]: -1=minimum, 0=neutral, +1=maximum (piecewise linear)
291-
var leftShoulderNormalized = leftTargetPositionTenths <= neutralTenths
292-
? (float) ( leftTargetPositionTenths - neutralTenths ) / ( neutralTenths - minimumTenths )
293-
: (float) ( leftTargetPositionTenths - neutralTenths ) / ( maximumTenths - neutralTenths );
294-
295-
var rightShoulderNormalized = rightTargetPositionTenths <= neutralTenths
296-
? (float) ( rightTargetPositionTenths - neutralTenths ) / ( neutralTenths - minimumTenths )
297-
: (float) ( rightTargetPositionTenths - neutralTenths ) / ( maximumTenths - neutralTenths );
297+
var leftShoulderNormalized = leftTargetPositionTenths <= neutralTenths ? (float) ( leftTargetPositionTenths - neutralTenths ) / ( neutralTenths - minimumTenths ) : (float) ( leftTargetPositionTenths - neutralTenths ) / ( maximumTenths - neutralTenths );
298+
var rightShoulderNormalized = rightTargetPositionTenths <= neutralTenths ? (float) ( rightTargetPositionTenths - neutralTenths ) / ( neutralTenths - minimumTenths ) : (float) ( rightTargetPositionTenths - neutralTenths ) / ( maximumTenths - neutralTenths );
298299

299300
_leftShoulderGraph.Advance( leftShoulderNormalized );
300301
_rightShoulderGraph.Advance( rightShoulderNormalized );
@@ -314,7 +315,7 @@ private void OnPortClosed( object? sender, EventArgs e )
314315

315316
public void Tick( App app )
316317
{
317-
if ( app.Simulator.IsOnTrack )
318+
if ( app.Simulator.IsOnTrack || app.Simulator.IsReplayPlaying )
318319
{
319320
_longAccelSum += app.Simulator.LongAccel;
320321
_latAccelSum += app.Simulator.LatAccel;
@@ -323,7 +324,7 @@ public void Tick( App app )
323324
_pitchSum += app.Simulator.Pitch;
324325
_rollSum += app.Simulator.Roll;
325326

326-
_accelSampleCount++;
327+
_sampleCount++;
327328
}
328329

329330
_updateCounter--;

DataContext/ContextSettings.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,18 @@ public class ContextSettings
194194
public float WindCurving { get; set; } = 1f;
195195

196196
#endregion
197+
198+
#region Seat Belt Tensioner
199+
200+
public float SeatBeltTensionerSurgeMaxG { get; set; } = 10f;
201+
public float SeatBeltTensionerSwayMaxG { get; set; } = 10f;
202+
public float SeatBeltTensionerHeaveMaxG { get; set; } = 10f;
203+
public bool SeatBeltTensionerSurgeSubtractGravity { get; set; } = false;
204+
public bool SeatBeltTensionerSwaySubtractGravity { get; set; } = false;
205+
public bool SeatBeltTensionerHeaveSubtractGravity { get; set; } = true;
206+
public bool SeatBeltTensionerSurgeInvert { get; set; } = false;
207+
public bool SeatBeltTensionerSwayInvert { get; set; } = false;
208+
public bool SeatBeltTensionerHeaveInvert { get; set; } = false;
209+
210+
#endregion
197211
}

DataContext/Settings.cs

Lines changed: 132 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10053,25 +10053,142 @@ public bool SeatBeltTensionerEnabled
1005310053

1005410054
#endregion
1005510055

10056-
#region Seat Belt Tensioner - Subtract Full Gravity
10056+
#region Seat Belt Tensioner - Surge Subtract Gravity
1005710057

10058-
private bool _seatBeltTensionerSubtractFullGravity = false;
10058+
private bool _seatBeltTensionerSurgeSubtractGravity = false;
1005910059

10060-
public bool SeatBeltTensionerSubtractFullGravity
10060+
public bool SeatBeltTensionerSurgeSubtractGravity
1006110061
{
10062-
get => _seatBeltTensionerSubtractFullGravity;
10062+
get => _seatBeltTensionerSurgeSubtractGravity;
1006310063

1006410064
set
1006510065
{
10066-
if ( value != _seatBeltTensionerSubtractFullGravity )
10066+
if ( value != _seatBeltTensionerSurgeSubtractGravity )
1006710067
{
10068-
_seatBeltTensionerSubtractFullGravity = value;
10068+
_seatBeltTensionerSurgeSubtractGravity = value;
1006910069

1007010070
OnPropertyChanged();
1007110071
}
1007210072
}
1007310073
}
1007410074

10075+
public ContextSwitches SeatBeltTensionerSurgeSubtractGravityContextSwitches { get; set; } = new( false, true, false, false, false );
10076+
10077+
#endregion
10078+
10079+
#region Seat Belt Tensioner - Sway Subtract Gravity
10080+
10081+
private bool _seatBeltTensionerSwaySubtractGravity = false;
10082+
10083+
public bool SeatBeltTensionerSwaySubtractGravity
10084+
{
10085+
get => _seatBeltTensionerSwaySubtractGravity;
10086+
10087+
set
10088+
{
10089+
if ( value != _seatBeltTensionerSwaySubtractGravity )
10090+
{
10091+
_seatBeltTensionerSwaySubtractGravity = value;
10092+
10093+
OnPropertyChanged();
10094+
}
10095+
}
10096+
}
10097+
10098+
public ContextSwitches SeatBeltTensionerSwaySubtractGravityContextSwitches { get; set; } = new( false, true, false, false, false );
10099+
10100+
#endregion
10101+
10102+
#region Seat Belt Tensioner - Heave Subtract Gravity
10103+
10104+
private bool _seatBeltTensionerHeaveSubtractGravity = true;
10105+
10106+
public bool SeatBeltTensionerHeaveSubtractGravity
10107+
{
10108+
get => _seatBeltTensionerHeaveSubtractGravity;
10109+
10110+
set
10111+
{
10112+
if ( value != _seatBeltTensionerHeaveSubtractGravity )
10113+
{
10114+
_seatBeltTensionerHeaveSubtractGravity = value;
10115+
10116+
OnPropertyChanged();
10117+
}
10118+
}
10119+
}
10120+
10121+
public ContextSwitches SeatBeltTensionerHeaveSubtractGravityContextSwitches { get; set; } = new( false, true, false, false, false );
10122+
10123+
#endregion
10124+
10125+
#region Seat Belt Tensioner - Surge Invert
10126+
10127+
private bool _seatBeltTensionerSurgeInvert = false;
10128+
10129+
public bool SeatBeltTensionerSurgeInvert
10130+
{
10131+
get => _seatBeltTensionerSurgeInvert;
10132+
10133+
set
10134+
{
10135+
if ( value != _seatBeltTensionerSurgeInvert )
10136+
{
10137+
_seatBeltTensionerSurgeInvert = value;
10138+
10139+
OnPropertyChanged();
10140+
}
10141+
}
10142+
}
10143+
10144+
public ContextSwitches SeatBeltTensionerSurgeInvertContextSwitches { get; set; } = new( false, true, false, false, false );
10145+
10146+
#endregion
10147+
10148+
#region Seat Belt Tensioner - Sway Invert
10149+
10150+
private bool _seatBeltTensionerSwayInvert = false;
10151+
10152+
public bool SeatBeltTensionerSwayInvert
10153+
{
10154+
get => _seatBeltTensionerSwayInvert;
10155+
10156+
set
10157+
{
10158+
if ( value != _seatBeltTensionerSwayInvert )
10159+
{
10160+
_seatBeltTensionerSwayInvert = value;
10161+
10162+
OnPropertyChanged();
10163+
}
10164+
}
10165+
}
10166+
10167+
public ContextSwitches SeatBeltTensionerSwayInvertContextSwitches { get; set; } = new( false, true, false, false, false );
10168+
10169+
#endregion
10170+
10171+
#region Seat Belt Tensioner - Heave Invert
10172+
10173+
private bool _seatBeltTensionerHeaveInvert = false;
10174+
10175+
public bool SeatBeltTensionerHeaveInvert
10176+
{
10177+
get => _seatBeltTensionerHeaveInvert;
10178+
10179+
set
10180+
{
10181+
if ( value != _seatBeltTensionerHeaveInvert )
10182+
{
10183+
_seatBeltTensionerHeaveInvert = value;
10184+
10185+
OnPropertyChanged();
10186+
}
10187+
}
10188+
}
10189+
10190+
public ContextSwitches SeatBeltTensionerHeaveInvertContextSwitches { get; set; } = new( false, true, false, false, false );
10191+
1007510192
#endregion
1007610193

1007710194
#region Seat Belt Tensioner - Minimum
@@ -10215,7 +10332,7 @@ public string SeatBeltTensionerMaximumString
1021510332

1021610333
#region Seat Belt Tensioner - Surge Max G
1021710334

10218-
private float _seatBeltTensionerSurgeMaxG = 6.0f;
10335+
private float _seatBeltTensionerSurgeMaxG = 10f;
1021910336

1022010337
public float SeatBeltTensionerSurgeMaxG
1022110338
{
@@ -10254,11 +10371,13 @@ public string SeatBeltTensionerSurgeMaxGString
1025410371
}
1025510372
}
1025610373

10374+
public ContextSwitches SeatBeltTensionerSurgeMaxGContextSwitches { get; set; } = new( false, true, false, false, false );
10375+
1025710376
#endregion
1025810377

1025910378
#region Seat Belt Tensioner - Sway Max G
1026010379

10261-
private float _seatBeltTensionerSwayMaxG = 12.0f;
10380+
private float _seatBeltTensionerSwayMaxG = 10f;
1026210381

1026310382
public float SeatBeltTensionerSwayMaxG
1026410383
{
@@ -10297,11 +10416,13 @@ public string SeatBeltTensionerSwayMaxGString
1029710416
}
1029810417
}
1029910418

10419+
public ContextSwitches SeatBeltTensionerSwayMaxGContextSwitches { get; set; } = new( false, true, false, false, false );
10420+
1030010421
#endregion
1030110422

1030210423
#region Seat Belt Tensioner - Heave Max G
1030310424

10304-
private float _seatBeltTensionerHeaveMaxG = 12.0f;
10425+
private float _seatBeltTensionerHeaveMaxG = 10f;
1030510426

1030610427
public float SeatBeltTensionerHeaveMaxG
1030710428
{
@@ -10340,6 +10461,8 @@ public string SeatBeltTensionerHeaveMaxGString
1034010461
}
1034110462
}
1034210463

10464+
public ContextSwitches SeatBeltTensionerHeaveMaxGContextSwitches { get; set; } = new( false, true, false, false, false );
10465+
1034310466
#endregion
1034410467

1034510468
#region Seat Belt Tensioner - Max Motor Speed

0 commit comments

Comments
 (0)