private DCSBIOSProtocolParser()
 {
     _state                  = DCSBiosStateEnum.WAIT_FOR_SYNC;
     _syncByteCount          = 0;
     DCSBIOSProtocolParserSO = this;
     _shutdown               = false;
 }
        internal void ProcessByte(byte b)
        {
            try
            {
                switch (_state)
                {
                case DCSBiosStateEnum.WAIT_FOR_SYNC:
                    /* do nothing */
                    break;

                case DCSBiosStateEnum.ADDRESS_LOW:
                    _address = b;
                    _state   = DCSBiosStateEnum.ADDRESS_HIGH;
                    break;

                case DCSBiosStateEnum.ADDRESS_HIGH:
                    _address = (uint)(b << 8) | _address;
                    _state   = _address != 0x5555 ? DCSBiosStateEnum.COUNT_LOW : DCSBiosStateEnum.WAIT_FOR_SYNC;
                    break;

                case DCSBiosStateEnum.COUNT_LOW:
                    _count = b;
                    _state = DCSBiosStateEnum.COUNT_HIGH;
                    break;

                case DCSBiosStateEnum.COUNT_HIGH:
                    _count = (uint)(b << 8) | _count;
                    _state = DCSBiosStateEnum.DATA_LOW;
                    break;

                case DCSBiosStateEnum.DATA_LOW:
                    _data = b;
                    _count--;
                    _state = DCSBiosStateEnum.DATA_HIGH;
                    break;

                case DCSBiosStateEnum.DATA_HIGH:
                    _data = (uint)(b << 8) | _data;
                    _count--;
                    //_iDcsBiosDataListener.DcsBiosDataReceived(_address, _data);
                    if (OnDcsDataAddressValue != null && IsBroadcastable(_address) && _data != 0x55)
                    {
                        /*if (_address == 25332)
                         * {
                         *  Debug.Print("SENDING FROM DCS-BIOS address & value --> " + _address + "  " + _data);
                         * }*/
                        try
                        {
                            OnDcsDataAddressValue?.Invoke(this, new DCSBIOSDataEventArgs()
                            {
                                Address = _address, Data = _data
                            });
                        }
                        catch (Exception e)
                        {
                            if (!_errorsLogged.Contains(e.Message))
                            {
                                Common.LogError(e, "Error in DCS-BIOS stream. This error will be logged *just once*.");
                                _errorsLogged.Add(e.Message);
                            }
                        }
                    }
                    _address += 2;
                    if (_count == 0)
                    {
                        _state = DCSBiosStateEnum.ADDRESS_LOW;
                    }
                    else
                    {
                        _state = DCSBiosStateEnum.DATA_LOW;
                    }
                    break;
                }
                if (b == 0x55)
                {
                    //Console.WriteLine(Environment.TickCount - ticks);
                    //ticks = Environment.TickCount;
                    _syncByteCount++;
                }
                else
                {
                    _syncByteCount = 0;
                }
                if (_syncByteCount == 4)
                {
                    _state         = DCSBiosStateEnum.ADDRESS_LOW;
                    _syncByteCount = 0;
                }
            }
            catch (Exception e)
            {
                Common.LogError(e, "DCSBIOSProtocolParser.ProcessByte()");
            }
        }
