/// <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);
        }