#include <proxmark3.h>
+#include <stdlib.h>
#include "apps.h"
#ifdef WITH_LCD
#include "fonts.h"
MeasureAntennaTuning();
break;
+ case CMD_LISTEN_READER_FIELD:
+ ListenReaderField(c->ext1);
+ break;
+
case CMD_HID_DEMOD_FSK:
CmdHIDdemodFSK(); // Demodulate HID tag
break;
WDT_HIT();
}
}
+
+// listen for external reader
+void ListenReaderField(int limit)
+{
+ int lf_av, lf_av_new, lf_baseline= -1, lf_count= 0;
+ int hf_av, hf_av_new, hf_baseline= -1, hf_count= 0;
+
+#define LF_ONLY 1
+#define HF_ONLY 2
+
+ LED_A_OFF();
+ LED_B_OFF();
+ LED_C_OFF();
+ LED_D_OFF();
+
+ lf_av= ReadAdc(ADC_CHAN_LF);
+
+ if(limit != HF_ONLY && lf_baseline == -1)
+ {
+ DbpString("LF 125/134 Baseline:");
+ DbpIntegers(lf_av,0,0);
+ lf_baseline= lf_av;
+ }
+
+ hf_av= ReadAdc(ADC_CHAN_HF);
+
+
+ if (limit != LF_ONLY && hf_baseline == -1)
+ {
+ DbpString("HF 13.56 Baseline:");
+ DbpIntegers(hf_av,0,0);
+ hf_baseline= hf_av;
+ }
+
+ for(;;)
+ {
+ if(BUTTON_PRESS())
+ {
+ LED_B_OFF();
+ LED_D_OFF();
+ return;
+ }
+ WDT_HIT();
+
+
+ if (limit != HF_ONLY)
+ {
+ if (abs(lf_av - lf_baseline) > 10)
+ LED_D_ON();
+ else
+ LED_D_OFF();
+ ++lf_count;
+ lf_av_new= ReadAdc(ADC_CHAN_LF);
+ // see if there's a significant change
+ if(abs(lf_av - lf_av_new) > 10)
+ {
+ DbpString("LF 125/134 Field Change:");
+ DbpIntegers(lf_av,lf_av_new,lf_count);
+ lf_av= lf_av_new;
+ lf_count= 0;
+ }
+ }
+
+ if (limit != LF_ONLY)
+ {
+ if (abs(hf_av - hf_baseline) > 10)
+ LED_B_ON();
+ else
+ LED_B_OFF();
+ ++hf_count;
+ hf_av_new= ReadAdc(ADC_CHAN_HF);
+ // see if there's a significant change
+ if(abs(hf_av - hf_av_new) > 10)
+ {
+ DbpString("HF 13.56 Field Change:");
+ DbpIntegers(hf_av,hf_av_new,hf_count);
+ hf_av= hf_av_new;
+ hf_count= 0;
+ }
+ }
+ }
+}
void SpinDelayUs(int us);\r
void ToSendStuffBit(int b);\r
void ToSendReset(void);\r
+void ListenReaderField(int limit);
void AcquireRawAdcSamples125k(BOOL at134khz);
void DoAcquisition125k(BOOL at134khz);
extern int ToSendMax;\r
// For measurements of the antenna tuning\r
#define CMD_MEASURE_ANTENNA_TUNING 0x0400\r
#define CMD_MEASURED_ANTENNA_TUNING 0x0401\r
+#define CMD_LISTEN_READER_FIELD 0x0402
\r
// For direct FPGA control\r
#define CMD_FPGA_MAJOR_MODE_OFF 0x0500 // ## FPGA Control\r
SendCommand(&c, FALSE);\r
}\r
\r
+static void CmdDetectReader(char *str)\r
+{\r
+ UsbCommand c;\r
+ // 'l' means LF - 125/134 kHz\r
+ if(*str == 'l') {\r
+ c.ext1 = 1;\r
+ } else if (*str == 'h') {\r
+ c.ext1 = 2;\r
+ } else if (*str != '\0') {\r
+ PrintToScrollback("use 'detectreader' or 'detectreader l' or 'detectreader h'");\r
+ return;\r
+ }\r
+ c.cmd = CMD_LISTEN_READER_FIELD;\r
+ SendCommand(&c, FALSE);\r
+}\r
+\r
/* send a command before reading */\r
static void CmdLoCommandRead(char *str)\r
{\r
"buffclear", CmdBuffClear,0, " Clear sample buffer and graph window",\r
"dec", CmdDec,1, " Decimate samples",\r
"detectclock", Cmddetectclockrate,1, " Detect clock rate",\r
+ "detectreader", CmdDetectReader,0, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)",\r
"em410xsim", CmdEM410xsim,1, "<UID> -- Simulate EM410x tag",\r
"em410xread", CmdEM410xread,1, "[clock rate] -- Extract ID from EM410x tag",\r
"em410xwatch", CmdEM410xwatch,0, " Watches for EM410x tags",\r