@@ -75,6 +75,7 @@ public class MechJebRPM : InternalModule
7575 private MechJebModuleLandingGuidance mjLandingGuidance = null ;
7676 private MechJebModuleWarpController mjWarpController = null ;
7777 private MechJebModuleStageStats mjStageStats = null ;
78+ private MechJebModuleAirplaneGuidance mjAirplaneGuidance = null ;
7879 private Vessel activeVessel = null ;
7980
8081 private TextMenu smartassOrbitalMenu ;
@@ -1593,50 +1594,204 @@ private void ClearRoverWaypoints()
15931594 #endregion
15941595
15951596 #region Aircraft Menu
1597+ private bool IsAircraftAutopilotEngaged ( )
1598+ {
1599+ return mjCore ? . Airplane ? . Users != null &&
1600+ mjAirplaneGuidance != null &&
1601+ mjCore . Airplane . Users . Contains ( mjAirplaneGuidance ) ;
1602+ }
1603+
1604+ private void SetAircraftAutopilotEngaged ( bool engaged )
1605+ {
1606+ if ( mjCore ? . Airplane ? . Users == null || mjAirplaneGuidance == null ) return ;
1607+
1608+ if ( engaged )
1609+ {
1610+ SyncAirplaneGuidanceTargetsToAutopilot ( ) ;
1611+ if ( ! mjCore . Airplane . Users . Contains ( mjAirplaneGuidance ) )
1612+ mjCore . Airplane . Users . Add ( mjAirplaneGuidance ) ;
1613+ }
1614+ else
1615+ {
1616+ if ( mjCore . Airplane . Users . Contains ( mjAirplaneGuidance ) )
1617+ mjCore . Airplane . Users . Remove ( mjAirplaneGuidance ) ;
1618+ }
1619+ }
1620+
1621+ private void SyncAirplaneGuidanceTargetsToAutopilot ( )
1622+ {
1623+ if ( mjCore ? . Airplane == null || mjAirplaneGuidance == null ) return ;
1624+
1625+ if ( mjAirplaneGuidance . AltitudeTargettmp != null )
1626+ mjCore . Airplane . AltitudeTarget = mjAirplaneGuidance . AltitudeTargettmp . Val ;
1627+ if ( mjAirplaneGuidance . VertSpeedTargettmp != null )
1628+ mjCore . Airplane . VertSpeedTarget = mjAirplaneGuidance . VertSpeedTargettmp . Val ;
1629+ if ( mjAirplaneGuidance . HeadingTargettmp != null )
1630+ mjCore . Airplane . HeadingTarget = mjAirplaneGuidance . HeadingTargettmp . Val ;
1631+ if ( mjAirplaneGuidance . RollTargettmp != null )
1632+ mjCore . Airplane . RollTarget = mjAirplaneGuidance . RollTargettmp . Val ;
1633+ if ( mjAirplaneGuidance . SpeedTargettmp != null )
1634+ mjCore . Airplane . SpeedTarget = mjAirplaneGuidance . SpeedTargettmp . Val ;
1635+ }
1636+
1637+ private double GetAircraftAltitudeTarget ( )
1638+ {
1639+ return mjAirplaneGuidance ? . AltitudeTargettmp ? . Val ?? mjCore ? . Airplane ? . AltitudeTarget ?? 0.0 ;
1640+ }
1641+
1642+ private void SetAircraftAltitudeTarget ( double value )
1643+ {
1644+ if ( mjAirplaneGuidance ? . AltitudeTargettmp != null )
1645+ mjAirplaneGuidance . AltitudeTargettmp . Val = value ;
1646+ if ( mjCore ? . Airplane != null )
1647+ mjCore . Airplane . AltitudeTarget = value ;
1648+ }
1649+
1650+ private double GetAircraftVertSpeedTarget ( )
1651+ {
1652+ return mjAirplaneGuidance ? . VertSpeedTargettmp ? . Val ?? mjCore ? . Airplane ? . VertSpeedTarget ?? 0.0 ;
1653+ }
1654+
1655+ private void SetAircraftVertSpeedTarget ( double value )
1656+ {
1657+ if ( mjAirplaneGuidance ? . VertSpeedTargettmp != null )
1658+ mjAirplaneGuidance . VertSpeedTargettmp . Val = value ;
1659+ if ( mjCore ? . Airplane != null )
1660+ mjCore . Airplane . VertSpeedTarget = value ;
1661+ }
1662+
1663+ private double GetAircraftHeadingTarget ( )
1664+ {
1665+ return mjAirplaneGuidance ? . HeadingTargettmp ? . Val ?? mjCore ? . Airplane ? . HeadingTarget ?? 0.0 ;
1666+ }
1667+
1668+ private void SetAircraftHeadingTarget ( double value )
1669+ {
1670+ if ( mjAirplaneGuidance ? . HeadingTargettmp != null )
1671+ mjAirplaneGuidance . HeadingTargettmp . Val = value ;
1672+ if ( mjCore ? . Airplane != null )
1673+ mjCore . Airplane . HeadingTarget = value ;
1674+ }
1675+
1676+ private double GetAircraftRollTarget ( )
1677+ {
1678+ return mjAirplaneGuidance ? . RollTargettmp ? . Val ?? mjCore ? . Airplane ? . RollTarget ?? 0.0 ;
1679+ }
1680+
1681+ private void SetAircraftRollTarget ( double value )
1682+ {
1683+ if ( mjAirplaneGuidance ? . RollTargettmp != null )
1684+ mjAirplaneGuidance . RollTargettmp . Val = value ;
1685+ if ( mjCore ? . Airplane != null )
1686+ mjCore . Airplane . RollTarget = value ;
1687+ }
1688+
1689+ private double GetAircraftSpeedTarget ( )
1690+ {
1691+ return mjAirplaneGuidance ? . SpeedTargettmp ? . Val ?? mjCore ? . Airplane ? . SpeedTarget ?? 0.0 ;
1692+ }
1693+
1694+ private void SetAircraftSpeedTarget ( double value )
1695+ {
1696+ if ( mjAirplaneGuidance ? . SpeedTargettmp != null )
1697+ mjAirplaneGuidance . SpeedTargettmp . Val = value ;
1698+ if ( mjCore ? . Airplane != null )
1699+ mjCore . Airplane . SpeedTarget = value ;
1700+ }
1701+
15961702 private TextMenu BuildAircraftMenu ( )
15971703 {
15981704 var menu = new TrackedTextMenu ( ) ;
15991705 menu . labelColor = JUtil . ColorToColorTag ( Color . white ) ;
16001706 menu . selectedColor = JUtil . ColorToColorTag ( Color . green ) ;
16011707 menu . disabledColor = JUtil . ColorToColorTag ( Color . gray ) ;
16021708
1709+ AddMenuItem ( menu ,
1710+ ( ) => IsAircraftAutopilotEngaged ( ) ? "Disengage Autopilot" : "Engage Autopilot" ,
1711+ ( ) => SetAircraftAutopilotEngaged ( ! IsAircraftAutopilotEngaged ( ) ) ) ;
1712+ AddMenuItem ( menu , "------" , null ) ;
1713+
16031714 AddMenuItem ( menu , "-- ALTITUDE --" , null ) ;
16041715 AddToggleItem ( menu , "Altitude Hold" ,
16051716 ( ) => mjCore . Airplane . AltitudeHoldEnabled ,
1606- ( val ) => { if ( val ) mjCore . Airplane . EnableAltitudeHold ( ) ; else mjCore . Airplane . DisableAltitudeHold ( ) ; } ) ;
1607- AddNumericItem ( menu , "Target Altitude" , mjCore . Airplane . AltitudeTarget ,
1717+ ( val ) =>
1718+ {
1719+ mjCore . Airplane . AltitudeHoldEnabled = val ;
1720+ if ( val )
1721+ {
1722+ SyncAirplaneGuidanceTargetsToAutopilot ( ) ;
1723+ mjCore . Airplane . EnableAltitudeHold ( ) ;
1724+ }
1725+ else
1726+ {
1727+ mjCore . Airplane . DisableAltitudeHold ( ) ;
1728+ }
1729+ } ) ;
1730+ AddNumericItem ( menu , "Target Altitude" , GetAircraftAltitudeTarget , SetAircraftAltitudeTarget ,
16081731 50.0 , v => v . ToString ( "F0" ) + " m" , null , true , 0 , false , 0 ) ;
16091732 AddToggleItem ( menu , "Vertical Speed Hold" ,
16101733 ( ) => mjCore . Airplane . VertSpeedHoldEnabled ,
1611- ( val ) => { if ( val ) mjCore . Airplane . EnableVertSpeedHold ( ) ; else mjCore . Airplane . DisableVertSpeedHold ( ) ; } ) ;
1612- AddNumericItem ( menu , "Target Vert Speed" , mjCore . Airplane . VertSpeedTarget ,
1734+ ( val ) =>
1735+ {
1736+ mjCore . Airplane . VertSpeedHoldEnabled = val ;
1737+ if ( val )
1738+ {
1739+ SyncAirplaneGuidanceTargetsToAutopilot ( ) ;
1740+ mjCore . Airplane . EnableVertSpeedHold ( ) ;
1741+ }
1742+ else
1743+ {
1744+ mjCore . Airplane . DisableVertSpeedHold ( ) ;
1745+ }
1746+ } ) ;
1747+ AddNumericItem ( menu , "Target Vert Speed" , GetAircraftVertSpeedTarget , SetAircraftVertSpeedTarget ,
16131748 1.0 , v => v . ToString ( "F1" ) + " m/s" , null , false , 0 , false , 0 ) ;
16141749
16151750 AddMenuItem ( menu , "------" , null ) ;
16161751
16171752 AddMenuItem ( menu , "-- HEADING --" , null ) ;
16181753 AddToggleItem ( menu , "Heading Hold" ,
16191754 ( ) => mjCore . Airplane . HeadingHoldEnabled ,
1620- ( val ) => { if ( val ) mjCore . Airplane . EnableHeadingHold ( ) ; else mjCore . Airplane . DisableHeadingHold ( ) ; } ) ;
1621- AddNumericItem ( menu , "Target Heading" ,
1622- ( ) => mjCore . Airplane . HeadingTarget ,
1623- ( val ) => mjCore . Airplane . HeadingTarget = val ,
1755+ ( val ) =>
1756+ {
1757+ mjCore . Airplane . HeadingHoldEnabled = val ;
1758+ if ( val )
1759+ {
1760+ SyncAirplaneGuidanceTargetsToAutopilot ( ) ;
1761+ mjCore . Airplane . EnableHeadingHold ( ) ;
1762+ }
1763+ else
1764+ {
1765+ mjCore . Airplane . DisableHeadingHold ( ) ;
1766+ }
1767+ } ) ;
1768+ AddNumericItem ( menu , "Target Heading" , GetAircraftHeadingTarget , SetAircraftHeadingTarget ,
16241769 1.0 , v => v . ToString ( "F1" ) + "°" , null , true , 0 , true , 360 ) ;
1625- AddToggleItem ( menu , "Roll Hold" , mjCore . Airplane , MechJebProxy . f_Airplane_RollHold ) ;
1626- AddNumericItem ( menu , "Target Roll" ,
1627- ( ) => mjCore . Airplane . RollTarget ,
1628- ( val ) => mjCore . Airplane . RollTarget = val ,
1770+ AddToggleItem ( menu , "Roll Hold" ,
1771+ ( ) => mjCore . Airplane . RollHoldEnabled ,
1772+ ( val ) => { if ( val ) { SyncAirplaneGuidanceTargetsToAutopilot ( ) ; mjCore . Airplane . RollHoldEnabled = true ; } else mjCore . Airplane . RollHoldEnabled = false ; } ) ;
1773+ AddNumericItem ( menu , "Target Roll" , GetAircraftRollTarget , SetAircraftRollTarget ,
16291774 1.0 , v => v . ToString ( "F1" ) + "°" , null , true , - 180 , true , 180 ) ;
16301775
16311776 AddMenuItem ( menu , "------" , null ) ;
16321777
16331778 AddMenuItem ( menu , "-- SPEED --" , null ) ;
16341779 AddToggleItem ( menu , "Speed Hold" ,
16351780 ( ) => mjCore . Airplane . SpeedHoldEnabled ,
1636- ( val ) => { if ( val ) mjCore . Airplane . EnableSpeedHold ( ) ; else mjCore . Airplane . DisableSpeedHold ( ) ; } ) ;
1637- AddNumericItem ( menu , "Target Speed" ,
1638- ( ) => mjCore . Airplane . SpeedTarget ,
1639- ( val ) => mjCore . Airplane . SpeedTarget = val ,
1781+ ( val ) =>
1782+ {
1783+ mjCore . Airplane . SpeedHoldEnabled = val ;
1784+ if ( val )
1785+ {
1786+ SyncAirplaneGuidanceTargetsToAutopilot ( ) ;
1787+ mjCore . Airplane . EnableSpeedHold ( ) ;
1788+ }
1789+ else
1790+ {
1791+ mjCore . Airplane . DisableSpeedHold ( ) ;
1792+ }
1793+ } ) ;
1794+ AddNumericItem ( menu , "Target Speed" , GetAircraftSpeedTarget , SetAircraftSpeedTarget ,
16401795 1.0 , v => v . ToString ( "F1" ) + " m/s" , null , true , 0 , false , 0 ) ;
16411796
16421797 AddMenuItem ( menu , "[BACK]" , ( ) => PopMenu ( ) ) ;
@@ -2027,6 +2182,7 @@ public void Update()
20272182 mjLandingGuidance = null ;
20282183 mjWarpController = null ;
20292184 mjStageStats = null ;
2185+ mjAirplaneGuidance = null ;
20302186
20312187 activeVessel = vessel ;
20322188 mjCore = vessel . GetMasterMechJeb ( ) ;
@@ -2041,6 +2197,7 @@ public void Update()
20412197 mjLandingGuidance = mjCore . GetComputerModule < MechJebModuleLandingGuidance > ( ) ;
20422198 mjWarpController = mjCore . GetComputerModule < MechJebModuleWarpController > ( ) ;
20432199 mjStageStats = mjCore . GetComputerModule < MechJebModuleStageStats > ( ) ;
2200+ mjAirplaneGuidance = mjCore . GetComputerModule < MechJebModuleAirplaneGuidance > ( ) ;
20442201 }
20452202 }
20462203
0 commit comments