@@ -513,28 +513,28 @@ int32_t Joystick_::getEffectForce(volatile TEffectState& effect, EffectParams _e
513
513
switch (effect.effectType )
514
514
{
515
515
case USB_EFFECT_CONSTANT:// 1
516
- force = ConstantForceCalculator (effect) * constantGain * angle_ratio;
516
+ force = ConstantForceCalculator (effect) * m_gains[axis]. constantGain * angle_ratio;
517
517
break ;
518
518
case USB_EFFECT_RAMP:// 2
519
- force = RampForceCalculator (effect) * rampGain * angle_ratio;
519
+ force = RampForceCalculator (effect) * m_gains[axis]. rampGain * angle_ratio;
520
520
break ;
521
521
case USB_EFFECT_SQUARE:// 3
522
- force = SquareForceCalculator (effect) * squareGain * angle_ratio;
522
+ force = SquareForceCalculator (effect) * m_gains[axis]. squareGain * angle_ratio;
523
523
break ;
524
524
case USB_EFFECT_SINE:// 4
525
- force = SinForceCalculator (effect) * sineGain * angle_ratio;
525
+ force = SinForceCalculator (effect) * m_gains[axis]. sineGain * angle_ratio;
526
526
break ;
527
527
case USB_EFFECT_TRIANGLE:// 5
528
- force = TriangleForceCalculator (effect) * triangleGain * angle_ratio;
528
+ force = TriangleForceCalculator (effect) * m_gains[axis]. triangleGain * angle_ratio;
529
529
break ;
530
530
case USB_EFFECT_SAWTOOTHDOWN:// 6
531
- force = SawtoothDownForceCalculator (effect) * sawtoothdownGain * angle_ratio;
531
+ force = SawtoothDownForceCalculator (effect) * m_gains[axis]. sawtoothdownGain * angle_ratio;
532
532
break ;
533
533
case USB_EFFECT_SAWTOOTHUP:// 7
534
- force = SawtoothUpForceCalculator (effect) * sawtoothupGain * angle_ratio;
534
+ force = SawtoothUpForceCalculator (effect) * m_gains[axis]. sawtoothupGain * angle_ratio;
535
535
break ;
536
536
case USB_EFFECT_SPRING:// 8
537
- force = ConditionForceCalculator (effect, NormalizeRange (_effect_params.springPosition , m_effect_params[axis].springMaxPosition ), condition) * angle_ratio * springGain;
537
+ force = ConditionForceCalculator (effect, NormalizeRange (_effect_params.springPosition , m_effect_params[axis].springMaxPosition ), condition) * angle_ratio * m_gains[axis]. springGain ;
538
538
break ;
539
539
case USB_EFFECT_DAMPER:// 9
540
540
force = ConditionForceCalculator (effect, NormalizeRange (_effect_params.damperVelocity , m_effect_params[axis].damperMaxVelocity ), condition) * angle_ratio;
@@ -543,21 +543,21 @@ int32_t Joystick_::getEffectForce(volatile TEffectState& effect, EffectParams _e
543
543
Interpolation::CatmullSpline (damperSplinePoints[0 ], damperSplinePoints[1 ], damperSplineNumPoints, abs (force))
544
544
/10000.0 );
545
545
#else
546
- force = force * damperGain;
546
+ force = force * m_gains[axis]. damperGain ;
547
547
#endif
548
548
force = damperFilter[axis].update (force);
549
549
break ;
550
550
case USB_EFFECT_INERTIA:// 10
551
551
if (_effect_params.inertiaAcceleration < 0 && _effect_params.frictionPositionChange < 0 ) {
552
- force = ConditionForceCalculator (effect, abs (NormalizeRange (_effect_params.inertiaAcceleration , m_effect_params[axis].inertiaMaxAcceleration )), condition) * angle_ratio * inertiaGain;
552
+ force = ConditionForceCalculator (effect, abs (NormalizeRange (_effect_params.inertiaAcceleration , m_effect_params[axis].inertiaMaxAcceleration )), condition) * angle_ratio * m_gains[axis]. inertiaGain ;
553
553
}
554
554
else if (_effect_params.inertiaAcceleration < 0 && _effect_params.frictionPositionChange > 0 ) {
555
- force = -1 * ConditionForceCalculator (effect, abs (NormalizeRange (_effect_params.inertiaAcceleration , m_effect_params[axis].inertiaMaxAcceleration )), condition) * angle_ratio * inertiaGain;
555
+ force = -1 * ConditionForceCalculator (effect, abs (NormalizeRange (_effect_params.inertiaAcceleration , m_effect_params[axis].inertiaMaxAcceleration )), condition) * angle_ratio * m_gains[axis]. inertiaGain ;
556
556
}
557
557
force = inertiaFilter[axis].update (force);
558
558
break ;
559
559
case USB_EFFECT_FRICTION:// 11
560
- force = ConditionForceCalculator (effect, NormalizeRange (_effect_params.frictionPositionChange , m_effect_params[axis].frictionMaxPositionChange ), condition) * angle_ratio * frictionGain;
560
+ force = ConditionForceCalculator (effect, NormalizeRange (_effect_params.frictionPositionChange , m_effect_params[axis].frictionMaxPositionChange ), condition) * angle_ratio * m_gains[axis]. frictionGain ;
561
561
force = frictionFilter[axis].update (force);
562
562
break ;
563
563
case USB_EFFECT_CUSTOM:// 12
@@ -567,11 +567,21 @@ int32_t Joystick_::getEffectForce(volatile TEffectState& effect, EffectParams _e
567
567
return force;
568
568
}
569
569
570
-
571
570
void Joystick_::forceCalculator (int32_t * forces) {
572
571
forces[0 ] = 0 ;
573
572
forces[1 ] = 0 ;
574
- int32_t force = 0 ;
573
+
574
+ // If the device is in default auto spring effect lets calculate it
575
+ if (DynamicHID ().pidReportHandler .deviceState == MDEVICESTATE_SPRING)
576
+ {
577
+ for (int axis = 0 ; axis < FFB_AXIS_COUNT; ++axis)
578
+ {
579
+ forces[axis] = (int32_t )(NormalizeRange (m_effect_params[axis].springPosition , m_effect_params[axis].springMaxPosition ) * -10000 * m_gains[axis].defaultSpringGain ); // TODO
580
+ }
581
+ }
582
+ else
583
+ {
584
+
575
585
for (int id = 0 ; id < MAX_EFFECTS; id++) {
576
586
volatile TEffectState& effect = DynamicHID ().pidReportHandler .g_EffectStates [id];
577
587
@@ -591,7 +601,7 @@ void Joystick_::forceCalculator(int32_t* forces) {
591
601
(effect.elapsedTime >= 0 ) &&
592
602
// dont calculate effects that have already finished
593
603
(effect.elapsedTime <= effect.duration ) &&
594
- !DynamicHID ().pidReportHandler .devicePaused )
604
+ !DynamicHID ().pidReportHandler .deviceState )
595
605
{
596
606
// if this is a directional conditional calculate the conditional parameters
597
607
// as the length in the direction of its angle. This is the same as the dot product of the vectors
@@ -629,10 +639,11 @@ void Joystick_::forceCalculator(int32_t* forces) {
629
639
// Serial.println(effect.totalDuration);
630
640
// }
631
641
}
642
+ }
632
643
633
644
for (int axis = 0 ; axis < FFB_AXIS_COUNT; ++axis)
634
645
{
635
- forces[axis] = (int32_t )((float )totalGain * forces[axis]); // each effect gain * total effect gain = 10000
646
+ forces[axis] = (int32_t )((float )m_gains[axis]. totalGain * forces[axis]); // each effect gain * total effect gain = 10000
636
647
forces[axis] = constrain (forces[axis], -10000 , 10000 );
637
648
}
638
649
}
0 commit comments