@@ -16,6 +16,7 @@ internal class WheelSteeringManager : IFlightControlParameter
1616
1717 public bool Enabled { get ; private set ; }
1818 public float Value { get ; set ; }
19+ public PIDLoop SteeringPID = new PIDLoop ( 0.03 , 0 , 0 ) ;
1920
2021 public bool FightsWithSas { get { return false ; } }
2122
@@ -90,26 +91,26 @@ Vessel IFlightControlParameter.GetResponsibleVessel()
9091
9192 object IFlightControlParameter . GetValue ( )
9293 {
93- if ( Enabled )
94- {
95- return Value ;
96- }
97- return internalVessel . ctrlState . mainThrottle ;
94+ return Value ;
9895 }
9996
10097 void IFlightControlParameter . UpdateAutopilot ( FlightCtrlState c , ControlTypes ctrlLock )
10198 {
10299 if ( ! Enabled ) return ;
103100
104101 if ( ! ( controlShared . Vessel . horizontalSrfSpeed > 0.1f ) ) return ;
102+
103+ float vesselHeading = VesselUtils . GetHeading ( controlShared . Vessel ) ;
104+ float bearing = VesselUtils . AngleDelta ( vesselHeading , Value ) ;
105+ float PIDOutput = SteeringPID . Update ( controlShared . UpdateHandler . CurrentFixedTime , bearing ) ;
105106
106- if ( Mathf . Abs ( VesselUtils . AngleDelta ( VesselUtils . GetHeading ( controlShared . Vessel ) , VesselUtils . GetVelocityHeading ( controlShared . Vessel ) ) ) <= 90 )
107+ if ( Mathf . Abs ( VesselUtils . AngleDelta ( vesselHeading , VesselUtils . GetVelocityHeading ( controlShared . Vessel ) ) ) <= 90 )
107108 {
108- c . wheelSteer = Mathf . Clamp ( Value / - 10 , - 1 , 1 ) ;
109+ c . wheelSteer = Mathf . Clamp ( PIDOutput , - 1 , 1 ) ;
109110 }
110111 else
111112 {
112- c . wheelSteer = - Mathf . Clamp ( Value / - 10 , - 1 , 1 ) ;
113+ c . wheelSteer = - Mathf . Clamp ( PIDOutput , - 1 , 1 ) ;
113114 }
114115 }
115116
@@ -123,29 +124,21 @@ void IFlightControlParameter.UpdateValue(object value, SharedObjects shared)
123124 if ( ! Enabled )
124125 ( ( IFlightControlParameter ) this ) . EnableControl ( shared ) ;
125126
126- float bearing = 0 ;
127-
128- if ( value is VesselTarget )
127+ if ( value is VesselTarget vessel )
129128 {
130- bearing = VesselUtils . GetTargetBearing ( controlShared . Vessel , ( ( VesselTarget ) value ) . Vessel ) ;
129+ Value = VesselUtils . GetTargetHeading ( controlShared . Vessel , vessel . Vessel ) ;
131130 }
132- else if ( value is GeoCoordinates )
131+ else if ( value is GeoCoordinates gc )
133132 {
134- bearing = ( ( GeoCoordinates ) value ) . GetBearing ( ) ;
133+ Value = gc . GetHeading ( ) ;
135134 }
136135 else
137136 {
138137 try
139138 {
140- double doubleValue = Convert . ToDouble ( value ) ;
141- if ( Utils . IsValidNumber ( doubleValue ) )
142- {
143- bearing = ( float ) ( Math . Round ( doubleValue ) - Mathf . Round ( FlightGlobals . ship_heading ) ) ;
144- if ( bearing < - 180 )
145- bearing += 360 ; // i.e. 359 degrees to the left is really 1 degree to the right.
146- else if ( bearing > 180 )
147- bearing -= 360 ; // i.e. 359 degrees to the right is really 1 degree to the left
148- }
139+ float heading = Convert . ToSingle ( value ) ;
140+ if ( ! float . IsInfinity ( heading ) && ! float . IsNaN ( heading ) )
141+ Value = heading ;
149142 }
150143 catch
151144 {
@@ -157,11 +150,10 @@ void IFlightControlParameter.UpdateValue(object value, SharedObjects shared)
157150 KOSNomenclature . GetKOSName ( typeof ( VesselTarget ) ) ,
158151 KOSNomenclature . GetKOSName ( typeof ( GeoCoordinates ) ) ,
159152 KOSNomenclature . GetKOSName ( typeof ( ScalarValue ) )
160- )
161- ) ;
153+ )
154+ ) ;
162155 }
163156 }
164- Value = bearing ;
165157 }
166158 }
167159}
0 commit comments