/// <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);
        }
예제 #3
0
 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);
        }
예제 #5
0
        //[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);
        }
예제 #7
0
 private int SendValue(SimConnectVariableValue variableValue, bool disableAI = false)
 {
     return(SimConnectHelper.SimConnectHelper.SetSimVar(variableValue, disableAI));
 }
예제 #8
0
        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;
 }