calibx / msfsdeck

MSFS Plugin for LoupeDeck Live & CT
Apache License 2.0
48 stars 13 forks source link

NAV radio folder like COMs radio #186

Closed Romulas67 closed 1 year ago

Romulas67 commented 1 year ago

First up, great work calibx! I'll buy you a coffee.

Is it possible to code a NAV radio folder to match what has been done with the COMs radio folder?

calibx commented 1 year ago

Good idea !

calibx commented 1 year ago

Hi,

Ok after looking at the vars and event for NAV ... I don't see what to include vars : https://docs.flightsimulator.com/html/Programming_Tools/SimVars/Aircraft_SimVars/#nav and events : https://docs.flightsimulator.com/html/Programming_Tools/Event_IDs/#nav Do you have an idea of the layout for the nav folder ?

Romulas67 commented 1 year ago

Hello,

Pleasure to hear from you.

Not sure what variables or events you are currently using on your COM folder setup.

But I guess your using COM1_RADIO and COM2_RADIO variables and events and all you need to do is replace these with their counterpart NAV1_RADIO and NAV2_RADIO variables and events?

But in short.

I like your current setup and layout for the COMs Radio Stack folder (COM), with the COM1 and COM2 radio frequencies controlled by the four dials with the left and right dials changing the frequency for the standby frequency and pressing the active frequency switches between the Standby and Active frequencies (COM1_RADIO_SWAP and COM2_RADIO_SWAP?) for each on the COMs radio.

I would suggest maybe just copying this COM1 and COM2 layout and function to a NAV1 and NAV2 radio stack in its own folder called "NAV" with replacing COM1% (Note:COM% is an alias of COM1%) with NAV1% and COM2% with NAV2%? Does that make sense?

Bests Regards

Romulas67 commented 1 year ago

Something like this maybe?

