Small lf bug fixes and threshold adjustments

adjusted lf demod thresholds based on additional testing
fixed bug in hid bit length calc in cmddata.c
fixed bugs in lf search
This commit is contained in:
marshmellow42 2015-01-13 17:21:36 -05:00
parent ae6ead3dc8
commit 84871873a4
3 changed files with 73 additions and 47 deletions

View file

@ -618,7 +618,7 @@ int CmdFSKdemodHID(const char *Cmd)
uint32_t cardnum = 0;
if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
uint32_t lo2=0;
lo2=(((hi & 15) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
uint8_t idx3 = 1;
while(lo2>1){ //find last bit set to 1 (format len bit)
lo2=lo2>>1;
@ -631,10 +631,6 @@ int CmdFSKdemodHID(const char *Cmd)
cardnum = (lo>>1)&0xFFFF;
fc = (lo>>17)&0xFF;
}
if(fmtLen==37){
cardnum = (lo>>1)&0x7FFFF;
fc = ((hi&0xF)<<12)|(lo>>20);
}
if(fmtLen==34){
cardnum = (lo>>1)&0xFFFF;
fc= ((hi&1)<<15)|(lo>>17);
@ -645,10 +641,10 @@ int CmdFSKdemodHID(const char *Cmd)
}
}
else { //if bit 38 is not set then 37 bit format is used
fmtLen= 37;
fc =0;
cardnum=0;
if(fmtLen==37){
fmtLen = 37;
fc = 0;
cardnum = 0;
if(fmtLen == 37){
cardnum = (lo>>1)&0x7FFFF;
fc = ((hi&0xF)<<12)|(lo>>20);
}
@ -870,24 +866,35 @@ int PSKnrzDemod(const char *Cmd){
// optional arguments - same as CmdpskNRZrawDemod (clock & invert)
int CmdIndalaDecode(const char *Cmd)
{
int ans;
if (strlen(Cmd)>0)
ans=PSKnrzDemod(Cmd);
else
ans=PSKnrzDemod("32");
uint8_t verbose = 1;
int ans;
if (strlen(Cmd)>0){
if (Cmd[0]=='0'){
verbose=0;
ans = PSKnrzDemod("32");
}else{
ans = PSKnrzDemod(Cmd);
}
} else{ //default to RF/32
ans = PSKnrzDemod("32");
}
if (ans < 0){
PrintAndLog("Error1: %d",ans);
if (verbose)
PrintAndLog("Error1: %d",ans);
return 0;
}
uint8_t invert=0;
ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert);
if (ans < 1) {
PrintAndLog("Error2: %d",ans);
if (verbose)
PrintAndLog("Error2: %d",ans);
return -1;
}
char showbits[251];
if(invert==1) PrintAndLog("Had to invert bits");
if (invert)
if (verbose)
PrintAndLog("Had to invert bits");
//convert UID to HEX
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
int idx;
@ -951,11 +958,19 @@ int CmdPskClean(const char *Cmd)
//prints binary found and saves in graphbuffer for further commands
int CmdpskNRZrawDemod(const char *Cmd)
{
int errCnt= PSKnrzDemod(Cmd);
uint8_t verbose = 1;
int errCnt;
if (strlen(Cmd)>0){
if (Cmd[0]=='0')
verbose=0;
}
errCnt = PSKnrzDemod(Cmd);
//output
if (errCnt<0) return 0;
if (errCnt>0){
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
if (verbose)
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
}
PrintAndLog("PSK or NRZ demoded bitstream:");
// Now output the bitstream to the scrollback by line of 16 bits

View file

@ -566,26 +566,37 @@ int CmdLFfind(const char *Cmd)
return 0;
}
if (!offline || (cmdp != '1') ){
if (!offline && (cmdp != '1')){
ans=CmdLFRead("");
ans=CmdSamples("20000");
ans=CmdSamples("20000");
} else if (GraphTraceLen < 1000) {
PrintAndLog("Data in Graphbuffer was too small.");
return 0;
}
PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag");
PrintAndLog("Checking for known tags:");
ans=Cmdaskmandemod("");
if (ans>0) return 1;
ans=CmdFSKdemodHID("");
if (ans>0) return 1;
ans=CmdFSKdemodIO("");
if (ans>0) return 1;
if (ans>0) {
PrintAndLog("Valid IO Prox ID Found!");
return 1;
}
ans=CmdFSKdemodHID("");
if (ans>0) {
PrintAndLog("Valid HID Prox ID Found!");
return 1;
}
//add psk and indala
ans=CmdIndalaDemod("");
if (ans>0) return 1;
ans=CmdIndalaDemod("224");
if (ans>0) return 1;
ans=CmdIndalaDecode("0");
if (ans>0) {
PrintAndLog("Valid Indala ID Found!");
return 1;
}
ans=Cmdaskmandemod("");
if (ans>0) {
PrintAndLog("Valid EM410x ID Found!");
return 1;
}
PrintAndLog("No Known Tags Found!\n");
return 0;
}

View file

@ -19,7 +19,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size)
//no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future
// otherwise could be a void with no arguments
//set defaults
int high=0, low=128;
int high=0, low=255;
uint64_t lo=0;
uint32_t i = 0;
@ -84,7 +84,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size)
int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
{
int i;
int high = 0, low = 128;
int high = 0, low = 255;
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
if (*clk<8) *clk =64;
@ -100,7 +100,7 @@ int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
else if (BinStream[i] < low)
low = BinStream[i];
}
if ((high < 158) ){ //throw away static
if ((high < 129) ){ //throw away static (anything < 1 graph)
//PrintAndLog("no data found");
return -2;
}
@ -283,7 +283,7 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
{
uint32_t i;
// int invert=0; //invert default
int high = 0, low = 128;
int high = 0, low = 255;
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
uint8_t BitStream[502] = {0};
@ -300,7 +300,8 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
else if (BinStream[i] < low)
low = BinStream[i];
}
if ((high < 134)){ //throw away static high has to be more than 6 on graph. noise <= -10 here
if ((high < 129)){ //throw away static high has to be more than 0 on graph.
//noise <= -10 here
// PrintAndLog("no data found");
return -2;
}
@ -410,8 +411,8 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow
//uint32_t maxVal=0;
if (fchigh==0) fchigh=10;
if (fclow==0) fclow=8;
//set the threshold close to 0 (graph) to avoid static
uint8_t threshold_value = 134; //(uint8_t)(((maxVal-128)*.75)+128);
//set the threshold close to 0 (graph) or 128 std to avoid static
uint8_t threshold_value = 123;
// sync to first lo-hi transition, and threshold
@ -471,7 +472,7 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t maxCons
if ( dest[idx-1]==1 ) {
n=myround2((float)(n+1)/((float)(rfLen)/(float)fclow));
} else {// 0->1 crossing
n=myround2((float)(n+1)/((float)(rfLen-2)/(float)fchigh)); //-2 for fudge factor
n=myround2((float)(n+1)/((float)(rfLen-1)/(float)fchigh)); //-1 for fudge factor
}
if (n == 0) n = 1;
@ -563,7 +564,7 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
int IOdemodFSK(uint8_t *dest, size_t size)
{
static const uint8_t THRESHOLD = 134;
static const uint8_t THRESHOLD = 129;
uint32_t idx=0;
//make sure buffer has data
if (size < 66) return -1;
@ -607,7 +608,7 @@ int DetectASKClock(uint8_t dest[], size_t size, int clock)
{
int i=0;
int peak=0;
int low=128;
int low=255;
int clk[]={16,32,40,50,64,100,128,256};
int loopCnt = 256; //don't need to loop through entire array...
if (size<loopCnt) loopCnt = size;
@ -679,7 +680,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
{
int i=0;
int peak=0;
int low=128;
int low=255;
int clk[]={16,32,40,50,64,100,128,256};
int loopCnt = 2048; //don't need to loop through entire array...
if (size<loopCnt) loopCnt = size;
@ -763,7 +764,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
void pskCleanWave(uint8_t *bitStream, size_t size)
{
int i;
int low=128;
int low=255;
int high=0;
int gap = 4;
// int loopMax = 2048;
@ -805,8 +806,7 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
{
//26 bit 40134 format (don't know other formats)
int i;
int long_wait;
long_wait = 29;//29 leading zeros in format
int long_wait=29;//29 leading zeros in format
int start;
int first = 0;
int first2 = 0;
@ -828,7 +828,6 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
// did not find start sequence
return -1;
}
//found start once now test length by finding next one
// Inverting signal if needed
if (first == 1) {
for (i = start; i < *size; i++) {
@ -838,6 +837,7 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
}else *invert=0;
int iii;
//found start once now test length by finding next one
for (ii=start+29; ii <= *size - 250; ii++) {
first2 = bitStream[ii];
for (iii = ii; iii < ii + long_wait; iii++) {
@ -873,7 +873,7 @@ int pskNRZrawDemod(uint8_t *dest, size_t *size, int *clk, int *invert)
int clk2 = DetectpskNRZClock(dest, *size, *clk);
*clk=clk2;
uint32_t i;
uint8_t high=0, low=128;
uint8_t high=0, low=255;
uint32_t gLen = *size;
if (gLen > 1280) gLen=1280;
// get high
@ -889,7 +889,7 @@ int pskNRZrawDemod(uint8_t *dest, size_t *size, int *clk, int *invert)
int lastBit = 0; //set first clock check
uint32_t bitnum = 0; //output counter
uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
if (*clk==32)tol=2; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely
if (*clk==32) tol = 2; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely
uint32_t iii = 0;
uint8_t errCnt =0;
uint32_t bestStart = *size;