diff --git a/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs b/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs index 094fd45..510bd15 100644 --- a/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs +++ b/CoordinateConverter/DCS/Aircraft/AH64/AH64.cs @@ -1019,6 +1019,158 @@ public int ClearPoints(EPointType pointType, int startIdx, int endIdx) return commands.Count; } + /// + /// Gets the dictionary of text for display data on the push button. + /// + /// The push button to get the text for. + /// The display data for the display at the time + /// A directory of the internal dcs push button names and it's associated text. + /// Invalid key - key + static public Dictionary GetDictionaryForDisplayDataOnPB(AH64.EKeyCode key, Dictionary displayData) + { + string dcsInternalKeyName = "PB"; + switch (key) + { + case AH64.EKeyCode.MFD_T1: + dcsInternalKeyName += "1_"; + break; + case AH64.EKeyCode.MFD_T2: + dcsInternalKeyName += "2_"; + break; + case AH64.EKeyCode.MFD_T3: + dcsInternalKeyName += "3_"; + break; + case AH64.EKeyCode.MFD_T4: + dcsInternalKeyName += "4_"; + break; + case AH64.EKeyCode.MFD_T5: + dcsInternalKeyName += "5_"; + break; + case AH64.EKeyCode.MFD_T6: + dcsInternalKeyName += "6_"; + break; + case AH64.EKeyCode.MFD_R1: + dcsInternalKeyName += "7_"; + break; + case AH64.EKeyCode.MFD_R2: + dcsInternalKeyName += "8_"; + break; + case AH64.EKeyCode.MFD_R3: + dcsInternalKeyName += "9_"; + break; + case AH64.EKeyCode.MFD_R4: + dcsInternalKeyName += "10_"; + break; + case AH64.EKeyCode.MFD_R5: + dcsInternalKeyName += "11_"; + break; + case AH64.EKeyCode.MFD_R6: + dcsInternalKeyName += "12_"; + break; + case AH64.EKeyCode.MFD_B1_M: + dcsInternalKeyName += "18_"; + break; + case AH64.EKeyCode.MFD_B2: + dcsInternalKeyName += "17_"; + break; + case AH64.EKeyCode.MFD_B3: + dcsInternalKeyName += "16_"; + break; + case AH64.EKeyCode.MFD_B4: + dcsInternalKeyName += "15_"; + break; + case AH64.EKeyCode.MFD_B5: + dcsInternalKeyName += "14_"; + break; + case AH64.EKeyCode.MFD_B6: + dcsInternalKeyName += "13_"; + break; + case AH64.EKeyCode.MFD_L1: + dcsInternalKeyName += "24_"; + break; + case AH64.EKeyCode.MFD_L2: + dcsInternalKeyName += "23_"; + break; + case AH64.EKeyCode.MFD_L3: + dcsInternalKeyName += "22_"; + break; + case AH64.EKeyCode.MFD_L4: + dcsInternalKeyName += "21_"; + break; + case AH64.EKeyCode.MFD_L5: + dcsInternalKeyName += "20_"; + break; + case AH64.EKeyCode.MFD_L6: + dcsInternalKeyName += "19_"; + break; + default: + throw new System.ArgumentException("Invalid key", nameof(key)); + } + + return displayData.Where(kvp => kvp.Key.StartsWith(dcsInternalKeyName)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + } + + /// + /// Gets the text line for display data on the push button. + /// + /// The push button. + /// The display data at the time. + /// The line number to get, 0 indexed. + /// The text for the line on that push button + /// Not enough lines, or no text at all. + static public string GetLineForDisplayDataOnPB(AH64.EKeyCode key, Dictionary displayData, uint line) + { + var dictForPB = GetDictionaryForDisplayDataOnPB(key, displayData); + // we need to discard the box key (ending with _b) + dictForPB = dictForPB.Where(kvp => !kvp.Key.EndsWith("_b")).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + // Keys for the lines on the displays are in the form of PB_ + // where key is the pushbuton internal name in DCS (starting with T1, going clockwise around the OSBs) + // and id is a seemingly arbitrary number, but they are strictly ordered by line number + // and then return the line-th entry in the dictionary + // when sorted by the id. + if (dictForPB.Count < line) + { + throw new System.ArgumentException("No text at that line. number of lines: " + dictForPB.Count.ToString() + " but wanted line: " + line.ToString(), nameof(line)); + } + return dictForPB.OrderBy(kvp => kvp.Key).ElementAt((int)line).Value; + } + + /// + /// Determines whether the option in display data is enabled on the push button, either boxed or with solid circle indicator. + /// + /// The push button. + /// The display data. + /// A string to check the display text against, and throw an exception if not matched. + /// + /// true if the option in display data is enabled on the push button; otherwise, false. + /// + static public bool IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode key, Dictionary displayData, string checkAgainst = null) + { + var displayDataForPB = GetDictionaryForDisplayDataOnPB(key, displayData); + + // check all values if any contains the checkAgainst string + if (!string.IsNullOrEmpty(checkAgainst)) + { + if (!displayDataForPB.Any(kvp => kvp.Value.Contains(checkAgainst))) + { + string values = "[" + string.Join(", ", displayDataForPB.Select(kvp => "\"" + kvp.Value + "\"").ToArray()) + "]"; + throw new Exception("Expected display text on " + key.ToString() + " to be \"" + checkAgainst + "\" but found " + values); + } + } + + // check if there is a box key (ending with _b) + if (displayDataForPB.Any(kvp => kvp.Key.EndsWith("_b"))) + { + return true; + } + + // check if this is a toggle button with a circle. + // hollow circle (disabled) in DCS is represented by '{', and a full circle (enabled) by '}' + // the circle can be either at the start or end of the value + return displayDataForPB.Any(kvp => kvp.Value.StartsWith("{")) || displayDataForPB.Any(kvp => kvp.Value.EndsWith("{")); + } + /// /// The valid point types for the AH64 /// diff --git a/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs b/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs index dd4fa04..b4e397e 100644 --- a/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs +++ b/CoordinateConverter/DCS/Aircraft/AH64/AH64DTCData.cs @@ -1681,19 +1681,20 @@ public ELaserCodeProgrammSelector CurrentLaserCodeProgrammSelector if (message == null || message.CockpitDisplayData == null || message.CockpitDisplayData[displayToRead].Count == 0 - || !message.CockpitDisplayData[displayToRead].ContainsKey("PB2_11") ) { return ELaserCodeProgrammSelector.Lrfd; } - if (message.CockpitDisplayData[displayToRead]["PB2_11"] == "LST") + string setString = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_T4, message.CockpitDisplayData[displayToRead], 1); + switch (setString) { - return ELaserCodeProgrammSelector.Lst; - } - else - { - return ELaserCodeProgrammSelector.Lrfd; + case "LST": + return ELaserCodeProgrammSelector.Lst; + case "LRFD": + return ELaserCodeProgrammSelector.Lrfd; + default: + throw new Exception($"Unknown laser code programm selector: {setString}"); } } } diff --git a/CoordinateConverter/DCS/Aircraft/AH64/AH64TSDOptionData.cs b/CoordinateConverter/DCS/Aircraft/AH64/AH64TSDOptionData.cs index 20a8ad8..89d9ea7 100644 --- a/CoordinateConverter/DCS/Aircraft/AH64/AH64TSDOptionData.cs +++ b/CoordinateConverter/DCS/Aircraft/AH64/AH64TSDOptionData.cs @@ -1,5 +1,6 @@ using CoordinateConverter.DCS.Communication; using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -958,7 +959,7 @@ static public AH64TSDOptionData ReadFromAC(bool isPilot) }; AH64TSDOptionData result = new AH64TSDOptionData(); - + string stringToCheck; // loop over navigations dictionary foreach (KeyValuePair> kvp in navigations.OrderBy(x => x.Key)) @@ -985,35 +986,134 @@ static public AH64TSDOptionData ReadFromAC(bool isPilot) switch (kvp.Key) { case EScreens.TSD_MAP: - result.Phase = displayData["PB17_39"] == "NAV" ? EPhase.Navigation : EPhase.Attack; - result.MapType = displayData["PB23_15"] == "DIG" ? EMapType.Digital - : displayData["PB23_15"] == "CHART" ? EMapType.Chart - : displayData["PB23_15"] == "SAT" ? EMapType.Satellite - : EMapType.Stick; - result.Center = displayData.ContainsKey("PB9_1_b") ? ECenter.Center : ECenter.Depressed; - result.Orientation = displayData["PB11_7"] == "TRK-UP" ? EOrientation.TrackUp - : (displayData["PB11_7"] == "HDG-UP" ? EOrientation.HeadingUp - : EOrientation.NorthUp); - result.Grid = displayData.ContainsKey("PB5_23_b") ? EGrid.Grid_Normal : EGrid.Grid_None; + stringToCheck = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_B2, displayData, 1); + switch (stringToCheck) + { + case "NAV": + result.Phase = EPhase.Navigation; + break; + case "ATK": + result.Phase = EPhase.Attack; + break; + default: + throw new System.Exception("Expected 'NAV' or 'ATK' on B2, but found \"" + stringToCheck + "\""); + } + + stringToCheck = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_L2, displayData, 1); + switch (stringToCheck) + { + case "DIG": + result.MapType = EMapType.Digital; + break; + case "CHART": + result.MapType = EMapType.Chart; + break; + case "SAT": + result.MapType = EMapType.Satellite; + break; + case "STICK": + result.MapType = EMapType.Stick; + break; + default: + throw new System.Exception("Expected 'DIG', 'CHART', 'SAT' or 'STICK' on L2, but found \"" + stringToCheck + "\""); + } + + result.Center = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R3, displayData, "CTR") ? ECenter.Center : ECenter.Depressed; + + stringToCheck = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_R5, displayData, 1); + switch (stringToCheck) + { + case "TRK-UP": + result.Orientation = EOrientation.TrackUp; + break; + case "HDG-UP": + result.Orientation = EOrientation.HeadingUp; + break; + case "N-UP": + result.Orientation = EOrientation.NorthUp; + break; + default: + throw new System.Exception("Expected 'TRK-UP', 'HDG-UP' or 'N-UP' on R5, but found \"" + stringToCheck + "\""); + } + + result.Grid = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_T5, displayData, "GRID") ? EGrid.Grid_Normal : EGrid.Grid_None; break; case EScreens.TSD_MAP_DIG: - result.Gray = displayData.ContainsKey("PB4_21_b") ? EGray.Gray : EGray.Green_and_gray; - result.ColorBand = displayData["PB21_31"] == "NONE" ? EColorBand.None - : displayData["PB21_31"] == "ELEV" ? EColorBand.Elevation - : EColorBand.AC; - result.Contours = displayData["PB20_35"] == "NONE" ? EContours.Contours_None - : displayData["PB20_35"] == "50" ? EContours.Contours_50 - : displayData["PB20_35"] == "100" ? EContours.Contours_100 - : displayData["PB20_35"] == "200" ? EContours.Contours_200 - : displayData["PB20_35"] == "500" ? EContours.Contours_500 - : EContours.Contours_1000; - result.ffd = displayData["PB19_39"] == "NONE" ? EFfd.FFD_None - : displayData["PB19_39"] == "BOTH" ? EFfd.FFD_Both - : displayData["PB19_39"] == "LINES" ? EFfd.FFD_Lines - : EFfd.FFD_Areas; + result.Gray = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_T4, displayData, "GRAY") ? EGray.Gray : EGray.Green_and_gray; + + stringToCheck = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_L4, displayData, 1); + switch (stringToCheck) + { + case "NONE": + result.ColorBand = EColorBand.None; + break; + case "ELEV": + result.ColorBand = EColorBand.Elevation; + break; + case "A/C": + result.ColorBand = EColorBand.AC; + break; + default: + throw new System.Exception("Expected 'NONE', 'ELEV' or 'A/C' on L4, but found \"" + stringToCheck + "\""); + } + + stringToCheck = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_L5, displayData, 1); + switch (stringToCheck) + { + case "NONE": + result.Contours = EContours.Contours_None; + break; + case "50": + result.Contours = EContours.Contours_50; + break; + case "100": + result.Contours = EContours.Contours_100; + break; + case "200": + result.Contours = EContours.Contours_200; + break; + case "500": + result.Contours = EContours.Contours_500; + break; + case "1000": + result.Contours = EContours.Contours_1000; + break; + default: + throw new System.Exception("Expected 'NONE', '50', '100', '200', '500' or '1000' on L5, but found \"" + stringToCheck + "\""); + } + + string ffdStr = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_L6, displayData, 1); + switch (ffdStr) + { + case "NONE": + result.ffd = EFfd.FFD_None; + break; + case "BOTH": + result.ffd = EFfd.FFD_Both; + break; + case "LINES": + result.ffd = EFfd.FFD_Lines; + break; + case "AREAS": + result.ffd = EFfd.FFD_Areas; + break; + default: + throw new System.Exception("Expected 'NONE', 'BOTH', 'LINES' or 'AREAS' on L6, but found \"" + ffdStr + "\""); + } break; case EScreens.TSD_MAP_SAT: - result.SatLevel = displayData["PB22_27"] == "5M" ? ESatLevel.L5 : ESatLevel.L10; + string satLevelStr = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_L3, displayData, 1); + switch (satLevelStr) + { + case "5M": + result.SatLevel = ESatLevel.L5; + break; + case "10M": + result.SatLevel = ESatLevel.L10; + break; + default: + throw new System.Exception("Expected '5M' or '10M' on L3, but found \"" + satLevelStr + "\""); + } break; case EScreens.TSD_MAP_CHART: // result.ChartScale = displayData["PB22_23"] == "" ...; @@ -1045,46 +1145,58 @@ static public AH64TSDOptionData ReadFromAC(bool isPilot) } break; case EScreens.TSD_SHOW_NAV: - result.NavWpData = displayData.ContainsKey("PB23_9_b") ? EFilter.Show : EFilter.Hide; - result.NavInactiveZones = displayData.ContainsKey("PB22_13_b") ? EFilter.Show : EFilter.Hide; - result.NavObstacles = displayData.ContainsKey("PB21_29_b") ? EFilter.Show : EFilter.Hide; - result.NavCursor = displayData.ContainsKey("PB20_15_b") ? EFilter.Show : EFilter.Hide; - result.NavCursorInfo = displayData.ContainsKey("PB19_17_b") ? EFilter.Show : EFilter.Hide; - result.NavHSI = displayData.ContainsKey("PB10_23_b") ? EFilter.Show : EFilter.Hide; - result.NavEndurance = displayData.ContainsKey("PB11_25_b") ? EFilter.Show : EFilter.Hide; - result.NavWind = displayData.ContainsKey("PB12_27_b") ? EFilter.Show : EFilter.Hide; - break; - case EScreens.TSD_SHOW_COORD_NAV: - result.NavCtrlMeasures = displayData.ContainsKey("PB23_11_b") ? EFilter.Show : EFilter.Hide; - result.NavFriendlyUnits = displayData.ContainsKey("PB22_13_b") ? EFilter.Show : EFilter.Hide; - result.NavEnemyUnits = displayData.ContainsKey("PB21_15_b") ? EFilter.Show : EFilter.Hide; - result.NavTargets = displayData.ContainsKey("PB20_17_b") ? EFilter.Show : EFilter.Hide; - result.NavLines = displayData.ContainsKey("PB7_19_b") ? EFilter.Show : EFilter.Hide; - result.NavAreas = displayData.ContainsKey("PB8_21_b") ? EFilter.Show : EFilter.Hide; + result.NavWpData = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L2, displayData, "WAYPOINT DATA") ? EFilter.Show : EFilter.Hide; + result.NavInactiveZones = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L3, displayData, "INACTIVE ZONES") ? EFilter.Show : EFilter.Hide; + result.NavObstacles = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L4, displayData, "OBSTACLES") ? EFilter.Show : EFilter.Hide; + result.NavCursor = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L5, displayData, " CURSOR") ? EFilter.Show : EFilter.Hide; + result.NavCursorInfo = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L6, displayData, "CURSR\nINFO") ? EFilter.Show : EFilter.Hide; + result.NavHSI = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R4, displayData, "HSI") ? EFilter.Show : EFilter.Hide; + result.NavEndurance = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R5, displayData, "ENDR") ? EFilter.Show : EFilter.Hide; + result.NavWind = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R6, displayData, "WIND") ? EFilter.Show : EFilter.Hide; break; case EScreens.TSD_SHOW_ATK: - result.AtkCurrentRoute = displayData.ContainsKey("PB23_11_b") ? EFilter.Show : EFilter.Hide; - result.AtkInactiveZones = displayData.ContainsKey("PB22_13_b") ? EFilter.Show : EFilter.Hide; - result.AtkFCRObstacles = displayData.ContainsKey("PB21_31_b") ? EFilter.Show : EFilter.Hide; - result.AtkCursor = displayData.ContainsKey("PB20_15_b") ? EFilter.Show : EFilter.Hide; - result.AtkCursorInfo = displayData.ContainsKey("PB19_17_b") ? EFilter.Show : EFilter.Hide; - result.AtkHSI = displayData.ContainsKey("PB10_23_b") ? EFilter.Show : EFilter.Hide; - result.AtkEndurance = displayData.ContainsKey("PB11_25_b") ? EFilter.Show : EFilter.Hide; - result.AtkWind = displayData.ContainsKey("PB12_27_b") ? EFilter.Show : EFilter.Hide; + result.AtkCurrentRoute = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L2, displayData, "CURRENT ROUTE") ? EFilter.Show : EFilter.Hide; + result.AtkInactiveZones = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L3, displayData, "INACTIVE ZONES") ? EFilter.Show : EFilter.Hide; + result.AtkFCRObstacles = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L4, displayData, "FCR TGTS/OBSTACLES") ? EFilter.Show : EFilter.Hide; + result.AtkCursor = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L5, displayData, " CURSOR") ? EFilter.Show : EFilter.Hide; + result.AtkCursorInfo = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L6, displayData, "CURSR\nINFO") ? EFilter.Show : EFilter.Hide; + result.AtkHSI = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R4, displayData, "HSI") ? EFilter.Show : EFilter.Hide; + result.AtkEndurance = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R5, displayData, "ENDR") ? EFilter.Show : EFilter.Hide; + result.AtkWind = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R6, displayData, "WIND") ? EFilter.Show : EFilter.Hide; + break; + case EScreens.TSD_SHOW_COORD_NAV: + result.NavFriendlyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L2, displayData, "CONTROL MEASURES") ? EFilter.Show : EFilter.Hide; + result.NavFriendlyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L3, displayData, "FRIENDLY UNITS") ? EFilter.Show : EFilter.Hide; + result.NavEnemyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L4, displayData, "ENEMY UNITS") ? EFilter.Show : EFilter.Hide; + result.NavTargets = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L5, displayData, "PLANNED TGTS/THREATS") ? EFilter.Show : EFilter.Hide; + result.NavLines = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R1, displayData, "LINES") ? EFilter.Show : EFilter.Hide; + result.NavAreas = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R2, displayData, "AREAS") ? EFilter.Show : EFilter.Hide; break; case EScreens.TSD_SHOW_COORD_ATK: - result.AtkCtrlMeasures = displayData.ContainsKey("PB23_11_b") ? EFilter.Show : EFilter.Hide; - result.AtkFriendlyUnits = displayData.ContainsKey("PB22_13_b") ? EFilter.Show : EFilter.Hide; - result.AtkEnemyUnits = displayData.ContainsKey("PB21_15_b") ? EFilter.Show : EFilter.Hide; - result.AtkTargets = displayData.ContainsKey("PB20_17_b") ? EFilter.Show : EFilter.Hide; - result.AtkLines = displayData.ContainsKey("PB7_19_b") ? EFilter.Show : EFilter.Hide; - result.AtkAreas = displayData.ContainsKey("PB8_21_b") ? EFilter.Show : EFilter.Hide; - result.AtkShotAt = displayData.ContainsKey("PB9_23_b") ? EFilter.Show : EFilter.Hide; + result.AtkFriendlyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L2, displayData, "CONTROL MEASURES") ? EFilter.Show : EFilter.Hide; + result.AtkFriendlyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L3, displayData, "FRIENDLY UNITS") ? EFilter.Show : EFilter.Hide; + result.AtkEnemyUnits = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L4, displayData, "ENEMY UNITS") ? EFilter.Show : EFilter.Hide; + result.AtkTargets = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L5, displayData, "PLANNED TGTS/THREATS") ? EFilter.Show : EFilter.Hide; + result.AtkLines = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R1, displayData, "LINES") ? EFilter.Show : EFilter.Hide; + result.AtkAreas = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R2, displayData, "AREAS") ? EFilter.Show : EFilter.Hide; + result.AtkShotAt = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R3, displayData, "SHOT") ? EFilter.Show : EFilter.Hide; break; case EScreens.TSD_SHOW_THREAT: - result.ThreatVis = displayData["PB7_25"] == "THRT" ? EVis.Threat : EVis.Own; - result.AseThreats = displayData.ContainsKey("PB23_15_b") ? EFilter.Show : EFilter.Hide; - result.VisShade = displayData.ContainsKey("PB19_21_b") ? EFilter.Show : EFilter.Hide; + string visStr = AH64.GetLineForDisplayDataOnPB(AH64.EKeyCode.MFD_R1, displayData, 1); + switch (visStr) + { + case "THRT": + result.ThreatVis = EVis.Threat; + break; + case "OWN": + result.ThreatVis = EVis.Own; + break; + default: + throw new System.Exception("Expected 'THRT' or 'OWN' on R1, but found \"" + visStr + "\""); + } + + result.AseThreats = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L2, displayData, "ASE THREATS") ? EFilter.Show : EFilter.Hide; + result.VisShade = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_L6, displayData, "VIS\nSHADE") ? EFilter.Show : EFilter.Hide; // switch to OWN if (result.ThreatVis == EVis.Threat) @@ -1115,10 +1227,10 @@ static public AH64TSDOptionData ReadFromAC(bool isPilot) } // we are now in OWN, read data - result.VisOwnOwn = displayData.ContainsKey("PB8_27_b") ? EFilter.Show : EFilter.Hide; - result.VisOwnTrnPt = displayData.ContainsKey("PB9_29_b") ? EFilter.Show : EFilter.Hide; - result.VisOwnGhost = displayData.ContainsKey("PB10_31_b") ? EFilter.Show : EFilter.Hide; - result.VisOwnRings = displayData.ContainsKey("PB12_33_b") ? EFilter.Show : EFilter.Hide; + result.VisOwnOwn = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R2, displayData, "OWN") ? EFilter.Show : EFilter.Hide; + result.VisOwnTrnPt = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R3, displayData, "TRN PT") ? EFilter.Show : EFilter.Hide; + result.VisOwnGhost = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R4, displayData, "GHOST") ? EFilter.Show : EFilter.Hide; + result.VisOwnRings = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R6, displayData, "RINGS") ? EFilter.Show : EFilter.Hide; // switch over to THRT commands = new List() @@ -1146,11 +1258,11 @@ static public AH64TSDOptionData ReadFromAC(bool isPilot) displayData = message.CockpitDisplayData[displayToRead]; // read THRT - result.VisThreatACQ = displayData.ContainsKey("PB8_37_b") ? EFilter.Show : EFilter.Hide; - result.VisThreatTrnPt = displayData.ContainsKey("PB9_39_b") ? EFilter.Show : EFilter.Hide; - result.VisThreatFCR = displayData.ContainsKey("PB10_41_b") ? EFilter.Show : EFilter.Hide; - result.VisThreatThreats = displayData.ContainsKey("PB11_43_b") ? EFilter.Show : EFilter.Hide; - result.visThreatTargets = displayData.ContainsKey("PB12_45_b") ? EFilter.Show : EFilter.Hide; + result.VisThreatACQ = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R2, displayData, "ACQ") ? EFilter.Show : EFilter.Hide; + result.VisThreatTrnPt = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R3, displayData, "TRN PT") ? EFilter.Show : EFilter.Hide; + result.VisThreatFCR = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R4, displayData, "FCR/RFI") ? EFilter.Show : EFilter.Hide; + result.VisThreatThreats = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R5, displayData, "THREATS") ? EFilter.Show : EFilter.Hide; + result.visThreatTargets = AH64.IsOptionInDisplayDataEnabledOnPB(AH64.EKeyCode.MFD_R6, displayData, "TARGETS") ? EFilter.Show : EFilter.Hide; break; } } diff --git a/CoordinateConverter/DCS/Tools/FormF18WeaponConfigurator.resx b/CoordinateConverter/DCS/Tools/FormF18WeaponConfigurator.resx index 3b7e30a..a8f77ed 100644 --- a/CoordinateConverter/DCS/Tools/FormF18WeaponConfigurator.resx +++ b/CoordinateConverter/DCS/Tools/FormF18WeaponConfigurator.resx @@ -160,120 +160,121 @@ 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 + YII= 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 - dmWKhyoKYd8AAAAASUVORK5CYII= + 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 + /gf9PIp337c2zwAAAABJRU5ErkJggg== diff --git a/CoordinateConverter/MainForm.cs b/CoordinateConverter/MainForm.cs index d9bf596..0dcf946 100644 --- a/CoordinateConverter/MainForm.cs +++ b/CoordinateConverter/MainForm.cs @@ -21,7 +21,7 @@ namespace CoordinateConverter /// public partial class MainForm : Form { - private readonly GitHub.Version VERSION = new GitHub.Version(0, 12, 0); + private readonly GitHub.Version VERSION = new GitHub.Version(0, 12, 1); #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member public static readonly Color ERROR_COLOR = Color.Pink; diff --git a/Installer/Installer.wixproj b/Installer/Installer.wixproj index 6e0e8a0..033d0a9 100644 --- a/Installer/Installer.wixproj +++ b/Installer/Installer.wixproj @@ -1,9 +1,9 @@  - Version=0.12.0 + Version=0.12.1 - Version=0.12.0 + Version=0.12.1