]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
[rleroy] add signal strength meter to 'detectreader' command (HF only)
authoradam@algroup.co.uk <adam@algroup.co.uk@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Tue, 21 Jul 2009 11:15:32 +0000 (11:15 +0000)
committeradam@algroup.co.uk <adam@algroup.co.uk@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Tue, 21 Jul 2009 11:15:32 +0000 (11:15 +0000)
armsrc/appmain.c

index a5c082e59e9325cd0ff138d55454063ce3388128..f42b0209992aca2121d268806746078cac0ec639 100644 (file)
@@ -1090,85 +1090,168 @@ void SamyRun()
 }
 
 
-// listen for external reader
-void ListenReaderField(int limit)
-{
-       int lf_av, lf_av_new, lf_baseline= 0, lf_count= 0;
-       int hf_av, hf_av_new,  hf_baseline= 0, 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)
-               {
-               DbpString("LF 125/134 Baseline:");
-               DbpIntegers(lf_av,0,0);
-               lf_baseline= lf_av;
-               }
-
-       hf_av= ReadAdc(ADC_CHAN_HF);
-
-
-       if (limit != LF_ONLY)
-               {
-               DbpString("HF 13.56 Baseline:");
-               DbpIntegers(hf_av,0,0);
-               hf_baseline= hf_av;
-               }
-
-       for(;;)
-               {
-               if(BUTTON_PRESS())
-                       {
-                       DbpString("Stopped");
-                       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;
-                               }
-                       }
-               }
-}
+/* \r
+OBJECTIVE\r
+Listen and detect an external reader. Determine the best location\r
+for the antenna.\r
+\r
+INSTRUCTIONS:\r
+Inside the ListenReaderField() function, there is two mode. \r
+By default, when you call the function, you will enter mode 1.\r
+If you press the PM3 button one time, you will enter mode 2.\r
+If you press the PM3 button a second time, you will exit the function.\r
+\r
+DESCRIPTION OF MODE 1:\r
+This mode just listens for an external reader field and lights up green \r
+for HF and/or red for LF. This is the original mode of the detectreader\r
+function.\r
+\r
+DESCRIPTION OF MODE 2:\r
+This mode will visually represent, using the LEDs, the actual strength of the\r
+current compared to the maximum current detected. Basically, once you know \r
+what kind of external reader is present, it will help you spot the best location to place\r
+your antenna. You will probably not get some good results if there is a LF and a HF reader\r
+at the same place! :-)\r
+\r
+LIGHT SCHEME USED:\r
+\r
+Light scheme | Descriptiong\r
+----------------------------------------------------\r
+    ----     | No field detected\r
+    X---     | 14% of maximum current detected\r
+    -X--     | 29% of maximum current detected\r
+    --X-     | 43% of maximum current detected\r
+    ---X     | 57% of maximum current detected\r
+    --XX     | 71% of maximum current detected\r
+    -XXX     | 86% of maximum current detected\r
+    XXXX     | 100% of maximum current detected\r
+\r
+TODO:\r
+Add the LF part for MODE 2\r
+\r
+*/\r
+void ListenReaderField(int limit)\r
+{\r
+       int lf_av, lf_av_new, lf_baseline= 0, lf_count= 0;\r
+       int hf_av, hf_av_new,  hf_baseline= 0, hf_count= 0, hf_max;\r
+       int mode=1;\r
+\r
+#define LF_ONLY                1\r
+#define HF_ONLY                2\r
+\r
+       LED_A_OFF();\r
+       LED_B_OFF();\r
+       LED_C_OFF();\r
+       LED_D_OFF();\r
+\r
+       lf_av= ReadAdc(ADC_CHAN_LF);\r
+\r
+       if(limit != HF_ONLY) \r
+               {\r
+               DbpString("LF 125/134 Baseline:");\r
+               DbpIntegers(lf_av,0,0);\r
+               lf_baseline= lf_av;\r
+               }\r
+\r
+       hf_av=hf_max=ReadAdc(ADC_CHAN_HF);\r
+\r
+       if (limit != LF_ONLY) \r
+               {\r
+               DbpString("HF 13.56 Baseline:");\r
+               DbpIntegers(hf_av,0,0);\r
+               hf_baseline= hf_av;\r
+               }\r
+\r
+       for(;;) \r
+               {\r
+               if (BUTTON_PRESS()) {\r
+                       SpinDelay(500);\r
+                       switch (mode) {\r
+                               case 1:\r
+                                       mode=2;\r
+                                       DbpString("Signal Strength Mode");
+                                       break;\r
+                               case 2:\r
+                               default:\r
+                                       DbpString("Stopped");\r
+                                       LED_A_OFF();\r
+                                       LED_B_OFF();\r
+                                       LED_C_OFF();\r
+                                       LED_D_OFF();\r
+                                       return;\r
+                                       break;\r
+                       }\r
+               }\r
+               WDT_HIT();\r
+\r
+               if (limit != HF_ONLY) \r
+                       {\r
+                       if (abs(lf_av - lf_baseline) > 10)\r
+                               LED_D_ON();\r
+                       else\r
+                               LED_D_OFF();\r
+                       ++lf_count;\r
+                       lf_av_new= ReadAdc(ADC_CHAN_LF);\r
+                       // see if there's a significant change\r
+                       if(abs(lf_av - lf_av_new) > 10) \r
+                               {\r
+                               DbpString("LF 125/134 Field Change:");\r
+                               DbpIntegers(lf_av,lf_av_new,lf_count);\r
+                               lf_av= lf_av_new;\r
+                               lf_count= 0;\r
+                               }\r
+                       }\r
+\r
+               if (limit != LF_ONLY) \r
+                       {\r
+                       if (abs(hf_av - hf_baseline) > 10) {\r
+                               if (mode == 1)\r
+                                       LED_B_ON();\r
+                               if (mode == 2) {\r
+                                       if ( hf_av>(hf_max/7)*6) {\r
+                                               LED_A_ON();     LED_B_ON();     LED_C_ON();     LED_D_ON();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*5) && (hf_av<=(hf_max/7)*6) ) {\r
+                                               LED_A_ON();     LED_B_ON();     LED_C_OFF(); LED_D_ON();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*4) && (hf_av<=(hf_max/7)*5) ) {\r
+                                               LED_A_OFF(); LED_B_ON(); LED_C_OFF(); LED_D_ON();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*3) && (hf_av<=(hf_max/7)*4) ) {\r
+                                               LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); LED_D_ON();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*2) && (hf_av<=(hf_max/7)*3) ) {\r
+                                               LED_A_OFF(); LED_B_ON(); LED_C_OFF(); LED_D_OFF();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*1) && (hf_av<=(hf_max/7)*2) ) {\r
+                                               LED_A_ON();     LED_B_OFF(); LED_C_OFF(); LED_D_OFF();\r
+                                       }\r
+                                       if ( (hf_av>(hf_max/7)*0) && (hf_av<=(hf_max/7)*1) ) {\r
+                                               LED_A_OFF(); LED_B_OFF(); LED_C_ON(); LED_D_OFF();\r
+                                       }\r
+                               } \r
+                       } else {\r
+                               if (mode == 1) {\r
+                                       LED_B_OFF();\r
+                               }\r
+                               if (mode == 2) {\r
+                                       LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); LED_D_OFF();\r
+                               }\r
+                       }\r
+\r
+                       ++hf_count;\r
+                       hf_av_new= ReadAdc(ADC_CHAN_HF);\r
+                       // see if there's a significant change\r
+                       if(abs(hf_av - hf_av_new) > 10) \r
+                               {\r
+                               DbpString("HF 13.56 Field Change:");\r
+                               DbpIntegers(hf_av,hf_av_new,hf_count);\r
+                               hf_av= hf_av_new;\r
+                               if (hf_av > hf_max)\r
+                                       hf_max = hf_av;\r
+                               hf_count= 0;\r
+                               }\r
+                       }\r
+               }\r
+}\r
+\r
Impressum, Datenschutz