/// <summary> /// Request an update for a specific SimVar request /// </summary> /// <param name="requestID">ID returned by SendRequest</param> /// <param name="frequency">SimVar can be requested manually (SimConnectUpdateFrequency.Never) or auto-sent at a pre-defined frequency</param> public static void GetSimVar(int requestID, SimConnectUpdateFrequency frequency) { WriteLog("Start GetSimVar(int, SimConnectUpdateFrequency)"); try { if (IsConnected) { if (frequency == SimConnectUpdateFrequency.Never || (int)frequency > (int)SIMCONNECT_PERIOD.SECOND) { if ((int)frequency > (int)SIMCONNECT_PERIOD.SECOND) { // Register SimVarRequest RegisterSimVar(Requests[requestID], SimConnectUpdateFrequency.Never); AddTimer(requestID, (int)frequency); } simConnect?.RequestDataOnSimObjectType((SIMVARREQUEST)requestID, (SIMVARDEFINITION)requestID, 0, SIMCONNECT_SIMOBJECT_TYPE.USER); } else { SIMCONNECT_PERIOD period = Enum.Parse <SIMCONNECT_PERIOD>(frequency.ToString().ToUpper()); RegisterSimVar(Requests[requestID], SimConnectUpdateFrequency.Never); simConnect?.RequestDataOnSimObject((SIMVARREQUEST)requestID, (SIMVARDEFINITION)requestID, 0, period, SIMCONNECT_DATA_REQUEST_FLAG.DEFAULT, 0, 0, 0); } } } catch (Exception ex) { WriteLog(string.Format("Get SimVar Error: {0}", ex.Message), EventLogEntryType.Error); // Likely cause, no request for this variable has previously been submitted } WriteLog("End GetSimVar(int, SimConnectUpdateFrequency)"); }
/// <summary> /// Request a SimVariable from SimConnect, optionally start capturing values /// </summary> /// <param name="request">SimVar to fetch from SimConnect</param> /// <param name="frequency">How frequently should SimConnect provide an updated value?</param> /// <returns>A unique ID for the submitted request. Use this to request the next value via FetchValueUpdate</returns> public static int RegisterSimVar(SimConnectVariable request, SimConnectUpdateFrequency frequency = SimConnectUpdateFrequency.Never) { WriteLog("Start GetSimVar(SimConnectVariable, SimConnectUpdateFrequency)"); if (IsConnected) { var unit = request.Unit; if (unit?.IndexOf("string") > -1) { unit = null; // String values don't actually have a unit } SimVarRequest simReq = AddRequest(request); // Submit the SimVar request to SimConnect try { var simVarName = request.Name; double index = 0; if (simVarName.IndexOf(':') > -1) { index = double.Parse(simVarName.Substring(simVarName.IndexOf(':') + 1)); simVarName = simVarName.Substring(0, simVarName.IndexOf(':')); } simConnect.AddToDataDefinition(simReq.DefID, simVarName, unit, simReq.SimType, 0.0f, SimConnect.SIMCONNECT_UNUSED); // Tell SimConnect what type of value we are expecting to be returned switch (simReq.DataType?.FullName) { case "System.UInt16": case "System.UInt32": case "System.UInt64": simConnect.RegisterDataDefineStruct <uint>(simReq.DefID); break; case "System.Int16": case "System.Int32": simConnect.RegisterDataDefineStruct <int>(simReq.DefID); break; case "System.Boolean": simConnect.RegisterDataDefineStruct <bool>(simReq.DefID); break; case "System.Byte": simConnect.RegisterDataDefineStruct <byte>(simReq.DefID); break; case "System.String": simConnect.RegisterDataDefineStruct <SimVarString>(simReq.DefID); break; case "System.Object": simConnect.RegisterDataDefineStruct <object>(simReq.DefID); // This will likely fail as variants don't transform well break; default: if (string.IsNullOrEmpty(unit)) { simConnect.RegisterDataDefineStruct <SimVarString>(simReq.DefID); } else { simConnect.RegisterDataDefineStruct <double>(simReq.DefID); // We'll presume default values being requested are numeric } break; } if (frequency != SimConnectUpdateFrequency.Never) { GetSimVar(simReq.ID, DefaultUpdateFrequency); // Request value to be sent back immediately, will auto-update using pre-defined frequency } } catch (Exception ex) { WriteLog(string.Format("SimConnect Error: {0}\r\nEnd GetSimVar(SimConnectVariable, SimConnectUpdateFrequency)", ex.Message), EventLogEntryType.Error); SimConnect_OnRecvException(simConnect, new SIMCONNECT_RECV_EXCEPTION { dwException = (uint)ex.HResult }); return(-1); } WriteLog("End GetSimVar(SimConnectVariable, SimConnectUpdateFrequency)"); return(simReq.ID); } WriteLog("SimVar Not Found\r\nEnd GetSimVar(SimConnectVariable, SimConnectUpdateFrequency)", EventLogEntryType.Warning); return(-1); }