예제 #1
0
        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++;
                }
            }
        }
예제 #2
0
        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;
                }
            }
        }