From b2ca626439ed3b59e8b0d7fda445c7106a6185ce Mon Sep 17 00:00:00 2001 From: hawkeye Date: Wed, 28 Feb 2024 19:54:25 -0500 Subject: [PATCH] Update cockpit camera view selection --- Orchestration/FlightSimData.cs | 5 ++-- Orchestration/FlightSimOrchestrator.cs | 15 ++++++++++++ SimconnectAgent/CameraState.cs | 12 ++++++++++ SimconnectAgent/Enums.cs | 1 + SimconnectAgent/SimConnectProvider.cs | 32 +++++++++++++++----------- SimconnectAgent/SimConnector.cs | 5 ++++ SimconnectAgent/SimDataDefinitions.cs | 1 + 7 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 SimconnectAgent/CameraState.cs diff --git a/Orchestration/FlightSimData.cs b/Orchestration/FlightSimData.cs index 5641316..e8bb18c 100644 --- a/Orchestration/FlightSimData.cs +++ b/Orchestration/FlightSimData.cs @@ -2,6 +2,7 @@ using MSFSPopoutPanelManager.Shared; using System; using System.ComponentModel; +using MSFSPopoutPanelManager.SimConnectAgent; namespace MSFSPopoutPanelManager.Orchestration { @@ -28,7 +29,7 @@ namespace MSFSPopoutPanelManager.Orchestration public bool TrackIRStatus { get; set; } - public int CameraState { get; set; } + public CameraState CameraState { get; set; } public int CockpitCameraZoom { get; set; } @@ -82,7 +83,7 @@ namespace MSFSPopoutPanelManager.Orchestration TrackIRStatus = false; IsInCockpit = false; PlaneInParkingSpot = false; - CameraState = -1; + CameraState = CameraState.Unknown; IsSimulatorStarted = false; PlaneAltAboveGround = 0; CameraViewTypeAndIndex1Max = 0; diff --git a/Orchestration/FlightSimOrchestrator.cs b/Orchestration/FlightSimOrchestrator.cs index 08e534d..e636cbe 100644 --- a/Orchestration/FlightSimOrchestrator.cs +++ b/Orchestration/FlightSimOrchestrator.cs @@ -71,6 +71,13 @@ namespace MSFSPopoutPanelManager.Orchestration if (trackIR != FlightSimData.TrackIRStatus) FlightSimData.TrackIRStatus = trackIR; + var cameraStateInt = Convert.ToInt32(e.Find(d => d.PropertyName == SimDataDefinitions.PropName.CameraState).Value); + var result = Enum.TryParse(cameraStateInt.ToString(), out var cameraState); + if (!result) + cameraState = CameraState.Unknown; + if (cameraState != FlightSimData.CameraState) + FlightSimData.CameraState = cameraState; + var cockpitCameraZoom = Convert.ToInt32(e.Find(d => d.PropertyName == SimDataDefinitions.PropName.CockpitCameraZoom).Value); if (cockpitCameraZoom != FlightSimData.CockpitCameraZoom) FlightSimData.CockpitCameraZoom = cockpitCameraZoom; @@ -339,6 +346,14 @@ namespace MSFSPopoutPanelManager.Orchestration public void SetFixedCamera(CameraType cameraType, int index) { + if (FlightSimData.CameraState != CameraState.Cockpit) + { + _simConnectProvider.SetCameraState(CameraState.Cockpit); + Thread.Sleep(250); + ResetCameraView(); + Thread.Sleep(250); + } + _simConnectProvider.SetCameraViewTypeAndIndex0(Convert.ToInt32(cameraType)); Thread.Sleep(250); _simConnectProvider.SetCameraViewTypeAndIndex1(index); diff --git a/SimconnectAgent/CameraState.cs b/SimconnectAgent/CameraState.cs new file mode 100644 index 0000000..8dca5c1 --- /dev/null +++ b/SimconnectAgent/CameraState.cs @@ -0,0 +1,12 @@ +namespace MSFSPopoutPanelManager.SimConnectAgent +{ + public enum CameraState + { + Cockpit = 2, + External = 3, + Drone = 4, + LoadScreen = 11, + HomeScreen = 15, + Unknown = 0 + } +} diff --git a/SimconnectAgent/Enums.cs b/SimconnectAgent/Enums.cs index 8c4ee3a..73d2872 100644 --- a/SimconnectAgent/Enums.cs +++ b/SimconnectAgent/Enums.cs @@ -6,6 +6,7 @@ HUDBAR_DEFINITION, WRITABLE_TRACK_IR_DEFINITION, WRITABLE_COCKPIT_CAMERA_ZOOM_DEFINITION, + WRITABLE_COCKPIT_CAMERA_STATE_DEFINITION, WRITABLE_CAMERA_REQUEST_ACTION_DEFINITION, WRITABLE_CAMERA_VIEW_TYPE_INDEX_0_DEFINITION, WRITABLE_CAMERA_VIEW_TYPE_INDEX_1_DEFINITION, diff --git a/SimconnectAgent/SimConnectProvider.cs b/SimconnectAgent/SimConnectProvider.cs index 4e726d0..942e649 100644 --- a/SimconnectAgent/SimConnectProvider.cs +++ b/SimconnectAgent/SimConnectProvider.cs @@ -227,6 +227,11 @@ namespace MSFSPopoutPanelManager.SimConnectAgent Thread.Sleep(200); } + public void SetCameraState(CameraState cameraState) + { + _simConnector.SetDataObject(WritableVariableName.CameraState, Convert.ToDouble(cameraState)); + } + public void SetCockpitCameraZoomLevel(int zoomLevel) { _simConnector.SetDataObject(WritableVariableName.CockpitCameraZoom, Convert.ToDouble(zoomLevel)); @@ -332,35 +337,37 @@ namespace MSFSPopoutPanelManager.SimConnectAgent OnSimConnectDataHudBarRefreshed?.Invoke(this, e); } - private const int CAMERA_STATE_COCKPIT = 2; - private const int CAMERA_STATE_LOAD_SCREEN = 11; - private const int CAMERA_STATE_HOME_SCREEN = 15; - private int _currentCameraState = -1; + private CameraState _currentCameraState = CameraState.Unknown; private void DetectFlightStartedOrStopped(List simData) { // Determine is flight started or ended - var cameraState = Convert.ToInt32(simData.Find(d => d.PropertyName == PropName.CameraState).Value); + var cameraStateInt = Convert.ToInt32(simData.Find(d => d.PropertyName == PropName.CameraState).Value); + + var success = Enum.TryParse(cameraStateInt.ToString(), out var cameraState); + if(!success) + cameraState = CameraState.Unknown; if (_currentCameraState == cameraState) return; - if (cameraState == CAMERA_STATE_COCKPIT) + if (cameraState == CameraState.Cockpit) OnIsInCockpitChanged?.Invoke(this, true); + switch (_currentCameraState) { - case CAMERA_STATE_HOME_SCREEN: - case CAMERA_STATE_LOAD_SCREEN: - if (cameraState == CAMERA_STATE_COCKPIT) + case CameraState.HomeScreen: + case CameraState.LoadScreen: + if (cameraState == CameraState.Cockpit) { _currentCameraState = cameraState; OnFlightStarted?.Invoke(this, EventArgs.Empty); } break; - case CAMERA_STATE_COCKPIT: - if (cameraState == CAMERA_STATE_LOAD_SCREEN || cameraState == CAMERA_STATE_HOME_SCREEN) + case CameraState.Cockpit: + if (cameraState == CameraState.LoadScreen || cameraState == CameraState.HomeScreen) { _currentCameraState = cameraState; OnFlightStopped?.Invoke(this, EventArgs.Empty); @@ -369,11 +376,10 @@ namespace MSFSPopoutPanelManager.SimConnectAgent _isHudBarDataActive = false; _hudBarRequestDataTimer.Stop(); } - break; } - if (cameraState is CAMERA_STATE_COCKPIT or CAMERA_STATE_HOME_SCREEN or CAMERA_STATE_LOAD_SCREEN) + if (cameraState is CameraState.Cockpit or CameraState.HomeScreen or CameraState.LoadScreen) _currentCameraState = cameraState; } diff --git a/SimconnectAgent/SimConnector.cs b/SimconnectAgent/SimConnector.cs index 580074a..094f1d8 100644 --- a/SimconnectAgent/SimConnector.cs +++ b/SimconnectAgent/SimConnector.cs @@ -188,6 +188,9 @@ namespace MSFSPopoutPanelManager.SimConnectAgent case WritableVariableName.CockpitCameraZoom: _simConnect.SetDataOnSimObject(DataDefinition.WRITABLE_COCKPIT_CAMERA_ZOOM_DEFINITION, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_DATA_SET_FLAG.DEFAULT, dataStruct); break; + case WritableVariableName.CameraState: + _simConnect.SetDataOnSimObject(DataDefinition.WRITABLE_COCKPIT_CAMERA_STATE_DEFINITION, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_DATA_SET_FLAG.DEFAULT, dataStruct); + break; case WritableVariableName.CameraRequestAction: _simConnect.SetDataOnSimObject(DataDefinition.WRITABLE_CAMERA_REQUEST_ACTION_DEFINITION, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_DATA_SET_FLAG.DEFAULT, dataStruct); break; @@ -309,6 +312,7 @@ namespace MSFSPopoutPanelManager.SimConnectAgent } _simConnect.AddToDataDefinition(DataDefinition.WRITABLE_TRACK_IR_DEFINITION, "TRACK IR ENABLE", "bool", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED); + _simConnect.AddToDataDefinition(DataDefinition.WRITABLE_COCKPIT_CAMERA_STATE_DEFINITION, "CAMERA STATE", "enum", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED); _simConnect.AddToDataDefinition(DataDefinition.WRITABLE_COCKPIT_CAMERA_ZOOM_DEFINITION, "COCKPIT CAMERA ZOOM", "percentage", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED); _simConnect.AddToDataDefinition(DataDefinition.WRITABLE_CAMERA_REQUEST_ACTION_DEFINITION, "CAMERA REQUEST ACTION", "enum", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED); _simConnect.AddToDataDefinition(DataDefinition.WRITABLE_CAMERA_VIEW_TYPE_INDEX_0_DEFINITION, "CAMERA VIEW TYPE AND INDEX:0", "number", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED); @@ -316,6 +320,7 @@ namespace MSFSPopoutPanelManager.SimConnectAgent _simConnect.RegisterDataDefineStruct(DataDefinition.REQUIRED_DEFINITION); _simConnect.RegisterDataDefineStruct(DataDefinition.WRITABLE_TRACK_IR_DEFINITION); + _simConnect.RegisterDataDefineStruct(DataDefinition.WRITABLE_COCKPIT_CAMERA_STATE_DEFINITION); _simConnect.RegisterDataDefineStruct(DataDefinition.WRITABLE_COCKPIT_CAMERA_ZOOM_DEFINITION); _simConnect.RegisterDataDefineStruct(DataDefinition.WRITABLE_CAMERA_VIEW_TYPE_INDEX_0_DEFINITION); _simConnect.RegisterDataDefineStruct(DataDefinition.WRITABLE_CAMERA_VIEW_TYPE_INDEX_1_DEFINITION); diff --git a/SimconnectAgent/SimDataDefinitions.cs b/SimconnectAgent/SimDataDefinitions.cs index 3530ee4..d710bab 100644 --- a/SimconnectAgent/SimDataDefinitions.cs +++ b/SimconnectAgent/SimDataDefinitions.cs @@ -113,6 +113,7 @@ namespace MSFSPopoutPanelManager.SimConnectAgent { TrackIREnable, CockpitCameraZoom, + CameraState, CameraRequestAction, CameraViewTypeAndIndex0, CameraViewTypeAndIndex1