Skip to content

Commit e998c1b

Browse files
authored
Fix aircraft autopilot IVA engagement and target sync (#178)
1 parent 565eedf commit e998c1b

2 files changed

Lines changed: 174 additions & 17 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,4 @@ GameData/JSI/JSIAdvTransparentPods/Plugins/JSIAdvTransparentPods.dll
237237
/GameData/JSI/RasterPropMonitor/Plugins/RasterPropMonitor.pdb
238238
/GameData/JSI/RasterPropMonitor/RasterPropMonitor.version
239239
/packages/
240-
/Releases
240+
/Releases

MechJebRPM/MechJebRPM.cs

Lines changed: 173 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)