Example #3
0
        //private int Deserialize(string ident)
        //{
        //    int value = -1;

        //    using (FileStream fs = File.OpenRead((Folder + @"\" + AirPlane + ".bin").FreePiePath()))
        //    using (BinaryReader reader = new BinaryReader(fs))
        //    {
        //        int count = reader.ReadInt32();
        //        for (int n = 0; n < count; n++)
        //        {
        //            var key = reader.ReadString();
        //            var val = reader.ReadInt32();
        //            if (key.Equals(ident))
        //            {
        //                value = val;
        //                break;
        //            }
        //        }
        //    }
        //    return value;
        //}
        private void ProcessByte(byte b)
        {
            //using (BinaryWriter bx = new BinaryWriter(File.Open(@"E:\file.bin", FileMode.Append)))
            //{
            //    bx.Write(b);
            //}

            switch (_state)
            {
            case DCSBiosStateEnum.WAIT_FOR_SYNC:
                /* do nothing */
                break;

            case DCSBiosStateEnum.ADDRESS_LOW:
                _address = b;
                _state   = DCSBiosStateEnum.ADDRESS_HIGH;
                break;

            case DCSBiosStateEnum.ADDRESS_HIGH:
                _address = (uint)(b << 8) | _address;
                _state   = _address != 0x5555 ? DCSBiosStateEnum.COUNT_LOW : DCSBiosStateEnum.WAIT_FOR_SYNC;
                break;

            case DCSBiosStateEnum.COUNT_LOW:
                _count = b;
                _state = DCSBiosStateEnum.COUNT_HIGH;
                break;

            case DCSBiosStateEnum.COUNT_HIGH:
                _count = (uint)(b << 8) | _count;
                _state = DCSBiosStateEnum.DATA_LOW;
                break;

            case DCSBiosStateEnum.DATA_LOW:
                _data = b;
                _count--;
                _state = DCSBiosStateEnum.DATA_HIGH;
                break;

            case DCSBiosStateEnum.DATA_HIGH:
                _data = (b << 8) | _data;
                _count--;

                if (_address > 0x20)                // Dont take Start Data
                {
                    int adr = (int)GetTranslatedAddressToBuffer(_address) >> 1;
                    unsafe
                    {
                        fixed(byte *pBuffer = buffer)
                        {
                            short *pSample = (short *)pBuffer;
                            var    bufdata = (int)pSample[adr];

                            if (_data != bufdata)
                            //if (isok[adr] && _data != bufdata)
                            {
                                lock (_lockObject)
                                {
                                    pSample[adr] = (short)_data;
                                }
                            }
                        }
                    }
                }

                if (_count == 0)
                {
                    _state = DCSBiosStateEnum.ADDRESS_LOW;
                }
                else
                {
                    _address += 2;
                    _state    = DCSBiosStateEnum.DATA_LOW;
                }
                break;
            }
            if (b == 0x55)
            {
                //Console.WriteLine(Environment.TickCount - ticks);
                //ticks = Environment.TickCount;
                _syncByteCount++;
            }
            else
            {
                _syncByteCount = 0;
            }
            if (_syncByteCount == 4)
            {
                _state         = DCSBiosStateEnum.ADDRESS_LOW;
                _syncByteCount = 0;
            }
        }
Example #4
0
        private void RunSensorPoll()
        {
            try
            {
                var ipEndPointReceiver = new IPEndPoint(IPAddress.Any, UdpPortRecept);
                var ipEndPointTablette = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 7776);
                UdpSockRecept = new UdpClient(UdpPortRecept);


                Stopped = false;
                OnStarted(this, new EventArgs());
                var started = DateTime.Now;

                while (!Stopped)
                {
                    byte[] bytes = UdpSockRecept.Receive(ref ipEndPointReceiver);
                    int    len   = bytes.Length;
                    if (len == 0)
                    {
                        continue;
                    }
                    _state         = DCSBiosStateEnum.WAIT_FOR_SYNC;
                    _syncByteCount = 0;
                    //if (len==1)
                    //{
                    //    var unicodeBytes = Encoding.Unicode.GetBytes(stringData + "\n");
                    //    var asciiBytes = new List<byte>(stringData.Length);
                    //    asciiBytes.AddRange(Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes));
                    //    UdpSockSend.Send(asciiBytes.ToArray(), asciiBytes.ToArray().Length, ipEndPointSender);
                    //}
                    //if (len == 3)
                    //{
                    //string d = GetData(4544, 240);
                    //var unicodeBytes = Encoding.Unicode.GetBytes(d);
                    //var asciiBytes = new List<byte>(d.Length);
                    //asciiBytes.AddRange(Encoding.Convert(Encoding.Unicode, Encoding.Default, unicodeBytes));
                    // IPEndPoint EndPointSender = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 7776);
                    //int result = UdpSockSend.Send(asciiBytes.ToArray(), asciiBytes.ToArray().Length, EndPointSender);
                    UdpSockSend.Send(bytes, len, ipEndPointTablette);
                    //continue;
                    //}

                    //UdpSockSend.Send(asciiBytes.ToArray(), asciiBytes.ToArray().Length, ipEndPointSender);

                    //using (BinaryWriter bx = new BinaryWriter(File.Open(@"E:\file.bin", FileMode.Append)))
                    //{
                    //    bx.Write(0x11111111);
                    //    bx.Write(len);
                    //    bx.Write(bytes);
                    //}
                    // Console.WriteLine("debut " + len);
                    for (int i = 0; i < len; i++)
                    {
                        ProcessByte(bytes[i]);
                    }

                    //Console.WriteLine("fin");
                }
            }
            catch (SocketException err)
            {
                // A graceful shutdown calls close socket and throws an exception while blocked in Receive()
                // Ignore this exception unless it was not generated during shutdown sequence
                if (!Stopped)
                {
                    throw err;
                }
            }
        }
