lf search use new psk, small demod adjustments

adjust thresholds for ask, fsk, io, psk based on more sample testing
adjust indala decode to set clock to 32 if no input (autodetect not
always correct)
This commit is contained in:
marshmellow42 2015-01-09 16:46:17 -05:00
parent c12512e99a
commit ac3ba7ee69
3 changed files with 49 additions and 41 deletions

View file

@ -870,8 +870,12 @@ int PSKnrzDemod(const char *Cmd){
// optional arguments - same as CmdpskNRZrawDemod (clock & invert) // optional arguments - same as CmdpskNRZrawDemod (clock & invert)
int CmdIndalaDecode(const char *Cmd) int CmdIndalaDecode(const char *Cmd)
{ {
int ans;
if (strlen(Cmd)>0)
ans=PSKnrzDemod(Cmd);
else
ans=PSKnrzDemod("32");
int ans=PSKnrzDemod(Cmd);
if (ans < 0){ if (ans < 0){
PrintAndLog("Error1: %d",ans); PrintAndLog("Error1: %d",ans);
return 0; return 0;

View file

@ -110,9 +110,9 @@ int CmdFlexdemod(const char *Cmd)
i = 0; i = 0;
int phase = 0; int phase = 0;
for (bit = 0; bit < 64; bit++) { for (bit = 0; bit < 64; bit++) {
phase = (bits[bit] == 0) ? 0 : 1; phase = (bits[bit] == 0) ? 0 : 1;
int j; int j;
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
GraphBuffer[i++] = phase; GraphBuffer[i++] = phase;
@ -123,7 +123,7 @@ int CmdFlexdemod(const char *Cmd)
RepaintGraphWindow(); RepaintGraphWindow();
return 0; return 0;
} }
int CmdIndalaDemod(const char *Cmd) int CmdIndalaDemod(const char *Cmd)
{ {
// Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID
@ -167,7 +167,7 @@ int CmdIndalaDemod(const char *Cmd)
count = 0; count = 0;
} }
} }
if (rawbit>0){ if (rawbit>0){
PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32); PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32);
PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos); PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos);
@ -198,7 +198,7 @@ int CmdIndalaDemod(const char *Cmd)
break; break;
} }
} }
if (start == rawbit - uidlen + 1) { if (start == rawbit - uidlen + 1) {
PrintAndLog("nothing to wait for"); PrintAndLog("nothing to wait for");
return 0; return 0;
@ -217,7 +217,7 @@ int CmdIndalaDemod(const char *Cmd)
int bit; int bit;
i = start; i = start;
int times = 0; int times = 0;
if (uidlen > rawbit) { if (uidlen > rawbit) {
PrintAndLog("Warning: not enough raw bits to get a full UID"); PrintAndLog("Warning: not enough raw bits to get a full UID");
for (bit = 0; bit < rawbit; bit++) { for (bit = 0; bit < rawbit; bit++) {
@ -235,12 +235,12 @@ int CmdIndalaDemod(const char *Cmd)
} }
times = 1; times = 1;
} }
//convert UID to HEX //convert UID to HEX
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
int idx; int idx;
uid1 = uid2 = 0; uid1 = uid2 = 0;
if (uidlen==64){ if (uidlen==64){
for( idx=0; idx<64; idx++) { for( idx=0; idx<64; idx++) {
if (showbits[idx] == '0') { if (showbits[idx] == '0') {
@ -249,7 +249,7 @@ int CmdIndalaDemod(const char *Cmd)
} else { } else {
uid1=(uid1<<1)|(uid2>>31); uid1=(uid1<<1)|(uid2>>31);
uid2=(uid2<<1)|1; uid2=(uid2<<1)|1;
} }
} }
PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2); PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2);
} }
@ -263,10 +263,10 @@ int CmdIndalaDemod(const char *Cmd)
uid4=(uid4<<1)|(uid5>>31); uid4=(uid4<<1)|(uid5>>31);
uid5=(uid5<<1)|(uid6>>31); uid5=(uid5<<1)|(uid6>>31);
uid6=(uid6<<1)|(uid7>>31); uid6=(uid6<<1)|(uid7>>31);
if (showbits[idx] == '0') if (showbits[idx] == '0')
uid7 = (uid7<<1) | 0; uid7 = (uid7<<1) | 0;
else else
uid7 = (uid7<<1) | 1; uid7 = (uid7<<1) | 1;
} }
PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7); PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
@ -291,7 +291,7 @@ int CmdIndalaDemod(const char *Cmd)
PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen); PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen);
// Remodulating for tag cloning // Remodulating for tag cloning
// HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod) // HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod)
// since this changes graphbuffer data. // since this changes graphbuffer data.
GraphTraceLen = 32*uidlen; GraphTraceLen = 32*uidlen;
i = 0; i = 0;
@ -559,23 +559,37 @@ int CmdLFfind(const char *Cmd)
ans=CmdSamples("20000"); ans=CmdSamples("20000");
} }
if (GraphTraceLen<1000) return 0; if (GraphTraceLen<1000) return 0;
PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag");
PrintAndLog("Checking for known tags:"); PrintAndLog("Checking for known tags:");
ans=Cmdaskmandemod(""); ans=Cmdaskmandemod("");
if (ans>0) return 1; if (ans>0) {
PrintAndLog("Valid EM410x ID Found!");
return 1;
}
ans=CmdFSKdemodHID(""); ans=CmdFSKdemodHID("");
if (ans>0) return 1; if (ans>0) {
PrintAndLog("Valid HID Prox ID Found!");
return 1;
}
ans=CmdFSKdemodIO(""); ans=CmdFSKdemodIO("");
if (ans>0) return 1; if (ans>0) {
PrintAndLog("Valid IO Prox ID Found!");
return 1;
}
//add psk and indala //add psk and indala
ans=CmdIndalaDemod(""); ans=CmdIndalaDecode("");
if (ans>0) return 1; if (ans>0) {
ans=CmdIndalaDemod("224"); PrintAndLog("Valid Indala ID Found!");
if (ans>0) return 1; return 1;
}
// ans=CmdIndalaDemod("224");
// if (ans>0) return 1;
PrintAndLog("No Known Tags Found!\n"); PrintAndLog("No Known Tags Found!\n");
return 0; return 0;
} }
static command_t CommandTable[] = static command_t CommandTable[] =
{ {
{"help", CmdHelp, 1, "This help"}, {"help", CmdHelp, 1, "This help"},
{"cmdread", CmdLFCommandRead, 0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"}, {"cmdread", CmdLFCommandRead, 0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
@ -602,7 +616,7 @@ static command_t CommandTable[] =
int CmdLF(const char *Cmd) int CmdLF(const char *Cmd)
{ {
CmdsParse(CommandTable, Cmd); CmdsParse(CommandTable, Cmd);
return 0; return 0;
} }
int CmdHelp(const char *Cmd) int CmdHelp(const char *Cmd)

View file

@ -300,7 +300,7 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
else if (BinStream[i] < low) else if (BinStream[i] < low)
low = BinStream[i]; low = BinStream[i];
} }
if ((high < 158)){ //throw away static if ((high < 134)){ //throw away static high has to be more than 6 on graph. noise <= -10 here
// PrintAndLog("no data found"); // PrintAndLog("no data found");
return -2; return -2;
} }
@ -407,21 +407,11 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow
{ {
uint32_t last_transition = 0; uint32_t last_transition = 0;
uint32_t idx = 1; uint32_t idx = 1;
uint32_t maxVal=0; //uint32_t maxVal=0;
if (fchigh==0) fchigh=10; if (fchigh==0) fchigh=10;
if (fclow==0) fclow=8; if (fclow==0) fclow=8;
// we do care about the actual theshold value as sometimes near the center of the //set the threshold close to 0 (graph) to avoid static
// wave we may get static that changes direction of wave for one value uint8_t threshold_value = 134; //(uint8_t)(((maxVal-128)*.75)+128);
// if our value is too low it might affect the read. and if our tag or
// antenna is weak a setting too high might not see anything. [marshmellow]
if (size<100) return 0;
for(idx=1; idx<100; idx++){
if(maxVal<dest[idx]) maxVal = dest[idx];
}
// set close to the top of the wave threshold with 25% margin for error
// less likely to get a false transition up there.
// (but have to be careful not to go too high and miss some short waves)
uint8_t threshold_value = (uint8_t)(((maxVal-128)*.75)+128);
// sync to first lo-hi transition, and threshold // sync to first lo-hi transition, and threshold
@ -573,7 +563,7 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
int IOdemodFSK(uint8_t *dest, size_t size) int IOdemodFSK(uint8_t *dest, size_t size)
{ {
static const uint8_t THRESHOLD = 140; static const uint8_t THRESHOLD = 134;
uint32_t idx=0; uint32_t idx=0;
//make sure buffer has data //make sure buffer has data
if (size < 66) return -1; if (size < 66) return -1;
@ -707,8 +697,8 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
low = dest[i]; low = dest[i];
} }
} }
peak=(int)(((peak-128)*.90)+128); peak=(int)(((peak-128)*.75)+128);
low= (int)(((low-128)*.90)+128); low= (int)(((low-128)*.75)+128);
//PrintAndLog("DEBUG: peak: %d, low: %d",peak,low); //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);
int ii; int ii;
uint8_t clkCnt; uint8_t clkCnt;
@ -720,7 +710,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
//test each valid clock from smallest to greatest to see which lines up //test each valid clock from smallest to greatest to see which lines up
for(clkCnt=0; clkCnt < 6; ++clkCnt){ for(clkCnt=0; clkCnt < 6; ++clkCnt){
if (clk[clkCnt] == 32){ if (clk[clkCnt] == 32){
tol=0; tol=1;
}else{ }else{
tol=0; tol=0;
} }