]>
 
 
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/lfdemod.c 
 
 
 
 
 
 
 
d9a875830d4ce654e2fc21fc7f8ba660c6b0cdda
   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  //-----------------------------------------------------------------------------  
  15  //un_comment to allow debug print calls when used not on device  
  16  void  dummy ( char  * fmt
, ...){}  
  20  #include  "cmdparser.h"  
  22  #define prnt PrintAndLog  
  24          uint8_t  g_debugMode
= 0 ;  
  28  uint8_t  justNoise ( uint8_t  * BitStream
,  size_t  size
)  
  30          static const uint8_t  THRESHOLD 
=  123 ;  
  31          //test samples are not just noise  
  32          uint8_t  justNoise1 
=  1 ;  
  33          for ( size_t  idx
= 0 ;  idx 
<  size 
&&  justNoise1 
; idx
++){  
  34                  justNoise1 
=  BitStream
[ idx
] <  THRESHOLD
;  
  40  //get high and low values of a wave with passed in fuzz factor. also return noise test = 1 for passed or 0 for only noise  
  41  int  getHiLo ( uint8_t  * BitStream
,  size_t  size
,  int  * high
,  int  * low
,  uint8_t  fuzzHi
,  uint8_t  fuzzLo
)  
  45          // get high and low thresholds   
  46          for  ( size_t  i
= 0 ;  i 
<  size
;  i
++){  
  47                  if  ( BitStream
[ i
] > * high
) * high 
=  BitStream
[ i
];  
  48                  if  ( BitStream
[ i
] < * low
) * low 
=  BitStream
[ i
];  
  50          if  (* high 
<  123 )  return  - 1 ;  // just noise  
  51          * high 
= ((* high
- 128 )* fuzzHi 
+  12800 )/ 100 ;  
  52          * low 
= ((* low
- 128 )* fuzzLo 
+  12800 )/ 100 ;  
  57  // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType  
  58  // returns 1 if passed  
  59  uint8_t  parityTest ( uint32_t  bits
,  uint8_t  bitLen
,  uint8_t  pType
)  
  62          for  ( uint8_t  i 
=  0 ;  i 
<  bitLen
;  i
++){  
  63                  ans 
^= (( bits 
>>  i
) &  1 );  
  65          //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType);  
  66          return  ( ans 
==  pType
);  
  70  // takes a array of binary values, start position, length of bits per parity (includes parity bit),  
  71  //   Parity Type (1 for odd; 0 for even; 2 for Always 1's; 3 for Always 0's), and binary Length (length to run)   
  72  size_t  removeParity ( uint8_t  * BitStream
,  size_t  startIdx
,  uint8_t  pLen
,  uint8_t  pType
,  size_t  bLen
)  
  74          uint32_t  parityWd 
=  0 ;  
  75          size_t  j 
=  0 ,  bitCnt 
=  0 ;  
  76          for  ( int  word 
=  0 ;  word 
< ( bLen
);  word
+= pLen
){  
  77                  for  ( int  bit
= 0 ;  bit 
<  pLen
;  bit
++){  
  78                          parityWd 
= ( parityWd 
<<  1 ) |  BitStream
[ startIdx
+ word
+ bit
];  
  79                          BitStream
[ j
++] = ( BitStream
[ startIdx
+ word
+ bit
]);  
  81                  j
--;  // overwrite parity with next data  
  82                  // if parity fails then return 0  
  84                          case  3 :   if  ( BitStream
[ j
]== 1 ) {  return  0 ; }  break ;  //should be 0 spacer bit  
  85                          case  2 :   if  ( BitStream
[ j
]== 0 ) {  return  0 ; }  break ;  //should be 1 spacer bit  
  86                          default :  if  ( parityTest ( parityWd
,  pLen
,  pType
) ==  0 ) {  return  0 ; }  break ;  //test parity  
  91          // if we got here then all the parities passed  
  92          //return ID start index and size  
  97  // takes a array of binary values, length of bits per parity (includes parity bit),  
  98  //   Parity Type (1 for odd; 0 for even; 2 Always 1's; 3 Always 0's), and binary Length (length to run)  
  99  //   Make sure *dest is long enough to store original sourceLen + #_of_parities_to_be_added  
 100  size_t  addParity ( uint8_t  * BitSource
,  uint8_t  * dest
,  uint8_t  sourceLen
,  uint8_t  pLen
,  uint8_t  pType
)  
 102          uint32_t  parityWd 
=  0 ;  
 103          size_t  j 
=  0 ,  bitCnt 
=  0 ;  
 104          for  ( int  word 
=  0 ;  word 
<  sourceLen
;  word
+= pLen
- 1 ) {  
 105                  for  ( int  bit
= 0 ;  bit 
<  pLen
- 1 ;  bit
++){  
 106                          parityWd 
= ( parityWd 
<<  1 ) |  BitSource
[ word
+ bit
];  
 107                          dest
[ j
++] = ( BitSource
[ word
+ bit
]);  
 110                  // if parity fails then return 0  
 112                          case  3 :  dest
[ j
++]= 0 ;  break ;  // marker bit which should be a 0  
 113                          case  2 :  dest
[ j
++]= 1 ;  break ;  // marker bit which should be a 1  
 115                                  dest
[ j
++] =  parityTest ( parityWd
,  pLen
- 1 ,  pType
) ^  1 ;  
 121          // if we got here then all the parities passed  
 122          //return ID start index and size  
 126  uint32_t  bytebits_to_byte ( uint8_t  * src
,  size_t  numbits
)  
 129          for ( int  i 
=  0  ;  i 
<  numbits 
;  i
++) {  
 130                  num 
= ( num 
<<  1 ) | (* src
);  
 136  //least significant bit first  
 137  uint32_t  bytebits_to_byteLSBF ( uint8_t  * src
,  size_t  numbits
)  
 140          for ( int  i 
=  0  ;  i 
<  numbits 
;  i
++) {  
 141                  num 
= ( num 
<<  1 ) | *( src 
+ ( numbits
-( i
+ 1 )));  
 147  //search for given preamble in given BitStream and return success=1 or fail=0 and startIndex and length  
 148  uint8_t  preambleSearch ( uint8_t  * BitStream
,  uint8_t  * preamble
,  size_t  pLen
,  size_t  * size
,  size_t  * startIdx
)  
 150          // Sanity check.  If preamble length is bigger than bitstream length.  
 151          if  ( * size 
<=  pLen 
)  return  0 ;  
 153          uint8_t  foundCnt 
=  0 ;  
 154          for  ( int  idx 
=  0 ;  idx 
< * size 
-  pLen
;  idx
++){  
 155                  if  ( memcmp ( BitStream
+ idx
,  preamble
,  pLen
) ==  0 ){  
 162                                  * size 
=  idx 
- * startIdx
;  
 171  //takes 1s and 0s and searches for EM410x format - output EM ID  
 172  uint8_t  Em410xDecode ( uint8_t  * BitStream
,  size_t  * size
,  size_t  * startIdx
,  uint32_t  * hi
,  uint64_t  * lo
)  
 174          //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future  
 175          //  otherwise could be a void with no arguments  
 178          if  ( BitStream
[ 1 ]> 1 )  return  0 ;   //allow only 1s and 0s  
 180          // 111111111 bit pattern represent start of frame  
 181          //  include 0 in front to help get start pos  
 182          uint8_t  preamble
[] = { 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 };  
 184          uint32_t  parityBits 
=  0 ;  
 188          errChk 
=  preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
,  startIdx
);  
 189          if  ( errChk 
==  0  || * size 
<  64 )  return  0 ;  
 190          if  (* size 
>  64 )  FmtLen 
=  22 ;  
 191          * startIdx 
+=  1 ;  //get rid of 0 from preamble  
 193          for  ( i
= 0 ;  i
< FmtLen
;  i
++){  //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)  
 194                  parityBits 
=  bytebits_to_byte ( BitStream
+( i
* 5 )+ idx
, 5 );  
 195                  //check even parity - quit if failed  
 196                  if  ( parityTest ( parityBits
,  5 ,  0 ) ==  0 )  return  0 ;  
 197                  //set uint64 with ID from BitStream  
 198                  for  ( uint8_t  ii
= 0 ;  ii
< 4 ;  ii
++){  
 199                          * hi 
= (* hi 
<<  1 ) | (* lo 
>>  63 );  
 200                          * lo 
= (* lo 
<<  1 ) | ( BitStream
[( i
* 5 )+ ii
+ idx
]);  
 203          if  ( errChk 
!=  0 )  return  1 ;  
 204          //skip last 5 bit parity test for simplicity.  
 210  //demodulates strong heavily clipped samples  
 211  int  cleanAskRawDemod ( uint8_t  * BinStream
,  size_t  * size
,  int  clk
,  int  invert
,  int  high
,  int  low
)  
 213          size_t  bitCnt
= 0 ,  smplCnt
= 0 ,  errCnt
= 0 ;  
 214          uint8_t  waveHigh 
=  0 ;  
 215          for  ( size_t  i
= 0 ;  i 
< * size
;  i
++){  
 216                  if  ( BinStream
[ i
] >=  high 
&&  waveHigh
){  
 218                  }  else if  ( BinStream
[ i
] <=  low 
&& ! waveHigh
){  
 220                  }  else  {  //transition  
 221                          if  (( BinStream
[ i
] >=  high 
&& ! waveHigh
) || ( BinStream
[ i
] <=  low 
&&  waveHigh
)){  
 222                                  if  ( smplCnt 
>  clk
-( clk
/ 4 )- 1 ) {  //full clock  
 223                                          if  ( smplCnt 
>  clk 
+ ( clk
/ 4 )+ 1 ) {  //too many samples  
 225                                                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Modulation Error at:  %u " ,  i
);  
 226                                                  BinStream
[ bitCnt
++]= 7 ;  
 227                                          }  else if  ( waveHigh
) {  
 228                                                  BinStream
[ bitCnt
++] =  invert
;  
 229                                                  BinStream
[ bitCnt
++] =  invert
;  
 230                                          }  else if  (! waveHigh
) {  
 231                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  
 232                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  
 236                                  }  else if  ( smplCnt 
> ( clk
/ 2 ) - ( clk
/ 4 )- 1 ) {  
 238                                                  BinStream
[ bitCnt
++] =  invert
;  
 239                                          }  else if  (! waveHigh
) {  
 240                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  
 244                                  }  else if  (! bitCnt
) {  
 246                                          waveHigh 
= ( BinStream
[ i
] >=  high
);  
 250                                          //transition bit oops  
 252                          }  else  {  //haven't hit new high or new low yet  
 262  void  askAmp ( uint8_t  * BitStream
,  size_t  size
)  
 265          for ( size_t  i 
=  1 ;  i 
<  size
; ++ i
){  
 266                  if  ( BitStream
[ i
]- BitStream
[ i
- 1 ] >=  30 )  //large jump up  
 268                  else if ( BitStream
[ i
- 1 ] -  BitStream
[ i
] >=  20 )  //large jump down  
 276  //attempts to demodulate ask modulations, askType == 0 for ask/raw, askType==1 for ask/manchester  
 277  int  askdemod ( uint8_t  * BinStream
,  size_t  * size
,  int  * clk
,  int  * invert
,  int  maxErr
,  uint8_t  amp
,  uint8_t  askType
)  
 279          if  (* size
== 0 )  return  - 1 ;  
 280          int  start 
=  DetectASKClock ( BinStream
, * size
,  clk
,  maxErr
);  //clock default  
 281          if  (* clk
== 0  ||  start 
<  0 )  return  - 3 ;  
 282          if  (* invert 
!=  1 ) * invert 
=  0 ;  
 283          if  ( amp
== 1 )  askAmp ( BinStream
, * size
);  
 284          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: clk  %d , beststart  %d " , * clk
,  start
);  
 286          uint8_t  initLoopMax 
=  255 ;  
 287          if  ( initLoopMax 
> * size
)  initLoopMax 
= * size
;  
 288          // Detect high and lows  
 289          //25% clip in case highs and lows aren't clipped [marshmellow]  
 291          if  ( getHiLo ( BinStream
,  initLoopMax
, & high
, & low
,  75 ,  75 ) <  1 )   
 292                  return  - 2 ;  //just noise  
 295          // if clean clipped waves detected run alternate demod  
 296          if  ( DetectCleanAskWave ( BinStream
, * size
,  high
,  low
)) {  
 297                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Clean Wave Detected - using clean wave demod" );  
 298                  errCnt 
=  cleanAskRawDemod ( BinStream
,  size
, * clk
, * invert
,  high
,  low
);  
 299                  if  ( askType
)  //askman  
 300                          return  manrawdecode ( BinStream
,  size
,  0 );          
 304          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Weak Wave Detected - using weak wave demod" );  
 306          int  lastBit
;   //set first clock check - can go negative  
 307          size_t  i
,  bitnum 
=  0 ;      //output counter  
 309          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  
 310          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  
 311          size_t  MaxBits 
=  3072 ;     //max bits to collect  
 312          lastBit 
=  start 
- * clk
;  
 314          for  ( i 
=  start
;  i 
< * size
; ++ i
) {  
 315                  if  ( i
- lastBit 
>= * clk
- tol
){  
 316                          if  ( BinStream
[ i
] >=  high
) {  
 317                                  BinStream
[ bitnum
++] = * invert
;  
 318                          }  else if  ( BinStream
[ i
] <=  low
) {  
 319                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  
 320                          }  else if  ( i
- lastBit 
>= * clk
+ tol
) {  
 322                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Modulation Error at:  %u " ,  i
);  
 323                                          BinStream
[ bitnum
++]= 7 ;  
 326                          }  else  {  //in tolerance - looking for peak  
 331                  }  else if  ( i
- lastBit 
>= (* clk
/ 2 - tol
) && ! midBit 
&& ! askType
){  
 332                          if  ( BinStream
[ i
] >=  high
) {  
 333                                  BinStream
[ bitnum
++] = * invert
;  
 334                          }  else if  ( BinStream
[ i
] <=  low
) {  
 335                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  
 336                          }  else if  ( i
- lastBit 
>= * clk
/ 2 + tol
) {  
 337                                  BinStream
[ bitnum
] =  BinStream
[ bitnum
- 1 ];  
 339                          }  else  {  //in tolerance - looking for peak  
 344                  if  ( bitnum 
>=  MaxBits
)  break ;  
 351  //take 10 and 01 and manchester decode  
 352  //run through 2 times and take least errCnt  
 353  int  manrawdecode ( uint8_t  *  BitStream
,  size_t  * size
,  uint8_t  invert
)  
 355          uint16_t  bitnum
= 0 ,  MaxBits 
=  512 ,  errCnt 
=  0 ;  
 357          uint16_t  bestErr 
=  1000 ,  bestRun 
=  0 ;  
 358          if  (* size 
<  16 )  return  - 1 ;  
 359          //find correct start position [alignment]  
 360          for  ( ii
= 0 ; ii
< 2 ;++ ii
){  
 361                  for  ( i
= ii
;  i
<* size
- 3 ;  i
+= 2 )  
 362                          if  ( BitStream
[ i
]== BitStream
[ i
+ 1 ])  
 372          for  ( i
= bestRun
;  i 
< * size
- 3 ;  i
+= 2 ){  
 373                  if ( BitStream
[ i
] ==  1  && ( BitStream
[ i
+ 1 ] ==  0 )){  
 374                          BitStream
[ bitnum
++]= invert
;  
 375                  }  else if (( BitStream
[ i
] ==  0 ) &&  BitStream
[ i
+ 1 ] ==  1 ){  
 376                          BitStream
[ bitnum
++]= invert
^ 1 ;  
 378                          BitStream
[ bitnum
++]= 7 ;  
 380                  if ( bitnum
> MaxBits
)  break ;  
 386  uint32_t  manchesterEncode2Bytes ( uint16_t  datain
) {  
 389          for  ( uint8_t  i
= 0 ;  i
< 16 ;  i
++) {  
 390                  curBit 
= ( datain 
>> ( 15 - i
) &  1 );  
 391                  output 
|= ( 1 <<((( 15 - i
)* 2 )+ curBit
));  
 397  //encode binary data into binary manchester   
 398  int  ManchesterEncode ( uint8_t  * BitStream
,  size_t  size
)  
 400          size_t  modIdx
= 20000 ,  i
= 0 ;  
 401          if  ( size
> modIdx
)  return  - 1 ;  
 402          for  ( size_t  idx
= 0 ;  idx 
<  size
;  idx
++){  
 403                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
];  
 404                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
]^ 1 ;  
 406          for  (;  i
<( size
* 2 );  i
++){  
 407                  BitStream
[ i
] =  BitStream
[ i
+ 20000 ];  
 413  //take 01 or 10 = 1 and 11 or 00 = 0  
 414  //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010  
 415  //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding  
 416  int  BiphaseRawDecode ( uint8_t  * BitStream
,  size_t  * size
,  int  offset
,  int  invert
)  
 421          uint16_t  MaxBits
= 512 ;  
 422          //if not enough samples - error  
 423          if  (* size 
<  51 )  return  - 1 ;  
 424          //check for phase change faults - skip one sample if faulty  
 425          uint8_t  offsetA 
=  1 ,  offsetB 
=  1 ;  
 427                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ])  offsetA
= 0 ;   
 428                  if  ( BitStream
[ i
+ 2 ]== BitStream
[ i
+ 3 ])  offsetB
= 0 ;                                    
 430          if  (! offsetA 
&&  offsetB
)  offset
++;  
 431          for  ( i
= offset
;  i
<* size
- 3 ;  i
+= 2 ){  
 432                  //check for phase error  
 433                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ]) {  
 434                          BitStream
[ bitnum
++]= 7 ;  
 437                  if (( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 1 )){  
 438                          BitStream
[ bitnum
++]= 1 ^ invert
;  
 439                  }  else if (( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 1 )){  
 440                          BitStream
[ bitnum
++]= invert
;  
 442                          BitStream
[ bitnum
++]= 7 ;  
 445                  if ( bitnum
> MaxBits
)  break ;  
 452  // demod gProxIIDemod   
 453  // error returns as -x   
 454  // success returns start position in BitStream  
 455  // BitStream must contain previously askrawdemod and biphasedemoded data  
 456  int  gProxII_Demod ( uint8_t  BitStream
[],  size_t  * size
)  
 459          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 0 };  
 461          uint8_t  errChk 
=  preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 462          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  
 463          if  (* size 
!=  96 )  return  - 2 ;  //should have found 96 bits  
 464          //check first 6 spacer bits to verify format  
 465          if  (! BitStream
[ startIdx
+ 5 ] && ! BitStream
[ startIdx
+ 10 ] && ! BitStream
[ startIdx
+ 15 ] && ! BitStream
[ startIdx
+ 20 ] && ! BitStream
[ startIdx
+ 25 ] && ! BitStream
[ startIdx
+ 30 ]){  
 466                  //confirmed proper separator bits found  
 467                  //return start position  
 468                  return  ( int )  startIdx
;  
 470          return  - 5 ;  //spacer bits not found - not a valid gproxII  
 473  //translate wave to 11111100000 (1 for each short wave [higher freq] 0 for each long wave [lower freq])  
 474  size_t  fsk_wave_demod ( uint8_t  *  dest
,  size_t  size
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 476          size_t  last_transition 
=  0 ;  
 479          if  ( fchigh
== 0 )  fchigh
= 10 ;  
 480          if  ( fclow
== 0 )  fclow
= 8 ;  
 481          //set the threshold close to 0 (graph) or 128 std to avoid static  
 482          uint8_t  threshold_value 
=  123 ;   
 483          size_t  preLastSample 
=  0 ;  
 484          size_t  LastSample 
=  0 ;  
 485          size_t  currSample 
=  0 ;  
 486          // sync to first lo-hi transition, and threshold  
 488          // Need to threshold first sample  
 489          // skip 160 samples to allow antenna/samples to settle  
 490          if ( dest
[ 160 ] <  threshold_value
)  dest
[ 0 ] =  0 ;  
 494          // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)  
 495          // or 10 (fc/10) cycles but in practice due to noise etc we may end up with anywhere  
 496          // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10  
 497          //  (could also be fc/5 && fc/7 for fsk1 = 4-9)  
 498          for ( idx 
=  161 ;  idx 
<  size
- 20 ;  idx
++) {  
 499                  // threshold current value  
 501                  if  ( dest
[ idx
] <  threshold_value
)  dest
[ idx
] =  0 ;  
 504                  // Check for 0->1 transition  
 505                  if  ( dest
[ idx
- 1 ] <  dest
[ idx
]) {  
 506                          preLastSample 
=  LastSample
;  
 507                          LastSample 
=  currSample
;  
 508                          currSample 
=  idx
- last_transition
;  
 509                          if  ( currSample 
< ( fclow
- 2 )){             //0-5 = garbage noise (or 0-3)  
 510                                  //do nothing with extra garbage  
 511                          }  else if  ( currSample 
< ( fchigh
- 1 )) {            //6-8 = 8 sample waves  (or 3-6 = 5)  
 512                                  //correct previous 9 wave surrounded by 8 waves (or 6 surrounded by 5)  
 513                                  if  ( LastSample 
> ( fchigh
- 2 ) && ( preLastSample 
< ( fchigh
- 1 ) ||  preLastSample     
==  0  )){  
 518                          }  else if  ( currSample 
> ( fchigh
) && ! numBits
) {  //12 + and first bit = unusable garbage   
 519                                  //do nothing with beginning garbage  
 520                          }  else if  ( currSample 
== ( fclow
+ 1 ) &&  LastSample 
== ( fclow
- 1 )) {  // had a 7 then a 9 should be two 8's (or 4 then a 6 should be two 5's)  
 522                          }  else  {                                         //9+ = 10 sample waves (or 6+ = 7)  
 525                          last_transition 
=  idx
;  
 528          return  numBits
;  //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0  
 531  //translate 11111100000 to 10  
 532  //rfLen = clock, fchigh = larger field clock, fclow = smaller field clock  
 533  size_t  aggregate_bits ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  
 534                  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 536          uint8_t  lastval
= dest
[ 0 ];  
 540          for (  idx
= 1 ;  idx 
<  size
;  idx
++) {  
 542                  if  ( dest
[ idx
]== lastval
)  continue ;   
 544                  //find out how many bits (n) we collected  
 545                  //if lastval was 1, we have a 1->0 crossing  
 546                  if  ( dest
[ idx
- 1 ]== 1 ) {  
 547                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  
 548                  }  else  { // 0->1 crossing   
 549                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;   
 553                  //add to our destination the bits we collected            
 554                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  
 559          // if valid extra bits at the end were all the same frequency - add them in  
 560          if  ( n 
>  rfLen
/ fchigh
) {  
 561                  if  ( dest
[ idx
- 2 ]== 1 ) {  
 562                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  
 564                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;  
 566                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  
 572  //by marshmellow  (from holiman's base)  
 573  // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)  
 574  int  fskdemod ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  
 577          size 
=  fsk_wave_demod ( dest
,  size
,  fchigh
,  fclow
);  
 578          size 
=  aggregate_bits ( dest
,  size
,  rfLen
,  invert
,  fchigh
,  fclow
);  
 582  // loop to get raw HID waveform then FSK demodulate the TAG ID from it  
 583  int  HIDdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  
 585          if  ( justNoise ( dest
, * size
))  return  - 1 ;  
 587          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;   
 589          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  
 590          if  (* size 
<  96 * 2 )  return  - 2 ;  
 591          // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  
 592          uint8_t  preamble
[] = { 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 };  
 593          // find bitstring in array    
 594          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 595          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  
 597          numStart 
=  startIdx 
+  sizeof ( preamble
);  
 598          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  
 599          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  
 600                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ]){  
 601                          return  - 4 ;  //not manchester data  
 603                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  
 604                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  
 605                  //Then, shift in a 0 or one into low  
 606                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  
 611          return  ( int ) startIdx
;  
 614  // loop to get raw paradox waveform then FSK demodulate the TAG ID from it  
 615  int  ParadoxdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  
 617          if  ( justNoise ( dest
, * size
))  return  - 1 ;  
 619          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;  
 621          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  
 622          if  (* size 
<  96 )  return  - 2 ;  
 624          // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  
 625          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 };  
 627          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 628          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  
 630          numStart 
=  startIdx 
+  sizeof ( preamble
);  
 631          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  
 632          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  
 633                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ])   
 634                          return  - 4 ;  //not manchester data  
 635                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  
 636                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  
 637                  //Then, shift in a 0 or one into low  
 638                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  
 643          return  ( int ) startIdx
;  
 646  int  IOdemodFSK ( uint8_t  * dest
,  size_t  size
)  
 648          if  ( justNoise ( dest
,  size
))  return  - 1 ;  
 649          //make sure buffer has data  
 650          if  ( size 
<  66 * 64 )  return  - 2 ;  
 652          size 
=  fskdemod ( dest
,  size
,  64 ,  1 ,  10 ,  8 );   // FSK2a RF/64   
 653          if  ( size 
<  65 )  return  - 3 ;   //did we get a good demod?  
 655          //0           10          20          30          40          50          60  
 657          //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23  
 658          //-----------------------------------------------------------------------------  
 659          //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11  
 661          //XSF(version)facility:codeone+codetwo  
 664          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 665          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
), & size
, & startIdx
);  
 666          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 668          if  (! dest
[ startIdx
+ 8 ] &&  dest
[ startIdx
+ 17 ]== 1  &&  dest
[ startIdx
+ 26 ]== 1  &&  dest
[ startIdx
+ 35 ]== 1  &&  dest
[ startIdx
+ 44 ]== 1  &&  dest
[ startIdx
+ 53 ]== 1 ){  
 669                  //confirmed proper separator bits found  
 670                  //return start position  
 671                  return  ( int )  startIdx
;  
 677  // find viking preamble 0xF200 in already demoded data  
 678  int  VikingDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  
 679          //make sure buffer has data  
 680          if  (* size 
<  64 * 2 )  return  - 2 ;  
 683          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
 684          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 685          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 686          uint32_t  checkCalc 
=  bytebits_to_byte ( dest
+ startIdx
, 8 ) ^   
 687                                                   bytebits_to_byte ( dest
+ startIdx
+ 8 , 8 ) ^   
 688                                                   bytebits_to_byte ( dest
+ startIdx
+ 16 , 8 ) ^   
 689                                                   bytebits_to_byte ( dest
+ startIdx
+ 24 , 8 ) ^   
 690                                                   bytebits_to_byte ( dest
+ startIdx
+ 32 , 8 ) ^   
 691                                                   bytebits_to_byte ( dest
+ startIdx
+ 40 , 8 ) ^   
 692                                                   bytebits_to_byte ( dest
+ startIdx
+ 48 , 8 ) ^   
 693                                                   bytebits_to_byte ( dest
+ startIdx
+ 56 , 8 );  
 694          if  (  checkCalc 
!=  0xA8  )  return  - 5 ;       
 695          if  (* size 
!=  64 )  return  - 6 ;  
 696          //return start position  
 697          return  ( int )  startIdx
;  
 700  // find presco preamble 0x10D in already demoded data  
 701  int  PrescoDemod ( uint8_t  * dest
,  size_t  * size
) {  
 702          //make sure buffer has data  
 703          if  (* size 
<  64 * 2 )  return  - 2 ;  
 706          uint8_t  preamble
[] = { 1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
 707          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 708          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 709          //return start position  
 710          return  ( int )  startIdx
;  
 713  // Ask/Biphase Demod then try to locate an ISO 11784/85 ID  
 714  // BitStream must contain previously askrawdemod and biphasedemoded data  
 715  int  FDXBdemodBI ( uint8_t  * dest
,  size_t  * size
)  
 717          //make sure buffer has enough data  
 718          if  (* size 
<  128 )  return  - 1 ;  
 721          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 723          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 724          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  
 725          return  ( int ) startIdx
;  
 728  // ASK/Diphase fc/64 (inverted Biphase)  
 729  // Note: this i s not a demod, this is only a detection  
 730  // the parameter *dest needs to be demoded before call  
 731  int  JablotronDemod ( uint8_t  * dest
,  size_t  * size
){  
 732          //make sure buffer has enough data  
 733          if  (* size 
<  64 )  return  - 1 ;  
 736          // 0xFFFF preamble, 64bits  
 737          uint8_t  preamble
[] = {  
 745          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 746          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 747          if  (* size 
!=  64 )  return  - 3 ;  
 749          uint8_t  checkchksum 
=  0 ;  
 750          for  ( int  i
= 16 ;  i 
<  56 ;  i 
+=  8 ) {  
 751                  checkchksum 
+=  bytebits_to_byte ( dest
+ startIdx
+ i
, 8 );  
 755          uint8_t  crc 
=  bytebits_to_byte ( dest
+ startIdx
+ 56 ,  8 );  
 757          if  (  checkchksum 
!=  crc 
)  return  - 5 ;      
 758          return  ( int ) startIdx
;  
 762  // FSK Demod then try to locate an AWID ID  
 763  int  AWIDdemodFSK ( uint8_t  * dest
,  size_t  * size
)  
 765          //make sure buffer has enough data  
 766          if  (* size 
<  96 * 50 )  return  - 1 ;  
 768          if  ( justNoise ( dest
, * size
))  return  - 2 ;  
 771          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   
 772          if  (* size 
<  96 )  return  - 3 ;   //did we get a good demod?  
 774          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 776          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 777          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 778          if  (* size 
!=  96 )  return  - 5 ;  
 779          return  ( int ) startIdx
;  
 783  // FSK Demod then try to locate a Farpointe Data (pyramid) ID  
 784  int  PyramiddemodFSK ( uint8_t  * dest
,  size_t  * size
)  
 786          //make sure buffer has data  
 787          if  (* size 
<  128 * 50 )  return  - 5 ;  
 789          //test samples are not just noise  
 790          if  ( justNoise ( dest
, * size
))  return  - 1 ;  
 793          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   
 794          if  (* size 
<  128 )  return  - 2 ;   //did we get a good demod?  
 796          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
 798          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 799          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 800          if  (* size 
!=  128 )  return  - 3 ;  
 801          return  ( int ) startIdx
;  
 804  // find nedap preamble in already demoded data  
 805  int  NedapDemod ( uint8_t  * dest
,  size_t  * size
) {  
 806          //make sure buffer has data  
 807          if  (* size 
<  128 )  return  - 3 ;  
 810          //uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,0,0,0,1};  
 811          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  
 812          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  
 813          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  
 814          return  ( int )  startIdx
;  
 818  // to detect a wave that has heavily clipped (clean) samples  
 819  uint8_t  DetectCleanAskWave ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  
 821          bool  allArePeaks 
=  true ;  
 823          size_t  loopEnd 
=  512 + 160 ;  
 824          if  ( loopEnd 
>  size
)  loopEnd 
=  size
;  
 825          for  ( size_t  i
= 160 ;  i
< loopEnd
;  i
++){  
 826                  if  ( dest
[ i
]> low 
&&  dest
[ i
]< high
)   
 832                  if  ( cntPeaks 
>  300 )  return true ;  
 837  // to help detect clocks on heavily clipped samples  
 838  // based on count of low to low  
 839  int  DetectStrongAskClock ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  
 841          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 };  
 845                  // get to first full low to prime loop and skip incomplete first pulse  
 846          while  (( dest
[ i
] <  high
) && ( i 
<  size
))  
 848          while  (( dest
[ i
] >  low
) && ( i 
<  size
))  
 851          // loop through all samples  
 853                  // measure from low to low  
 854                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  
 857                  while  (( dest
[ i
] <  high
) && ( i 
<  size
))  
 859                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  
 861                  //get minimum measured distance  
 862                  if  ( i
- startwave 
<  minClk 
&&  i 
<  size
)  
 863                          minClk 
=  i 
-  startwave
;  
 866          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectstrongASKclk smallest wave:  %d " , minClk
);  
 867          for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) {  
 868                  if  ( minClk 
>=  fndClk
[ clkCnt
]-( fndClk
[ clkCnt
]/ 8 ) &&  minClk 
<=  fndClk
[ clkCnt
]+ 1 )  
 869                          return  fndClk
[ clkCnt
];  
 875  // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)  
 876  // maybe somehow adjust peak trimming value based on samples to fix?  
 877  // return start index of best starting position for that clock and return clock (by reference)  
 878  int  DetectASKClock ( uint8_t  dest
[],  size_t  size
,  int  * clock
,  int  maxErr
)  
 881          uint8_t  clk
[] = { 255 , 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  
 883          uint8_t  loopCnt 
=  255 ;   //don't need to loop through entire array...  
 884          if  ( size 
<=  loopCnt
+ 60 )  return  - 1 ;  //not enough samples  
 885          size 
-=  60 ;  //sometimes there is a strange end wave - filter out this....  
 886          //if we already have a valid clock  
 889                  if  ( clk
[ i
] == * clock
)  clockFnd 
=  i
;  
 890                  //clock found but continue to find best startpos  
 892          //get high and low peak  
 894          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  - 1 ;  
 896          //test for large clean peaks  
 898                  if  ( DetectCleanAskWave ( dest
,  size
,  peak
,  low
)== 1 ){  
 899                          int  ans 
=  DetectStrongAskClock ( dest
,  size
,  peak
,  low
);  
 900                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectaskclk Clean Ask Wave Detected: clk  %d " , ans
);  
 901                          for  ( i
= clkEnd
- 1 ;  i
> 0 ;  i
--){  
 905                                          return  0 ;   // for strong waves i don't use the 'best start position' yet...  
 906                                          //break; //clock found but continue to find best startpos [not yet]  
 912          uint8_t  clkCnt
,  tol 
=  0 ;  
 913          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  
 914          uint8_t  bestStart
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
 916          size_t  arrLoc
,  loopEnd
;  
 924          //test each valid clock from smallest to greatest to see which lines up  
 925          for (;  clkCnt 
<  clkEnd
;  clkCnt
++){  
 926                  if  ( clk
[ clkCnt
] <=  32 ){  
 931                  //if no errors allowed - keep start within the first clock  
 932                  if  (! maxErr 
&&  size 
>  clk
[ clkCnt
]* 2  +  tol 
&&  clk
[ clkCnt
]< 128 )  loopCnt
= clk
[ clkCnt
]* 2 ;  
 933                  bestErr
[ clkCnt
]= 1000 ;  
 934                  //try lining up the peaks by moving starting point (try first few clocks)  
 935                  for  ( ii
= 0 ;  ii 
<  loopCnt
;  ii
++){  
 936                          if  ( dest
[ ii
] <  peak 
&&  dest
[ ii
] >  low
)  continue ;  
 939                          // now that we have the first one lined up test rest of wave array  
 940                          loopEnd 
= (( size
- ii
- tol
) /  clk
[ clkCnt
]) -  1 ;  
 941                          for  ( i
= 0 ;  i 
<  loopEnd
; ++ i
){  
 942                                  arrLoc 
=  ii 
+ ( i 
*  clk
[ clkCnt
]);  
 943                                  if  ( dest
[ arrLoc
] >=  peak 
||  dest
[ arrLoc
] <=  low
){  
 944                                  } else if  ( dest
[ arrLoc
- tol
] >=  peak 
||  dest
[ arrLoc
- tol
] <=  low
){  
 945                                  } else if  ( dest
[ arrLoc
+ tol
] >=  peak 
||  dest
[ arrLoc
+ tol
] <=  low
){  
 946                                  } else {   //error no peak detected  
 950                          //if we found no errors then we can stop here and a low clock (common clocks)  
 951                          //  this is correct one - return this clock  
 952                          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG ASK: clk  %d , err  %d , startpos  %d , endpos  %d " , clk
[ clkCnt
], errCnt
, ii
, i
);  
 953                          if ( errCnt
== 0  &&  clkCnt
< 7 ) {   
 954                                  if  (! clockFnd
) * clock 
=  clk
[ clkCnt
];  
 957                          //if we found errors see if it is lowest so far and save it as best run  
 958                          if ( errCnt
< bestErr
[ clkCnt
]){  
 959                                  bestErr
[ clkCnt
]= errCnt
;  
 960                                  bestStart
[ clkCnt
]= ii
;  
 966          for  ( iii
= 1 ;  iii
< clkEnd
; ++ iii
){  
 967                  if  ( bestErr
[ iii
] <  bestErr
[ best
]){  
 968                          if  ( bestErr
[ iii
] ==  0 )  bestErr
[ iii
]= 1 ;  
 969                          // current best bit to error ratio     vs  new bit to error ratio  
 970                          if  ( ( size
/ clk
[ best
])/ bestErr
[ best
] < ( size
/ clk
[ iii
])/ bestErr
[ iii
] ){  
 974                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG ASK: clk  %d , # Errors  %d , Current Best Clk  %d , bestStart  %d " , clk
[ iii
], bestErr
[ iii
], clk
[ best
], bestStart
[ best
]);  
 976          if  (! clockFnd
) * clock 
=  clk
[ best
];  
 977          return  bestStart
[ best
];  
 981  //detect psk clock by reading each phase shift  
 982  // a phase shift is determined by measuring the sample length of each wave  
 983  int  DetectPSKClock ( uint8_t  dest
[],  size_t  size
,  int  clock
)  
 985          uint8_t  clk
[]={ 255 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  //255 is not a valid clock  
 986          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array...  
 987          if  ( size 
==  0 )  return  0 ;  
 988          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ;  
 990          //if we already have a valid clock quit  
 993                  if  ( clk
[ i
] ==  clock
)  return  clock
;  
 995          size_t  waveStart
= 0 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ;  
 996          uint8_t  clkCnt
,  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ;  
 997          uint16_t  peakcnt
= 0 ,  errCnt
= 0 ,  waveLenCnt
= 0 ;  
 998          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  
 999          uint16_t  peaksdet
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1000          fc 
=  countFC ( dest
,  size
,  0 );  
1001          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ;  
1002          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: FC:  %d " , fc
);  
1004          //find first full wave  
1005          for  ( i
= 160 ;  i
< loopCnt
;  i
++){  
1006                  if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){  
1007                          if  ( waveStart 
==  0 ) {  
1009                                  //prnt("DEBUG: waveStart: %d",waveStart);  
1012                                  //prnt("DEBUG: waveEnd: %d",waveEnd);  
1013                                  waveLenCnt 
=  waveEnd
- waveStart
;  
1014                                  if  ( waveLenCnt 
>  fc
){  
1015                                          firstFullWave 
=  waveStart
;  
1016                                          fullWaveLen
= waveLenCnt
;  
1023          if  ( g_debugMode 
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %d , waveLen:  %d " , firstFullWave
, fullWaveLen
);  
1025          //test each valid clock from greatest to smallest to see which lines up  
1026          for ( clkCnt
= 7 ;  clkCnt 
>=  1  ;  clkCnt
--){  
1027                  lastClkBit 
=  firstFullWave
;  //set end of wave as clock align  
1031                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: clk:  %d , lastClkBit:  %d " , clk
[ clkCnt
], lastClkBit
);  
1033                  for  ( i 
=  firstFullWave
+ fullWaveLen
- 1 ;  i 
<  loopCnt
- 2 ;  i
++){  
1034                          //top edge of wave = start of new wave   
1035                          if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){  
1036                                  if  ( waveStart 
==  0 ) {  
1041                                          waveLenCnt 
=  waveEnd
- waveStart
;  
1042                                          if  ( waveLenCnt 
>  fc
){   
1043                                                  //if this wave is a phase shift  
1044                                                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: phase shift at:  %d , len:  %d , nextClk:  %d , i:  %d , fc:  %d " , waveStart
, waveLenCnt
, lastClkBit
+ clk
[ clkCnt
]- tol
, i
+ 1 , fc
);  
1045                                                  if  ( i
+ 1  >=  lastClkBit 
+  clk
[ clkCnt
] -  tol
){  //should be a clock bit  
1047                                                          lastClkBit
+= clk
[ clkCnt
];  
1048                                                  }  else if  ( i
< lastClkBit
+ 8 ){  
1049                                                          //noise after a phase shift - ignore  
1050                                                  }  else  {  //phase shift before supposed to based on clock  
1053                                          }  else if  ( i
+ 1  >  lastClkBit 
+  clk
[ clkCnt
] +  tol 
+  fc
){  
1054                                                  lastClkBit
+= clk
[ clkCnt
];  //no phase shift but clock bit  
1063                  if  ( errCnt 
<=  bestErr
[ clkCnt
])  bestErr
[ clkCnt
]= errCnt
;  
1064                  if  ( peakcnt 
>  peaksdet
[ clkCnt
])  peaksdet
[ clkCnt
]= peakcnt
;  
1066          //all tested with errors   
1067          //return the highest clk with the most peaks found  
1069          for  ( i
= 7 ;  i
>= 1 ;  i
--){  
1070                  if  ( peaksdet
[ i
] >  peaksdet
[ best
]) {  
1073                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: Clk:  %d , peaks:  %d , errs:  %d , bestClk:  %d " , clk
[ i
], peaksdet
[ i
], bestErr
[ i
], clk
[ best
]);  
1078  int  DetectStrongNRZClk ( uint8_t  * dest
,  size_t  size
,  int  peak
,  int  low
){  
1079          //find shortest transition from high to low  
1081          size_t  transition1 
=  0 ;  
1082          int  lowestTransition 
=  255 ;  
1083          bool  lastWasHigh 
=  false ;  
1085          //find first valid beginning of a high or low wave  
1086          while  (( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) && ( i 
<  size
))  
1088          while  (( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
) && ( i 
<  size
))  
1090          lastWasHigh 
= ( dest
[ i
] >=  peak
);  
1092          if  ( i
== size
)  return  0 ;  
1095          for  (; i 
<  size
;  i
++) {  
1096                  if  (( dest
[ i
] >=  peak 
&& ! lastWasHigh
) || ( dest
[ i
] <=  low 
&&  lastWasHigh
)) {  
1097                          lastWasHigh 
= ( dest
[ i
] >=  peak
);  
1098                          if  ( i
- transition1 
<  lowestTransition
)  lowestTransition 
=  i
- transition1
;  
1102          if  ( lowestTransition 
==  255 )  lowestTransition 
=  0 ;  
1103          if  ( g_debugMode
== 2 )  prnt ( "DEBUG NRZ: detectstrongNRZclk smallest wave:  %d " , lowestTransition
);  
1104          return  lowestTransition
;  
1108  //detect nrz clock by reading #peaks vs no peaks(or errors)  
1109  int  DetectNRZClock ( uint8_t  dest
[],  size_t  size
,  int  clock
)  
1112          uint8_t  clk
[]={ 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  
1113          size_t  loopCnt 
=  4096 ;   //don't need to loop through entire array...  
1114          if  ( size 
==  0 )  return  0 ;  
1115          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ;  
1116          //if we already have a valid clock quit  
1118                  if  ( clk
[ i
] ==  clock
)  return  clock
;  
1120          //get high and low peak  
1122          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  0 ;  
1124          int  lowestTransition 
=  DetectStrongNRZClk ( dest
,  size
- 20 ,  peak
,  low
);  
1128          uint16_t  smplCnt 
=  0 ;  
1129          int16_t  peakcnt 
=  0 ;  
1130          int16_t  peaksdet
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1131          uint16_t  maxPeak 
=  255 ;  
1132          bool  firstpeak 
=  false ;  
1133          //test for large clipped waves  
1134          for  ( i
= 0 ;  i
< loopCnt
;  i
++){  
1135                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
){  
1136                          if  (! firstpeak
)  continue ;  
1141                                  if  ( maxPeak 
>  smplCnt
){  
1143                                          //prnt("maxPk: %d",maxPeak);  
1146                                  //prnt("maxPk: %d, smplCnt: %d, peakcnt: %d",maxPeak,smplCnt,peakcnt);  
1151          bool  errBitHigh 
=  0 ;  
1153          uint8_t  ignoreCnt 
=  0 ;  
1154          uint8_t  ignoreWindow 
=  4 ;  
1155          bool  lastPeakHigh 
=  0 ;  
1158          //test each valid clock from smallest to greatest to see which lines up  
1159          for ( clkCnt
= 0 ;  clkCnt 
<  8 ; ++ clkCnt
){  
1160                  //ignore clocks smaller than smallest peak  
1161                  if  ( clk
[ clkCnt
] <  maxPeak 
- ( clk
[ clkCnt
]/ 4 ))  continue ;  
1162                  //try lining up the peaks by moving starting point (try first 256)  
1163                  for  ( ii
= 20 ;  ii 
<  loopCnt
; ++ ii
){  
1164                          if  (( dest
[ ii
] >=  peak
) || ( dest
[ ii
] <=  low
)){  
1168                                  lastBit 
=  ii
- clk
[ clkCnt
];   
1169                                  //loop through to see if this start location works  
1170                                  for  ( i 
=  ii
;  i 
<  size
- 20 ; ++ i
) {  
1171                                          //if we are at a clock bit  
1172                                          if  (( i 
>=  lastBit 
+  clk
[ clkCnt
] -  tol
) && ( i 
<=  lastBit 
+  clk
[ clkCnt
] +  tol
)) {  
1174                                                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) {  
1175                                                          //if same peak don't count it  
1176                                                          if  (( dest
[ i
] >=  peak 
&& ! lastPeakHigh
) || ( dest
[ i
] <=  low 
&&  lastPeakHigh
)) {  
1179                                                          lastPeakHigh 
= ( dest
[ i
] >=  peak
);  
1182                                                          ignoreCnt 
=  ignoreWindow
;  
1183                                                          lastBit 
+=  clk
[ clkCnt
];  
1184                                                  }  else if  ( i 
==  lastBit 
+  clk
[ clkCnt
] +  tol
) {  
1185                                                          lastBit 
+=  clk
[ clkCnt
];  
1187                                          //else if not a clock bit and no peaks  
1188                                          }  else if  ( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
){  
1191                                                          if  ( errBitHigh
== true )  peakcnt
--;  
1196                                                  // else if not a clock bit but we have a peak  
1197                                          }  else if  (( dest
[ i
]>= peak 
||  dest
[ i
]<= low
) && (! bitHigh
)) {  
1198                                                  //error bar found no clock...  
1202                                  if ( peakcnt
> peaksdet
[ clkCnt
]) {  
1203                                          peaksdet
[ clkCnt
]= peakcnt
;  
1210          for  ( iii
= 7 ;  iii 
>  0 ;  iii
--){  
1211                  if  (( peaksdet
[ iii
] >= ( peaksdet
[ best
]- 1 )) && ( peaksdet
[ iii
] <=  peaksdet
[ best
]+ 1 ) &&  lowestTransition
) {  
1212                          if  ( clk
[ iii
] > ( lowestTransition 
- ( clk
[ iii
]/ 8 )) &&  clk
[ iii
] < ( lowestTransition 
+ ( clk
[ iii
]/ 8 ))) {  
1215                  }  else if  ( peaksdet
[ iii
] >  peaksdet
[ best
]){  
1218                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG NRZ: Clk:  %d , peaks:  %d , maxPeak:  %d , bestClk:  %d , lowestTrs:  %d " , clk
[ iii
], peaksdet
[ iii
], maxPeak
,  clk
[ best
],  lowestTransition
);  
1225  // convert psk1 demod to psk2 demod  
1226  // only transition waves are 1s  
1227  void  psk1TOpsk2 ( uint8_t  * BitStream
,  size_t  size
)  
1230          uint8_t  lastBit
= BitStream
[ 0 ];  
1231          for  (;  i
< size
;  i
++){  
1232                  if  ( BitStream
[ i
]== 7 ){  
1234                  }  else if  ( lastBit
!= BitStream
[ i
]){  
1235                          lastBit
= BitStream
[ i
];  
1245  // convert psk2 demod to psk1 demod  
1246  // from only transition waves are 1s to phase shifts change bit  
1247  void  psk2TOpsk1 ( uint8_t  * BitStream
,  size_t  size
)  
1250          for  ( size_t  i
= 0 ;  i
< size
;  i
++){  
1251                  if  ( BitStream
[ i
]== 1 ){  
1259  // redesigned by marshmellow adjusted from existing decode functions  
1260  // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more  
1261  int  indala26decode ( uint8_t  * bitStream
,  size_t  * size
,  uint8_t  * invert
)  
1263          //26 bit 40134 format  (don't know other formats)  
1264          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  
1265          uint8_t  preamble_i
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  
1266          size_t  startidx 
=  0 ;   
1267          if  (! preambleSearch ( bitStream
,  preamble
,  sizeof ( preamble
),  size
, & startidx
)){  
1268                  // if didn't find preamble try again inverting  
1269                  if  (! preambleSearch ( bitStream
,  preamble_i
,  sizeof ( preamble_i
),  size
, & startidx
))  return  - 1 ;  
1272          if  (* size 
!=  64  && * size 
!=  224 )  return  - 2 ;  
1274                  for  ( size_t  i 
=  startidx
;  i 
< * size
;  i
++)  
1277          return  ( int )  startidx
;  
1280  // by marshmellow - demodulate NRZ wave - requires a read with strong signal  
1281  // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak  
1282  int  nrzRawDemod ( uint8_t  * dest
,  size_t  * size
,  int  * clk
,  int  * invert
){  
1283          if  ( justNoise ( dest
, * size
))  return  - 1 ;  
1284          * clk 
=  DetectNRZClock ( dest
, * size
, * clk
);  
1285          if  (* clk
== 0 )  return  - 2 ;  
1286          size_t  i
,  gLen 
=  4096 ;  
1287          if  ( gLen
>* size
)  gLen 
= * size
- 20 ;  
1289          if  ( getHiLo ( dest
,  gLen
, & high
, & low
,  75 ,  75 ) <  1 )  return  - 3 ;  //25% fuzz on high 25% fuzz on low  
1292          //convert wave samples to 1's and 0's  
1293          for ( i
= 20 ;  i 
< * size
- 20 ;  i
++){  
1294                  if  ( dest
[ i
] >=  high
)  bit 
=  1 ;  
1295                  if  ( dest
[ i
] <=  low
)   bit 
=  0 ;  
1298          //now demod based on clock (rf/32 = 32 1's for one 1 bit, 32 0's for one 0 bit)   
1301          for ( i
= 21 ;  i 
< * size
- 20 ;  i
++) {  
1302                  //if transition detected or large number of same bits - store the passed bits  
1303                  if  ( dest
[ i
] !=  dest
[ i
- 1 ] || ( i
- lastBit
) == ( 10  * * clk
)) {  
1304                          memset ( dest
+ numBits
,  dest
[ i
- 1 ] ^ * invert
, ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
);  
1305                          numBits 
+= ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
;  
1314  //detects the bit clock for FSK given the high and low Field Clocks  
1315  uint8_t  detectFSKClk ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fcHigh
,  uint8_t  fcLow
)  
1317          uint8_t  clk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 0 };  
1318          uint16_t  rfLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1319          uint8_t  rfCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1320          uint8_t  rfLensFnd 
=  0 ;  
1321          uint8_t  lastFCcnt 
=  0 ;  
1322          uint16_t  fcCounter 
=  0 ;  
1323          uint16_t  rfCounter 
=  0 ;  
1324          uint8_t  firstBitFnd 
=  0 ;  
1326          if  ( size 
==  0 )  return  0 ;  
1328          uint8_t  fcTol 
= (( fcHigh
* 100  -  fcLow
* 100 )/ 2  +  50 )/ 100 ;  //(uint8_t)(0.5+(float)(fcHigh-fcLow)/2);  
1333          //PrintAndLog("DEBUG: fcTol: %d",fcTol);  
1334          // prime i to first peak / up transition  
1335          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++)  
1336                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
]>= BitStream
[ i
+ 1 ])  
1339          for  (;  i 
<  size
- 20 ;  i
++){  
1343                  if  ( BitStream
[ i
] <=  BitStream
[ i
- 1 ] ||  BitStream
[ i
] <  BitStream
[ i
+ 1 ])   
1346                  // if we got less than the small fc + tolerance then set it to the small fc  
1347                  if  ( fcCounter 
<  fcLow
+ fcTol
)   
1349                  else  //set it to the large fc  
1352                  //look for bit clock  (rf/xx)  
1353                  if  (( fcCounter 
<  lastFCcnt 
||  fcCounter 
>  lastFCcnt
)){  
1354                          //not the same size as the last wave - start of new bit sequence  
1355                          if  ( firstBitFnd 
>  1 ){  //skip first wave change - probably not a complete bit  
1356                                  for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){  
1357                                          if  ( rfLens
[ ii
] >= ( rfCounter
- 4 ) &&  rfLens
[ ii
] <= ( rfCounter
+ 4 )){  
1363                                  if  ( rfCounter 
>  0  &&  rfLensFnd 
<  15 ){  
1364                                          //PrintAndLog("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter);  
1365                                          rfCnts
[ rfLensFnd
]++;  
1366                                          rfLens
[ rfLensFnd
++] =  rfCounter
;  
1372                          lastFCcnt
= fcCounter
;  
1376          uint8_t  rfHighest
= 15 ,  rfHighest2
= 15 ,  rfHighest3
= 15 ;  
1378          for  ( i
= 0 ;  i
< 15 ;  i
++){  
1379                  //get highest 2 RF values  (might need to get more values to compare or compare all?)  
1380                  if  ( rfCnts
[ i
]> rfCnts
[ rfHighest
]){  
1381                          rfHighest3
= rfHighest2
;  
1382                          rfHighest2
= rfHighest
;  
1384                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest2
]){  
1385                          rfHighest3
= rfHighest2
;  
1387                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest3
]){  
1390                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: RF  %d , cnts  %d " , rfLens
[ i
],  rfCnts
[ i
]);  
1392          // set allowed clock remainder tolerance to be 1 large field clock length+1   
1393          //   we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off    
1394          uint8_t  tol1 
=  fcHigh
+ 1 ;   
1396          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: most counted rf values: 1  %d , 2  %d , 3  %d " , rfLens
[ rfHighest
], rfLens
[ rfHighest2
], rfLens
[ rfHighest3
]);  
1398          // loop to find the highest clock that has a remainder less than the tolerance  
1399          //   compare samples counted divided by  
1400          // test 128 down to 32 (shouldn't be possible to have fc/10 & fc/8 and rf/16 or less)  
1402          for  (;  ii
>= 2 ;  ii
--){  
1403                  if  ( rfLens
[ rfHighest
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1404                          if  ( rfLens
[ rfHighest2
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest2
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1405                                  if  ( rfLens
[ rfHighest3
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest3
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){  
1406                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: clk  %d  divides into the 3 most rf values within tolerance" , clk
[ ii
]);  
1413          if  ( ii
< 0 )  return  0 ;  // oops we went too far  
1419  //countFC is to detect the field clock lengths.  
1420  //counts and returns the 2 most common wave lengths  
1421  //mainly used for FSK field clock detection  
1422  uint16_t  countFC ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fskAdj
)  
1424          uint8_t  fcLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1425          uint16_t  fcCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  
1426          uint8_t  fcLensFnd 
=  0 ;  
1427          uint8_t  lastFCcnt
= 0 ;  
1428          uint8_t  fcCounter 
=  0 ;  
1430          if  ( size 
==  0 )  return  0 ;  
1432          // prime i to first up transition  
1433          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++)  
1434                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ])  
1437          for  (;  i 
<  size
- 20 ;  i
++){  
1438                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]){  
1439                          // new up transition  
1442                                  //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8)  
1443                                  if  ( lastFCcnt
== 5  &&  fcCounter
== 9 )  fcCounter
--;  
1444                                  //if fc=9 or 4 add one (for when we get a fc 9 instead of 10 or a 4 instead of a 5)  
1445                                  if  (( fcCounter
== 9 ) ||  fcCounter
== 4 )  fcCounter
++;  
1446                          // save last field clock count  (fc/xx)  
1447                          lastFCcnt 
=  fcCounter
;  
1449                          // find which fcLens to save it to:  
1450                          for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){  
1451                                  if  ( fcLens
[ ii
]== fcCounter
){  
1457                          if  ( fcCounter
> 0  &&  fcLensFnd
< 15 ){  
1459                                  fcCnts
[ fcLensFnd
]++;  
1460                                  fcLens
[ fcLensFnd
++]= fcCounter
;  
1469          uint8_t  best1
= 14 ,  best2
= 14 ,  best3
= 14 ;  
1471          // go through fclens and find which ones are bigest 2    
1472          for  ( i
= 0 ;  i
< 15 ;  i
++){  
1473                  // get the 3 best FC values  
1474                  if  ( fcCnts
[ i
]> maxCnt1
) {  
1479                  }  else if ( fcCnts
[ i
]> fcCnts
[ best2
]){  
1482                  }  else if ( fcCnts
[ i
]> fcCnts
[ best3
]){  
1485                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG countfc: FC  %u , Cnt  %u , best fc:  %u , best2 fc:  %u " , fcLens
[ i
], fcCnts
[ i
], fcLens
[ best1
], fcLens
[ best2
]);  
1487          if  ( fcLens
[ best1
]== 0 )  return  0 ;  
1488          uint8_t  fcH
= 0 ,  fcL
= 0 ;  
1489          if  ( fcLens
[ best1
]> fcLens
[ best2
]){  
1496          if  (( size
- 180 )/ fcH
/ 3  >  fcCnts
[ best1
]+ fcCnts
[ best2
]) {  
1497                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG countfc: fc is too large:  %u  >  %u . Not psk or fsk" ,( size
- 180 )/ fcH
/ 3 , fcCnts
[ best1
]+ fcCnts
[ best2
]);  
1498                  return  0 ;  //lots of waves not psk or fsk  
1500          // TODO: take top 3 answers and compare to known Field clocks to get top 2  
1502          uint16_t  fcs 
= ((( uint16_t ) fcH
)<< 8 ) |  fcL
;  
1503          if  ( fskAdj
)  return  fcs
;   
1504          return  fcLens
[ best1
];  
1507  //by marshmellow - demodulate PSK1 wave   
1508  //uses wave lengths (# Samples)   
1509  int  pskRawDemod ( uint8_t  dest
[],  size_t  * size
,  int  * clock
,  int  * invert
)  
1511          if  ( size 
==  0 )  return  - 1 ;  
1512          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array...  
1513          if  (* size
< loopCnt
)  loopCnt 
= * size
;  
1516          uint8_t  curPhase 
= * invert
;  
1517          size_t  i
,  waveStart
= 1 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ;  
1518          uint8_t  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ;  
1519          uint16_t  errCnt
= 0 ,  waveLenCnt
= 0 ;  
1520          fc 
=  countFC ( dest
, * size
,  0 );  
1521          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ;  
1522          //PrintAndLog("DEBUG: FC: %d",fc);  
1523          * clock 
=  DetectPSKClock ( dest
, * size
, * clock
);  
1524          if  (* clock 
==  0 )  return  - 1 ;  
1525          int  avgWaveVal
= 0 ,  lastAvgWaveVal
= 0 ;  
1526          //find first phase shift  
1527          for  ( i
= 0 ;  i
< loopCnt
;  i
++){  
1528                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){  
1530                          //PrintAndLog("DEBUG: waveEnd: %d",waveEnd);  
1531                          waveLenCnt 
=  waveEnd
- waveStart
;  
1532                          if  ( waveLenCnt 
>  fc 
&&  waveStart 
>  fc 
&& !( waveLenCnt 
>  fc
+ 2 )){  //not first peak and is a large wave but not out of whack  
1533                                  lastAvgWaveVal 
=  avgWaveVal
/( waveLenCnt
);  
1534                                  firstFullWave 
=  waveStart
;  
1535                                  fullWaveLen
= waveLenCnt
;  
1536                                  //if average wave value is > graph 0 then it is an up wave or a 1  
1537                                  if  ( lastAvgWaveVal 
>  123 )  curPhase 
^=  1 ;   //fudge graph 0 a little 123 vs 128  
1543                  avgWaveVal 
+=  dest
[ i
+ 2 ];  
1545          if  ( firstFullWave 
==  0 ) {  
1546                  // no phase shift detected - could be all 1's or 0's - doesn't matter where we start  
1547                  // so skip a little to ensure we are past any Start Signal  
1548                  firstFullWave 
=  160 ;  
1549                  memset ( dest
,  curPhase
,  firstFullWave 
/ * clock
);  
1551                  memset ( dest
,  curPhase
^ 1 ,  firstFullWave 
/ * clock
);  
1554          numBits 
+= ( firstFullWave 
/ * clock
);  
1555          //set start of wave as clock align  
1556          lastClkBit 
=  firstFullWave
;  
1557          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %u , waveLen:  %u " , firstFullWave
, fullWaveLen
);    
1558          if  ( g_debugMode
== 2 )  prnt ( "DEBUG: clk:  %d , lastClkBit:  %u , fc:  %u " , * clock
,  lastClkBit
,( unsigned int )  fc
);  
1560          dest
[ numBits
++] =  curPhase
;  //set first read bit  
1561          for  ( i 
=  firstFullWave 
+  fullWaveLen 
-  1 ;  i 
< * size
- 3 ;  i
++){  
1562                  //top edge of wave = start of new wave   
1563                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){  
1564                          if  ( waveStart 
==  0 ) {  
1567                                  avgWaveVal 
=  dest
[ i
+ 1 ];  
1570                                  waveLenCnt 
=  waveEnd
- waveStart
;  
1571                                  lastAvgWaveVal 
=  avgWaveVal
/ waveLenCnt
;  
1572                                  if  ( waveLenCnt 
>  fc
){    
1573                                          //PrintAndLog("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal);  
1574                                          //this wave is a phase shift  
1575                                          //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc);  
1576                                          if  ( i
+ 1  >=  lastClkBit 
+ * clock 
-  tol
){  //should be a clock bit  
1578                                                  dest
[ numBits
++] =  curPhase
;  
1579                                                  lastClkBit 
+= * clock
;  
1580                                          }  else if  ( i 
<  lastClkBit
+ 10 + fc
){  
1581                                                  //noise after a phase shift - ignore  
1582                                          }  else  {  //phase shift before supposed to based on clock  
1584                                                  dest
[ numBits
++] =  7 ;  
1586                                  }  else if  ( i
+ 1  >  lastClkBit 
+ * clock 
+  tol 
+  fc
){  
1587                                          lastClkBit 
+= * clock
;  //no phase shift but clock bit  
1588                                          dest
[ numBits
++] =  curPhase
;  
1594                  avgWaveVal 
+=  dest
[ i
+ 1 ];  
1601  //attempt to identify a Sequence Terminator in ASK modulated raw wave  
1602  bool  DetectST ( uint8_t  buffer
[],  size_t  * size
,  int  * foundclock
) {  
1603          size_t  bufsize 
= * size
;  
1604          //need to loop through all samples and identify our clock, look for the ST pattern  
1605          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 };  
1608          int  i
,  j
,  skip
,  start
,  end
,  low
,  high
,  minClk
,  waveStart
;  
1609          bool  complete 
=  false ;  
1610          int  tmpbuff
[ bufsize 
/  64 ];  
1611          int  waveLen
[ bufsize 
/  64 ];  
1612          size_t  testsize 
= ( bufsize 
<  512 ) ?  bufsize 
:  512 ;  
1615          memset ( tmpbuff
,  0 ,  sizeof ( tmpbuff
));  
1617          if  (  getHiLo ( buffer
,  testsize
, & high
, & low
,  80 ,  80 ) == - 1  ) {  
1618                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: just noise detected - quitting" );  
1619                  return false ;  //just noise  
1624          // get to first full low to prime loop and skip incomplete first pulse  
1625          while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
))  
1627          while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
))  
1631          // populate tmpbuff buffer with pulse lengths  
1632          while  ( i 
<  bufsize
) {  
1633                  // measure from low to low  
1634                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
))  
1637                  while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
))  
1639                  //first high point for this wave  
1641                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
))  
1643                  if  ( j 
>= ( bufsize
/ 64 )) {  
1646                  waveLen
[ j
] =  i 
-  waveStart
;  //first high to first low  
1647                  tmpbuff
[ j
++] =  i 
-  start
;  
1648                  if  ( i
- start 
<  minClk 
&&  i 
<  bufsize
) {  
1652          // set clock  - might be able to get this externally and remove this work...  
1654                  for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) {  
1655                          tol 
=  fndClk
[ clkCnt
]/ 8 ;  
1656                          if  ( minClk 
>=  fndClk
[ clkCnt
]- tol 
&&  minClk 
<=  fndClk
[ clkCnt
]+ 1 ) {   
1661                  // clock not found - ERROR  
1663                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: clock not found - quitting" );  
1670          // look for Sequence Terminator - should be pulses of clk*(1 or 1.5), clk*2, clk*(1.5 or 2)  
1672          for  ( i 
=  0 ;  i 
<  j 
-  4 ; ++ i
) {  
1674                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol 
&&  waveLen
[ i
] <  clk
+ tol
) {            //1 to 2 clocks depending on 2 bits prior  
1675                          if  ( tmpbuff
[ i
+ 1 ] >=  clk
* 2 - tol 
&&  tmpbuff
[ i
+ 1 ] <=  clk
* 2 + tol 
&&  waveLen
[ i
+ 1 ] >  clk
* 3 / 2 - tol
) {        //2 clocks and wave size is 1 1/2  
1676                                  if  ( tmpbuff
[ i
+ 2 ] >= ( clk
* 3 )/ 2 - tol 
&&  tmpbuff
[ i
+ 2 ] <=  clk
* 2 + tol 
&&  waveLen
[ i
+ 2 ] >  clk
- tol
) {  //1 1/2 to 2 clocks and at least one full clock wave  
1677                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit  
1685          // first ST not found - ERROR  
1687                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: first STT not found - quitting" );  
1690          if  ( waveLen
[ i
+ 2 ] >  clk
* 1 + tol
)  
1695          // skip over the remainder of ST  
1696          skip 
+=  clk
* 7 / 2 ;  //3.5 clocks from tmpbuff[i] = end of st - also aligns for ending point  
1698          // now do it again to find the end  
1700          for  ( i 
+=  3 ;  i 
<  j 
-  4 ; ++ i
) {  
1702                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol
) {            //1 to 2 clocks depending on 2 bits prior  
1703                          if  ( tmpbuff
[ i
+ 1 ] >=  clk
* 2 - tol 
&&  tmpbuff
[ i
+ 1 ] <=  clk
* 2 + tol 
&&  waveLen
[ i
+ 1 ] >  clk
* 3 / 2 - tol
) {        //2 clocks and wave size is 1 1/2  
1704                                  if  ( tmpbuff
[ i
+ 2 ] >= ( clk
* 3 )/ 2 - tol 
&&  tmpbuff
[ i
+ 2 ] <=  clk
* 2 + tol 
&&  waveLen
[ i
+ 2 ] >  clk
- tol
) {  //1 1/2 to 2 clocks and at least one full clock wave  
1705                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit  
1714          //didn't find second ST - ERROR  
1716                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: second STT not found - quitting" );  
1719          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: start of data:  %d  end of data:  %d , datalen:  %d , clk:  %d , bits:  %d , phaseoff:  %d " ,  skip
,  end
,  end
- skip
,  clk
, ( end
- skip
)/ clk
,  phaseoff
);  
1720          //now begin to trim out ST so we can use normal demod cmds  
1722          size_t  datalen 
=  end 
-  start
;  
1723          // check validity of datalen (should be even clock increments)  - use a tolerance of up to 1/8th a clock  
1724          if  ( datalen 
%  clk 
>  clk
/ 8 ) {  
1725                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen not divisible by clk:  %u  %%  %d  =  %d  - quitting" ,  datalen
,  clk
,  datalen 
%  clk
);  
1728                  // padd the amount off - could be problematic...  but shouldn't happen often  
1729                  datalen 
+=  datalen 
%  clk
;  
1731          // if datalen is less than one t55xx block - ERROR  
1732          if  ( datalen
/ clk 
<  8 * 4 ) {  
1733                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen is less than 1 full t55xx block - quitting" );                
1736          size_t  dataloc 
=  start
;  
1739          // warning - overwriting buffer given with raw wave data with ST removed...  
1740          while  (  dataloc 
<  bufsize
-( clk
/ 2 ) ) {  
1741                  //compensate for long high at end of ST not being high due to signal loss... (and we cut out the start of wave high part)  
1742                  if  ( buffer
[ dataloc
]< high 
&&  buffer
[ dataloc
]> low 
&&  buffer
[ dataloc
+ 3 ]< high 
&&  buffer
[ dataloc
+ 3 ]> low
) {  
1743                          for ( i
= 0 ;  i 
<  clk
/ 2 - tol
; ++ i
) {  
1744                                  buffer
[ dataloc
+ i
] =  high
+ 5 ;  
1747                  for  ( i
= 0 ;  i
< datalen
; ++ i
) {  
1748                          if  ( i
+ newloc 
<  bufsize
) {  
1749                                  if  ( i
+ newloc 
<  dataloc
)  
1750                                          buffer
[ i
+ newloc
] =  buffer
[ dataloc
];  
1756                  //skip next ST  -  we just assume it will be there from now on...