コード例 #1
0
        public static object SwapADF(object[] arguments)
        {
            try
            {
                FsuipcSdk.Fsuipc fsuipc = new FsuipcSdk.Fsuipc();
                int result = 0;
                if (fsuipc.FSUIPC_Open(FsuipcSdk.Fsuipc.SIM_ANY, ref result))
                {
                    // odczytanie ustawień ADF1
                    int adf1btoken = 0;
                    fsuipc.FSUIPC_Read(0x034C, 2, ref adf1btoken, ref result);
                    int adf1etoken = 0;
                    fsuipc.FSUIPC_Read(0x0356, 2, ref adf1etoken, ref result);

                    // odczytanie ustaiwń ADF2
                    int adf2btoken = 0;
                    fsuipc.FSUIPC_Read(0x02D4, 2, ref adf2btoken, ref result);
                    int adf2etoken = 0;
                    fsuipc.FSUIPC_Read(0x02D6, 2, ref adf2etoken, ref result);

                    fsuipc.FSUIPC_Process(ref result);

                    // pobranie wartości
                    short adf1b = 0;
                    fsuipc.FSUIPC_Get(ref adf1btoken, ref adf1b);
                    short adf1e = 0;
                    fsuipc.FSUIPC_Get(ref adf1etoken, ref adf1e);
                    short adf2b = 0;
                    fsuipc.FSUIPC_Get(ref adf2btoken, ref adf2b);
                    short adf2e = 0;
                    fsuipc.FSUIPC_Get(ref adf2etoken, ref adf2e);

                    // zamiana wartości
                    short tmp = 0;
                    tmp   = adf1b;
                    adf1b = adf2b;
                    adf2b = tmp;
                    tmp   = adf1e;
                    adf1e = adf2e;
                    adf2e = tmp;

                    // zapisanie
                    fsuipc.FSUIPC_Write(0x034C, adf1b, ref adf1btoken, ref result);
                    fsuipc.FSUIPC_Write(0x0356, adf1e, ref adf1etoken, ref result);
                    fsuipc.FSUIPC_Write(0x02D4, adf2b, ref adf2btoken, ref result);
                    fsuipc.FSUIPC_Write(0x02D6, adf2e, ref adf2etoken, ref result);

                    fsuipc.FSUIPC_Process(ref result);

                    fsuipc.FSUIPC_Close();
                }
            }
            catch
            {
            }
            return(true);
        }
コード例 #2
0
        public static object GetOffsetValue(object [] arguments)
        {
            object result = (int)0;

            int offset = (int)arguments[0];
            int size   = (int)arguments[1];
            int type   = 0;

            if (arguments.Length > 2)
            {
                type = (int)arguments[2];
            }

            try
            {
                FsuipcSdk.Fsuipc fsuipc = new FsuipcSdk.Fsuipc();
                int dwresult            = 0;
                if (fsuipc.FSUIPC_Open(FsuipcSdk.Fsuipc.SIM_ANY, ref dwresult))
                {
                    int token = 0;
                    if (fsuipc.FSUIPC_Read(offset, size, ref token, ref dwresult))
                    {
                        if (fsuipc.FSUIPC_Process(ref dwresult))
                        {
                            switch (type)
                            {
                            // liczba
                            case 0:

                                switch (size)
                                {
                                case 1:
                                    byte bv = 0;
                                    fsuipc.FSUIPC_Get(ref token, ref bv);
                                    return((int)bv);

                                case 2:
                                    short sv = 0;
                                    fsuipc.FSUIPC_Get(ref token, ref sv);
                                    return((int)sv);
                                }
                                break;
                            }
                        }
                    }

                    fsuipc.FSUIPC_Close();
                }
            }
            catch
            {
            }

            return(result);
        }
