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()"); } }
//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; } }
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; } } }
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; } }
internal DCSProtocolParser(IDCSDataListenerInterface dcsDataListenerInterface) { _dcsDataListenerInterface = dcsDataListenerInterface; _state = DCSBiosStateEnum.WAIT_FOR_SYNC; _syncByteCount = 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()"); } }