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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
- 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
+ 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
+ YII=
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
- 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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