/// <summary> /// When SimConnect sends an updated object, the data is captured here /// </summary> /// <param name="sender">SimConnect</param> /// <param name="data">Object Data</param> private static void SimConnect_OnRecvSimobjectDataByType(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data) { //WriteLog("Start SimConnect_OnRecvSimobjectDataByType(SimConnect, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE)"); if (SimData != null) { try { var value = data?.dwData; if (value != null && value.Length == 1 && value[0].GetType() == typeof(SimVarString)) { value = new object[] { ((SimVarString)value[0]).Value } } ; // May receive a value for a recently deleted request, ignore it if (Requests.Any(x => x.Key == (int)data.dwRequestID)) { var request = Requests.First(x => x.Key == (int)data.dwRequestID).Value; var simVarVal = new SimConnectVariableValue { Request = request, Value = value }; new Task(new Action(() => SimData.DynamicInvoke(simConnect, simVarVal))).Start(); } } catch (Exception ex) { WriteLog(string.Format("SimConnect_OnRecvSimobjectDataByType Error: {0}", ex.Message), EventLogEntryType.Error); } } //WriteLog("End SimConnect_OnRecvSimobjectDataByType(SimConnect, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE)"); }
public void RequestSimVar_Test_Once() { result = null; SimConnectHandler.SimError += SimConnect_Error; SimConnectHandler.SimConnected += SimConnect_Connection; SimConnectHandler.SimData += SimConnect_DataReceived; SimConnectHandler.Connect(); var variable = new SimConnectVariable { Name = "AMBIENT WIND VELOCITY", Unit = "knots" }; var requestID = SimConnectHandler.RegisterSimVar(variable, SimConnectUpdateFrequency.Once); // Wait up to 5 seconds for MSFS to return the requested value DateTime endTime = DateTime.Now.AddSeconds(5); while (result == null && DateTime.Now < endTime) { Thread.Sleep(100); } SimConnectHandler.CancelRequest(variable); SimConnectHandler.Disconnect(); Assert.IsNotNull(result); }
private void SimData(object sender, SimConnectVariableValue e) { if (e.Value != null) { var row = FindRowBySimVarName(e.Request.Name); if (row != null) { var value = e.Value.GetType().IsArray ? ((object[])e.Value)[0].ToString() : e.Value.ToString(); row.Cells["SimVarValue"].Value = value; } } }
/// <summary> /// Set the value associated with a SimVar /// </summary> /// <param name="simVarValue">SimVar and associated value</param> public static int SetSimVar(SimConnectVariableValue simVarValue) { WriteLog("Start SetSimVar(SimConnectVariableValue)"); // As for requests, setting values is a 2-step process, reserve the data area,then modify the data it holds GetSimVar(simVarValue.Request); var reqId = GetRequestId(simVarValue.Request); if (reqId > -1) { // Data area reserved, now set the value simConnect.SetDataOnSimObject((SIMVARDEFINITION)reqId, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_DATA_SET_FLAG.DEFAULT, simVarValue.Value); //simConnect.SetDataOnSimObject((SIMVARDEFINITION)reqId, (uint)reqId, (SIMCONNECT_DATA_SET_FLAG)SimConnect.SIMCONNECT_OBJECT_ID_USER, simVarValue.Value); } WriteLog("End SetSimVar(SimConnectVariableValue)"); return(reqId); }
//[TestMethod] public void GetEverySimVar() { List <SimConnectVariable> failures = new List <SimConnectVariable>(); const int frequency = (int)SimConnectUpdateFrequency.Once; const int resultDelayCheckMilliseconds = 5; const int maxWaitForResultMilliseconds = 1000; SimConnectHelper.SimConnectHelper.Disconnect(); SimConnectHelper.SimConnectHelper.SimError += SimConnect_Error; SimConnectHelper.SimConnectHelper.SimConnected += SimConnect_Connection; SimConnectHelper.SimConnectHelper.SimData += SimConnect_DataReceived; SimConnectHelper.SimConnectHelper.Connect(); foreach (var simVarDefinition in SimVarUnits.DefaultUnits) { SimConnectVariable request = new SimConnectVariable { Name = simVarDefinition.Value.Name, Unit = simVarDefinition.Value.DefaultUnit }; int requestId = SimConnectHelper.SimConnectHelper.GetSimVar(request, frequency); // -1 is the default value for a request that could not be sent - usually because SimConnect is not connected to MSFS 2020 Assert.AreNotEqual(-1, requestId); // Ask SimConnect to fetch the latest value result = null; SimConnectHelper.SimConnectHelper.GetSimVar(requestId); var endWaitTime = DateTime.Now.AddMilliseconds(maxWaitForResultMilliseconds); while (result == null && endWaitTime > DateTime.Now) { Thread.Sleep(resultDelayCheckMilliseconds); // Wait to receive the value } if (result == null) { failures.Add(request); } SimConnectHelper.SimConnectHelper.CancelRequest(request); } SimConnectHelper.SimConnectHelper.Disconnect(); foreach (var request in failures) { Debug.WriteLine(string.Format("{0} ({1})", request.Name, request.Unit)); } Assert.AreEqual(0, failures.Count()); }
/// <summary> /// Set the value associated with a SimVar /// </summary> /// <param name="simVarValue">SimVar and associated value</param> public static int SetSimVar(SimConnectVariableValue simVarValue, bool disableAI = false) { WriteLog("Start SetSimVar(SimConnectVariableValue)"); // As for requests, setting values is a 2-step process, reserve the data area,then modify the data it holds GetSimVar(simVarValue.Request); var reqId = GetRequestId(simVarValue.Request); if (reqId > -1) { if (disableAI) { // We shall assume all SimVar updates will be in relation to the user's aircraft DisableAI(reqId); } // Data area reserved, now set the value simConnect.SetDataOnSimObject((SIMVARDEFINITION)reqId, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_DATA_SET_FLAG.DEFAULT, simVarValue.Value); //simConnect.SetDataOnSimObject((SIMVARDEFINITION)reqId, (uint)reqId, (SIMCONNECT_DATA_SET_FLAG)SimConnect.SIMCONNECT_OBJECT_ID_USER, simVarValue.Value); } WriteLog("End SetSimVar(SimConnectVariableValue)"); return(reqId); }
private int SendValue(SimConnectVariableValue variableValue, bool disableAI = false) { return(SimConnectHelper.SimConnectHelper.SetSimVar(variableValue, disableAI)); }
private void pbSendRequest_Click(object sender, EventArgs e) { var selectedItem = (KeyValuePair <string, SimVarDefinition>)cmbVariable.SelectedItem; var index = cmbIndex.SelectedItem?.ToString(); var simVarName = selectedItem.Key + (string.IsNullOrEmpty(index) ? "" : (":" + index)); var simVarDefinition = selectedItem.Value; bool bCanSendRequest = FindRowBySimVarName(simVarName) == null; if (bCanSendRequest) { var value = ""; int reqId = -1; //var isReadOnly = simVarDefinition.ReadOnly; //if (!simVarDefinition.ReadOnly) value = txtSimVarValue.Text; var frequency = cmbFrequency.SelectedItem; if (frequency.ToString() == "Milliseconds") { frequency = (int)txtMilliseconds.Value; } int rowIdx = dgVariables.Rows.Add(new object[] { 0, // RecID simVarName, // SimVar simVarDefinition.DefaultUnit, // Units frequency.ToString(), // Frequency value, // Value simVarDefinition.ReadOnly // ReadOnly }); dgVariables.Rows[rowIdx].Cells["ReqID"].ReadOnly = true; dgVariables.Rows[rowIdx].Cells["SimVarName"].ReadOnly = true; dgVariables.Rows[rowIdx].Cells["SimVarUnit"].ReadOnly = true; dgVariables.Rows[rowIdx].Cells["SimVarFreq"].ReadOnly = true; dgVariables.Rows[rowIdx].Cells["VarIsReadOnly"].ReadOnly = true; dgVariables.Rows[rowIdx].Cells["SimVarValue"].ReadOnly = false; //ReqID //SimVarName //SimVarUnit //SimVarValue //VarIsReadOnly SimConnectVariable variableRequest = new SimConnectVariable { Name = simVarName, Unit = simVarDefinition.DefaultUnit }; if (string.IsNullOrEmpty(value)) { // Send Request - then update ReqID cell with returned request ID reqId = SendRequest(variableRequest, (int)Enum.Parse(typeof(SimConnectUpdateFrequency), frequency.ToString())); } else { SimConnectVariableValue variableValue = new SimConnectVariableValue { Request = variableRequest, Value = value }; reqId = SendValue(variableValue, cbDisableAI.Checked); } dgVariables.Rows[rowIdx].Cells["ReqID"].Value = reqId; } }
private int SendValue(SimConnectVariableValue variableValue) { return(SimConnectHandler.SetSimVar(variableValue)); }
private void SimConnect_DataReceived(object sender, SimConnectVariableValue e) { result = e; }