private void Parser_PacketReady(object sender, EosPacketEventArgs e) { lock (this) { //Console.WriteLine("Packet Received (masterState {0}, responseAddress {1})", _masterState, _resposneAddress); OnPacketReceived(e.Packet); // Check to see if we got the response before we checked for done transmitting if (_masterState == BusMasterState.TRANSMITTING && _resposneAddress != 0xff && !IsWriting) { _masterState = BusMasterState.WAITINGRESPONSE; switch (State) { case EosBusState.TRANSMITTING: State = EosBusState.WAITING_RESPONSE; break; case EosBusState.POLLING: case EosBusState.IDLE: State = _polling ? EosBusState.POLLING : EosBusState.IDLE; break; } } if (_masterState == BusMasterState.WAITINGRESPONSE && e.Packet.Source == _resposneAddress) { _busTimer.Stop(); _masterState = BusMasterState.IDLE; switch (State) { case EosBusState.POLLING: //Console.WriteLine("Polling Received"); if (e.Packet.Data.Count > 0) { EosDevice device = Devices.GetByAddress(e.Packet.Source); device.UpdateState(e.Packet); OnDeviceUpdated(device); } _busTimer.Interval = POLL_INTERVAL; _busTimer.Start(); break; case EosBusState.SCANNING: // Scan found a valid response _devices.Add(new EosDevice(this, e.Packet.Source, e.Packet.Data)); NextScan(); break; case EosBusState.WAITING_RESPONSE: //Console.WriteLine("Response sent"); OnResponseReceived(e.Packet); if (_polling) { State = EosBusState.POLLING; _busTimer.Interval = POLL_INTERVAL; _busTimer.Start(); } else { State = EosBusState.IDLE; } break; } } else if (_masterState == BusMasterState.CLEARINGSCAN) { _masterState = BusMasterState.IDLE; Rescan(); } else if (_masterState == BusMasterState.CLEARINGRESET) { _masterState = BusMasterState.IDLE; Reset(); } else { // Received errored packet when we are not waiting on one. _stats.Collisions++; } } }
public override void ProcessData(byte[] buffer, int offset, int length) { for (int i = 0; i < length; i++) { byte data = buffer[offset + i]; switch (_parseState) { case ParseStates.COMMAND: ProcessCommand(data); break; case ParseStates.MODE: ProcessMode(data); break; case ParseStates.PACKET: _parseBuffer[_parseBufferCount++] = data; if ((_parseBufferCount == 4 && _parseBuffer[3] == 0) || (_parseBufferCount > 4 && _parseBufferCount == (4 + _parseBuffer[3]))) { EosPacket packet = new EosPacket(); packet.Destination = _parseBuffer[0]; packet.Source = _parseBuffer[1]; packet.Command = _parseBuffer[2]; for (int j = 0; j < _parseBuffer[3]; j++) { packet.Add(_parseBuffer[4 + j]); } OnPacketReceived(packet); if (State == EosBusState.WAITING_RESPONSE) { OnResponseReceived(packet); } if (packet.Command == 127 && packet.Data.Count > 0) { EosDevice device = Devices.GetByAddress(packet.Source); device.UpdateState(packet); OnDeviceUpdated(device); } _parseState = ParseStates.COMMAND; //Console.WriteLine(); } break; case ParseStates.ENUMERATIONCOUNT: if (data > 0) { _parseBuffer[0] = data; _parseState = ParseStates.ENUMERATION; } else { _parseState = ParseStates.COMMAND; } break; case ParseStates.ENUMERATION: _parseBuffer[1 + _parseBufferCount++] = data; if (_parseBufferCount == 21) { List <byte> deviceData = new List <byte>(20); for (int j = 0; j < 20; j++) { deviceData.Add(_parseBuffer[2 + j]); } _devices.Add(new EosDevice(this, _parseBuffer[1], deviceData)); _parseBuffer[0]--; _parseBufferCount = 0; if (_parseBuffer[0] == 0) { _parseState = ParseStates.COMMAND; OnBusReset(); //Console.WriteLine(); } } break; default: if (data == 58) { ProcessCommandData(); //Console.WriteLine(); } else { _parseBuffer[_parseBufferCount++] = data; } break; } } }