コード例 #3
0
        public override int SetValue(object value, FsuipcSdk.Fsuipc fsuipc)
        {
            //Debug.WriteLine(string.Format("FS Write: Offset = {0}, Value = {1}", Offset, value));
            // przetworzenie wartości
            int iv = (int)value;

            int result = FsuipcSdk.Fsuipc.FSUIPC_ERR_OK;

            switch (FSType)
            {
            case FSDataType.Byte:
                byte b = (byte)iv;
                if (_firstSet || Math.Abs(_bValue - b) >= Change)
                {
                    _bValue = b;
                    bool rrr = fsuipc.FSUIPC_Write(Offset, _bValue, ref Token, ref result);
                    Debug.WriteLine(string.Format("FS Write (byte), {0}, {1}, {2}", Offset, _bValue, rrr));
                }
                break;

            case FSDataType.Short:
                short s = (short)iv;
                if (_firstSet || Math.Abs(_sValue - s) >= Change)
                {
                    _sValue = s;
                    bool rrr = fsuipc.FSUIPC_Write(Offset, _sValue, ref Token, ref result);
                    Debug.WriteLine(string.Format("FS Write (short), {0}, {1}, {2}", Offset, _sValue, rrr));
                }
                break;

            case FSDataType.Int:
                if (_firstSet || Math.Abs(_iValue - iv) >= Change)
                {
                    _iValue = iv;
                    fsuipc.FSUIPC_Write(Offset, _iValue, ref Token, ref result);
                }
                break;

            case FSDataType.Long:
                long l = BitConverter.DoubleToInt64Bits((double)iv);
                if (_firstSet || Math.Abs(_lValue - l) >= Change)
                {
                    _lValue = l;
                    fsuipc.FSUIPC_Write(Offset, _lValue, ref Token, ref result);
                }
                break;

            default:
                throw new Exception();
            }
            _firstSet = false;
            return(result);
        }
コード例 #4
0
        public override int SetValue(object value, FsuipcSdk.Fsuipc fsuipc)
        {
            Debug.WriteLine(string.Format("FS Write: Offset = {0}", Offset));
            // przetworzenie wartości
            double dv = (double)value;

            int result = FsuipcSdk.Fsuipc.FSUIPC_ERR_OK;

            switch (FSType)
            {
            case FSDataType.Byte:
                byte b = (byte)dv;
                if (Math.Abs(_bValue - b) >= Change)
                {
                    _bValue = b;
                    fsuipc.FSUIPC_Write(Offset, _bValue, ref Token, ref result);
                }
                break;

            case FSDataType.Short:
                short s = (short)dv;
                if (Math.Abs(_sValue - s) >= Change)
                {
                    _sValue = s;
                    fsuipc.FSUIPC_Write(Offset, _sValue, ref Token, ref result);
                }
                break;

            case FSDataType.Int:
                int i = (int)dv;
                if (Math.Abs(_iValue - i) >= Change)
                {
                    _iValue = i;
                    fsuipc.FSUIPC_Write(Offset, _iValue, ref Token, ref result);
                }
                break;

            case FSDataType.Long:
                long l = BitConverter.DoubleToInt64Bits(dv);
                if (Math.Abs(_lValue - l) >= Change)
                {
                    _lValue = l;
                    fsuipc.FSUIPC_Write(Offset, _lValue, ref Token, ref result);
                }
                break;

            default:
                throw new Exception();
            }
            return(result);
        }
