void recvBulk(byte[] buffer) { Logger.Debug("RecvBulk " + BinConvert.ToHex(buffer)); CCID.RDR_to_PC_Block block = new CCID.RDR_to_PC_Block(buffer); Logger.Debug("Calling child's RDR_to_PC"); Children[block.Slot].RDR_to_PC(block); Logger.Debug("Done with child's RDR_to_PC"); }
public void RDR_to_PC(CCID.RDR_to_PC_Block block) { LastResponse = block; Logger.Trace("RDR_to_PC>" + BinConvert.ToHex(block.Message) + " " + BinConvert.ToHex(block.Status) + " " + BinConvert.ToHex(block.Error) + " " + BinConvert.ToHex(block.Data)); SlotState localState; lock (slotLocker) { localState = slotState; } switch (block.Status & 0x03) { case 0: if ((localState == SlotState.CardPowerUpPending) && (block.Message == CCID.RDR_TO_PC_DATABLOCK)) { cardAtr = block.Data; Logger.Trace("Card ATR is " + BinConvert.ToHex(cardAtr)); localState = SlotState.CardPowered; } break; case 1: localState = SlotState.CardUnpowered; break; case 2: localState = SlotState.CardAbsent; break; default: break; } lock (slotLocker) { if (localState != slotState) { Logger.Trace("New state is " + localState.ToString()); slotState = localState; } } ExchangeDoneEvent.Set(); }