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();
            }