Example #5
0
        internal void ProcessByte(byte b)
        {
            switch (_state)
            {
            case DCSBiosStateEnum.WAIT_FOR_SYNC:
                /* do nothing */
                break;

            case DCSBiosStateEnum.ADDRESS_LOW:
                _address = b;
                _state   = DCSBiosStateEnum.ADDRESS_HIGH;
                break;

            case DCSBiosStateEnum.ADDRESS_HIGH:
                _address = (uint)(b << 8) | _address;
                _state   = _address != 0x5555 ? DCSBiosStateEnum.COUNT_LOW : DCSBiosStateEnum.WAIT_FOR_SYNC;
                break;

            case DCSBiosStateEnum.COUNT_LOW:
                _count = b;
                _state = DCSBiosStateEnum.COUNT_HIGH;
                break;

            case DCSBiosStateEnum.COUNT_HIGH:
                _count = (uint)(b << 8) | _count;
                _state = DCSBiosStateEnum.DATA_LOW;
                break;

            case DCSBiosStateEnum.DATA_LOW:
                _data = b;
                _count--;
                _state = DCSBiosStateEnum.DATA_HIGH;
                break;

            case DCSBiosStateEnum.DATA_HIGH:
                _data = (uint)(b << 8) | _data;
                _count--;
                _dcsDataListenerInterface.DcsBiosDataReceived(_address, _data);
                _address += 2;
                if (_count == 0)
                {
                    _state = DCSBiosStateEnum.ADDRESS_LOW;
                }
                else
                {
                    _state = DCSBiosStateEnum.DATA_LOW;
                }
                break;
            }
            if (b == 0x55)
            {
                _syncByteCount++;
            }
            else
            {
                _syncByteCount = 0;
            }
            if (_syncByteCount == 4)
            {
                _state         = DCSBiosStateEnum.ADDRESS_LOW;
                _syncByteCount = 0;
            }
        }
Example #6
0
 internal DCSProtocolParser(IDCSDataListenerInterface dcsDataListenerInterface)
 {
     _dcsDataListenerInterface = dcsDataListenerInterface;
     _state         = DCSBiosStateEnum.WAIT_FOR_SYNC;
     _syncByteCount = 0;
 }
Example #7
0
        internal void ProcessByte(byte b)
        {
            try
            {
                switch (_state)
                {
                case DCSBiosStateEnum.WAIT_FOR_SYNC:
                    /* do nothing */
                    break;

                case DCSBiosStateEnum.ADDRESS_LOW:
                    _address = b;
                    _state   = DCSBiosStateEnum.ADDRESS_HIGH;
                    break;

                case DCSBiosStateEnum.ADDRESS_HIGH:
                    _address = (uint)(b << 8) | _address;
                    _state   = _address != 0x5555 ? DCSBiosStateEnum.COUNT_LOW : DCSBiosStateEnum.WAIT_FOR_SYNC;
                    break;

                case DCSBiosStateEnum.COUNT_LOW:
                    _count = b;
                    _state = DCSBiosStateEnum.COUNT_HIGH;
                    break;

                case DCSBiosStateEnum.COUNT_HIGH:
                    _count = (uint)(b << 8) | _count;
                    _state = DCSBiosStateEnum.DATA_LOW;
                    break;

                case DCSBiosStateEnum.DATA_LOW:
                    _data = b;
                    _count--;
                    _state = DCSBiosStateEnum.DATA_HIGH;
                    break;

                case DCSBiosStateEnum.DATA_HIGH:
                    _data = (uint)(b << 8) | _data;
                    _count--;
                    //_iDcsBiosDataListener.DcsBiosDataReceived(_address, _data);
                    if (OnDcsDataAddressValue != null && IsBroadcastable(_address))
                    {
                        OnDcsDataAddressValue(_address, _data);
                    }
                    _address += 2;
                    if (_count == 0)
                    {
                        _state = DCSBiosStateEnum.ADDRESS_LOW;
                    }
                    else
                    {
                        _state = DCSBiosStateEnum.DATA_LOW;
                    }
                    break;
                }
                if (b == 0x55)
                {
                    //Console.WriteLine(Environment.TickCount - ticks);
                    //ticks = Environment.TickCount;
                    _syncByteCount++;
                }
                else
                {
                    _syncByteCount = 0;
                }
                if (_syncByteCount == 4)
                {
                    _state         = DCSBiosStateEnum.ADDRESS_LOW;
                    _syncByteCount = 0;
                }
            }
            catch (Exception e)
            {
                DBCommon.LogError(924094, e, "DCSBIOSProtocolParser.ProcessByte()");
            }
        }