From 289b96edc00f1e28d50ac7684cb2468fce3e0aa9 Mon Sep 17 00:00:00 2001 From: Falco Date: Thu, 16 May 2024 19:06:22 +0200 Subject: [PATCH] - ah64 auto seat detection - ah64 guard receiver option - lua: read display - lua: get param --- .../CoordinateConverter.csproj | 1 + CoordinateConverter/DCS/Aircraft/AH64/AH64.cs | 102 ++++++++++--- .../DCS/Aircraft/AH64/AH64DTCData.cs | 63 +++++++- .../DCS/Communication/CoordinateConverter.lua | 82 ++++++++++ .../DCS/Communication/DCSMessage.cs | 35 +++++ .../DCS/Tools/FormAH64DTC.Designer.cs | 26 ++++ CoordinateConverter/DCS/Tools/FormAH64DTC.cs | 16 ++ .../DCS/Tools/FormAH64DTC.resx | 140 +++++++++--------- CoordinateConverter/MainForm.Designer.cs | 52 +++---- CoordinateConverter/MainForm.cs | 21 +-- CoordinateConverter/todo.txt | 12 ++ Installer/Installer.wixproj | 4 +- 12 files changed, 417 insertions(+), 137 deletions(-) diff --git a/CoordinateConverter/CoordinateConverter.csproj b/CoordinateConverter/CoordinateConverter.csproj index b091926..22f9e7b 100644 --- a/CoordinateConverter/CoordinateConverter.csproj +++ b/CoordinateConverter/CoordinateConverter.csproj @@ -156,6 +156,7 @@ FormAH64DTC.cs + Designer FormAH64PointDeleter.cs diff --git a/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs b/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs index 7faad9c..d4a43bf 100644 --- a/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs +++ b/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs @@ -11,21 +11,42 @@ namespace CoordinateConverter.DCS.Aircraft.AH64 /// public class AH64 : DCSAircraft { + private bool? isPilot = null; + /// /// Gets or sets a value indicating whether the user is in the pilot or CPG seat. /// /// /// true if this instance is pilot; otherwise, false. /// - public bool IsPilot { get; private set; } + public bool? IsPilot { + get + { + DCSMessage message = new DCSMessage() + { + GetHandleData = new List() + { + "SEAT" + }, + }; + message = DCSConnection.SendRequest(message); + if (message != null && message.HandleData.ContainsKey("SEAT")) + { + isPilot = message.HandleData["SEAT"] == "0"; + } + + return isPilot; + } private set + { + isPilot = value; + } + } /// /// Initializes a new instance of the class. /// - /// if set to true [is pilot]. - public AH64(bool isPilot) + public AH64() { - IsPilot = isPilot; } /// @@ -80,6 +101,42 @@ public enum EDeviceCode } + /// + /// Display codes. + /// + public enum EDisplayCodes + { + #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + PLT_EUFD = 17, + PLT_HMD = 21, + PLT_MFD_Left = 6, + PLT_MFD_Right = 8, + PLT_CMWS = 24, + CPG_MFD_Left = 10, + CPG_MFD_Right = 12, + CPG_EUFD = 18, + #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + + } + + /// + /// Display characters with special meanings + /// + public enum EDisplaySpecialChars + { + #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + IDM_Both = '~', + IDM_Own = '[', + IDM_Other = ']', + RTS_Own = '<', + RTS_Other = '>', + RTS_None = '=', + Squelch = '*', + MFD_Circle_Off = '}', + MFD_Circle_On = '{', + #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + } + /// /// Key codes /// @@ -442,34 +499,36 @@ protected override List GetActions(object item) throw new ArgumentException("Bad Point Type"); } } + bool plt = IsPilot ?? true; + int mfd = (int)(plt ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD); // DebugCommandList commands = new DebugCommandList List commands = new List { // press ADD - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_L2), + new DCSCommand(mfd, (int)EKeyCode.MFD_L2), // press the waypoint type button - extraData == null ? null : new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)keyMFDPointType), + extraData == null ? null : new DCSCommand(mfd, (int)keyMFDPointType), // press ident - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_L1) + new DCSCommand(mfd, (int)EKeyCode.MFD_L1) }; // enter ident - commands.AddRange(GetCommandsForKUText(ident, false, IsPilot)); + commands.AddRange(GetCommandsForKUText(ident, false, plt)); // enter free text (max 3 chars) - commands.AddRange(GetCommandsForKUText((coordinate.Name.Length <= 3 ? coordinate.Name : coordinate.Name.Substring(0, 3)) + '\n', false, IsPilot)); + commands.AddRange(GetCommandsForKUText((coordinate.Name.Length <= 3 ? coordinate.Name : coordinate.Name.Substring(0, 3)) + '\n', false, plt)); // enter MGRS coordinates // remove spaces and append enter string mgrsString = string.Join(string.Empty ,coordinate.GetCoordinateStrMGRS(4).Where(ch => ch != ' ')) + '\n'; - commands.AddRange(GetCommandsForKUText(mgrsString, true, IsPilot)); + commands.AddRange(GetCommandsForKUText(mgrsString, true, plt)); // enter altitude if (coordinate.AltitudeInFt == 0 && coordinate.AltitudeIsAGL) { - commands.AddRange(GetCommandsForKUText("\n", false, IsPilot)); + commands.AddRange(GetCommandsForKUText("\n", false, plt)); } else { - commands.AddRange(GetCommandsForKUText(((int)Math.Round(coordinate.GetAltitudeValue(true))).ToString() + "\n", true, IsPilot)); + commands.AddRange(GetCommandsForKUText(((int)Math.Round(coordinate.GetAltitudeValue(true))).ToString() + "\n", true, plt)); } return commands; } @@ -520,6 +579,7 @@ public static bool GetIsValidTextForKU(string text, uint minLength = 1, uint max /// The list of commands that is required to enter the text into the KU public static List GetCommandsForKUText(string text, bool clearFirst, bool IsPilot) { + int ku = (int)(IsPilot ? EDeviceCode.PLT_KU : EDeviceCode.CPG_KU); List commands = new List(); // DebugCommandList commands = new DebugCommandList(); if (text == null) @@ -529,7 +589,7 @@ public static List GetCommandsForKUText(string text, bool clearFirst if (clearFirst) { - commands.Add(new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_KU : EDeviceCode.CPG_KU), (int)EKeyCode.KU_CLR)); + commands.Add(new DCSCommand(ku, (int)EKeyCode.KU_CLR)); } // type the text EKeyCode? prevKeyCode = null; @@ -578,7 +638,7 @@ public static List GetCommandsForKUText(string text, bool clearFirst { commands.Last().Delay = 250; } - commands.Add(new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_KU : EDeviceCode.CPG_KU), (int)keyCode.Value)); + commands.Add(new DCSCommand(ku, (int)keyCode.Value)); prevKeyCode = keyCode; } } @@ -596,7 +656,7 @@ protected override List GetPostActions() return new List() { // press TSD to reset the screen - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_TSD) + new DCSCommand((int)((IsPilot ?? true) ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_TSD) }; } @@ -608,14 +668,15 @@ protected override List GetPostActions() /// protected override List GetPreActions() { + bool plt = IsPilot ?? true; return new List { // press TSD - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_TSD), + new DCSCommand((int)(plt ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_TSD), // go to point page - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_B6), + new DCSCommand((int)(plt ? EDeviceCode.PLT_RMFD : EDeviceCode.CPG_RMFD), (int)EKeyCode.MFD_B6), // clear KU - new DCSCommand((int)(IsPilot ? EDeviceCode.PLT_KU : EDeviceCode.CPG_KU), (int)EKeyCode.KU_CLR), + new DCSCommand((int)(plt ? EDeviceCode.PLT_KU : EDeviceCode.CPG_KU), (int)EKeyCode.KU_CLR), }; } @@ -662,14 +723,15 @@ public override List GetPointOptionsForType(string pointTypeStr) public int ClearPoints(EPointType pointType, int startIdx, int endIdx) { List commands = new List(); - int deviceId = IsPilot ? (int)EDeviceCode.PLT_RMFD : (int)EDeviceCode.CPG_RMFD; + bool plt = IsPilot ?? true; + int deviceId = plt ? (int)EDeviceCode.PLT_RMFD : (int)EDeviceCode.CPG_RMFD; for (int pointIdx = startIdx; pointIdx <= endIdx ; pointIdx++) { commands.Add(new DCSCommand(deviceId, (int)EKeyCode.MFD_TSD)); // Reset to TSD after every point, to avoid weirdness. commands.Add(new DCSCommand(deviceId, (int)EKeyCode.MFD_B6)); // Point commands.Add(new DCSCommand(deviceId, (int)EKeyCode.MFD_L1)); // Point > - commands.AddRange(GetCommandsForKUText(pointType.ToString().First() + pointIdx.ToString() + "\n", true, IsPilot)); // Enter point identifier + commands.AddRange(GetCommandsForKUText(pointType.ToString().First() + pointIdx.ToString() + "\n", true, plt)); // Enter point identifier commands.Add(new DCSCommand(deviceId, (int)EKeyCode.MFD_L4)); // Del commands.Add(new DCSCommand(deviceId, (int)EKeyCode.MFD_L3)); // Yes } diff --git a/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs b/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs index 580cea0..cd7f20f 100644 --- a/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs +++ b/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using CoordinateConverter.DCS.Communication; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -180,7 +181,8 @@ public bool ContainsTuningData || UHFTuneSetting != ETuneSetting.No_Change || FM1TuneSetting != ETuneSetting.No_Change || FM2TuneSetting != ETuneSetting.No_Change - || HFTuneSetting != ETuneSetting.No_Change; + || HFTuneSetting != ETuneSetting.No_Change + || UHFGuardReceiver != EUHFGuardReceiver.No_Change; } } @@ -247,6 +249,33 @@ public decimal VHFManualFrequency /// The uhf tune setting. /// public ETuneSetting UHFTuneSetting { get; set; } = ETuneSetting.No_Change; + + /// + /// Whether the UHF Guard receiver is on or off + /// + public enum EUHFGuardReceiver + { + /// + /// Guard receiver stays in current configuration + /// + No_Change, + /// + /// Guard receiver is disabled + /// + Off, + /// + /// Guard receivr is enabled + /// + On, + } + /// + /// Gets or sets the guard receiver option for the UHF radio + /// + /// + /// The guard receiver setting + /// + public EUHFGuardReceiver UHFGuardReceiver { get; set; } = EUHFGuardReceiver.No_Change; + /// /// Gets or sets the uhf tune preset. /// @@ -984,7 +1013,35 @@ protected override List GetActions(object item) if (ContainsTuningData) { commands.Add(new DCSCommand(DeviceRMFD, (int)AH64.EKeyCode.MFD_COM)); - // Presets first + // UHF Guard receiver + if (UHFGuardReceiver != EUHFGuardReceiver.No_Change) + { + // get current status and press the button if not the correct one + int display = (int)(IsPilot ? AH64.EDisplayCodes.PLT_EUFD : AH64.EDisplayCodes.CPG_EUFD); + DCSMessage message = new DCSMessage() + { + GetCockpitDisplayData = new List() { display } + }; + message = DCSConnection.SendRequest(message); + if (message != null && message.CockpitDisplayData.ContainsKey(display)) + { + Dictionary displayData = message.CockpitDisplayData[display]; + if (displayData.ContainsKey("Guard")) + { + string guardStr = displayData["Guard"]; + bool currentGuardStatus = !string.IsNullOrEmpty(guardStr); + + if (currentGuardStatus ^ (UHFGuardReceiver == EUHFGuardReceiver.On)) + { + // need to press the buttons, currently on COM page + commands.Add(new DCSCommand(DeviceRMFD, (int)AH64.EKeyCode.MFD_T4)); // UHF + commands.Add(new DCSCommand(DeviceRMFD, (int)AH64.EKeyCode.MFD_L6)); // GUARD + commands.Add(new DCSCommand(DeviceRMFD, (int)AH64.EKeyCode.MFD_COM)); // Reset to com page + } + } + } + } + // Presets int presetKey = -1; if (VHFTuneSetting == ETuneSetting.Preset) { diff --git a/CoordinateConverter/DCS/Communication/CoordinateConverter.lua b/CoordinateConverter/DCS/Communication/CoordinateConverter.lua index b80f84e..a0a80cf 100644 --- a/CoordinateConverter/DCS/Communication/CoordinateConverter.lua +++ b/CoordinateConverter/DCS/Communication/CoordinateConverter.lua @@ -1,6 +1,14 @@ -- REF: https://wiki.hoggitworld.com/view/DCS_export -- REF: https://wiki.hoggitworld.com/view/DCS_Export_Script +--[[ + +show_param_handles_list() to show all cockpit parameters in an interactive windows in DCS +get_param_handle("NAME") to get a handle for that parameter. use :get() to get the value + for example get_param_handle("SEAT"):get() -- 0 = PLT, 1 = CPG + +]]-- + local LOG_MODNAME = "COORDINATECONVERTER" local DEBUGGING = false -- if true logs all the things local TESTING = false -- if true sends all available data, even unrequested @@ -19,6 +27,29 @@ local upstreamLuaExportStop = LuaExportStop local upstreamLuaExportAfterNextFrame = LuaExportAfterNextFrame local upstreamLuaExportBeforeNextFrame = LuaExportBeforeNextFrame +-- function to list content of an MFD or other cockpit display +-- from https://github.com/ciribob/DCS-SimpleRadioStandalone/blob/5542bf796ff7ba54c9641b4e222f610e6cfec53b/Scripts/DCS-SRS/Scripts/DCS-SimpleRadioStandalone.lua#L3400 +function getListIndicatorValue(IndicatorID) + local ListIindicator = list_indication(IndicatorID) + local TmpReturn = {} + + if ListIindicator == "" then + return nil + end + + local ListindicatorMatch = ListIindicator:gmatch("-----------------------------------------\n([^\n]+)\n([^\n]*)\n") + while true do + local Key, Value = ListindicatorMatch() + if not Key then + break + end + TmpReturn[Key] = Value + end + + return TmpReturn +end + + function LuaExportStop() if upstreamLuaExportStop ~= nil then successful, err = pcall(upstreamLuaExportStop) @@ -193,6 +224,57 @@ function LuaExportAfterNextFrame() end end + -- handle get_handle request + if data["GetHandleData"] or TESTING then + if data["GetHandleData"] then + local f = function() + if DEBUGGING then + log.write(LOG_MODNAME, log.INFO, "Getting handle data") + end + + response["HandleData"] = {} + + for _, handleName in pairs(data["GetHandleData"]) do + local handle = get_param_handle(handleName) + if handle then + local data = handle:get() + response["HandleData"][handleName] = tostring(data) + end + end + end + + success, errMsg = pcall(f) + if not success then + log.write(LOG_MODNAME, log.ERROR, "Failure to get handle data: " .. tostring(errMsg)) + response["ErrorList"][#response["ErrorList"] + 1] = tostring(errMsg) + end + end + end + + if data["GetCockpitDisplayData"] or TESTING then + local f = function() + if DEBUGGING then + log.write(LOG_MODNAME, log.INFO, "Getting cockpit display data") + end + + response["CockpitDisplayData"] = {} + + -- loop over 0 to 100 and call getListIndicatorValue + for _, displayIndex in ipairs(data["GetCockpitDisplayData"]) do + local data = getListIndicatorValue(displayIndex) + if data then + response["CockpitDisplayData"][tostring(displayIndex)] = data + end + end + end + + success, errMsg = pcall(f) + if not success then + log.write(LOG_MODNAME, log.ERROR, "Failure to get cockpit display data: " .. tostring(errMsg)) + response["ErrorList"][#response["ErrorList"] + 1] = tostring(errMsg) + end + end + -- handle camera position request if data["FetchCameraPosition"] or TESTING then local f = function() diff --git a/CoordinateConverter/DCS/Communication/DCSMessage.cs b/CoordinateConverter/DCS/Communication/DCSMessage.cs index fb60b1a..5c6cddf 100644 --- a/CoordinateConverter/DCS/Communication/DCSMessage.cs +++ b/CoordinateConverter/DCS/Communication/DCSMessage.cs @@ -43,6 +43,41 @@ public class DCSMessage [JsonProperty("Model")] public string AircraftType = null; + /// + /// Gets or sets the get handle request. + /// + /// + /// A list of handle names for which to get the data. + /// + [JsonProperty("GetHandleData")] + public List GetHandleData { get; set; } = null; + + /// + /// Gets or sets the handle data. + /// + /// + /// The handle data returned by the server. + /// + [JsonProperty("HandleData")] + public Dictionary HandleData { get; set; } = null; + + /// + /// Gets or sets whether to fetch cockpit display data. + /// + /// + /// Whether cockpit display data is to be gotten + /// + [JsonProperty("GetCockpitDisplayData")] + public List GetCockpitDisplayData { get; set; } = null; + /// + /// Gets or sets the cockpit display data. + /// + /// + /// The cockpit display data returned by the server. + /// + [JsonProperty("CockpitDisplayData")] + public Dictionary> CockpitDisplayData { get; set; } = null; + /// /// Ground elevation requests for lat/long and their responses /// diff --git a/CoordinateConverter/DCS/Tools/FormAH64DTC.Designer.cs b/CoordinateConverter/DCS/Tools/FormAH64DTC.Designer.cs index 5ce99f3..a4f7d26 100644 --- a/CoordinateConverter/DCS/Tools/FormAH64DTC.Designer.cs +++ b/CoordinateConverter/DCS/Tools/FormAH64DTC.Designer.cs @@ -240,6 +240,8 @@ private void InitializeComponent() this.btnSave = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.btnReset = new System.Windows.Forms.ToolStripButton(); + this.ddlTuneUHFGuardReciever = new System.Windows.Forms.ComboBox(); + this.label72 = new System.Windows.Forms.Label(); this.tabControl1.SuspendLayout(); this.tabRadio.SuspendLayout(); this.tabControl2.SuspendLayout(); @@ -1382,6 +1384,8 @@ private void InitializeComponent() // // tabTune // + this.tabTune.Controls.Add(this.label72); + this.tabTune.Controls.Add(this.ddlTuneUHFGuardReciever); this.tabTune.Controls.Add(this.groupBox10); this.tabTune.Controls.Add(this.groupBox9); this.tabTune.Controls.Add(this.groupBox8); @@ -2976,6 +2980,25 @@ private void InitializeComponent() this.btnReset.Text = "Reset"; this.btnReset.Click += new System.EventHandler(this.btnReset_Click); // + // ddlTuneUHFGuardReciever + // + this.ddlTuneUHFGuardReciever.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ddlTuneUHFGuardReciever.FormattingEnabled = true; + this.ddlTuneUHFGuardReciever.Location = new System.Drawing.Point(76, 286); + this.ddlTuneUHFGuardReciever.Name = "ddlTuneUHFGuardReciever"; + this.ddlTuneUHFGuardReciever.Size = new System.Drawing.Size(121, 22); + this.ddlTuneUHFGuardReciever.TabIndex = 16; + this.ddlTuneUHFGuardReciever.SelectedIndexChanged += new System.EventHandler(this.ddlTuneUHFGuardReciever_SelectedIndexChanged); + // + // label72 + // + this.label72.AutoSize = true; + this.label72.Location = new System.Drawing.Point(9, 289); + this.label72.Name = "label72"; + this.label72.Size = new System.Drawing.Size(61, 13); + this.label72.TabIndex = 17; + this.label72.Text = "UHF Guard"; + // // FormAH64DTC // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -3030,6 +3053,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit(); this.splitContainer3.ResumeLayout(false); this.tabTune.ResumeLayout(false); + this.tabTune.PerformLayout(); this.groupBox10.ResumeLayout(false); this.groupBox10.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.nudTuneHFRXManualFreq)).EndInit(); @@ -3283,5 +3307,7 @@ private void InitializeComponent() private System.Windows.Forms.NumericUpDown nudTuneFM2ManualFreq; private System.Windows.Forms.NumericUpDown nudTuneFM1ManualFreq; private System.Windows.Forms.NumericUpDown nudTuneHFRXManualFreq; + private System.Windows.Forms.ComboBox ddlTuneUHFGuardReciever; + private System.Windows.Forms.Label label72; } } \ No newline at end of file diff --git a/CoordinateConverter/DCS/Tools/FormAH64DTC.cs b/CoordinateConverter/DCS/Tools/FormAH64DTC.cs index 74e0275..64930dd 100644 --- a/CoordinateConverter/DCS/Tools/FormAH64DTC.cs +++ b/CoordinateConverter/DCS/Tools/FormAH64DTC.cs @@ -159,6 +159,15 @@ public FormAH64DTC(bool isPilot) ddlPresetModemBaudRate.Items.Add(item); } + ddlTuneUHFGuardReciever.ValueMember = "Value"; + ddlTuneUHFGuardReciever.DisplayMember = "Text"; + foreach (AH64DTCData.EUHFGuardReceiver guardReceiver in Enum.GetValues(typeof(AH64DTCData.EUHFGuardReceiver))) + { + string text = Enum.GetName(typeof(AH64DTCData.EUHFGuardReceiver), guardReceiver); + ComboItem item = new ComboItem(text, guardReceiver); + ddlTuneUHFGuardReciever.Items.Add(item); + } + // XPNDR ddlXPNDRMode4Key.ValueMember = "Value"; @@ -421,6 +430,8 @@ private void RefreshControls() rbTuneUHFNoChange.Checked = data.UHFTuneSetting == AH64DTCData.ETuneSetting.No_Change; rbTuneUHFPreset.Checked = data.UHFTuneSetting == AH64DTCData.ETuneSetting.Preset; rbTuneUHFMan.Checked = data.UHFTuneSetting == AH64DTCData.ETuneSetting.Manual; + + ddlTuneUHFGuardReciever.SelectedIndex = ComboItem.FindValue(ddlTuneUHFGuardReciever, data.UHFGuardReceiver) ?? 0; // FM1 nudTuneFM1ManualFreq.Value = data.FM1ManualFrequency; ddlTuneFM1Preset.SelectedIndex = ComboItem.FindValue(ddlTuneFM1Preset, data.FM1TunePreset) ?? 0; @@ -1256,6 +1267,11 @@ private void nudTuneUHFManualFreq_ValueChanged(object sender, EventArgs e) { data.UHFManualFrequency = nudTuneUHFManualFreq.Value; } + + private void ddlTuneUHFGuardReciever_SelectedIndexChanged(object sender, EventArgs e) + { + data.UHFGuardReceiver = ComboItem.GetSelectedValue(ddlTuneUHFGuardReciever); + } #endregion #region TuneFM1 diff --git a/CoordinateConverter/DCS/Tools/FormAH64DTC.resx b/CoordinateConverter/DCS/Tools/FormAH64DTC.resx index 8bfcf80..e6e3808 100644 --- a/CoordinateConverter/DCS/Tools/FormAH64DTC.resx +++ b/CoordinateConverter/DCS/Tools/FormAH64DTC.resx @@ -120,6 +120,12 @@ True + + True + + + True + True @@ -214,73 +220,73 @@ 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 - AA2uijm4svh6AAAAAElFTkSuQmCC + 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 + C4o0bmQsQQAAAABJRU5ErkJggg== diff --git a/CoordinateConverter/MainForm.Designer.cs b/CoordinateConverter/MainForm.Designer.cs index 4e5c33b..87205e4 100644 --- a/CoordinateConverter/MainForm.Designer.cs +++ b/CoordinateConverter/MainForm.Designer.cs @@ -140,8 +140,7 @@ private void InitializeComponent() this.tsmi_A10C = new System.Windows.Forms.ToolStripMenuItem(); this.tsmi_A10C_UseMGRS = new System.Windows.Forms.ToolStripMenuItem(); this.tsmi_AH64Menu = new System.Windows.Forms.ToolStripMenuItem(); - this.tsmi_AH64_PLT = new System.Windows.Forms.ToolStripMenuItem(); - this.tsmi_AH64_CPG = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmi_AH64 = new System.Windows.Forms.ToolStripMenuItem(); this.tsmi_AH64_ClearPoints = new System.Windows.Forms.ToolStripMenuItem(); this.tsmi_AH64_DTC = new System.Windows.Forms.ToolStripMenuItem(); this.tsmi_AV8B = new System.Windows.Forms.ToolStripMenuItem(); @@ -1489,14 +1488,14 @@ private void InitializeComponent() this.tsmi_Auto.Checked = true; this.tsmi_Auto.CheckState = System.Windows.Forms.CheckState.Checked; this.tsmi_Auto.Name = "tsmi_Auto"; - this.tsmi_Auto.Size = new System.Drawing.Size(116, 22); + this.tsmi_Auto.Size = new System.Drawing.Size(180, 22); this.tsmi_Auto.Text = "Auto"; this.tsmi_Auto.Click += new System.EventHandler(this.Tsmi_Aircraft_Auto_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(113, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6); // // tsmi_A10CMenu // @@ -1504,7 +1503,7 @@ private void InitializeComponent() this.tsmi_A10C, this.tsmi_A10C_UseMGRS}); this.tsmi_A10CMenu.Name = "tsmi_A10CMenu"; - this.tsmi_A10CMenu.Size = new System.Drawing.Size(116, 22); + this.tsmi_A10CMenu.Size = new System.Drawing.Size(180, 22); this.tsmi_A10CMenu.Text = "A10C"; // // tsmi_A10C @@ -1524,46 +1523,38 @@ private void InitializeComponent() // tsmi_AH64Menu // this.tsmi_AH64Menu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.tsmi_AH64_PLT, - this.tsmi_AH64_CPG, + this.tsmi_AH64, this.tsmi_AH64_ClearPoints, this.tsmi_AH64_DTC}); this.tsmi_AH64Menu.Name = "tsmi_AH64Menu"; - this.tsmi_AH64Menu.Size = new System.Drawing.Size(116, 22); + this.tsmi_AH64Menu.Size = new System.Drawing.Size(180, 22); this.tsmi_AH64Menu.Text = "AH64"; // - // tsmi_AH64_PLT + // tsmi_AH64 // - this.tsmi_AH64_PLT.Name = "tsmi_AH64_PLT"; - this.tsmi_AH64_PLT.Size = new System.Drawing.Size(162, 22); - this.tsmi_AH64_PLT.Text = "AH64-PLT"; - this.tsmi_AH64_PLT.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); - // - // tsmi_AH64_CPG - // - this.tsmi_AH64_CPG.Name = "tsmi_AH64_CPG"; - this.tsmi_AH64_CPG.Size = new System.Drawing.Size(162, 22); - this.tsmi_AH64_CPG.Text = "AH-64-CPG"; - this.tsmi_AH64_CPG.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); + this.tsmi_AH64.Name = "tsmi_AH64"; + this.tsmi_AH64.Size = new System.Drawing.Size(180, 22); + this.tsmi_AH64.Text = "AH64"; + this.tsmi_AH64.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); // // tsmi_AH64_ClearPoints // this.tsmi_AH64_ClearPoints.Name = "tsmi_AH64_ClearPoints"; - this.tsmi_AH64_ClearPoints.Size = new System.Drawing.Size(162, 22); + this.tsmi_AH64_ClearPoints.Size = new System.Drawing.Size(180, 22); this.tsmi_AH64_ClearPoints.Text = "Clear Points..."; this.tsmi_AH64_ClearPoints.Click += new System.EventHandler(this.Tsmi_AH64_ClearPoints_Click); // // tsmi_AH64_DTC // this.tsmi_AH64_DTC.Name = "tsmi_AH64_DTC"; - this.tsmi_AH64_DTC.Size = new System.Drawing.Size(162, 22); + this.tsmi_AH64_DTC.Size = new System.Drawing.Size(180, 22); this.tsmi_AH64_DTC.Text = "DTC..."; this.tsmi_AH64_DTC.Click += new System.EventHandler(this.Tsmi_AH64_DTC_Click); // // tsmi_AV8B // this.tsmi_AV8B.Name = "tsmi_AV8B"; - this.tsmi_AV8B.Size = new System.Drawing.Size(116, 22); + this.tsmi_AV8B.Size = new System.Drawing.Size(180, 22); this.tsmi_AV8B.Text = "AV8B"; this.tsmi_AV8B.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); // @@ -1573,7 +1564,7 @@ private void InitializeComponent() this.tsmi_F15E_Pilot, this.tsmi_F15E_WSO}); this.tsmi_F15EMenu.Name = "tsmi_F15EMenu"; - this.tsmi_F15EMenu.Size = new System.Drawing.Size(116, 22); + this.tsmi_F15EMenu.Size = new System.Drawing.Size(180, 22); this.tsmi_F15EMenu.Text = "F15E"; // // tsmi_F15E_Pilot @@ -1596,7 +1587,7 @@ private void InitializeComponent() this.tsmi_F16, this.tsmi_F16_SetFirstPoint}); this.tsmi_F16Menu.Name = "tsmi_F16Menu"; - this.tsmi_F16Menu.Size = new System.Drawing.Size(116, 22); + this.tsmi_F16Menu.Size = new System.Drawing.Size(180, 22); this.tsmi_F16Menu.Text = "F16"; // // tsmi_F16 @@ -1616,7 +1607,7 @@ private void InitializeComponent() // tsmi_F18 // this.tsmi_F18.Name = "tsmi_F18"; - this.tsmi_F18.Size = new System.Drawing.Size(116, 22); + this.tsmi_F18.Size = new System.Drawing.Size(180, 22); this.tsmi_F18.Text = "F18"; this.tsmi_F18.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); // @@ -1626,7 +1617,7 @@ private void InitializeComponent() this.tsmi_JF17, this.tsmi_JF17_SetFirstPoint}); this.tsmi_JF17Menu.Name = "tsmi_JF17Menu"; - this.tsmi_JF17Menu.Size = new System.Drawing.Size(116, 22); + this.tsmi_JF17Menu.Size = new System.Drawing.Size(180, 22); this.tsmi_JF17Menu.Text = "JF17"; // // tsmi_JF17 @@ -1646,14 +1637,14 @@ private void InitializeComponent() // tsmi_KA50 // this.tsmi_KA50.Name = "tsmi_KA50"; - this.tsmi_KA50.Size = new System.Drawing.Size(116, 22); + this.tsmi_KA50.Size = new System.Drawing.Size(180, 22); this.tsmi_KA50.Text = "KA50"; this.tsmi_KA50.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); // // tsmi_M2000 // this.tsmi_M2000.Name = "tsmi_M2000"; - this.tsmi_M2000.Size = new System.Drawing.Size(116, 22); + this.tsmi_M2000.Size = new System.Drawing.Size(180, 22); this.tsmi_M2000.Text = "M2000"; this.tsmi_M2000.Click += new System.EventHandler(this.Tsmi_AircraftSelection_Click); // @@ -2128,8 +2119,7 @@ private void InitializeComponent() private ToolStripMenuItem tsmi_Opacity75; private ToolStripMenuItem tsmi_ImportUnits; private ToolStripMenuItem tsmi_AH64Menu; - private ToolStripMenuItem tsmi_AH64_PLT; - private ToolStripMenuItem tsmi_AH64_CPG; + private ToolStripMenuItem tsmi_AH64; private ToolStripMenuItem tsmi_AH64_ClearPoints; private ToolStripMenuItem tsmi_F15EMenu; private ToolStripMenuItem tsmi_F15E_Pilot; diff --git a/CoordinateConverter/MainForm.cs b/CoordinateConverter/MainForm.cs index 27851a0..f4987a6 100644 --- a/CoordinateConverter/MainForm.cs +++ b/CoordinateConverter/MainForm.cs @@ -20,7 +20,7 @@ namespace CoordinateConverter /// public partial class MainForm : Form { - private readonly GitHub.Version VERSION = new GitHub.Version(0, 6, 13); + private readonly GitHub.Version VERSION = new GitHub.Version(0, 6, 14); #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member public static readonly Color ERROR_COLOR = Color.Pink; @@ -1819,8 +1819,7 @@ private List AircraftSelectionMenuStripItems { get => new List() { tsmi_A10C, - tsmi_AH64_CPG, - tsmi_AH64_PLT, + tsmi_AH64, tsmi_AV8B, tsmi_F15E_Pilot, tsmi_F15E_WSO, @@ -1837,7 +1836,7 @@ private Dictionary> AircraftMenuStripItemsForAircr get => new Dictionary>() { { typeof(A10C), new List() { tsmi_A10C, tsmi_A10C_UseMGRS } }, - { typeof(AH64), new List() { tsmi_AH64_CPG, tsmi_AH64_PLT, tsmi_AH64_ClearPoints, tsmi_AH64_DTC } }, + { typeof(AH64), new List() { tsmi_AH64, tsmi_AH64_ClearPoints, tsmi_AH64_DTC } }, { typeof(AV8B), new List() { tsmi_AV8B } }, { typeof(F15E), new List() { tsmi_F15E_Pilot, tsmi_F15E_WSO } }, { typeof(F16C), new List() { tsmi_F16, tsmi_F16_SetFirstPoint } }, @@ -1845,7 +1844,6 @@ private Dictionary> AircraftMenuStripItemsForAircr { typeof(F18C), new List() { tsmi_F18 } }, { typeof(KA50), new List() { tsmi_KA50 } }, { typeof(M2000), new List() { tsmi_M2000 } }, - }; } @@ -1901,8 +1899,7 @@ private void AutoSelectAircraft(string model) { break; } - FormAskBinaryQuestion isPltForm = new FormAskBinaryQuestion(this, "Which station are you in?", "Pilot", "CPG"); - Tsmi_AircraftSelection_Click(isPltForm.Result ? tsmi_AH64_PLT : tsmi_AH64_CPG, null); + Tsmi_AircraftSelection_Click(tsmi_AH64, null); break; case "FA-18C_hornet": if (selectedAircraft != null && selectedAircraft.GetType() == typeof(F18C)) @@ -2007,13 +2004,9 @@ private void Tsmi_AircraftSelection_Click(object objSender, EventArgs e) private bool SetSelectedAircraft(string ControlName) { // Remind user here: "Transfer uses MGRS instead of L/L if MGRS selected, cockpit must match" - if (ControlName == tsmi_AH64_PLT.Name) - { - selectedAircraft = new AH64(true); - } - else if (ControlName == tsmi_AH64_CPG.Name) + if (ControlName == tsmi_AH64.Name) { - selectedAircraft = new AH64(false); + selectedAircraft = new AH64(); } else if (ControlName == tsmi_F18.Name) { @@ -2834,7 +2827,7 @@ private void Tsmi_CheckForUpdates_Click(object sender, EventArgs e) private void Tsmi_AH64_DTC_Click(object sender, EventArgs e) { - var ah64DTCForm = new FormAH64DTC((selectedAircraft as AH64).IsPilot); + var ah64DTCForm = new FormAH64DTC((selectedAircraft as AH64).IsPilot ?? true); ah64DTCForm.TopMost = TopMost; ah64DTCForm.ShowDialog(); pb_Transfer.Value = 0; diff --git a/CoordinateConverter/todo.txt b/CoordinateConverter/todo.txt index 3efe8e2..b987084 100644 --- a/CoordinateConverter/todo.txt +++ b/CoordinateConverter/todo.txt @@ -1,6 +1,18 @@ Unit list: - Filter by unit type/name +AH-64 DTC: + - Set up map options + - different lrfd/lst based on cockpit display data + +A-10C: + - Auto UTM/LL detection + +F-18: + - Auto set PRECISE + - Smarter Weapons selection, not based on wing loadout + + Data Entry - Fix spurious data entry errors for AH64 KU diff --git a/Installer/Installer.wixproj b/Installer/Installer.wixproj index 3c033e2..c61d09f 100644 --- a/Installer/Installer.wixproj +++ b/Installer/Installer.wixproj @@ -1,9 +1,9 @@  - Version=0.6.13 + Version=0.6.14 - Version=0.6.13 + Version=0.6.14