public void KeyboardWedge(ResponseFrame frame, Exception e)
        {
            DetectSingleNdef repeatRead  = new DetectSingleNdef(0, DetectTagSetting.Type2Type4AandMifare);
            bool             textEntered = false;

            if (CheckForErrorsOrTimeout(frame, e))
            {
                tappy.SendCommand(repeatRead, InvokeKeyboardFeature);
                return;
            }
            else if (frame.CompareCommandFamilies(new byte[] { 0x00, 0x01 }) && frame.ResponseCode == 0x02)
            {
                try
                {
                    byte[] data = frame.Data;
                    byte[] buf  = new byte[data.Length - data[1] - 2];

                    if (buf.Length > 0)
                    {
                        Array.Copy(data, 2 + data[1], buf, 0, buf.Length);

                        NdefMessage message = NdefMessage.FromByteArray(buf);

                        int numRecords = message.Count;
                        int recordNum  = 1;

                        foreach (NdefRecord record in message)
                        {
                            string type = Encoding.UTF8.GetString(record.Type);
                            textEntered = false;
                            if (record.TypeNameFormat == NdefRecord.TypeNameFormatType.NfcRtd && type.Equals("T") && recordTypes.Contains(RecordType.TEXT))
                            {
                                NdefTextRecord textRecord = new NdefTextRecord(record);
                                System.Windows.Forms.SendKeys.SendWait(textRecord.Text);
                                textEntered = true;
                            }
                            else if ((record.TypeNameFormat == NdefRecord.TypeNameFormatType.NfcRtd && type.Equals("U") && recordTypes.Contains(RecordType.URI)) ||
                                     (record.TypeNameFormat == NdefRecord.TypeNameFormatType.Uri && recordTypes.Contains(RecordType.URI)))
                            {
                                NdefUriRecord uriRecord = new NdefUriRecord(record);
                                System.Windows.Forms.SendKeys.SendWait(uriRecord.Uri);
                                textEntered = true;
                            }
                            else if ((record.TypeNameFormat == NdefRecord.TypeNameFormatType.ExternalRtd && recordTypes.Contains(RecordType.EXTERNAL)) ||
                                     (record.TypeNameFormat == NdefRecord.TypeNameFormatType.Mime && recordTypes.Contains(RecordType.MIME)))
                            {
                                System.Windows.Forms.SendKeys.SendWait(Encoding.UTF8.GetString(record.Payload));
                                textEntered = true;
                            }

                            if (textEntered == true && formModeActive == true)
                            {
                                if (recordNum == numRecords)
                                {
                                    System.Windows.Forms.SendKeys.SendWait("{ENTER}");
                                }
                                else
                                {
                                    System.Windows.Forms.SendKeys.SendWait("{TAB}");
                                }
                            }
                            else if (textEntered == true)
                            {
                                if (controlCharacters.Contains(ControlCharacter.CRLF))
                                {
                                    System.Windows.Forms.SendKeys.SendWait("{ENTER}");
                                }
                                if (controlCharacters.Contains(ControlCharacter.TAB))
                                {
                                    System.Windows.Forms.SendKeys.SendWait("{TAB}");
                                }
                            }

                            recordNum++;
                        }

                        if (textEntered)
                        {
                            Thread.Sleep(scanStaggerMs);
                        }
                    }
                    tappy.SendCommand(repeatRead, InvokeKeyboardFeature);
                    return;
                }
                catch
                {
                    Console.WriteLine("Error Parsing NDEF Response From Tappy");
                }
            }
            else
            {
                Console.WriteLine("Invalid TCMP Response From Tappy (i.e not the command family and response code expected)");
            }
        }