namespace Loupedeck.MsfsPlugin.folder { using System; using System.Collections.Generic; using System.Globalization;

using Loupedeck.MsfsPlugin.tools;

public class ComDynamicFolder : PluginDynamicFolder, Notifiable
{
    protected readonly List<Binding> _bindings = new List<Binding>();
    public ComDynamicFolder()
    {
        this.DisplayName = "NAV";
        this.GroupName = "Folder";

        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_ACTIVE_FREQUENCY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_ACTIVE_FREQUENCY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_ACTIVE_FREQUENCY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_ACTIVE_FREQUENCY_TYPE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_ACTIVE_FREQUENCY_TYPE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_ACTIVE_FREQUENCY_TYPE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_STATUS)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_STATUS)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_STATUS)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_AVAILABLE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_AVAILABLE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_AVAILABLE)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_STBY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_STBY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_STBY)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV1_RADIO_SWAP)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV2_RADIO_SWAP)));
        this._bindings.Add(MsfsData.Instance.Register(new Binding(BindingKeys.NAV3_RADIO_SWAP)));

        MsfsData.Instance.Register(this);

    }

    public override PluginDynamicFolderNavigation GetNavigationArea(DeviceType _) => PluginDynamicFolderNavigation.None;
    public override IEnumerable<String> GetButtonPressActionNames(DeviceType deviceType)
    {
        return new[]
        {
            this.CreateCommandName("NAV1 Active Int"),
            this.CreateCommandName("NAV1 Active Float"),
            this.CreateCommandName("NAV1 Standby Int"),
            this.CreateCommandName("NAV1 Standby Float"),
            this.CreateCommandName("NAV2 Active Int"),
            this.CreateCommandName("NAV2 Active Float"),
            this.CreateCommandName("NAV2 Standby Int"),
            this.CreateCommandName("NAV2 Standby Float"),
            PluginDynamicFolder.NavigateUpActionName,
        };
    }
    public override IEnumerable<String> GetEncoderRotateActionNames(DeviceType deviceType)
    {
        return new[]
        {
            this.CreateAdjustmentName ("NAV1 Int Encoder"),
            this.CreateAdjustmentName ("NAV2 Int Encoder"),
            this.CreateAdjustmentName (""),
            this.CreateAdjustmentName ("NAV1 Float Encoder"),
            this.CreateAdjustmentName ("NAV2 Float Encoder"),
        };
    }

    public override IEnumerable<String> GetEncoderPressActionNames(DeviceType deviceType)
    {
        return new[]
        {
            this.CreateCommandName("NAV1 Int Reset"),
            this.CreateCommandName("NAV2 Int Reset"),
            this.CreateCommandName (""),
            this.CreateCommandName("NAV1 Float Reset"),
            this.CreateCommandName("NAV2 Float Reset"),
        };
    }
    public override String GetAdjustmentDisplayName(String actionParameter, PluginImageSize imageSize)
    {
        var ret = "";
        switch (actionParameter)
        {
            case "NAV1 Int Encoder":
                ret = "NAV1\n" + Math.Truncate(this._bindings[12].ControllerValue / 1000000f) + ".";
                break;
            case "NAV1 Float Encoder":
                var NAV1dbl = Math.Round(this._bindings[12].ControllerValue / 1000000f - Math.Truncate(this._bindings[12].ControllerValue / 1000000f), 3).ToString();
                ret = "NAV1\n" + (NAV1dbl.Length > 2 ? NAV1dbl.Substring(2) : NAV1dbl).PadRight(3, '0');
                break;
            case "NAV2 Int Encoder":
                ret = "NAV2\n" + Math.Truncate(this._bindings[13].ControllerValue / 1000000f) + ".";
                break;
            case "NAV2 Float Encoder":
                var NAV2dbl = Math.Round(this._bindings[13].ControllerValue / 1000000f - Math.Truncate(this._bindings[13].ControllerValue / 1000000f), 3).ToString();
                ret = "NAV2\n" + (NAV2dbl.Length > 2 ? NAV2dbl.Substring(2) : NAV2dbl).PadRight(3, '0');
                break;
        }
        return ret;
    }
    public override BitmapImage GetCommandImage(String actionParameter, PluginImageSize imageSize)
    {
        var bitmapBuilder = new BitmapBuilder(imageSize);
        switch (actionParameter)
        {
            case "NAV1 Active Int":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[9].MsfsValue));
                bitmapBuilder.DrawText((this._bindings[0].ControllerValue == 0 ? "0" : this._bindings[0].ControllerValue.ToString().Substring(0, 3)) + ".", new BitmapColor(0, 255, 0), 40);
                break;
            case "NAV1 Active Float":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[9].MsfsValue));
                bitmapBuilder.DrawText(this._bindings[0].ControllerValue == 0 ? "0" : this._bindings[0].ControllerValue.ToString().Substring(3, 3), new BitmapColor(0, 255, 0), 40);
                break;
            case "NAV1 Standby Int":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[9].MsfsValue));
                bitmapBuilder.DrawText((this._bindings[12].ControllerValue == 0 ? "0" : this._bindings[12].ControllerValue.ToString().Substring(0, 3)) + ".", new BitmapColor(255, 255, 0), 40);
                break;
            case "NAV1 Standby Float":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[9].MsfsValue));
                bitmapBuilder.DrawText(this._bindings[12].ControllerValue == 0 ? "0" : this._bindings[12].ControllerValue.ToString().Substring(3, 3), new BitmapColor(255, 255, 0), 40);
                break;
            case "NAV2 Active Int":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[10].MsfsValue));
                bitmapBuilder.DrawText((this._bindings[1].ControllerValue == 0 ? "0" : this._bindings[1].ControllerValue.ToString().Substring(0, 3)) + ".", new BitmapColor(0, 255, 0), 40);
                break;
            case "NAV2 Active Float":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[10].MsfsValue));
                bitmapBuilder.DrawText(this._bindings[1].ControllerValue == 0 ? "0" : this._bindings[1].ControllerValue.ToString().Substring(3, 3), new BitmapColor(0, 255, 0), 40);
                break;
            case "NAV2 Standby Int":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[10].MsfsValue));
                bitmapBuilder.DrawText((this._bindings[13].ControllerValue == 0 ? "0" : this._bindings[13].ControllerValue.ToString().Substring(0, 3)) + ".", new BitmapColor(255, 255, 0), 40);
                break;
            case "NAV2 Standby Float":
                bitmapBuilder.SetBackgroundImage(ImageTool.GetAvailableDisableImage(this._bindings[10].MsfsValue));
                bitmapBuilder.DrawText(this._bindings[13].ControllerValue == 0 ? "0" : this._bindings[13].ControllerValue.ToString().Substring(3, 3), new BitmapColor(255, 255, 0), 40);
                break;

        }
        return bitmapBuilder.ToImage();
    }

    public override void RunCommand(String actionParameter)
    {
        switch (actionParameter)
        {
            case "NAV1 Active":
            case "NAV1 Active Int":
            case "NAV1 Active Float":
            case "NAV1 Standby":
            case "NAV1 Standby Int":
            case "NAV1 Standby Float":
            case "NAV1 Int Reset":
            case "NAV1 Float Reset":
                this._bindings[15].SetControllerValue(1);
                break;
            case "NAV2 Active":
            case "NAV2 Active Int":
            case "NAV2 Active Float":
            case "NAV2 Standby":
            case "NAV2 Standby Int":
            case "NAV2 Standby Float":
            case "NAV2 Int Reset":
            case "NAV2 Float Reset":
                this._bindings[16].SetControllerValue(1);
                break;

        }
    }

    public override void ApplyAdjustment(String actionParameter, Int32 ticks)
    {
        switch (actionParameter)
        {
            case "NAV1 Int Encoder":
                var NAV1int = Int32.Parse(this._bindings[12].ControllerValue.ToString().Substring(0, 3));
                var NAV1dbl = Int32.Parse(this._bindings[12].ControllerValue.ToString().Substring(3, 3));
                var newInt = ConvertTool.ApplyAdjustment(NAV1int, ticks, 118, 136, 1, true);
                this._bindings[12].SetControllerValue(newInt * 1000000 + NAV1dbl * 1000);
                break;
            case "NAV1 Float Encoder":
                var NAV1dbl1 = Int32.Parse(this._bindings[12].ControllerValue.ToString().Substring(3, 3));
                var NAV1int1 = Int32.Parse(this._bindings[12].ControllerValue.ToString().Substring(0, 3));
                var newFloat = ConvertTool.ApplyAdjustment(NAV1dbl1, ticks, 0, 995, 5, true);
                this._bindings[12].SetControllerValue(NAV1int1 * 1000000 + newFloat * 1000);
                break;
            case "NAV2 Int Encoder":
                var NAV2int = Int32.Parse(this._bindings[13].ControllerValue.ToString().Substring(0, 3));
                var NAV2dbl = Int32.Parse(this._bindings[13].ControllerValue.ToString().Substring(3, 3));
                var newInt2 = ConvertTool.ApplyAdjustment(NAV2int, ticks, 118, 136, 1, true);
                this._bindings[13].SetControllerValue(newInt2 * 1000000 + NAV2dbl * 1000);
                break;
            case "NAV2 Float Encoder":
                var NAV2dbl2 = Int32.Parse(this._bindings[13].ControllerValue.ToString().Substring(3, 3));
                var NAV2int2 = Int32.Parse(this._bindings[13].ControllerValue.ToString().Substring(0, 3));
                var newFloat2 = ConvertTool.ApplyAdjustment(NAV2dbl2, ticks, 0, 995, 5, true);
                this._bindings[13].SetControllerValue(NAV2int2 * 1000000 + newFloat2 * 1000);
                break;

        }
        this.EncoderActionNamesChanged();
        this.ButtonActionNamesChanged();
    }
    public void Notify()
    {
        foreach (Binding binding in this._bindings)
        {
            if (binding.HasMSFSChanged())
            {
                binding.Reset();
            }
        }
    }
}

}

calibx commented 1 year ago

Will try !

calibx commented 1 year ago

Nav folder is ready for next release !

Romulas67 commented 1 year ago

Great news! And thanks in advance

On 15/12/2022, at 21:49, calibx @.***> wrote:

 Nav folder is ready for next release !

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.

Romulas67 commented 1 year ago

Tested and its working Great! Thanks again.