コード例 #5
0
        private static bool _MovePlaneToGateID(int id)
        {
            LoadGates();
            Gate gate = __gates.Find(delegate(Gate o)
            {
                return(o.ID == id);
            });

            if (gate != null)
            {
                // ustawienie samolotu

                // połączenie z FSUIPC itp.
                try
                {
                    FsuipcSdk.Fsuipc fsuipc = new FsuipcSdk.Fsuipc();
                    int result = 0;
                    if (fsuipc.FSUIPC_Open(FsuipcSdk.Fsuipc.SIM_ANY, ref result))
                    {
                        // włączenie SLEW MODE
                        int token = 0;
                        fsuipc.FSUIPC_Write(0x05dc, (short)1, ref token, ref result);
                        fsuipc.FSUIPC_Process(ref result);

                        // przeniesienie samolotu na wybraną pozycję
                        double off = 90d / (10001750d * 65536d * 65536d);                        // 42957189152768000d;
                        long   lat = (long)(gate.Latitude / off);
                        off = 360d / (65536d * 65536d * 65536d * 65536d);
                        long lon = (long)(gate.Longitude / off);
                        fsuipc.FSUIPC_Write(0x0560, lat, ref token, ref result);
                        fsuipc.FSUIPC_Write(0x0568, lon, ref token, ref result);
                        fsuipc.FSUIPC_Write(0x0580, (uint)(gate.HeadingTrue / (360d / (65536d * 65536d))), ref token, ref result);
                        fsuipc.FSUIPC_Write(0x0570, long.MinValue, ref token, ref result);
                        fsuipc.FSUIPC_Process(ref result);

                        // wyłączenie SLEW MODE
                        fsuipc.FSUIPC_Write(0x05dc, (short)0, ref token, ref result);
                        fsuipc.FSUIPC_Process(ref result);

                        fsuipc.FSUIPC_Close();

                        return(true);
                    }
                }
                catch
                {
                }
            }
            return(false);
        }
コード例 #6
0
 public override int SetValue(object value, FsuipcSdk.Fsuipc fsuipc)
 {
     if (_listenForChange)
     {
         _state = (bool)value != _lastState;
         if (_state)
         {
             _lastState = (bool)value;
         }
     }
     else
     {
         _state = (bool)value;
     }
     return(FsuipcSdk.Fsuipc.FSUIPC_ERR_OK);
 }
コード例 #7
0
        public static object ChangeADF(object [] arguments)
        {
            int adfOffset = (int)arguments[0] < 1 ? 0x034C : 0x02D4;
            int change    = (int)arguments[1];

            try
            {
                FsuipcSdk.Fsuipc fsuipc = new FsuipcSdk.Fsuipc();
                int result = 0;
                if (fsuipc.FSUIPC_Open(FsuipcSdk.Fsuipc.SIM_ANY, ref result))
                {
                    // odczytanie ustawień ADF
                    int adfbtoken = 0;
                    fsuipc.FSUIPC_Read(adfOffset, 2, ref adfbtoken, ref result);

                    fsuipc.FSUIPC_Process(ref result);

                    // pobranie wartości
                    short adfb = 0;
                    fsuipc.FSUIPC_Get(ref adfbtoken, ref adfb);

                    int iv = HexToInt((int)adfb);
                    iv += change;
                    if (iv < 100)
                    {
                        iv += 700;
                    }
                    if (iv > 799)
                    {
                        iv -= 700;
                    }
                    adfb = (short)IntToHex(iv);

                    // zapisanie
                    fsuipc.FSUIPC_Write(adfOffset, adfb, ref adfbtoken, ref result);

                    fsuipc.FSUIPC_Process(ref result);

                    fsuipc.FSUIPC_Close();
                }
            }
            catch
            {
            }
            return(true);
        }
コード例 #8
0
        public override int SetValue(object value, FsuipcSdk.Fsuipc fsuipc)
        {
            int    result = FsuipcSdk.Fsuipc.FSUIPC_ERR_OK;
            string sv     = (string)value;

            if (Change == 0d || _value != sv)
            {
                byte [] vb = Encoding.ASCII.GetBytes(sv);
                if (vb.Length < Size)
                {
                    byte[] vb2 = new byte[Size];
                    Array.Copy(vb, vb2, vb.Length);
                    fsuipc.FSUIPC_Write(Offset, Size, ref vb2, ref Token, ref result);
                }
                else
                {
                    fsuipc.FSUIPC_Write(Offset, Size, ref vb, ref Token, ref result);
                }
                _value = sv;
            }
            return(result);
        }
