internal void OnAltidudeDataSampled(int id) { if (_mcp.AltitudeHold) { var altitudeDelta = _mcp.ALT - Timeline.AltitudeAvg; var mult = 10; if (SystemManager.Instance.Nav.IsOnGlidePath) { mult = 6; } _mcp.VS = Math2.Clamp(altitudeDelta / mult, -15, 20); Timeline.Data[id].Altitude.SetpointValue = _mcp.ALT; } }
internal void OnRollDataSampled(int id) { if (double.IsNaN(Timeline.Heading)) { return; } if (_mcp.BankHold | _mcp.HeadingHold | _mcp.LNAV) { if (!double.IsNaN(Timeline.Data[id].Roll.Value)) { if (_mcp.HeadingHold | _mcp.LNAV) { var rollDelta = Math2.DiffAngles(Timeline.Heading, _mcp.HDG) * 0.7; var rollMax = 25; if (Math.Abs(rollDelta) > 5) { // if (SystemManager.Instance.Nav.IsOnGlidePath90) rollMax = 0; var newRoll = Math2.Clamp(-1 * rollDelta, -1 * rollMax, rollMax); _mcp.Bank += (_mcp.Bank > newRoll) ? -.15 : .15; if (Timeline.Altitude < 800) { _mcp.Bank = 0; } } else { _mcp.Bank = 0; } } var rollValue = Timeline.LatestAvg(3, f => f.Roll.Value, id); var output = _rollPid.Compute( rollValue, _mcp.Bank, GetTimeBetweenThisFrameAndLastGoodFrame(id, (f) => f.Roll.Value)); _control.Set(XINPUT_GAMEPAD_AXIS.LEFT_THUMB_X, (int)RemoveDeadZone(output, 8500, 9500)); Timeline.Data[id].Roll.OutputValue = output; } Timeline.Data[id].Roll.SetpointValue = _mcp.Bank; } }