private void DoEntryPointB(DesFireTransactionTypeEnum desFireTransactionType)
        {
            Task.Run(() =>
            {
                try
                {
                    ProtocolActivation_B().ContinueWith((parentTask) =>
                    {
                        try
                        {
                            if (cancellationTokenForPreProcessing.Token.IsCancellationRequested)
                            {
                                cancellationTokenForPreProcessing.Dispose();
                                return;
                            }

                            DesfireAccessHandler desfireAccess;
                            byte[] sessionKey = new byte[0];
                            switch (desFireTransactionType)
                            {
                            case DesFireTransactionTypeEnum.ProcessTransaction:
                                desfireAccess       = new DesfireAccessHandler(cardQProcessor);
                                CardDetails desfire = desfireAccess.ReadCardDetails();
                                Logger.Log("DesFire Card Details:  " + Environment.NewLine + desfire.ToString());

                                //desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x01 }); //select installed application

                                //sessionKey = desfireAccess.AuthenticateAES();
                                //Logger.Log("Session Key:  " + Formatting.ByteArrayToHexString(sessionKey));

                                //byte[] dataWrittenAndReadBack = desfireAccess.WriteData(sessionKey, 0x01, 0x08);
                                //Logger.Log("Data Written:  " + Formatting.ByteArrayToHexString(dataWrittenAndReadBack));

                                OnProcessCompleted(new DesfireTerminalProcessingOutcome()
                                {
                                    CardDetails               = desfire,
                                    NextProcessState          = EMVTerminalPreProcessingStateEnum.EndProcess,
                                    UIRequestOnOutcomePresent = true,
                                    UserInterfaceRequest      = new UserInterfaceRequest()
                                    {
                                        MessageIdentifier = MessageIdentifiersEnum.ClearDisplay,
                                        Status            = StatusEnum.ReadyToRead
                                    }
                                });
                                break;

                            case DesFireTransactionTypeEnum.InstallApp:
                                desfireAccess = new DesfireAccessHandler(cardQProcessor);
                                //auth to PICC application and get session key
                                //PICC master key setting default does not require authentication to be done before creating an application
                                //we will eventually change this
                                desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x00 });     //select pic application

                                //sessionKey = desfireAccess.AuthenticateAES();
                                //Logger.Log("Session Key:  " + Formatting.ByteArrayToHexString(sessionKey));

                                desfireAccess.GetKeyVersion(0x00);
                                desfireAccess.GetKeySettings();
                                desfireAccess.GetApplicationIDs();
                                desfireAccess.GetFileIDs();

                                desfireAccess.CreateApplication(new byte[] { 0x00, 0x00, 0x01 });
                                desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x01 });     //select installed application
                                desfireAccess.CreateFile(0x01);

                                OnProcessCompleted(new TerminalProcessingOutcome()
                                {
                                    NextProcessState          = EMVTerminalPreProcessingStateEnum.EndProcess,
                                    UIRequestOnOutcomePresent = true,
                                    UserInterfaceRequest      = new UserInterfaceRequest()
                                    {
                                        MessageIdentifier = MessageIdentifiersEnum.ClearDisplay,
                                        Status            = StatusEnum.ReadyToRead
                                    }
                                });
                                break;

                            default:
                                throw new DesFireException("Unrecognised desfire transaction type: " + desFireTransactionType);
                            }
                        }
                        catch (Exception ex)
                        {
                            OnExceptionOccured(ex);
                        }
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
                }
                catch (Exception ex)
                {
                    OnExceptionOccured(ex);
                }
            });
        }
 public void StartTransactionRequest(DesFireTransactionTypeEnum desFireTransactionType)
 {
     cancellationTokenForPreProcessing = new CancellationTokenSource();
     DoEntryPointB(desFireTransactionType);
 }