]>
 
 
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/lfdemod.c 
 
 
 
 
 
 
 
   1  //-----------------------------------------------------------------------------  
   4  // This code is licensed to you under the terms of the GNU GPL, version 2 or,  
   5  // at your option, any later version. See the LICENSE.txt file for the text of  
   7  //-----------------------------------------------------------------------------  
   8  // Low frequency demod/decode commands  
   9  //-----------------------------------------------------------------------------  
  16  //get high and low with passed in fuzz factor. also return noise test = 1 for passed or 0 for only noise  
  17  int  getHiLo ( uint8_t  * BitStream
,  size_t  size
,  int  * high
,  int  * low
,  uint8_t  fuzzHi
,  uint8_t  fuzzLo
)  
  21          // get high and low thresholds   
  22          for  ( int  i
= 0 ;  i 
<  size
;  i
++){  
  23                  if  ( BitStream
[ i
] > * high
) * high 
=  BitStream
[ i
];  
  24                  if  ( BitStream
[ i
] < * low
) * low 
=  BitStream
[ i
];  
  26          if  (* high 
<  123 )  return  - 1 ;  // just noise  
  27          * high 
= ( int )(((* high
- 128 )*((( float ) fuzzHi
)/ 100 ))+ 128 );  
  28          * low 
= ( int )(((* low
- 128 )*((( float ) fuzzLo
)/ 100 ))+ 128 );  
  33  //takes 1s and 0s and searches for EM410x format - output EM ID  
  34  uint64_t  Em410xDecode ( uint8_t  * BitStream
,  size_t  * size
,  size_t  * startIdx
)  
  36          //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future  
  37          //  otherwise could be a void with no arguments  
  41          if  ( BitStream
[ 10 ]> 1 ){   //allow only 1s and 0s  
  42                  // PrintAndLog("no data found");  
  46          // 111111111 bit pattern represent start of frame  
  47          uint8_t  frame_marker_mask
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 };  
  51          while ( ( idx 
+  64 ) < * size
) {  
  53                  // search for a start of frame marker  
  54                  if  (  memcmp ( BitStream
+ idx
,  frame_marker_mask
,  sizeof ( frame_marker_mask
)) ==  0 )  
  55                  {  // frame marker found  
  59                                  for ( ii
= 0 ;  ii
< 5 ; ++ ii
){  
  60                                          parityTest 
^=  BitStream
[( i
* 5 )+ ii
+ idx
];  
  62                                  if  (! parityTest
){  //even parity  
  64                                          for  ( ii
= 0 ;  ii
< 4 ;++ ii
){  
  65                                                  lo
=( lo
<< 1LL )|( BitStream
[( i
* 5 )+ ii
+ idx
]);  
  67                                          //PrintAndLog("DEBUG: EM parity passed parity val: %d, i:%d, ii:%d,idx:%d, Buffer: %d%d%d%d%d,lo: %d",parityTest,i,ii,idx,BitStream[idx+ii+(i*5)-5],BitStream[idx+ii+(i*5)-4],BitStream[idx+ii+(i*5)-3],BitStream[idx+ii+(i*5)-2],BitStream[idx+ii+(i*5)-1],lo);  
  68                                  } else  { //parity failed  
  69                                          //PrintAndLog("DEBUG: EM parity failed parity val: %d, i:%d, ii:%d,idx:%d, Buffer: %d%d%d%d%d",parityTest,i,ii,idx,BitStream[idx+ii+(i*5)-5],BitStream[idx+ii+(i*5)-4],BitStream[idx+ii+(i*5)-3],BitStream[idx+ii+(i*5)-2],BitStream[idx+ii+(i*5)-1]);  
  72                                          if  ( resetCnt
> 5 ) return  0 ;  //try 5 times  
  74                                          goto  restart
; //continue;  
  77                          //skip last 5 bit parity test for simplicity.  
  88  //takes 2 arguments - clock and invert both as integers  
  89  //attempts to demodulate ask while decoding manchester  
  90  //prints binary found and saves in graphbuffer for further commands  
  91  int  askmandemod ( uint8_t  * BinStream
,  size_t  * size
,  int  * clk
,  int  * invert
)  
  95          * clk
= DetectASKClock ( BinStream
, * size
, * clk
);  //clock default  
  97          // if autodetected too low then adjust  //MAY NEED ADJUSTMENT  
  98          if  ( clk2
== 0  && * clk
< 8 ) * clk 
= 64 ;  
  99          if  ( clk2
== 0  && * clk
< 32 ) * clk
= 32 ;  
 100          if  (* invert 
!=  0  && * invert 
!=  1 ) * invert
= 0 ;  
 101          uint32_t  initLoopMax 
=  200 ;  
 102          if  ( initLoopMax 
> * size
)  initLoopMax
=* size
;  
 103          // Detect high and lows  
 104          // 25% fuzz in case highs and lows aren't clipped [marshmellow]  
 106          ans 
=  getHiLo ( BinStream
,  initLoopMax
, & high
, & low
,  75 ,  75 );  
 107          if  ( ans
< 1 )  return  - 2 ;  //just noise  
 109          // PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);  
 110          int  lastBit 
=  0 ;   //set first clock check  
 111          uint32_t  bitnum 
=  0 ;      //output counter  
 112          int  tol 
=  0 ;   //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave  
 113          if  (* clk
<= 32 ) tol
= 1 ;     //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely  
 115          uint32_t  gLen 
= * size
;  
 116          if  ( gLen 
>  3000 )  gLen
= 3000 ;  
 118          uint32_t  bestStart 
= * size
;  
 119          uint32_t  bestErrCnt 
= (* size
/ 1000 );  
 120          uint32_t  maxErr 
= (* size
/ 1000 );  
 121          // PrintAndLog("DEBUG - lastbit - %d",lastBit);  
 122          // loop to find first wave that works  
 123          for  ( iii
= 0 ;  iii 
<  gLen
; ++ iii
){  
 124                  if  (( BinStream
[ iii
] >=  high
) || ( BinStream
[ iii
] <=  low
)){  
 127                          // loop through to see if this start location works  
 128                          for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
 129                                  if  (( BinStream
[ i
] >=  high
) && (( i
- lastBit
) > (* clk
- tol
))){  
 131                                  }  else if  (( BinStream
[ i
] <=  low
) && (( i
- lastBit
) > (* clk
- tol
))){  
 132                                          //low found and we are expecting a bar  
 135                                          //mid value found or no bar supposed to be here  
 136                                          if  (( i
- lastBit
)>(* clk
+ tol
)){  
 137                                                  //should have hit a high or low based on clock!!  
 140                                                  //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);  
 143                                                  lastBit
+=* clk
; //skip over until hit too many errors  
 144                                                  if  ( errCnt
>( maxErr
))  break ;   //allow 1 error for every 1000 samples else start over  
 147                                  if  (( i
- iii
) >( 400  * * clk
))  break ;  //got plenty of bits  
 149                          //we got more than 64 good bits and not all errors  
 150                          if  (((( i
- iii
)/ * clk
) > ( 64 + errCnt
)) && ( errCnt
< maxErr
)) {  
 155                                          break ;   //great read - finish  
 157                                  if  ( errCnt
< bestErrCnt
){   //set this as new best run  
 164          if  ( bestErrCnt
< maxErr
){  
 165                  //best run is good enough set to best run and set overwrite BinStream  
 167                  lastBit 
=  bestStart 
- * clk
;  
 169                  for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
 170                          if  (( BinStream
[ i
] >=  high
) && (( i
- lastBit
) > (* clk
- tol
))){  
 172                                  BinStream
[ bitnum
] = * invert
;  
 174                          }  else if  (( BinStream
[ i
] <=  low
) && (( i
- lastBit
) > (* clk
- tol
))){  
 175                                  //low found and we are expecting a bar  
 177                                  BinStream
[ bitnum
] =  1 -* invert
;  
 180                                  //mid value found or no bar supposed to be here  
 181                                  if  (( i
- lastBit
)>(* clk
+ tol
)){  
 182                                          //should have hit a high or low based on clock!!  
 185                                          //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);  
 187                                                  BinStream
[ bitnum
]= 77 ;  
 191                                          lastBit
+=* clk
; //skip over error  
 194                          if  ( bitnum 
>= 400 )  break ;  
 206  //encode binary data into binary manchester   
 207  int  ManchesterEncode ( uint8_t  * BitStream
,  size_t  size
)  
 209          size_t  modIdx
= 20000 ,  i
= 0 ;  
 210          if  ( size
> modIdx
)  return  - 1 ;  
 211    for  ( size_t  idx
= 0 ;  idx 
<  size
;  idx
++){  
 212          BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
];  
 213          BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
]^ 1 ;  
 215    for  (;  i
<( size
* 2 );  i
++){  
 216          BitStream
[ i
] =  BitStream
[ i
+ 20000 ];  
 222  //take 10 and 01 and manchester decode  
 223  //run through 2 times and take least errCnt  
 224  int  manrawdecode ( uint8_t  *  BitStream
,  size_t  * size
)  
 232          for  ( ii
= 1 ; ii
< 3 ;++ ii
){  
 234                  for  ( i
= i
+ ii
; i
<* size
- 2 ; i
+= 2 ){  
 235                          if ( BitStream
[ i
]== 1  && ( BitStream
[ i
+ 1 ]== 0 )){  
 236                          }  else if (( BitStream
[ i
]== 0 )&&  BitStream
[ i
+ 1 ]== 1 ){  
 240                          if ( bitnum
> 300 )  break ;  
 252                  for  ( i
= i
+ ii
; i 
< * size
- 2 ; i
+= 2 ){  
 253                          if ( BitStream
[ i
] ==  1  && ( BitStream
[ i
+ 1 ] ==  0 )){  
 254                                  BitStream
[ bitnum
++]= 0 ;  
 255                          }  else if (( BitStream
[ i
] ==  0 ) &&  BitStream
[ i
+ 1 ] ==  1 ){  
 256                                  BitStream
[ bitnum
++]= 1 ;  
 258                                  BitStream
[ bitnum
++]= 77 ;  
 261                          if ( bitnum
> 300 )  break ;  
 269  //take 01 or 10 = 0 and 11 or 00 = 1  
 270  int  BiphaseRawDecode ( uint8_t  * BitStream
,  size_t  * size
,  int  offset
,  int  invert
)  
 276          for  (; i
<* size
- 2 ;  i
+= 2 ){  
 277                  if (( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 1 )){  
 278                          BitStream
[ bitnum
++]= 1 ^ invert
;  
 279                  }  else if (( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 1 )){  
 280                          BitStream
[ bitnum
++]= invert
;  
 282                          BitStream
[ bitnum
++]= 77 ;  
 285                  if ( bitnum
> 250 )  break ;  
 292  //takes 2 arguments - clock and invert both as integers  
 293  //attempts to demodulate ask only  
 294  //prints binary found and saves in graphbuffer for further commands  
 295  int  askrawdemod ( uint8_t  * BinStream
,  size_t  * size
,  int  * clk
,  int  * invert
)  
 298          // int invert=0;  //invert default  
 300          * clk
= DetectASKClock ( BinStream
, * size
, * clk
);  //clock default  
 301          //uint8_t BitStream[502] = {0};  
 303          //HACK: if clock not detected correctly - default  
 304          if  ( clk2
== 0  && * clk
< 8 ) * clk 
= 64 ;  
 305          if  ( clk2
== 0  && * clk
< 32  &&  clk2
== 0 ) * clk
= 32 ;  
 306          if  (* invert 
!=  0  && * invert 
!=  1 ) * invert 
= 0 ;  
 307          uint32_t  initLoopMax 
=  200 ;  
 308          if  ( initLoopMax 
> * size
)  initLoopMax
=* size
;  
 309          // Detect high and lows  
 310          //25% fuzz in case highs and lows aren't clipped [marshmellow]  
 312          ans 
=  getHiLo ( BinStream
,  initLoopMax
, & high
, & low
,  75 ,  75 );  
 313          if  ( ans
< 1 )  return  - 2 ;  //just noise  
 315          //PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);  
 316          int  lastBit 
=  0 ;   //set first clock check  
 317          uint32_t  bitnum 
=  0 ;      //output counter  
 318          uint8_t  tol 
=  0 ;   //clock tolerance adjust - waves will be accepted as within the clock  
 319                            //  if they fall + or - this value + clock from last valid wave  
 320          if  (* clk 
==  32 )  tol
= 1 ;     //clock tolerance may not be needed anymore currently set to  
 321                                    //  + or - 1 but could be increased for poor waves or removed entirely  
 323          uint32_t  gLen 
= * size
;  
 324          if  ( gLen 
>  500 )  gLen
= 500 ;  
 326          uint32_t  bestStart 
= * size
;  
 327          uint32_t  bestErrCnt 
= (* size
/ 1000 );  
 328          uint32_t  maxErr 
=  bestErrCnt
;  
 330          //PrintAndLog("DEBUG - lastbit - %d",lastBit);  
 331          //loop to find first wave that works  
 332          for  ( iii
= 0 ;  iii 
<  gLen
; ++ iii
){  
 333                  if  (( BinStream
[ iii
]>= high
) || ( BinStream
[ iii
]<= low
)){  
 335                          //loop through to see if this start location works  
 336                          for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
 337                                  if  (( BinStream
[ i
] >=  high
) && (( i
- lastBit
)>(* clk
- tol
))){  
 340                                  }  else if  (( BinStream
[ i
] <=  low
) && (( i
- lastBit
)>(* clk
- tol
))){  
 341                                          //low found and we are expecting a bar  
 344                                  }  else if  (( BinStream
[ i
]<= low
) && ( midBit
== 0 ) && (( i
- lastBit
)>((* clk
/ 2 )- tol
))){  
 347                                  }  else if  (( BinStream
[ i
]>= high
) && ( midBit
== 0 ) && (( i
- lastBit
)>((* clk
/ 2 )- tol
))){  
 350                                  }  else if  (( i
- lastBit
)>((* clk
/ 2 )+ tol
) && ( midBit
== 0 )){  
 354                                          //mid value found or no bar supposed to be here  
 356                                          if  (( i
- lastBit
)>(* clk
+ tol
)){  
 357                                                  //should have hit a high or low based on clock!!  
 359                                                  //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);  
 362                                                  lastBit
+=* clk
; //skip over until hit too many errors  
 363                                                  if  ( errCnt 
> ((* size
/ 1000 ))){   //allow 1 error for every 1000 samples else start over  
 369                                  if  (( i
- iii
)>( 500  * * clk
))  break ;  //got enough bits  
 371                          //we got more than 64 good bits and not all errors  
 372                          if  (((( i
- iii
)/ * clk
) > ( 64 + errCnt
)) && ( errCnt
<(* size
/ 1000 ))) {  
 377                                          break ;   //great read - finish  
 379                                  if  ( errCnt
< bestErrCnt
){   //set this as new best run  
 386          if  ( bestErrCnt
< maxErr
){  
 387                  //best run is good enough - set to best run and overwrite BinStream  
 389                  lastBit 
=  bestStart 
- * clk
;  
 391                  for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
 392                          if  (( BinStream
[ i
] >=  high
) && (( i
- lastBit
) > (* clk
- tol
))){  
 394                                  BinStream
[ bitnum
] = * invert
;  
 397                          }  else if  (( BinStream
[ i
] <=  low
) && (( i
- lastBit
) > (* clk
- tol
))){  
 398                                  //low found and we are expecting a bar  
 400                                  BinStream
[ bitnum
] =  1 -* invert
;  
 403                          }  else if  (( BinStream
[ i
]<= low
) && ( midBit
== 0 ) && (( i
- lastBit
)>((* clk
/ 2 )- tol
))){  
 406                                  BinStream
[ bitnum
] =  1  - * invert
;  
 408                          }  else if  (( BinStream
[ i
]>= high
) && ( midBit
== 0 ) && (( i
- lastBit
)>((* clk
/ 2 )- tol
))){  
 411                                  BinStream
[ bitnum
] = * invert
;  
 413                          }  else if  (( i
- lastBit
)>((* clk
/ 2 )+ tol
) && ( midBit
== 0 )){  
 416                                  if  ( bitnum
!= 0 )  BinStream
[ bitnum
] =  BinStream
[ bitnum
- 1 ];  
 420                                  //mid value found or no bar supposed to be here  
 421                                  if  (( i
- lastBit
)>(* clk
+ tol
)){  
 422                                          //should have hit a high or low based on clock!!  
 425                                          //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);  
 427                                                  BinStream
[ bitnum
]= 77 ;  
 431                                          lastBit
+=* clk
; //skip over error  
 434                          if  ( bitnum 
>= 400 )  break ;  
 444  //translate wave to 11111100000 (1 for each short wave 0 for each long wave)  
 445  size_t  fsk_wave_demod ( uint8_t  *  dest
,  size_t  size
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 447          uint32_t  last_transition 
=  0 ;  
 450          if  ( fchigh
== 0 )  fchigh
= 10 ;  
 451          if  ( fclow
== 0 )  fclow
= 8 ;  
 452          //set the threshold close to 0 (graph) or 128 std to avoid static  
 453          uint8_t  threshold_value 
=  123 ;   
 455          // sync to first lo-hi transition, and threshold  
 457          // Need to threshold first sample  
 459          if ( dest
[ 0 ] <  threshold_value
)  dest
[ 0 ] =  0 ;  
 463          // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)  
 464          // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere  
 465          // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10  
 466          for ( idx 
=  1 ;  idx 
<  size
;  idx
++) {  
 467                  // threshold current value  
 469                  if  ( dest
[ idx
] <  threshold_value
)  dest
[ idx
] =  0 ;  
 472                  // Check for 0->1 transition  
 473                  if  ( dest
[ idx
- 1 ] <  dest
[ idx
]) {  // 0 -> 1 transition  
 474                          if  (( idx
- last_transition
)<( fclow
- 2 )){             //0-5 = garbage noise  
 475                                  //do nothing with extra garbage  
 476                          }  else if  (( idx
- last_transition
) < ( fchigh
- 1 )) {  //6-8 = 8 waves  
 478                          }  else  {                                                         //9+ = 10 waves  
 481                          last_transition 
=  idx
;  
 485          return  numBits
;  //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0  
 488  uint32_t  myround2 ( float  f
)  
 490          if  ( f 
>=  2000 )  return  2000 ; //something bad happened  
 491          return  ( uint32_t ) ( f 
+ ( float ) 0.5 );  
 494  //translate 11111100000 to 10  
 495  size_t  aggregate_bits ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  uint8_t  maxConsequtiveBits
,  
 496      uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 498          uint8_t  lastval
= dest
[ 0 ];  
 503          for (  idx
= 1 ;  idx 
<  size
;  idx
++) {  
 505                  if  ( dest
[ idx
]== lastval
) {  
 509                  //if lastval was 1, we have a 1->0 crossing  
 510                  if  (  dest
[ idx
- 1 ]== 1  ) {  
 511                          n
= myround2 (( float )( n
+ 1 )/(( float )( rfLen
)/( float ) fclow
));  
 512                  }  else  { // 0->1 crossing  
 513                          n
= myround2 (( float )( n
+ 1 )/(( float )( rfLen
- 1 )/( float ) fchigh
));   //-1 for fudge factor  
 517                  if ( n 
<  maxConsequtiveBits
)  //Consecutive  
 519                          if ( invert
== 0 ){  //invert bits  
 520                                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ] ,  n
);  
 522                                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ 1  ,  n
);  
 531  //by marshmellow  (from holiman's base)  
 532  // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)  
 533  int  fskdemod ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 536          size 
=  fsk_wave_demod ( dest
,  size
,  fchigh
,  fclow
);  
 537          size 
=  aggregate_bits ( dest
,  size
,  rfLen
,  192 ,  invert
,  fchigh
,  fclow
);  
 540  // loop to get raw HID waveform then FSK demodulate the TAG ID from it  
 541  int  HIDdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  
 544          size_t  idx
= 0 ,  size2
=* size
,  startIdx
= 0 ;   
 547          * size 
=  fskdemod ( dest
,  size2
, 50 , 0 , 10 , 8 );  
 549          // final loop, go over previously decoded manchester data and decode into usable tag ID  
 550          // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0  
 551          uint8_t  frame_marker_mask
[] = { 1 , 1 , 1 , 0 , 0 , 0 };  
 555          while (  idx 
+  sizeof ( frame_marker_mask
) < * size
) {  
 556                  // search for a start of frame marker  
 557                  if  (  memcmp ( dest
+ idx
,  frame_marker_mask
,  sizeof ( frame_marker_mask
)) ==  0 )  
 558                  {  // frame marker found  
 560                          idx
+= sizeof ( frame_marker_mask
);  
 561                          while ( dest
[ idx
] !=  dest
[ idx
+ 1 ] &&  idx 
< * size
- 2 )  
 563                                  // Keep going until next frame marker (or error)  
 564                                  // Shift in a bit. Start by shifting high registers  
 565                                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  
 566                                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  
 567                                  //Then, shift in a 0 or one into low  
 568                                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  
 575                          // Hopefully, we read a tag and  hit upon the next frame marker  
 576                          if ( idx 
+  sizeof ( frame_marker_mask
) < * size
)  
 578                                  if  (  memcmp ( dest
+ idx
,  frame_marker_mask
,  sizeof ( frame_marker_mask
)) ==  0 )  
 586                          * hi2 
= * hi 
= * lo 
=  0 ;  
 595  // loop to get raw paradox waveform then FSK demodulate the TAG ID from it  
 596  size_t  ParadoxdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  
 599          size_t  idx
= 0 ,  size2
=* size
;  
 602          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  
 604          // final loop, go over previously decoded manchester data and decode into usable tag ID  
 605          // 00001111 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0  
 606          uint8_t  frame_marker_mask
[] = { 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 };  
 607          uint16_t  numshifts 
=  0 ;  
 610          while (  idx 
+  sizeof ( frame_marker_mask
) < * size
) {  
 611                  // search for a start of frame marker  
 612                  if  (  memcmp ( dest
+ idx
,  frame_marker_mask
,  sizeof ( frame_marker_mask
)) ==  0 )  
 613                  {  // frame marker found  
 615                          idx
+= sizeof ( frame_marker_mask
);  
 616                          while ( dest
[ idx
] !=  dest
[ idx
+ 1 ] &&  idx 
< * size
- 2 )  
 618                                  // Keep going until next frame marker (or error)  
 619                                  // Shift in a bit. Start by shifting high registers  
 620                                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  
 621                                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  
 622                                  //Then, shift in a 0 or one into low  
 623                                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  
 630                          // Hopefully, we read a tag and  hit upon the next frame marker and got enough bits  
 631                          if ( idx 
+  sizeof ( frame_marker_mask
) < * size 
&&  numshifts 
>  40 )  
 633                                  if  (  memcmp ( dest
+ idx
,  frame_marker_mask
,  sizeof ( frame_marker_mask
)) ==  0 )  
 635                                          //good return - return start grid position and bits found  
 636                                          * size 
= (( numshifts
* 2 )+ 8 );  
 641                          * hi2 
= * hi 
= * lo 
=  0 ;  
 650  uint32_t  bytebits_to_byte ( uint8_t *  src
,  size_t  numbits
)  
 653          for ( int  i 
=  0  ;  i 
<  numbits 
;  i
++)  
 655                  num 
= ( num 
<<  1 ) | (* src
);  
 661  int  IOdemodFSK ( uint8_t  * dest
,  size_t  size
)  
 663          static const uint8_t  THRESHOLD 
=  129 ;  
 665          //make sure buffer has data  
 666          if  ( size 
<  66 )  return  - 1 ;  
 667          //test samples are not just noise  
 668          uint8_t  justNoise 
=  1 ;  
 669          for ( idx
= 0 ; idx
<  size 
&&  justNoise 
; idx
++){  
 670                  justNoise 
=  dest
[ idx
] <  THRESHOLD
;  
 672          if ( justNoise
)  return  0 ;  
 675          size 
=  fskdemod ( dest
,  size
,  64 ,  1 ,  10 ,  8 );   //  RF/64 and invert  
 676          if  ( size 
<  65 )  return  - 1 ;   //did we get a good demod?  
 678          //0           10          20          30          40          50          60  
 680          //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23  
 681          //-----------------------------------------------------------------------------  
 682          //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11  
 684          //XSF(version)facility:codeone+codetwo  
 686          uint8_t  mask
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 687          for (  idx
= 0 ;  idx 
< ( size 
-  65 );  idx
++) {  
 688                  if  (  memcmp ( dest 
+  idx
,  mask
,  sizeof ( mask
))== 0 ) {  
 690                          if  (! dest
[ idx
+ 8 ] &&  dest
[ idx
+ 17 ]== 1  &&  dest
[ idx
+ 26 ]== 1  &&  dest
[ idx
+ 35 ]== 1  &&  dest
[ idx
+ 44 ]== 1  &&  dest
[ idx
+ 53 ]== 1 ){  
 691                                  //confirmed proper separator bits found  
 692                                  //return start position  
 701  // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType  
 702  // returns 1 if passed  
 703  uint8_t  parityTest ( uint32_t  bits
,  uint8_t  bitLen
,  uint8_t  pType
)  
 706          for  ( uint8_t  i 
=  0 ;  i 
<  bitLen
;  i
++){  
 707                  ans 
^= (( bits 
>>  i
) &  1 );  
 709    //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType);  
 710          return  ( ans 
==  pType
);  
 714  // takes a array of binary values, start position, length of bits per parity (includes parity bit),  
 715  //   Parity Type (1 for odd 0 for even), and binary Length (length to run)   
 716  size_t  removeParity ( uint8_t  * BitStream
,  size_t  startIdx
,  uint8_t  pLen
,  uint8_t  pType
,  size_t  bLen
)  
 718          uint32_t  parityWd 
=  0 ;  
 719          size_t  j 
=  0 ,  bitCnt 
=  0 ;  
 720          for  ( int  word 
=  0 ;  word 
< ( bLen
);  word
+= pLen
){  
 721                  for  ( int  bit
= 0 ;  bit 
<  pLen
;  bit
++){  
 722                          parityWd 
= ( parityWd 
<<  1 ) |  BitStream
[ startIdx
+ word
+ bit
];  
 723        BitStream
[ j
++] = ( BitStream
[ startIdx
+ word
+ bit
]);  
 726                  // if parity fails then return 0  
 727                  if  ( parityTest ( parityWd
,  pLen
,  pType
) ==  0 )  return  - 1 ;  
 731          // if we got here then all the parities passed  
 732          //return ID start index and size  
 737  // FSK Demod then try to locate an AWID ID  
 738  int  AWIDdemodFSK ( uint8_t  * dest
,  size_t  size
)  
 740          static const uint8_t  THRESHOLD 
=  123 ;  
 741          uint32_t  idx
= 0 ,  idx2
= 0 ;  
 742          //make sure buffer has data  
 743          if  ( size 
<  96 * 50 )  return  - 1 ;  
 744          //test samples are not just noise  
 745          uint8_t  justNoise 
=  1 ;  
 746          for ( idx
= 0 ;  idx 
<  size 
&&  justNoise 
; idx
++){  
 747                  justNoise 
=  dest
[ idx
] <  THRESHOLD
;  
 749          if ( justNoise
)  return  - 2 ;  
 752          size 
=  fskdemod ( dest
,  size
,  50 ,  1 ,  10 ,  8 );   //  RF/64 and invert  
 753          if  ( size 
<  96 )  return  - 3 ;   //did we get a good demod?  
 755          uint8_t  mask
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 756          for (  idx
= 0 ;  idx 
< ( size 
-  96 );  idx
++) {  
 757                  if  (  memcmp ( dest 
+  idx
,  mask
,  sizeof ( mask
))== 0 ) {  
 758                          // frame marker found  
 759                          //return ID start index  
 760                          if  ( idx2 
==  0 )  idx2
= idx
;  
 761                          else if ( idx
- idx2
== 96 )  return  idx2
;  
 764                          // should always get 96 bits if it is awid  
 772  // FSK Demod then try to locate an Farpointe Data (pyramid) ID  
 773  int  PyramiddemodFSK ( uint8_t  * dest
,  size_t  size
)  
 775    static const uint8_t  THRESHOLD 
=  123 ;  
 776    uint32_t  idx
= 0 ,  idx2
= 0 ;  
 777    // size_t size2 = size;  
 778    //make sure buffer has data  
 779    if  ( size 
<  128 * 50 )  return  - 5 ;  
 780    //test samples are not just noise  
 781    uint8_t  justNoise 
=  1 ;  
 782    for ( idx
= 0 ;  idx 
<  size 
&&  justNoise 
; idx
++){  
 783      justNoise 
=  dest
[ idx
] <  THRESHOLD
;  
 785    if ( justNoise
)  return  - 1 ;  
 788    size 
=  fskdemod ( dest
,  size
,  50 ,  1 ,  10 ,  8 );   //  RF/64 and invert  
 789    if  ( size 
<  128 )  return  - 2 ;   //did we get a good demod?  
 791    uint8_t  mask
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 792    for (  idx
= 0 ;  idx 
< ( size 
-  128 );  idx
++) {  
 793      if  (  memcmp ( dest 
+  idx
,  mask
,  sizeof ( mask
))== 0 ) {  
 794        // frame marker found  
 795        if  ( idx2
== 0 )  idx2
= idx
;  
 796        else if  ( idx
- idx2
== 128 )  return  idx2
;  
 805  // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)  
 806  // maybe somehow adjust peak trimming value based on samples to fix?  
 807  int  DetectASKClock ( uint8_t  dest
[],  size_t  size
,  int  clock
)  
 810    int  clk
[]={ 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 256 };  
 811    int  loopCnt 
=  256 ;   //don't need to loop through entire array...  
 812    if  ( size
< loopCnt
)  loopCnt 
=  size
;  
 814    //if we already have a valid clock quit  
 817      if  ( clk
[ i
] ==  clock
)  return  clock
;  
 819    //get high and low peak  
 821    getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 );  
 826    int  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  
 828    //test each valid clock from smallest to greatest to see which lines up  
 829    for ( clkCnt
= 0 ;  clkCnt 
<  8 ; ++ clkCnt
){  
 830      if  ( clk
[ clkCnt
] ==  32 ){  
 835      bestErr
[ clkCnt
]= 1000 ;  
 836      //try lining up the peaks by moving starting point (try first 256)  
 837      for  ( ii
= 0 ;  ii 
<  loopCnt
; ++ ii
){  
 838        if  (( dest
[ ii
] >=  peak
) || ( dest
[ ii
] <=  low
)){  
 840          // now that we have the first one lined up test rest of wave array  
 841          for  ( i
= 0 ;  i
<(( int )(( size
- ii
- tol
)/ clk
[ clkCnt
])- 1 ); ++ i
){  
 842            if  ( dest
[ ii
+( i
* clk
[ clkCnt
])]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])]<= low
){  
 843            } else if ( dest
[ ii
+( i
* clk
[ clkCnt
])- tol
]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])- tol
]<= low
){  
 844            } else if ( dest
[ ii
+( i
* clk
[ clkCnt
])+ tol
]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])+ tol
]<= low
){  
 845            } else {   //error no peak detected  
 849          //if we found no errors then we can stop here  
 850          //  this is correct one - return this clock  
 851              //PrintAndLog("DEBUG: clk %d, err %d, ii %d, i %d",clk[clkCnt],errCnt,ii,i);  
 852          if ( errCnt
== 0  &&  clkCnt
< 6 )  return  clk
[ clkCnt
];  
 853          //if we found errors see if it is lowest so far and save it as best run  
 854          if ( errCnt
< bestErr
[ clkCnt
])  bestErr
[ clkCnt
]= errCnt
;  
 860    for  ( iii
= 0 ;  iii
< 8 ; ++ iii
){  
 861      if  ( bestErr
[ iii
]< bestErr
[ best
]){  
 862        if  ( bestErr
[ iii
]== 0 )  bestErr
[ iii
]= 1 ;  
 863        // current best bit to error ratio     vs  new bit to error ratio  
 864        if  ((( size
/ clk
[ best
])/ bestErr
[ best
] < ( size
/ clk
[ iii
])/ bestErr
[ iii
]) ){  
 873  //detect psk clock by reading #peaks vs no peaks(or errors)  
 874  int  DetectpskNRZClock ( uint8_t  dest
[],  size_t  size
,  int  clock
)  
 877          int  clk
[]={ 16 , 32 , 40 , 50 , 64 , 100 , 128 , 256 };  
 878          int  loopCnt 
=  2048 ;   //don't need to loop through entire array...  
 879          if  ( size
< loopCnt
)  loopCnt 
=  size
;  
 881          //if we already have a valid clock quit  
 883                  if  ( clk
[ i
] ==  clock
)  return  clock
;  
 885          //get high and low peak  
 887          getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 );  
 889          //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);  
 895          int  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  
 896          int  peaksdet
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
 897          //test each valid clock from smallest to greatest to see which lines up  
 898          for ( clkCnt
= 0 ;  clkCnt 
<  7 ; ++ clkCnt
){  
 899                  if  ( clk
[ clkCnt
] <=  32 ){  
 904                  //try lining up the peaks by moving starting point (try first 256)  
 905                  for  ( ii
= 0 ;  ii
<  loopCnt
; ++ ii
){  
 906                          if  (( dest
[ ii
] >=  peak
) || ( dest
[ ii
] <=  low
)){  
 909                                  // now that we have the first one lined up test rest of wave array  
 910                                  for  ( i
= 0 ;  i 
< (( int )(( size
- ii
- tol
)/ clk
[ clkCnt
])- 1 ); ++ i
){  
 911                                          if  ( dest
[ ii
+( i
* clk
[ clkCnt
])]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])]<= low
){  
 913                                          } else if ( dest
[ ii
+( i
* clk
[ clkCnt
])- tol
]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])- tol
]<= low
){  
 915                                          } else if ( dest
[ ii
+( i
* clk
[ clkCnt
])+ tol
]>= peak 
||  dest
[ ii
+( i
* clk
[ clkCnt
])+ tol
]<= low
){  
 917                                          } else {   //error no peak detected  
 921                                  if ( peakcnt
> peaksdet
[ clkCnt
]) {  
 922                                          peaksdet
[ clkCnt
]= peakcnt
;  
 923                                          bestErr
[ clkCnt
]= errCnt
;  
 930          //int ratio2;  //debug  
 933          for  ( iii
= 0 ;  iii 
<  7 ; ++ iii
){  
 935                  //ratio2=1000;  //debug  
 936                  //bits=size/clk[iii];  //debug  
 937                  if  ( peaksdet
[ iii
] >  0 ){  
 938                          ratio
= bestErr
[ iii
]/ peaksdet
[ iii
];  
 939                          if  ((( bestErr
[ best
]/ peaksdet
[ best
]) > ( ratio
)+ 1 )){  
 942                          //ratio2=bits/peaksdet[iii]; //debug  
 944                  //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d, ratio: %d, bits: %d, peakbitr: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best],ratio, bits,ratio2);  
 949  // by marshmellow (attempt to get rid of high immediately after a low)  
 950  void  pskCleanWave ( uint8_t  * BitStream
,  size_t  size
)  
 957          getHiLo ( BitStream
,  size
, & high
, & low
,  80 ,  90 );  
 959          for  ( i
= 0 ;  i 
<  size
; ++ i
){  
 961                          if  ( BitStream
[ i
]> low
){  
 969                  } else if  ( newHigh 
==  1 ){  
 970                          if  ( BitStream
[ i
]< high
){  
 979                  if  ( BitStream
[ i
] <=  low
)  newLow
= 1 ;  
 980                  if  ( BitStream
[ i
] >=  high
)  newHigh
= 1 ;  
 986  // convert psk1 demod to psk2 demod  
 987  // only transition waves are 1s  
 988  void  psk1TOpsk2 ( uint8_t  * BitStream
,  size_t  size
)  
 991          uint8_t  lastBit
= BitStream
[ 0 ];  
 993                  if  ( lastBit
!= BitStream
[ i
]){  
 994                          lastBit
= BitStream
[ i
];  
1003  // redesigned by marshmellow adjusted from existing decode functions  
1004  // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more  
1005  int  indala26decode ( uint8_t  * bitStream
,  size_t  * size
,  uint8_t  * invert
)  
1007          //26 bit 40134 format  (don't know other formats)  
1009          int  long_wait
= 29 ; //29 leading zeros in format  
1015          // Finding the start of a UID  
1016          for  ( start 
=  0 ;  start 
<= * size 
-  250 ;  start
++) {  
1017                  first 
=  bitStream
[ start
];  
1018                  for  ( i 
=  start
;  i 
<  start 
+  long_wait
;  i
++) {  
1019                          if  ( bitStream
[ i
] !=  first
) {  
1023                  if  ( i 
== ( start 
+  long_wait
)) {  
1027          if  ( start 
== * size 
-  250  +  1 ) {  
1028                  // did not find start sequence  
1031          // Inverting signal if needed  
1033                  for  ( i 
=  start
;  i 
< * size
;  i
++) {  
1034                          bitStream
[ i
] = ! bitStream
[ i
];  
1040          //found start once now test length by finding next one  
1041          for  ( ii
= start
+ 29 ;  ii 
<= * size 
-  250 ;  ii
++) {  
1042                  first2 
=  bitStream
[ ii
];  
1043                  for  ( iii 
=  ii
;  iii 
<  ii 
+  long_wait
;  iii
++) {  
1044                          if  ( bitStream
[ iii
] !=  first2
) {  
1048                  if  ( iii 
== ( ii 
+  long_wait
)) {  
1052          if  ( ii
== * size 
-  250  +  1 ){  
1053                  // did not find second start sequence  
1060          for  ( ii 
=  0 ;  ii 
<  bitCnt
;  ii
++) {  
1061                  bitStream
[ ii
] =  bitStream
[ i
++];  
1067  // by marshmellow - demodulate PSK1 wave or NRZ wave (both similar enough)  
1068  // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak  
1069  int  pskNRZrawDemod ( uint8_t  * dest
,  size_t  * size
,  int  * clk
,  int  * invert
)  
1071          pskCleanWave ( dest
,* size
);  
1072          int  clk2 
=  DetectpskNRZClock ( dest
, * size
, * clk
);  
1076          ans 
=  getHiLo ( dest
,  1260 , & high
, & low
,  75 ,  80 );  //25% fuzz on high 20% fuzz on low  
1077          if  ( ans
< 1 )  return  - 2 ;  //just noise  
1078          uint32_t  gLen 
= * size
;  
1079          //PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);  
1080          int  lastBit 
=  0 ;   //set first clock check  
1081          uint32_t  bitnum 
=  0 ;      //output counter  
1082          uint8_t  tol 
=  1 ;   //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave  
1083          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  
1086          uint32_t  bestStart 
= * size
;  
1087          uint32_t  maxErr 
= (* size
/ 1000 );  
1088          uint32_t  bestErrCnt 
=  maxErr
;  
1091          uint8_t  ignorewin
=* clk
/ 8 ;  
1092          //PrintAndLog("DEBUG - lastbit - %d",lastBit);  
1093          //loop to find first wave that works - align to clock  
1094          for  ( iii
= 0 ;  iii 
<  gLen
; ++ iii
){  
1095                  if  (( dest
[ iii
]>= high
) || ( dest
[ iii
]<= low
)){  
1097                          //loop through to see if this start location works  
1098                          for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
1099                                  //if we found a high bar and we are at a clock bit  
1100                                  if  (( dest
[ i
]>= high 
) && ( i
>= lastBit
+* clk
- tol 
&&  i
<= lastBit
+* clk
+ tol
)){  
1105                                  //else if low bar found and we are at a clock point  
1106                                  } else if  (( dest
[ i
]<= low 
) && ( i
>= lastBit
+* clk
- tol 
&&  i
<= lastBit
+* clk
+ tol
)){  
1111                                  //else if no bars found  
1112                                  } else if ( dest
[ i
] <  high 
&&  dest
[ i
] >  low
) {  
1116                                                                                  //if we are past a clock point  
1117                                          if  ( i 
>=  lastBit
+* clk
+ tol
){  //clock val  
1121                                  //else if bar found but we are not at a clock bit and we did not just have a clock bit  
1122                                  } else if  (( dest
[ i
]>= high 
||  dest
[ i
]<= low
) && ( i
< lastBit
+* clk
- tol 
||  i
> lastBit
+* clk
+ tol
) && ( bitHigh
== 0 )){  
1123                                          //error bar found no clock...  
1126                                  if  ( bitnum
>= 1000 )  break ;  
1128                          //we got more than 64 good bits and not all errors  
1129                          if  (( bitnum 
> ( 64 + errCnt
)) && ( errCnt 
< ( maxErr
))) {  
1130                                  //possible good read  
1133                                          bestErrCnt 
=  errCnt
;  
1134                                          break ;   //great read - finish  
1136                                  if  ( errCnt 
<  bestErrCnt
){   //set this as new best run  
1137                                          bestErrCnt 
=  errCnt
;  
1143          if  ( bestErrCnt 
<  maxErr
){  
1144                  //best run is good enough set to best run and set overwrite BinStream  
1146                  lastBit
= bestStart
-* clk
;  
1148                  for  ( i 
=  iii
;  i 
< * size
; ++ i
) {  
1149                          //if we found a high bar and we are at a clock bit  
1150                          if  (( dest
[ i
] >=  high 
) && ( i
>= lastBit
+* clk
- tol 
&&  i
<= lastBit
+* clk
+ tol
)){  
1154                                  dest
[ bitnum
]= curBit
;  
1157                          //else if low bar found and we are at a clock point  
1158                          } else if  (( dest
[ i
]<= low 
) && ( i
>= lastBit
+* clk
- tol 
&&  i
<= lastBit
+* clk
+ tol
)){  
1162                                  dest
[ bitnum
]= curBit
;  
1165                          //else if no bars found  
1166                          } else if ( dest
[ i
]< high 
&&  dest
[ i
]> low
) {  
1170                                  //if we are past a clock point  
1171                                  if  ( i
>= lastBit
+* clk
+ tol
){  //clock val  
1173                                          dest
[ bitnum
]= curBit
;  
1176                          //else if bar found but we are not at a clock bit and we did not just have a clock bit  
1177                          } else if  (( dest
[ i
]>= high 
||  dest
[ i
]<= low
) && (( i
< lastBit
+* clk
- tol
) || ( i
> lastBit
+* clk
+ tol
)) && ( bitHigh
== 0 )){  
1178                                  //error bar found no clock...  
1184                          if  ( bitnum 
>= 1000 )  break ;  
1200  //detects the bit clock for FSK given the high and low Field Clocks  
1201  uint8_t  detectFSKClk ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fcHigh
,  uint8_t  fcLow
)  
1203    uint8_t  clk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 0 };  
1204    uint16_t  rfLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1205    uint8_t  rfCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1206    uint8_t  rfLensFnd 
=  0 ;  
1207    uint8_t  lastFCcnt
= 0 ;  
1208    uint32_t  fcCounter 
=  0 ;  
1209    uint16_t  rfCounter 
=  0 ;  
1210    uint8_t  firstBitFnd 
=  0 ;  
1213    uint8_t  fcTol 
= ( uint8_t )( 0.5 +( float )( fcHigh
- fcLow
)/ 2 );  
1218    //PrintAndLog("DEBUG: fcTol: %d",fcTol);  
1219    // prime i to first up transition  
1220    for  ( i 
=  1 ;  i 
<  size
- 1 ;  i
++)  
1221      if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
]>= BitStream
[ i
+ 1 ])  
1224    for  (;  i 
<  size
- 1 ;  i
++){  
1225      if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
]>= BitStream
[ i
+ 1 ]){  
1229        // if we got less than the small fc + tolerance then set it to the small fc  
1230        if  ( fcCounter 
<  fcLow
+ fcTol
)   
1232        else  //set it to the large fc  
1235        //look for bit clock  (rf/xx)  
1236        if  (( fcCounter
< lastFCcnt 
||  fcCounter
> lastFCcnt
)){  
1237          //not the same size as the last wave - start of new bit sequence  
1239          if  ( firstBitFnd
> 1 ){  //skip first wave change - probably not a complete bit  
1240            for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){  
1241              if  ( rfLens
[ ii
]== rfCounter
){  
1247            if  ( rfCounter
> 0  &&  rfLensFnd
< 15 ){  
1248              //PrintAndLog("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter);  
1249              rfCnts
[ rfLensFnd
]++;  
1250              rfLens
[ rfLensFnd
++]= rfCounter
;  
1256          lastFCcnt
= fcCounter
;  
1265    uint8_t  rfHighest
= 15 ,  rfHighest2
= 15 ,  rfHighest3
= 15 ;  
1267    for  ( i
= 0 ;  i
< 15 ;  i
++){  
1268      //PrintAndLog("DEBUG: RF %d, cnts %d",rfLens[i], rfCnts[i]);  
1269      //get highest 2 RF values  (might need to get more values to compare or compare all?)  
1270      if  ( rfCnts
[ i
]> rfCnts
[ rfHighest
]){  
1271        rfHighest3
= rfHighest2
;  
1272        rfHighest2
= rfHighest
;  
1274      }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest2
]){  
1275        rfHighest3
= rfHighest2
;  
1277      }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest3
]){  
1281    // set allowed clock remainder tolerance to be 1 large field clock length+1   
1282    //   we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off    
1283    uint8_t  tol1 
=  fcHigh
+ 1 ;   
1285    //PrintAndLog("DEBUG: hightest: 1 %d, 2 %d, 3 %d",rfLens[rfHighest],rfLens[rfHighest2],rfLens[rfHighest3]);  
1287    // loop to find the highest clock that has a remainder less than the tolerance  
1288    //   compare samples counted divided by  
1290    for  (;  ii
>= 0 ;  ii
--){  
1291      if  ( rfLens
[ rfHighest
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1292        if  ( rfLens
[ rfHighest2
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest2
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1293          if  ( rfLens
[ rfHighest3
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest3
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1300    if  ( ii
< 0 )  return  0 ;  // oops we went too far  
1306  //countFC is to detect the field clock lengths.  
1307  //counts and returns the 2 most common wave lengths  
1308  uint16_t  countFC ( uint8_t  * BitStream
,  size_t  size
)  
1310    uint8_t  fcLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1311    uint16_t  fcCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1312    uint8_t  fcLensFnd 
=  0 ;  
1313    uint8_t  lastFCcnt
= 0 ;  
1314    uint32_t  fcCounter 
=  0 ;  
1317    // prime i to first up transition  
1318    for  ( i 
=  1 ;  i 
<  size
- 1 ;  i
++)  
1319      if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ])  
1322    for  (;  i 
<  size
- 1 ;  i
++){  
1323      if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]){  
1324          // new up transition  
1327        //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8)  
1328        if  ( lastFCcnt
== 5  &&  fcCounter
== 9 )  fcCounter
--;  
1329        //if odd and not rc/5 add one (for when we get a fc 9 instead of 10)  
1330        if  (( fcCounter
== 9  &&  fcCounter 
&  1 ) ||  fcCounter
== 4 )  fcCounter
++;  
1332        // save last field clock count  (fc/xx)  
1333        // find which fcLens to save it to:  
1334        for  ( int  ii
= 0 ;  ii
< 10 ;  ii
++){  
1335          if  ( fcLens
[ ii
]== fcCounter
){  
1341        if  ( fcCounter
> 0  &&  fcLensFnd
< 10 ){  
1343          fcCnts
[ fcLensFnd
]++;  
1344          fcLens
[ fcLensFnd
++]= fcCounter
;  
1353    uint8_t  best1
= 9 ,  best2
= 9 ,  best3
= 9 ;  
1355    // go through fclens and find which ones are bigest 2    
1356    for  ( i
= 0 ;  i
< 10 ;  i
++){  
1357      // PrintAndLog("DEBUG: FC %d, Cnt %d, Errs %d",fcLens[i],fcCnts[i],errCnt);      
1358      // get the 3 best FC values  
1359      if  ( fcCnts
[ i
]> maxCnt1
) {  
1364      }  else if ( fcCnts
[ i
]> fcCnts
[ best2
]){  
1367      }  else if ( fcCnts
[ i
]> fcCnts
[ best3
]){  
1371    uint8_t  fcH
= 0 ,  fcL
= 0 ;  
1372    if  ( fcLens
[ best1
]> fcLens
[ best2
]){  
1380    // TODO: take top 3 answers and compare to known Field clocks to get top 2  
1382    uint16_t  fcs 
= ((( uint16_t ) fcH
)<< 8 ) |  fcL
;  
1383    // PrintAndLog("DEBUG: Best %d  best2 %d best3 %d",fcLens[best1],fcLens[best2],fcLens[best3]);