コード例 #9
0
        private void ProcessingMethod()
        {
            FsuipcSdk.Fsuipc fsuipc    = null;
            bool             connected = false;

            try
            {
                int ret      = 0;
                int interval = _configuration.Settings.Interval;
                int fs       = 0;
                switch (_configuration.Settings.FSVersion)
                {
                case FSVersion.Dowolna:
                    fs = FsuipcSdk.Fsuipc.SIM_ANY;
                    break;

                case FSVersion.FS2002:
                    fs = FsuipcSdk.Fsuipc.SIM_FS2K2;
                    break;

                case FSVersion.FS2004:
                    fs = FsuipcSdk.Fsuipc.SIM_FS2K4;
                    break;

                case FSVersion.FSX:
                    fs = FsuipcSdk.Fsuipc.SIM_FSX;
                    break;

                default:
                    throw new Exception("Nieobsługiwana wersja symulatora '" + _configuration.Settings.FSVersion.ToString() + "'.");
                }
                _log.Log(this, "Próba połączenia z symulatorem w wersji '" + _configuration.Settings.FSVersion.ToString() + "'.");
                fsuipc = new FsuipcSdk.Fsuipc();
                while (_working)
                {
                    if (fsuipc.FSUIPC_Open(fs, ref ret))
                    {
                        _log.Log(this, "Połączono z symulatorem w wersji '" + _configuration.Settings.FSVersion.ToString() + "'.");
                        connected = true;
                        break;
                    }
                    Thread.Sleep(100);
                }

                List <VariableToWrite> vars = new List <VariableToWrite>();
                _signal.Set();
                while (_working)
                {
                    _signal.WaitOne();
                    if (!_working)
                    {
                        break;
                    }

                    // pobranie tablicy z wartościami do zapisu
                    lock (_syncQueue)
                    {
                        while (_writeQueue.Count > 0)
                        {
                            vars.Add(_writeQueue.Dequeue());
                        }
                    }
                    _signal.Reset();
                    if (vars.Count > 0)
                    {
                        int ile = 0;
                        while (vars.Count > 0)
                        {
                            VariableToWrite v = vars[0];
                            if (!(v.Variable is SpecialOutputVariable))
                            {
                                ile++;
                            }
                            ret = v.Variable.SetValue(v.Value, fsuipc);
                            if (ret != FsuipcSdk.Fsuipc.FSUIPC_ERR_OK)
                            {
                                _log.Log(this, string.Format("Błąd ({0}) podczas zapisywania wartości zmiennej o identyfikatorze '{1}'.", ret, v.Variable.ID));
                            }
                            vars.RemoveAt(0);
                        }

                        if (ile > 0 && (_autoFlush.State || _flush.State))
                        {
                            #if DEBUG
                            _log.Log(this, "FSUIPC_Process");
                            #endif
                            if (!fsuipc.FSUIPC_Process(ref ret))
                            {
                                _log.Log(this, string.Format("Błąd ({0}) podczas wysyłania wartości do symulatora.", ret));
                            }

                            _flush.Reset();
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                _log.Log(this, ex.ToString());
            }
            finally
            {
                if (fsuipc != null)
                {
                    try
                    {
                        fsuipc.FSUIPC_Close();
                        if (connected)
                        {
                            _log.Log(this, "Rozłączono z symulatorem '" + _configuration.Settings.FSVersion.ToString() + "'.");
                        }
                    }
                    catch { }
                }
            }
        }
コード例 #10
0
        private void ProcessingMethod()
        {
            FsuipcSdk.Fsuipc fsuipc    = null;
            bool             connected = false;

            try
            {
                int ret      = 0;
                int interval = _configuration.Settings.Interval;
                int fs       = 0;
                switch (_configuration.Settings.FSVersion)
                {
                case FSVersion.Dowolna:
                    fs = FsuipcSdk.Fsuipc.SIM_ANY;
                    break;

                case FSVersion.FS2002:
                    fs = FsuipcSdk.Fsuipc.SIM_FS2K2;
                    break;

                case FSVersion.FS2004:
                    fs = FsuipcSdk.Fsuipc.SIM_FS2K4;
                    break;

                case FSVersion.FSX:
                    fs = FsuipcSdk.Fsuipc.SIM_FSX;
                    break;

                default:
                    throw new Exception("Nieobsługiwana wersja symulatora '" + _configuration.Settings.FSVersion.ToString() + "'.");
                }
                _log.Log(this, "Próba połączenia z symulatorem w wersji '" + _configuration.Settings.FSVersion.ToString() + "'.");
                fsuipc = new FsuipcSdk.Fsuipc();
                while (_working)
                {
                    if (fsuipc.FSUIPC_Open(fs, ref ret))
                    {
                        _log.Log(this, "Połączono z symulatorem w wersji '" + _configuration.Settings.FSVersion.ToString() + "'.");
                        connected = true;
                        break;
                    }
                    Thread.Sleep(100);
                }

                byte   v1 = 0;
                short  v2 = 0;
                int    v4 = 0;
                long   v8 = 0;
                object v  = null;
                bool   ok = false;

                while (_working)
                {
                    //lock (FsuipcSdk.Fsuipc.__FSUIPC_LOCKER)
                    //FsuipcSdk.Fsuipc.__FSUIPC_EVENT.WaitOne();
                    //try
                    {
                        for (int i = 0; i < _spiesVariables.Length; i++)
                        {
                            if (!fsuipc.FSUIPC_Read(_spiesVariables[i].Offset, _spiesVariables[i].Size, ref _spiesVariables[i].Token, ref ret))
                            {
                                _log.Log(this, "Błąd (" + ret.ToString() + " podczas żądania odczytu wartości zmiennej o identyfikatorze '" + _spiesVariables[i].ID + "'.");
                            }
                        }

                        if (!fsuipc.FSUIPC_Process(ref ret))
                        {
                            _log.Log(this, "Błąd (" + ret.ToString() + ") podczas żądania odczytania żądanych wartości.");
                        }
                        else
                        {
                            for (int i = 0; i < _spiesVariables.Length; i++)
                            {
                                switch (_spiesVariables[i].FSType)
                                {
                                case FSDataType.Byte:
                                    ok = fsuipc.FSUIPC_Get(ref _spiesVariables[i].Token, ref v1);
                                    v  = v1;
                                    break;

                                case FSDataType.Short:
                                    ok = fsuipc.FSUIPC_Get(ref _spiesVariables[i].Token, ref v2);
                                    v  = v2;
                                    break;

                                case FSDataType.Int:
                                    ok = fsuipc.FSUIPC_Get(ref _spiesVariables[i].Token, ref v4);
                                    v  = v4;
                                    break;

                                case FSDataType.Long:
                                    ok = fsuipc.FSUIPC_Get(ref _spiesVariables[i].Token, ref v8);
                                    v  = v8;
                                    break;

                                case FSDataType.ByteArray:
                                    byte[] buf = new byte[_spiesVariables[i].Size];
                                    ok = fsuipc.FSUIPC_Get(ref _spiesVariables[i].Token, buf.Length, ref buf);
                                    v  = buf;
                                    break;
                                }

                                if (ok)
                                {
                                    _spiesVariables[i].SetValue(v);
                                }
                                else
                                {
                                    _log.Log(this, "Błąd podczas pobierania wartości zmiennej o identyfikatorze '" + _spiesVariables[i].ID + "', Offset = 0x" + _spiesVariables[i].Offset.ToString("X4") + ".");
                                }
                            }
                        }
                    }
                    //finally
                    //{
                    //    FsuipcSdk.Fsuipc.__FSUIPC_EVENT.Set();
                    //}
                    if (interval > 0)
                    {
                        Thread.Sleep(interval);
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                _log.Log(this, ex.ToString());
            }
            finally
            {
                if (fsuipc != null)
                {
                    try
                    {
                        fsuipc.FSUIPC_Close();
                        if (connected)
                        {
                            _log.Log(this, "Rozłączono z symulatorem '" + _configuration.Settings.FSVersion.ToString() + "'.");
                        }
                    }
                    catch { }
                }
            }
        }
コード例 #11
0
 public abstract int SetValue(object value, FsuipcSdk.Fsuipc fsuipc);