public override SiDriverState Receive(SiMessageQueue queue, ICommWriter writer, SiHandler siHandler) { siHandler.Notify(CommStatus.Ready); SiMessage message = queue.Take(); siHandler.Notify(CommStatus.Processing); if (!message.Valid()) { return(DISPATCH_READY); } if (message.CommandByte() == SiMessage.SI_CARD_5_DETECTED || message.CommandByte() == SiMessage.SI_CARD_6_PLUS_DETECTED || message.CommandByte() == SiMessage.SI_CARD_8_PLUS_DETECTED) { var bytes = new ByteFrame(message.Data()); if (!siHandler.OnEcardDown(bytes.Block3At(5).ToString())) { return(ACK_READ.Send(writer, siHandler)); } } switch (message.CommandByte()) { case SiMessage.SI_CARD_5_DETECTED: return(RETRIEVE_SICARD_5_DATA.Retrieve(queue, writer, siHandler)); case SiMessage.SI_CARD_6_PLUS_DETECTED: return(RETRIEVE_SICARD_6_DATA.Retrieve(queue, writer, siHandler)); case SiMessage.SI_CARD_8_PLUS_DETECTED: return(DispatchSicard8Plus(message, queue, writer, siHandler)); case SiMessage.BEEP: break; case SiMessage.SI_CARD_REMOVED: GecoSiLogger.Debug("Late removal " + message); break; default: GecoSiLogger.Debug("Unexpected message " + message); break; } return(DISPATCH_READY); }