[rleroy] add signal strength meter to 'detectreader' command (HF only)

This commit is contained in:
adam@algroup.co.uk
2009-07-21 11:15:32 +00:00
parent 8e7a6ce409
commit ebd7aaf9e7

View File

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