]>
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  //-----------------------------------------------------------------------------   12  //un_comment to allow debug print calls when used not on device   13  void  dummy ( char  * fmt
, ...){}   18  # include  "cmdparser.h"   20  # define prnt PrintAndLog   22          uint8_t  g_debugMode
= 0 ;   26  //test samples are not just noise   27  uint8_t  justNoise ( uint8_t  * bits
,  size_t  size
) {   30          for ( size_t  idx
= 0 ;  idx 
<  size 
&&  val 
; idx
++)   31                  val 
=  bits
[ idx
] <  THRESHOLD
;   36  //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   37  int  getHiLo ( uint8_t  * BitStream
,  size_t  size
,  int  * high
,  int  * low
,  uint8_t  fuzzHi
,  uint8_t  fuzzLo
)   41          // get high and low thresholds    42          for  ( size_t  i
= 0 ;  i 
<  size
;  i
++){   43                  if  ( BitStream
[ i
] > * high
) * high 
=  BitStream
[ i
];   44                  if  ( BitStream
[ i
] < * low
) * low 
=  BitStream
[ i
];   46          if  (* high 
<  123 )  return  - 1 ;  // just noise   47          * high 
= ((* high
- 128 )* fuzzHi 
+  12800 )/ 100 ;   48          * low 
= ((* low
- 128 )* fuzzLo 
+  12800 )/ 100 ;   53  // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType   54  // returns 1 if passed   55  uint8_t  parityTest ( uint32_t  bits
,  uint8_t  bitLen
,  uint8_t  pType
)   58          for  ( uint8_t  i 
=  0 ;  i 
<  bitLen
;  i
++){   59                  ans 
^= (( bits 
>>  i
) &  1 );   61          if  ( g_debugMode
)  prnt ( "DEBUG: ans:  %d , ptype:  %d , bits:  %0 8X" , ans
, pType
, bits
);   62          return  ( ans 
==  pType
);   66  // takes a array of binary values, start position, length of bits per parity (includes parity bit),   67  //   Parity Type (1 for odd; 0 for even; 2 for Always 1's; 3 for Always 0's), and binary Length (length to run)    68  size_t  removeParity ( uint8_t  * BitStream
,  size_t  startIdx
,  uint8_t  pLen
,  uint8_t  pType
,  size_t  bLen
)   70          uint32_t  parityWd 
=  0 ;   71          size_t  j 
=  0 ,  bitCnt 
=  0 ;   72          for  ( int  word 
=  0 ;  word 
< ( bLen
);  word 
+=  pLen
){   73                  for  ( int  bit
= 0 ;  bit 
<  pLen
;  bit
++){   74                          parityWd 
= ( parityWd 
<<  1 ) |  BitStream
[ startIdx
+ word
+ bit
];   75                          BitStream
[ j
++] = ( BitStream
[ startIdx
+ word
+ bit
]);   77                  if  ( word
+ pLen 
>=  bLen
)  break ;   79                  j
--;  // overwrite parity with next data   80                  // if parity fails then return 0   82                          case  3 :   if  ( BitStream
[ j
]== 1 ) {  return  0 ; }  break ;  //should be 0 spacer bit   83                          case  2 :   if  ( BitStream
[ j
]== 0 ) {  return  0 ; }  break ;  //should be 1 spacer bit   84                          default :  if  ( parityTest ( parityWd
,  pLen
,  pType
) ==  0 ) {  return  0 ; }  break ;  //test parity   89          // if we got here then all the parities passed   90          //return ID start index and size   95  // takes a array of binary values, length of bits per parity (includes parity bit),   96  //   Parity Type (1 for odd; 0 for even; 2 Always 1's; 3 Always 0's), and binary Length (length to run)   97  //   Make sure *dest is long enough to store original sourceLen + #_of_parities_to_be_added   98  size_t  addParity ( uint8_t  * BitSource
,  uint8_t  * dest
,  uint8_t  sourceLen
,  uint8_t  pLen
,  uint8_t  pType
)  100          uint32_t  parityWd 
=  0 ;  101          size_t  j 
=  0 ,  bitCnt 
=  0 ;  102          for  ( int  word 
=  0 ;  word 
<  sourceLen
;  word
+= pLen
- 1 ) {  103                  for  ( int  bit
= 0 ;  bit 
<  pLen
- 1 ;  bit
++){  104                          parityWd 
= ( parityWd 
<<  1 ) |  BitSource
[ word
+ bit
];  105                          dest
[ j
++] = ( BitSource
[ word
+ bit
]);  108                  // if parity fails then return 0  110                          case  3 :  dest
[ j
++]= 0 ;  break ;  // marker bit which should be a 0  111                          case  2 :  dest
[ j
++]= 1 ;  break ;  // marker bit which should be a 1  113                                  dest
[ j
++] =  parityTest ( parityWd
,  pLen
- 1 ,  pType
) ^  1 ;  119          // if we got here then all the parities passed  120          //return ID start index and size  124  uint32_t  bytebits_to_byte ( uint8_t  * src
,  size_t  numbits
)  127          for ( int  i 
=  0  ;  i 
<  numbits 
;  i
++) {  128                  num 
= ( num 
<<  1 ) | (* src
);  134  //least significant bit first  135  uint32_t  bytebits_to_byteLSBF ( uint8_t  * src
,  size_t  numbits
)  138          for ( int  i 
=  0  ;  i 
<  numbits 
;  i
++) {  139                  num 
= ( num 
<<  1 ) | *( src 
+ ( numbits
-( i
+ 1 )));  145  // search for given preamble in given BitStream and return success=1 or fail=0 and startIndex (where it was found)  146  bool  preambleSearch ( uint8_t  * BitStream
,  uint8_t  * preamble
,  size_t  pLen
,  size_t  * size
,  size_t  * startIdx
){  147          return  preambleSearchEx ( BitStream
,  preamble
,  pLen
,  size
,  startIdx
,  false );  150  //search for given preamble in given BitStream and return success=1 or fail=0 and startIndex and length  151  // param @findone:  look for a repeating preamble or only the first.  152  // em4x05/4x69 only sends preamble once, so look for it once in the first pLen bits  153  bool  preambleSearchEx ( uint8_t  * BitStream
,  uint8_t  * preamble
,  size_t  pLen
,  size_t  * size
,  size_t  * startIdx
,  bool  findone
)  155          // Sanity check.  If preamble length is bigger than bitstream length.  156          if  ( * size 
<=  pLen 
)  return false ;  158          uint8_t  foundCnt 
=  0 ;  159          for  ( int  idx 
=  0 ;  idx 
< * size 
-  pLen
;  idx
++){  160                  if  ( memcmp ( BitStream
+ idx
,  preamble
,  pLen
) ==  0 ){  161                          if  ( g_debugMode
)  prnt ( "DEBUG: preamble found at  %u " ,  idx
);  166                                  if  ( findone
)  return true ;  169                                  * size 
=  idx 
- * startIdx
;  177  // find start of modulating data (for fsk and psk) in case of beginning noise or slow chip startup.  178  size_t  findModStart ( uint8_t  dest
[],  size_t  size
,  uint8_t  threshold_value
,  uint8_t  expWaveSize
) {  180          size_t  waveSizeCnt 
=  0 ;  181          uint8_t  thresholdCnt 
=  0 ;  182          bool  isAboveThreshold 
=  dest
[ i
++] >=  threshold_value
;  183          for  (;  i 
<  size
- 20 ;  i
++ ) {  184                  if ( dest
[ i
] <  threshold_value 
&&  isAboveThreshold
) {  186                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  expWaveSize
+ 1 )  break ;                       187                          isAboveThreshold 
=  false ;  189                  }  else if  ( dest
[ i
] >=  threshold_value 
&& ! isAboveThreshold
) {  191                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  expWaveSize
+ 1 )  break ;                       192                          isAboveThreshold 
=  true ;  197                  if  ( thresholdCnt 
>  10 )  break ;  199          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG: threshold Count reached at  %u , count:  %u " , i
,  thresholdCnt
);  204  //takes 1s and 0s and searches for EM410x format - output EM ID  205  // actually, no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future  206  uint8_t  Em410xDecode ( uint8_t  * BitStream
,  size_t  * size
,  size_t  * startIdx
,  uint32_t  * hi
,  uint64_t  * lo
)  208          //allow only 1s and 0s  209          // only checking first bitvalue?!  210          if  ( BitStream
[ 1 ] >  1 )  return  0 ;   212          uint32_t  i 
=  0 ,  idx 
=  0 ,  parityBits 
=  0 ;  216          // preamble 0111111111  217          // include 0 in front to help get start pos  218          uint8_t  preamble
[] = { 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 };  219          if  (! preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
,  startIdx
))   221          if  (* size 
<  64 )  return  0 ;  223          fmtlen 
= (* size 
>  64 ) ?  22  :  10 ;  225          idx 
= * startIdx 
+  sizeof ( preamble
);  227          //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)  228          for  ( i
= 0 ;  i 
<  fmtlen
;  i
++){   229                  parityBits 
=  bytebits_to_byte ( BitStream 
+ ( i
* 5 ) +  idx
,  5 );  231                  if  ( parityTest ( parityBits
,  5 ,  0 ) ==  0 )  return  0 ;  232                  //set uint64 with ID from BitStream  233                  for  ( uint8_t  j 
=  0 ;  j 
<  4 ;  j
++){  234                          * hi 
= (* hi 
<<  1 ) | (* lo 
>>  63 );  235                          * lo 
= (* lo 
<<  1 ) | ( BitStream
[( i
* 5 ) +  j 
+  idx
]);  238          //skip last 5 bit parity test for simplicity.  244  //demodulates strong heavily clipped samples  245  int  cleanAskRawDemod ( uint8_t  * BinStream
,  size_t  * size
,  int  clk
,  int  invert
,  int  high
,  int  low
)  247          size_t  bitCnt
= 0 ,  smplCnt
= 0 ,  errCnt
= 0 ;  248          uint8_t  waveHigh 
=  0 ;  249          for  ( size_t  i
= 0 ;  i 
< * size
;  i
++){  250                  if  ( BinStream
[ i
] >=  high 
&&  waveHigh
){  252                  }  else if  ( BinStream
[ i
] <=  low 
&& ! waveHigh
){  254                  }  else  {  //transition  255                          if  (( BinStream
[ i
] >=  high 
&& ! waveHigh
) || ( BinStream
[ i
] <=  low 
&&  waveHigh
)){  257                                  if  ( smplCnt 
>  clk
-( clk
/ 4 )- 1 ) {  //full clock  258                                          if  ( smplCnt 
>  clk 
+ ( clk
/ 4 )+ 1 ) {  //too many samples  260                                                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Modulation Error at:  %u " ,  i
);  261                                                  BinStream
[ bitCnt
++] =  7 ;  262                                          }  else if  ( waveHigh
) {  263                                                  BinStream
[ bitCnt
++] =  invert
;  264                                                  BinStream
[ bitCnt
++] =  invert
;  265                                          }  else if  (! waveHigh
) {  266                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  267                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  271                                  }  else if  ( smplCnt 
> ( clk
/ 2 ) - ( clk
/ 4 )- 1 ) {  273                                                  BinStream
[ bitCnt
++] =  invert
;  274                                          }  else if  (! waveHigh
) {  275                                                  BinStream
[ bitCnt
++] =  invert 
^  1 ;  279                                  }  else if  (! bitCnt
) {  281                                          waveHigh 
= ( BinStream
[ i
] >=  high
);  285                                          //transition bit oops  287                          }  else  {  //haven't hit new high or new low yet  297  void  askAmp ( uint8_t  * BitStream
,  size_t  size
)  300          for ( size_t  i 
=  1 ;  i 
<  size
; ++ i
){  301                  if  ( BitStream
[ i
]- BitStream
[ i
- 1 ] >=  30 )  //large jump up  303                  else if ( BitStream
[ i
- 1 ] -  BitStream
[ i
] >=  20 )  //large jump down  311  //attempts to demodulate ask modulations, askType == 0 for ask/raw, askType==1 for ask/manchester  312  int  askdemod ( uint8_t  * BinStream
,  size_t  * size
,  int  * clk
,  int  * invert
,  int  maxErr
,  uint8_t  amp
,  uint8_t  askType
)  314          if  (* size
== 0 )  return  - 1 ;  315          int  start 
=  DetectASKClock ( BinStream
, * size
,  clk
,  maxErr
);  //clock default  317          if  (* clk
== 0  ||  start 
<  0 )  return  - 3 ;  318          if  (* invert 
!=  1 ) * invert 
=  0 ;  319          if  ( amp
== 1 )  askAmp ( BinStream
, * size
);  320          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: clk  %d , beststart  %d , amp  %d " , * clk
,  start
,  amp
);  322          uint8_t  initLoopMax 
=  255 ;  323          if  ( initLoopMax 
> * size
)  initLoopMax 
= * size
;  324          // Detect high and lows  325          //25% clip in case highs and lows aren't clipped [marshmellow]  327          if  ( getHiLo ( BinStream
,  initLoopMax
, & high
, & low
,  75 ,  75 ) <  1 )   328                  return  - 2 ;  //just noise  331          // if clean clipped waves detected run alternate demod  332          if  ( DetectCleanAskWave ( BinStream
, * size
,  high
,  low
)) {  333                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Clean Wave Detected - using clean wave demod" );  334                  errCnt 
=  cleanAskRawDemod ( BinStream
,  size
, * clk
, * invert
,  high
,  low
);  335                  if  ( askType
)  //askman  336                          return  manrawdecode ( BinStream
,  size
,  0 );          340          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Weak Wave Detected - using weak wave demod" );  342          int  lastBit
;   //set first clock check - can go negative  343          size_t  i
,  bitnum 
=  0 ;      //output counter  345          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  346          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  347          size_t  MaxBits 
=  3072 ;     //max bits to collect  348          lastBit 
=  start 
- * clk
;  350          for  ( i 
=  start
;  i 
< * size
; ++ i
) {  351                  if  ( i
- lastBit 
>= * clk
- tol
){  352                          if  ( BinStream
[ i
] >=  high
) {  353                                  BinStream
[ bitnum
++] = * invert
;  354                          }  else if  ( BinStream
[ i
] <=  low
) {  355                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  356                          }  else if  ( i
- lastBit 
>= * clk
+ tol
) {  358                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Modulation Error at:  %u " ,  i
);  359                                          BinStream
[ bitnum
++]= 7 ;  362                          }  else  {  //in tolerance - looking for peak  367                  }  else if  ( i
- lastBit 
>= (* clk
/ 2 - tol
) && ! midBit 
&& ! askType
){  368                          if  ( BinStream
[ i
] >=  high
) {  369                                  BinStream
[ bitnum
++] = * invert
;  370                          }  else if  ( BinStream
[ i
] <=  low
) {  371                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  372                          }  else if  ( i
- lastBit 
>= * clk
/ 2 + tol
) {  373                                  BinStream
[ bitnum
] =  BinStream
[ bitnum
- 1 ];  375                          }  else  {  //in tolerance - looking for peak  380                  if  ( bitnum 
>=  MaxBits
)  break ;  386  //take 10 and 01 and manchester decode  387  //run through 2 times and take least errCnt  388  int  manrawdecode ( uint8_t  *  BitStream
,  size_t  * size
,  uint8_t  invert
){  389          int  errCnt 
=  0 ,  bestErr 
=  1000 ;  390          uint16_t  bitnum 
=  0 ,  MaxBits 
=  512 ,  bestRun 
=  0 ;  392          if  (* size 
<  16 )  return  - 1 ;  393          //find correct start position [alignment]  394          for  ( k
= 0 ;  k 
<  2 ; ++ k
){  395                  for  ( i
= k
;  i
<* size
- 3 ;  i 
+=  2 )  396                          if  ( BitStream
[ i
] ==  BitStream
[ i
+ 1 ])  399                  if  ( bestErr 
>  errCnt
){  406          for  ( i
= bestRun
;  i 
< * size
- 3 ;  i 
+=  2 ){  407                  if  ( BitStream
[ i
] ==  1  && ( BitStream
[ i
+ 1 ] ==  0 )){  408                          BitStream
[ bitnum
++] =  invert
;  409                  }  else if  (( BitStream
[ i
] ==  0 ) &&  BitStream
[ i
+ 1 ] ==  1 ){  410                          BitStream
[ bitnum
++] =  invert
^ 1 ;  412                          BitStream
[ bitnum
++] =  7 ;  414                  if  ( bitnum
> MaxBits
)  break ;  420  uint32_t  manchesterEncode2Bytes ( uint16_t  datain
) {  423          for  ( uint8_t  i
= 0 ;  i
< 16 ;  i
++) {  424                  curBit 
= ( datain 
>> ( 15 - i
) &  1 );  425                  output 
|= ( 1 <<((( 15 - i
)* 2 )+ curBit
));  431  //encode binary data into binary manchester   432  int  ManchesterEncode ( uint8_t  * BitStream
,  size_t  size
)  434          size_t  modIdx
= 20000 ,  i
= 0 ;  435          if  ( size
> modIdx
)  return  - 1 ;  436          for  ( size_t  idx
= 0 ;  idx 
<  size
;  idx
++){  437                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
];  438                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
]^ 1 ;  440          for  (;  i
<( size
* 2 );  i
++){  441                  BitStream
[ i
] =  BitStream
[ i
+ 20000 ];  447  //take 01 or 10 = 1 and 11 or 00 = 0  448  //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010  449  //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding  450  int  BiphaseRawDecode ( uint8_t  * BitStream
,  size_t  * size
,  int  offset
,  int  invert
)  455          uint16_t  MaxBits
= 512 ;  456          //if not enough samples - error  457          if  (* size 
<  51 )  return  - 1 ;  458          //check for phase change faults - skip one sample if faulty  459          uint8_t  offsetA 
=  1 ,  offsetB 
=  1 ;  461                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ])  offsetA
= 0 ;   462                  if  ( BitStream
[ i
+ 2 ]== BitStream
[ i
+ 3 ])  offsetB
= 0 ;                                    464          if  (! offsetA 
&&  offsetB
)  offset
++;  465          for  ( i
= offset
;  i
<* size
- 3 ;  i
+= 2 ){  466                  //check for phase error  467                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ]) {  468                          BitStream
[ bitnum
++]= 7 ;  471                  if (( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 1 )){  472                          BitStream
[ bitnum
++]= 1 ^ invert
;  473                  }  else if (( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 1 )){  474                          BitStream
[ bitnum
++]= invert
;  476                          BitStream
[ bitnum
++]= 7 ;  479                  if ( bitnum
> MaxBits
)  break ;  486  // demod gProxIIDemod   487  // error returns as -x   488  // success returns start position in BitStream  489  // BitStream must contain previously askrawdemod and biphasedemoded data  490  int  gProxII_Demod ( uint8_t  BitStream
[],  size_t  * size
)  493          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 0 };  495          if  (! preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))   496                  return  - 3 ;  //preamble not found  498          if  (* size 
!=  96 )  return  - 2 ;  //should have found 96 bits  500          //check first 6 spacer bits to verify format  501          if  (! BitStream
[ startIdx
+ 5 ] && ! BitStream
[ startIdx
+ 10 ] && ! BitStream
[ startIdx
+ 15 ] && ! BitStream
[ startIdx
+ 20 ] && ! BitStream
[ startIdx
+ 25 ] && ! BitStream
[ startIdx
+ 30 ]){  502                  //confirmed proper separator bits found  503                  //return start position  504                  return  ( int )  startIdx
;  506          return  - 5 ;  //spacer bits not found - not a valid gproxII  509  //translate wave to 11111100000 (1 for each short wave [higher freq] 0 for each long wave [lower freq])  510  size_t  fsk_wave_demod ( uint8_t  *  dest
,  size_t  size
,  uint8_t  fchigh
,  uint8_t  fclow
)  512          size_t  last_transition 
=  0 ;  514          if  ( fchigh
== 0 )  fchigh
= 10 ;  515          if  ( fclow
== 0 )  fclow
= 8 ;  516          //set the threshold close to 0 (graph) or 128 std to avoid static  517          uint8_t  threshold_value 
=  123 ;   518          size_t  preLastSample 
=  0 ;  519          size_t  LastSample 
=  0 ;  520          size_t  currSample 
=  0 ;  521          if  (  size 
<  1024  )  return  0 ;  // not enough samples  523          //find start of modulating data in trace   524          idx 
=  findModStart ( dest
,  size
,  threshold_value
,  fchigh
);  526          // Need to threshold first sample  527          if ( dest
[ idx
] <  threshold_value
)  dest
[ 0 ] =  0 ;  532          // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)  533          // or 10 (fc/10) cycles but in practice due to noise etc we may end up with anywhere  534          // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10  535          //  (could also be fc/5 && fc/7 for fsk1 = 4-9)  536          for (;  idx 
<  size
- 20 ;  idx
++) {  537                  // threshold current value  539                  if  ( dest
[ idx
] <  threshold_value
)  dest
[ idx
] =  0 ;  542                  // Check for 0->1 transition  543                  if  ( dest
[ idx
- 1 ] <  dest
[ idx
]) {  544                          preLastSample 
=  LastSample
;  545                          LastSample 
=  currSample
;  546                          currSample 
=  idx
- last_transition
;  547                          if  ( currSample 
< ( fclow
- 2 )){             //0-5 = garbage noise (or 0-3)  548                                  //do nothing with extra garbage  549                          }  else if  ( currSample 
< ( fchigh
- 1 )) {            //6-8 = 8 sample waves  (or 3-6 = 5)  550                                  //correct previous 9 wave surrounded by 8 waves (or 6 surrounded by 5)  551                                  if  ( LastSample 
> ( fchigh
- 2 ) && ( preLastSample 
< ( fchigh
- 1 ))){  556                          }  else if  ( currSample 
> ( fchigh
+ 1 ) &&  numBits 
<  3 ) {  //12 + and first two bit = unusable garbage  557                                  //do nothing with beginning garbage and reset..  should be rare..  559                          }  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)  561                          }  else  {                                         //9+ = 10 sample waves (or 6+ = 7)  564                          last_transition 
=  idx
;  567          return  numBits
;  //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0  570  //translate 11111100000 to 10  571  //rfLen = clock, fchigh = larger field clock, fclow = smaller field clock  572  size_t  aggregate_bits ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  573                  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  575          uint8_t  lastval
= dest
[ 0 ];  579          for (  idx
= 1 ;  idx 
<  size
;  idx
++) {  581                  if  ( dest
[ idx
]== lastval
)  continue ;  //skip until we hit a transition  583                  //find out how many bits (n) we collected  584                  //if lastval was 1, we have a 1->0 crossing  585                  if  ( dest
[ idx
- 1 ]== 1 ) {  586                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  587                  }  else  { // 0->1 crossing   588                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;   592                  //add to our destination the bits we collected            593                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  598          // if valid extra bits at the end were all the same frequency - add them in  599          if  ( n 
>  rfLen
/ fchigh
) {  600                  if  ( dest
[ idx
- 2 ]== 1 ) {  601                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  603                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;  605                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  611  //by marshmellow  (from holiman's base)  612  // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)  613  int  fskdemod ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  616          size 
=  fsk_wave_demod ( dest
,  size
,  fchigh
,  fclow
);  617          size 
=  aggregate_bits ( dest
,  size
,  rfLen
,  invert
,  fchigh
,  fclow
);  621  // loop to get raw HID waveform then FSK demodulate the TAG ID from it  622  int  HIDdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  624          if  ( justNoise ( dest
, * size
))  return  - 1 ;  626          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;   628          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  629          if  (* size 
<  96 * 2 )  return  - 2 ;  630          // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  631          uint8_t  preamble
[] = { 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 };  632          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))   633                  return  - 3 ;  //preamble not found  635          numStart 
=  startIdx 
+  sizeof ( preamble
);  636          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  637          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  638                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ]){  639                          return  - 4 ;  //not manchester data  641                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  642                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  643                  //Then, shift in a 0 or one into low  645                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  650          return  ( int ) startIdx
;  653  // loop to get raw paradox waveform then FSK demodulate the TAG ID from it  654  int  ParadoxdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  656          if  ( justNoise ( dest
, * size
))  return  - 1 ;  658          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;  660          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  661          if  (* size 
<  96 )  return  - 2 ;  663          // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  664          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 };  665          if  ( preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))   666                  return  - 3 ;  //preamble not found  668          numStart 
=  startIdx 
+  sizeof ( preamble
);  669          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  670          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  671                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ])   672                          return  - 4 ;  //not manchester data  673                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  674                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  675                  //Then, shift in a 0 or one into low  676                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  681          return  ( int ) startIdx
;  684  int  IOdemodFSK ( uint8_t  * dest
,  size_t  size
)  686          if  ( justNoise ( dest
,  size
))  return  - 1 ;  687          //make sure buffer has data  688          if  ( size 
<  66 * 64 )  return  - 2 ;  690          size 
=  fskdemod ( dest
,  size
,  64 ,  1 ,  10 ,  8 );   // FSK2a RF/64   691          if  ( size 
<  65 )  return  - 3 ;   //did we get a good demod?  693          //0           10          20          30          40          50          60  695          //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23  696          //-----------------------------------------------------------------------------  697          //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11  699          //XSF(version)facility:codeone+codetwo  702          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  703          if  (!  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
), & size
, & startIdx
))  704                  return  - 4 ;  //preamble not found  706          if  (! dest
[ startIdx
+ 8 ] &&  dest
[ startIdx
+ 17 ]== 1  &&  dest
[ startIdx
+ 26 ]== 1  &&  dest
[ startIdx
+ 35 ]== 1  &&  dest
[ startIdx
+ 44 ]== 1  &&  dest
[ startIdx
+ 53 ]== 1 ){  707                  //confirmed proper separator bits found  708                  //return start position  709                  return  ( int )  startIdx
;  715  // find viking preamble 0xF200 in already demoded data  716  int  VikingDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  717          //make sure buffer has data  718          if  (* size 
<  64 * 2 )  return  - 2 ;  720          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 };  721          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))   722                  return  - 4 ;  //preamble not found  724          uint32_t  checkCalc 
=  bytebits_to_byte ( dest
+ startIdx
, 8 ) ^   725                                                   bytebits_to_byte ( dest
+ startIdx
+ 8 , 8 ) ^   726                                                   bytebits_to_byte ( dest
+ startIdx
+ 16 , 8 ) ^   727                                                   bytebits_to_byte ( dest
+ startIdx
+ 24 , 8 ) ^   728                                                   bytebits_to_byte ( dest
+ startIdx
+ 32 , 8 ) ^   729                                                   bytebits_to_byte ( dest
+ startIdx
+ 40 , 8 ) ^   730                                                   bytebits_to_byte ( dest
+ startIdx
+ 48 , 8 ) ^   731                                                   bytebits_to_byte ( dest
+ startIdx
+ 56 , 8 );  732          if  (  checkCalc 
!=  0xA8  )  return  - 5 ;       733          if  (* size 
!=  64 )  return  - 6 ;  734          //return start position  735          return  ( int ) startIdx
;  739  // find Visa2000 preamble in already demoded data  740  int  Visa2kDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  741          if  (* size 
<  96 )  return  - 1 ;  //make sure buffer has data  743          uint8_t  preamble
[] = { 0 , 1 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 };  744          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  745                  return  - 2 ;  //preamble not found  746          if  (* size 
!=  96 )  return  - 3 ;  //wrong demoded size  747          //return start position  748          return  ( int ) startIdx
;  751  // find Noralsy preamble in already demoded data  752  int  NoralsyDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  753          if  (* size 
<  96 )  return  - 1 ;  //make sure buffer has data  755          uint8_t  preamble
[] = { 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 };  756          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  757                  return  - 2 ;  //preamble not found  758          if  (* size 
!=  96 )  return  - 3 ;  //wrong demoded size  759          //return start position  760          return  ( int ) startIdx
;  762  // find presco preamble 0x10D in already demoded data  763  int  PrescoDemod ( uint8_t  * dest
,  size_t  * size
) {  764          if  (* size 
<  128 * 2 )  return  - 1 ;  //make sure buffer has data  766          uint8_t  preamble
[] = { 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  767          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  768                  return  - 2 ;  //preamble not found  769          if  (* size 
!=  128 )  return  - 3 ;  //wrong demoded size  770          //return start position  771          return  ( int ) startIdx
;  774  // Ask/Biphase Demod then try to locate an ISO 11784/85 ID  775  // BitStream must contain previously askrawdemod and biphasedemoded data  776  int  FDXBdemodBI ( uint8_t  * dest
,  size_t  * size
) {  777          if  (* size 
<  128 * 2 )  return  - 1 ;    //make sure buffer has enough data  779          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  780          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  781                  return  - 2 ;  //preamble not found  782          if  (* size 
!=  128 )  return  - 3 ;  //wrong demoded size  783          //return start position  784          return  ( int ) startIdx
;  787  // ASK/Diphase fc/64 (inverted Biphase)  788  // Note: this i s not a demod, this is only a detection  789  // the parameter *dest needs to be demoded before call  790  // 0xFFFF preamble, 64bits  791  int  JablotronDemod ( uint8_t  * dest
,  size_t  * size
){  792          if  (* size 
<  64 * 2 )  return  - 1 ;     //make sure buffer has enough data  794          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  795          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))   796                  return  - 2 ;  //preamble not found  797          if  (* size 
!=  64 )  return  - 3 ;  // wrong demoded size  799          uint8_t  checkchksum 
=  0 ;  800          for  ( int  i
= 16 ;  i 
<  56 ;  i 
+=  8 ) {  801                  checkchksum 
+=  bytebits_to_byte ( dest
+ startIdx
+ i
, 8 );  804          uint8_t  crc 
=  bytebits_to_byte ( dest
+ startIdx
+ 56 ,  8 );  805          if  (  checkchksum 
!=  crc 
)  return  - 5 ;  806          return  ( int ) startIdx
;  810  // FSK Demod then try to locate an AWID ID  811  int  AWIDdemodFSK ( uint8_t  * dest
,  size_t  * size
)  813          //make sure buffer has enough data  814          if  (* size 
<  96 * 50 )  return  - 1 ;  816          if  ( justNoise ( dest
, * size
))  return  - 2 ;  819          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   820          if  (* size 
<  96 )  return  - 3 ;   //did we get a good demod?  822          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  824          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  825                  return  - 4 ;  //preamble not found  826          if  (* size 
!=  96 )  return  - 5 ;  827          return  ( int ) startIdx
;  831  // FSK Demod then try to locate a Farpointe Data (pyramid) ID  832  int  PyramiddemodFSK ( uint8_t  * dest
,  size_t  * size
)  834          //make sure buffer has data  835          if  (* size 
<  128 * 50 )  return  - 5 ;  837          //test samples are not just noise  838          if  ( justNoise ( dest
, * size
))  return  - 1 ;  841          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   842          if  (* size 
<  128 )  return  - 2 ;   //did we get a good demod?  844          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  845          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  846                  return  - 4 ;  //preamble not found  847          if  (* size 
!=  128 )  return  - 3 ;  848          return  ( int ) startIdx
;  851  // find nedap preamble in already demoded data  852  int  NedapDemod ( uint8_t  * dest
,  size_t  * size
) {  853          //make sure buffer has data  854          if  (* size 
<  128 )  return  - 3 ;  857          //uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,0,0,0,1};  858          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  859          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  860                  return  - 4 ;  //preamble not found  861          return  ( int )  startIdx
;  864  // Find IDTEC PSK1, RF  Preamble == 0x4944544B, Demodsize 64bits  866  int  IdteckDemodPSK ( uint8_t  * dest
,  size_t  * size
) {  867          //make sure buffer has data  868          if  (* size 
<  64 * 2 )  return  - 1 ;      870          uint8_t  preamble
[] = { 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 };  871          if  (! preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
))  872                  return  - 2 ;  //preamble not found  873          if  (* size 
!=  64 )  return  - 3 ;  // wrong demoded size  874          return  ( int )  startIdx
;  878  // to detect a wave that has heavily clipped (clean) samples  879  uint8_t  DetectCleanAskWave ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  881          bool  allArePeaks 
=  true ;  883          size_t  loopEnd 
=  512 + 160 ;  884          if  ( loopEnd 
>  size
)  loopEnd 
=  size
;  885          for  ( size_t  i
= 160 ;  i
< loopEnd
;  i
++){  886                  if  ( dest
[ i
]> low 
&&  dest
[ i
]< high
)   892                  if  ( cntPeaks 
>  300 )  return true ;  897  // to help detect clocks on heavily clipped samples  898  // based on count of low to low  899  int  DetectStrongAskClock ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  901          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 };  905                  // get to first full low to prime loop and skip incomplete first pulse  906          while  (( dest
[ i
] <  high
) && ( i 
<  size
))  908          while  (( dest
[ i
] >  low
) && ( i 
<  size
))  911          // loop through all samples  913                  // measure from low to low  914                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  917                  while  (( dest
[ i
] <  high
) && ( i 
<  size
))  919                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  921                  //get minimum measured distance  922                  if  ( i
- startwave 
<  minClk 
&&  i 
<  size
)  923                          minClk 
=  i 
-  startwave
;  926          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectstrongASKclk smallest wave:  %d " , minClk
);  927          for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) {  928                  if  ( minClk 
>=  fndClk
[ clkCnt
]-( fndClk
[ clkCnt
]/ 8 ) &&  minClk 
<=  fndClk
[ clkCnt
]+ 1 )  929                          return  fndClk
[ clkCnt
];  935  // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)  936  // maybe somehow adjust peak trimming value based on samples to fix?  937  // return start index of best starting position for that clock and return clock (by reference)  938  int  DetectASKClock ( uint8_t  dest
[],  size_t  size
,  int  * clock
,  int  maxErr
)  941          uint8_t  clk
[] = { 255 , 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  943          uint8_t  loopCnt 
=  255 ;   //don't need to loop through entire array...  944          if  ( size 
<=  loopCnt
+ 60 )  return  - 1 ;  //not enough samples  945          size 
-=  60 ;  //sometimes there is a strange end wave - filter out this....  946          //if we already have a valid clock  949                  if  ( clk
[ i
] == * clock
)  clockFnd 
=  i
;  950                  //clock found but continue to find best startpos  952          //get high and low peak  954          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  - 1 ;  956          //test for large clean peaks  958                  if  ( DetectCleanAskWave ( dest
,  size
,  peak
,  low
)== 1 ){  959                          int  ans 
=  DetectStrongAskClock ( dest
,  size
,  peak
,  low
);  960                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectaskclk Clean Ask Wave Detected: clk  %d " , ans
);  961                          for  ( i
= clkEnd
- 1 ;  i
> 0 ;  i
--){  965                                          return  0 ;   // for strong waves i don't use the 'best start position' yet...  966                                          //break; //clock found but continue to find best startpos [not yet]  972          uint8_t  clkCnt
,  tol 
=  0 ;  973          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  974          uint8_t  bestStart
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  976          size_t  arrLoc
,  loopEnd
;  985          //test each valid clock from smallest to greatest to see which lines up  986          for (;  clkCnt 
<  clkEnd
;  clkCnt
++) {  987                  if  ( clk
[ clkCnt
] <=  32 ) {  992                  //if no errors allowed - keep start within the first clock  993                  if  (! maxErr 
&&  size 
>  clk
[ clkCnt
]* 2  +  tol 
&&  clk
[ clkCnt
]< 128 )   994                          loopCnt 
=  clk
[ clkCnt
] *  2 ;  996                  bestErr
[ clkCnt
] =  1000 ;  998                  //try lining up the peaks by moving starting point (try first few clocks)  999                  for  ( ii
= 0 ;  ii 
<  loopCnt
;  ii
++){ 1000                          if  ( dest
[ ii
] <  peak 
&&  dest
[ ii
] >  low
)  continue ; 1003                          // now that we have the first one lined up test rest of wave array 1004                          loopEnd 
= (( size
- ii
- tol
) /  clk
[ clkCnt
]) -  1 ; 1005                          for  ( i
= 0 ;  i 
<  loopEnd
; ++ i
){ 1006                                  arrLoc 
=  ii 
+ ( i 
*  clk
[ clkCnt
]); 1007                                  if  ( dest
[ arrLoc
] >=  peak 
||  dest
[ arrLoc
] <=  low
){ 1008                                  } else if  ( dest
[ arrLoc
- tol
] >=  peak 
||  dest
[ arrLoc
- tol
] <=  low
){ 1009                                  } else if  ( dest
[ arrLoc
+ tol
] >=  peak 
||  dest
[ arrLoc
+ tol
] <=  low
){ 1010                                  } else {   //error no peak detected 1014                          //if we found no errors then we can stop here and a low clock (common clocks) 1015                          //  this is correct one - return this clock 1016                          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG ASK: clk  %d , err  %d , startpos  %d , endpos  %d " ,  clk
[ clkCnt
],  errCnt
,  ii
,  i
); 1017                          if  ( errCnt
== 0  &&  clkCnt
< 7 ) {  1018                                  if  (! clockFnd
) * clock 
=  clk
[ clkCnt
]; 1021                          //if we found errors see if it is lowest so far and save it as best run 1022                          if  ( errCnt 
<  bestErr
[ clkCnt
]) { 1023                                  bestErr
[ clkCnt
] =  errCnt
; 1024                                  bestStart
[ clkCnt
] =  ii
; 1030          for  ( k
= 1 ;  k 
<  clkEnd
; ++ k
){ 1031                  if  ( bestErr
[ k
] <  bestErr
[ best
]){ 1032                          if  ( bestErr
[ k
] ==  0 )  bestErr
[ k
]= 1 ; 1033                          // current best bit to error ratio     vs  new bit to error ratio 1034                          if  ( ( size
/ clk
[ best
])/ bestErr
[ best
] < ( size
/ clk
[ k
])/ bestErr
[ k
] ){ 1038                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG ASK: clk  %d , # Errors  %d , Current Best Clk  %d , bestStart  %d " ,  clk
[ k
],  bestErr
[ k
],  clk
[ best
],  bestStart
[ best
]); 1040          if  (! clockFnd
) * clock 
=  clk
[ best
]; 1041          return  bestStart
[ best
]; 1045  //detect psk clock by reading each phase shift 1046  // a phase shift is determined by measuring the sample length of each wave 1047  int  DetectPSKClock ( uint8_t  dest
[],  size_t  size
,  int  clock
) 1049          uint8_t  clk
[]={ 255 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  //255 is not a valid clock 1050          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1051          if  ( size 
==  0 )  return  0 ; 1052          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ; 1054          //if we already have a valid clock quit 1057                  if  ( clk
[ i
] ==  clock
)  return  clock
; 1059          size_t  waveStart
= 0 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ; 1060          uint8_t  clkCnt
,  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ; 1061          uint16_t  peakcnt
= 0 ,  errCnt
= 0 ,  waveLenCnt
= 0 ; 1062          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 }; 1063          uint16_t  peaksdet
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1064          fc 
=  countFC ( dest
,  size
,  0 ); 1065          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ; 1066          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: FC:  %d " , fc
); 1068          //find first full wave 1069          for  ( i
= 160 ;  i
< loopCnt
;  i
++){ 1070                  if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1071                          if  ( waveStart 
==  0 ) { 1073                                  //prnt("DEBUG: waveStart: %d",waveStart); 1076                                  //prnt("DEBUG: waveEnd: %d",waveEnd); 1077                                  waveLenCnt 
=  waveEnd
- waveStart
; 1078                                  if  ( waveLenCnt 
>  fc
){ 1079                                          firstFullWave 
=  waveStart
; 1080                                          fullWaveLen
= waveLenCnt
; 1087          if  ( g_debugMode 
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %d , waveLen:  %d " , firstFullWave
, fullWaveLen
); 1089          //test each valid clock from greatest to smallest to see which lines up 1090          for ( clkCnt
= 7 ;  clkCnt 
>=  1  ;  clkCnt
--){ 1091                  lastClkBit 
=  firstFullWave
;  //set end of wave as clock align 1095                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: clk:  %d , lastClkBit:  %d " , clk
[ clkCnt
], lastClkBit
); 1097                  for  ( i 
=  firstFullWave
+ fullWaveLen
- 1 ;  i 
<  loopCnt
- 2 ;  i
++){ 1098                          //top edge of wave = start of new wave  1099                          if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1100                                  if  ( waveStart 
==  0 ) { 1105                                          waveLenCnt 
=  waveEnd
- waveStart
; 1106                                          if  ( waveLenCnt 
>  fc
){  1107                                                  //if this wave is a phase shift 1108                                                  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
); 1109                                                  if  ( i
+ 1  >=  lastClkBit 
+  clk
[ clkCnt
] -  tol
){  //should be a clock bit 1111                                                          lastClkBit
+= clk
[ clkCnt
]; 1112                                                  }  else if  ( i
< lastClkBit
+ 8 ){ 1113                                                          //noise after a phase shift - ignore 1114                                                  }  else  {  //phase shift before supposed to based on clock 1117                                          }  else if  ( i
+ 1  >  lastClkBit 
+  clk
[ clkCnt
] +  tol 
+  fc
){ 1118                                                  lastClkBit
+= clk
[ clkCnt
];  //no phase shift but clock bit 1127                  if  ( errCnt 
<=  bestErr
[ clkCnt
])  bestErr
[ clkCnt
]= errCnt
; 1128                  if  ( peakcnt 
>  peaksdet
[ clkCnt
])  peaksdet
[ clkCnt
]= peakcnt
; 1130          //all tested with errors  1131          //return the highest clk with the most peaks found 1133          for  ( i
= 7 ;  i
>= 1 ;  i
--){ 1134                  if  ( peaksdet
[ i
] >  peaksdet
[ best
]) { 1137                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: Clk:  %d , peaks:  %d , errs:  %d , bestClk:  %d " , clk
[ i
], peaksdet
[ i
], bestErr
[ i
], clk
[ best
]); 1142  int  DetectStrongNRZClk ( uint8_t  * dest
,  size_t  size
,  int  peak
,  int  low
){ 1143          //find shortest transition from high to low 1145          size_t  transition1 
=  0 ; 1146          int  lowestTransition 
=  255 ; 1147          bool  lastWasHigh 
=  false ; 1149          //find first valid beginning of a high or low wave 1150          while  (( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) && ( i 
<  size
)) 1152          while  (( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
) && ( i 
<  size
)) 1154          lastWasHigh 
= ( dest
[ i
] >=  peak
); 1156          if  ( i
== size
)  return  0 ; 1159          for  (; i 
<  size
;  i
++) { 1160                  if  (( dest
[ i
] >=  peak 
&& ! lastWasHigh
) || ( dest
[ i
] <=  low 
&&  lastWasHigh
)) { 1161                          lastWasHigh 
= ( dest
[ i
] >=  peak
); 1162                          if  ( i
- transition1 
<  lowestTransition
)  lowestTransition 
=  i
- transition1
; 1166          if  ( lowestTransition 
==  255 )  lowestTransition 
=  0 ; 1167          if  ( g_debugMode
== 2 )  prnt ( "DEBUG NRZ: detectstrongNRZclk smallest wave:  %d " , lowestTransition
); 1168          return  lowestTransition
; 1172  //detect nrz clock by reading #peaks vs no peaks(or errors) 1173  int  DetectNRZClock ( uint8_t  dest
[],  size_t  size
,  int  clock
) 1176          uint8_t  clk
[]={ 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 }; 1177          size_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1178          if  ( size 
==  0 )  return  0 ; 1179          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ; 1180          //if we already have a valid clock quit 1182                  if  ( clk
[ i
] ==  clock
)  return  clock
; 1184          //get high and low peak 1186          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  0 ; 1188          int  lowestTransition 
=  DetectStrongNRZClk ( dest
,  size
- 20 ,  peak
,  low
); 1192          uint16_t  smplCnt 
=  0 ; 1193          int16_t  peakcnt 
=  0 ; 1194          int16_t  peaksdet
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1195          uint16_t  maxPeak 
=  255 ; 1196          bool  firstpeak 
=  false ; 1197          //test for large clipped waves 1198          for  ( i
= 0 ;  i
< loopCnt
;  i
++){ 1199                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
){ 1200                          if  (! firstpeak
)  continue ; 1205                                  if  ( maxPeak 
>  smplCnt
){ 1207                                          //prnt("maxPk: %d",maxPeak); 1210                                  //prnt("maxPk: %d, smplCnt: %d, peakcnt: %d",maxPeak,smplCnt,peakcnt); 1215          bool  errBitHigh 
=  0 ; 1217          uint8_t  ignoreCnt 
=  0 ; 1218          uint8_t  ignoreWindow 
=  4 ; 1219          bool  lastPeakHigh 
=  0 ; 1222          //test each valid clock from smallest to greatest to see which lines up 1223          for ( clkCnt
= 0 ;  clkCnt 
<  8 ; ++ clkCnt
){ 1224                  //ignore clocks smaller than smallest peak 1225                  if  ( clk
[ clkCnt
] <  maxPeak 
- ( clk
[ clkCnt
]/ 4 ))  continue ; 1226                  //try lining up the peaks by moving starting point (try first 256) 1227                  for  ( ii
= 20 ;  ii 
<  loopCnt
; ++ ii
){ 1228                          if  (( dest
[ ii
] >=  peak
) || ( dest
[ ii
] <=  low
)){ 1232                                  lastBit 
=  ii
- clk
[ clkCnt
];  1233                                  //loop through to see if this start location works 1234                                  for  ( i 
=  ii
;  i 
<  size
- 20 ; ++ i
) { 1235                                          //if we are at a clock bit 1236                                          if  (( i 
>=  lastBit 
+  clk
[ clkCnt
] -  tol
) && ( i 
<=  lastBit 
+  clk
[ clkCnt
] +  tol
)) { 1238                                                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) { 1239                                                          //if same peak don't count it 1240                                                          if  (( dest
[ i
] >=  peak 
&& ! lastPeakHigh
) || ( dest
[ i
] <=  low 
&&  lastPeakHigh
)) { 1243                                                          lastPeakHigh 
= ( dest
[ i
] >=  peak
); 1246                                                          ignoreCnt 
=  ignoreWindow
; 1247                                                          lastBit 
+=  clk
[ clkCnt
]; 1248                                                  }  else if  ( i 
==  lastBit 
+  clk
[ clkCnt
] +  tol
) { 1249                                                          lastBit 
+=  clk
[ clkCnt
]; 1251                                          //else if not a clock bit and no peaks 1252                                          }  else if  ( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
){ 1255                                                          if  ( errBitHigh
== true )  peakcnt
--; 1260                                                  // else if not a clock bit but we have a peak 1261                                          }  else if  (( dest
[ i
]>= peak 
||  dest
[ i
]<= low
) && (! bitHigh
)) { 1262                                                  //error bar found no clock... 1266                                  if ( peakcnt
> peaksdet
[ clkCnt
]) { 1267                                          peaksdet
[ clkCnt
]= peakcnt
; 1274          for  ( iii
= 7 ;  iii 
>  0 ;  iii
--){ 1275                  if  (( peaksdet
[ iii
] >= ( peaksdet
[ best
]- 1 )) && ( peaksdet
[ iii
] <=  peaksdet
[ best
]+ 1 ) &&  lowestTransition
) { 1276                          if  ( clk
[ iii
] > ( lowestTransition 
- ( clk
[ iii
]/ 8 )) &&  clk
[ iii
] < ( lowestTransition 
+ ( clk
[ iii
]/ 8 ))) { 1279                  }  else if  ( peaksdet
[ iii
] >  peaksdet
[ best
]){ 1282                  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
); 1289  // convert psk1 demod to psk2 demod 1290  // only transition waves are 1s 1291  void  psk1TOpsk2 ( uint8_t  * bits
,  size_t  size
) { 1292          uint8_t  lastBit 
=  bits
[ 0 ]; 1293          for  ( size_t  i 
=  1 ;  i 
<  size
;  i
++){ 1295                  if  ( bits
[ i
] ==  7 )  continue ; 1297                  if  ( lastBit 
!=  bits
[ i
]){ 1307  // convert psk2 demod to psk1 demod 1308  // from only transition waves are 1s to phase shifts change bit 1309  void  psk2TOpsk1 ( uint8_t  * bits
,  size_t  size
) { 1311          for  ( size_t  i 
=  0 ;  i 
<  size
;  i
++){ 1319  // redesigned by marshmellow adjusted from existing decode functions 1320  // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more 1321  int  indala26decode ( uint8_t  * bitStream
,  size_t  * size
,  uint8_t  * invert
) 1323          //26 bit 40134 format  (don't know other formats) 1324          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 }; 1325          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 }; 1326          size_t  startidx 
=  0 ;  1327          if  (! preambleSearch ( bitStream
,  preamble
,  sizeof ( preamble
),  size
, & startidx
)){ 1328                  // if didn't find preamble try again inverting 1329                  if  (! preambleSearch ( bitStream
,  preamble_i
,  sizeof ( preamble_i
),  size
, & startidx
))  return  - 1 ; 1332          if  (* size 
!=  64  && * size 
!=  224 )  return  - 2 ; 1334                  for  ( size_t  i 
=  startidx
;  i 
< * size
;  i
++) 1337          return  ( int )  startidx
; 1340  // by marshmellow - demodulate NRZ wave - requires a read with strong signal 1341  // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak 1342  int  nrzRawDemod ( uint8_t  * dest
,  size_t  * size
,  int  * clk
,  int  * invert
){ 1343          if  ( justNoise ( dest
, * size
))  return  - 1 ; 1344          * clk 
=  DetectNRZClock ( dest
, * size
, * clk
); 1345          if  (* clk
== 0 )  return  - 2 ; 1346          size_t  i
,  gLen 
=  4096 ; 1347          if  ( gLen
>* size
)  gLen 
= * size
- 20 ; 1349          if  ( getHiLo ( dest
,  gLen
, & high
, & low
,  75 ,  75 ) <  1 )  return  - 3 ;  //25% fuzz on high 25% fuzz on low 1352          //convert wave samples to 1's and 0's 1353          for ( i
= 20 ;  i 
< * size
- 20 ;  i
++){ 1354                  if  ( dest
[ i
] >=  high
)  bit 
=  1 ; 1355                  if  ( dest
[ i
] <=  low
)   bit 
=  0 ; 1358          //now demod based on clock (rf/32 = 32 1's for one 1 bit, 32 0's for one 0 bit)  1361          for ( i
= 21 ;  i 
< * size
- 20 ;  i
++) { 1362                  //if transition detected or large number of same bits - store the passed bits 1363                  if  ( dest
[ i
] !=  dest
[ i
- 1 ] || ( i
- lastBit
) == ( 10  * * clk
)) { 1364                          memset ( dest
+ numBits
,  dest
[ i
- 1 ] ^ * invert
, ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
); 1365                          numBits 
+= ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
; 1374  //detects the bit clock for FSK given the high and low Field Clocks 1375  uint8_t  detectFSKClk ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fcHigh
,  uint8_t  fcLow
) 1377          uint8_t  clk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 0 }; 1378          uint16_t  rfLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1379          uint8_t  rfCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1380          uint8_t  rfLensFnd 
=  0 ; 1381          uint8_t  lastFCcnt 
=  0 ; 1382          uint16_t  fcCounter 
=  0 ; 1383          uint16_t  rfCounter 
=  0 ; 1384          uint8_t  firstBitFnd 
=  0 ; 1386          if  ( size 
==  0 )  return  0 ; 1388          uint8_t  fcTol 
= (( fcHigh
* 100  -  fcLow
* 100 )/ 2  +  50 )/ 100 ;  //(uint8_t)(0.5+(float)(fcHigh-fcLow)/2); 1393          //prnt("DEBUG: fcTol: %d",fcTol); 1394          // prime i to first peak / up transition 1395          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++) 1396                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
]>= BitStream
[ i
+ 1 ]) 1399          for  (;  i 
<  size
- 20 ;  i
++){ 1403                  if  ( BitStream
[ i
] <=  BitStream
[ i
- 1 ] ||  BitStream
[ i
] <  BitStream
[ i
+ 1 ])  1406                  // if we got less than the small fc + tolerance then set it to the small fc 1407                  // if it is inbetween set it to the last counter 1408                  if  ( fcCounter 
<  fcHigh 
&&  fcCounter 
>  fcLow
) 1409                          fcCounter 
=  lastFCcnt
; 1410                  else if  ( fcCounter 
<  fcLow
+ fcTol
)  1412                  else  //set it to the large fc 1415                  //look for bit clock  (rf/xx) 1416                  if  (( fcCounter 
<  lastFCcnt 
||  fcCounter 
>  lastFCcnt
)){ 1417                          //not the same size as the last wave - start of new bit sequence 1418                          if  ( firstBitFnd 
>  1 ){  //skip first wave change - probably not a complete bit 1419                                  for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){ 1420                                          if  ( rfLens
[ ii
] >= ( rfCounter
- 4 ) &&  rfLens
[ ii
] <= ( rfCounter
+ 4 )){ 1426                                  if  ( rfCounter 
>  0  &&  rfLensFnd 
<  15 ){ 1427                                          //prnt("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter); 1428                                          rfCnts
[ rfLensFnd
]++; 1429                                          rfLens
[ rfLensFnd
++] =  rfCounter
; 1435                          lastFCcnt
= fcCounter
; 1439          uint8_t  rfHighest
= 15 ,  rfHighest2
= 15 ,  rfHighest3
= 15 ; 1441          for  ( i
= 0 ;  i
< 15 ;  i
++){ 1442                  //get highest 2 RF values  (might need to get more values to compare or compare all?) 1443                  if  ( rfCnts
[ i
]> rfCnts
[ rfHighest
]){ 1444                          rfHighest3
= rfHighest2
; 1445                          rfHighest2
= rfHighest
; 1447                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest2
]){ 1448                          rfHighest3
= rfHighest2
; 1450                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest3
]){ 1453                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: RF  %d , cnts  %d " , rfLens
[ i
],  rfCnts
[ i
]); 1455          // set allowed clock remainder tolerance to be 1 large field clock length+1  1456          //   we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off   1457          uint8_t  tol1 
=  fcHigh
+ 1 ;  1459          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: most counted rf values: 1  %d , 2  %d , 3  %d " , rfLens
[ rfHighest
], rfLens
[ rfHighest2
], rfLens
[ rfHighest3
]); 1461          // loop to find the highest clock that has a remainder less than the tolerance 1462          //   compare samples counted divided by 1463          // test 128 down to 32 (shouldn't be possible to have fc/10 & fc/8 and rf/16 or less) 1465          for  (;  ii
>= 2 ;  ii
--){ 1466                  if  ( rfLens
[ rfHighest
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1467                          if  ( rfLens
[ rfHighest2
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest2
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1468                                  if  ( rfLens
[ rfHighest3
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest3
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1469                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: clk  %d  divides into the 3 most rf values within tolerance" , clk
[ ii
]); 1476          if  ( ii
< 2 )  return  0 ;  // oops we went too far 1482  //countFC is to detect the field clock lengths. 1483  //counts and returns the 2 most common wave lengths 1484  //mainly used for FSK field clock detection 1485  uint16_t  countFC ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fskAdj
) 1487          uint8_t  fcLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1488          uint16_t  fcCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1489          uint8_t  fcLensFnd 
=  0 ; 1490          uint8_t  lastFCcnt 
=  0 ; 1491          uint8_t  fcCounter 
=  0 ; 1493          if  ( size 
<  180 )  return  0 ; 1495          // prime i to first up transition 1496          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++) 1497                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]) 1500          for  (;  i 
<  size
- 20 ;  i
++){ 1501                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]){ 1502                          // new up transition 1505                                  //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8) 1506                                  if  ( lastFCcnt
== 5  &&  fcCounter
== 9 )  fcCounter
--; 1507                                  //if fc=9 or 4 add one (for when we get a fc 9 instead of 10 or a 4 instead of a 5) 1508                                  if  (( fcCounter
== 9 ) ||  fcCounter
== 4 )  fcCounter
++; 1509                          // save last field clock count  (fc/xx) 1510                          lastFCcnt 
=  fcCounter
; 1512                          // find which fcLens to save it to: 1513                          for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){ 1514                                  if  ( fcLens
[ ii
]== fcCounter
){ 1520                          if  ( fcCounter
> 0  &&  fcLensFnd
< 15 ){ 1522                                  fcCnts
[ fcLensFnd
]++; 1523                                  fcLens
[ fcLensFnd
++]= fcCounter
; 1532          uint8_t  best1
= 14 ,  best2
= 14 ,  best3
= 14 ; 1534          // go through fclens and find which ones are bigest 2   1535          for  ( i
= 0 ;  i
< 15 ;  i
++){ 1536                  // get the 3 best FC values 1537                  if  ( fcCnts
[ i
]> maxCnt1
) { 1542                  }  else if ( fcCnts
[ i
]> fcCnts
[ best2
]){ 1545                  }  else if ( fcCnts
[ i
]> fcCnts
[ best3
]){ 1548                  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
]); 1550          if  ( fcLens
[ best1
]== 0 )  return  0 ; 1551          uint8_t  fcH
= 0 ,  fcL
= 0 ; 1552          if  ( fcLens
[ best1
]> fcLens
[ best2
]){ 1559          if  (( size
- 180 )/ fcH
/ 3  >  fcCnts
[ best1
]+ fcCnts
[ best2
]) { 1560                  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
]); 1561                  return  0 ;  //lots of waves not psk or fsk 1563          // TODO: take top 3 answers and compare to known Field clocks to get top 2 1565          uint16_t  fcs 
= ((( uint16_t ) fcH
)<< 8 ) |  fcL
; 1566          if  ( fskAdj
)  return  fcs
;  1567          return  fcLens
[ best1
]; 1570  //by marshmellow - demodulate PSK1 wave  1571  //uses wave lengths (# Samples)  1572  int  pskRawDemod ( uint8_t  dest
[],  size_t  * size
,  int  * clock
,  int  * invert
) 1574          if  ( size 
==  0 )  return  - 1 ; 1575          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1576          if  (* size
< loopCnt
)  loopCnt 
= * size
; 1579          uint8_t  curPhase 
= * invert
; 1580          size_t  i
= 0 ,  waveStart
= 1 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ; 1581          uint16_t  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ; 1582          uint16_t  errCnt
= 0 ,  waveLenCnt
= 0 ,  errCnt2
= 0 ; 1583          fc 
=  countFC ( dest
, * size
,  1 ); 1584          uint8_t  fc2 
=  fc 
>>  8 ; 1585          if  ( fc2 
==  10 )  return  - 1 ;  //fsk found - quit 1587          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ; 1588          //prnt("DEBUG: FC: %d",fc); 1589          * clock 
=  DetectPSKClock ( dest
, * size
, * clock
); 1590          if  (* clock 
==  0 )  return  - 1 ; 1592          //find start of modulating data in trace  1593          uint8_t  threshold_value 
=  123 ;  //-5 1594          i 
=  findModStart ( dest
, * size
,  threshold_value
,  fc
); 1596          //find first phase shift 1597          int  avgWaveVal
= 0 ,  lastAvgWaveVal
= 0 ; 1599          for  (;  i
< loopCnt
;  i
++){ 1601                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1603                          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: waveEnd:  %u , waveStart:  %u " , waveEnd
,  waveStart
); 1604                          waveLenCnt 
=  waveEnd
- waveStart
; 1605                          if  ( waveLenCnt 
>  fc 
&&  waveStart 
>  fc 
&& !( waveLenCnt 
>  fc
+ 3 )){  //not first peak and is a large wave but not out of whack 1606                                  lastAvgWaveVal 
=  avgWaveVal
/( waveLenCnt
); 1607                                  firstFullWave 
=  waveStart
; 1608                                  fullWaveLen
= waveLenCnt
; 1609                                  //if average wave value is > graph 0 then it is an up wave or a 1 (could cause inverting) 1610                                  if  ( lastAvgWaveVal 
>  threshold_value
)  curPhase 
^=  1 ; 1616                  avgWaveVal 
+=  dest
[ i
+ 2 ]; 1618          if  ( firstFullWave 
==  0 ) { 1619                  // no phase shift detected - could be all 1's or 0's - doesn't matter where we start 1620                  // so skip a little to ensure we are past any Start Signal 1621                  firstFullWave 
=  160 ; 1622                  memset ( dest
,  curPhase
,  firstFullWave 
/ * clock
); 1624                  memset ( dest
,  curPhase
^ 1 ,  firstFullWave 
/ * clock
); 1627          numBits 
+= ( firstFullWave 
/ * clock
); 1628          //set start of wave as clock align 1629          lastClkBit 
=  firstFullWave
; 1630          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %u , waveLen:  %u " , firstFullWave
, fullWaveLen
);   1631          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: clk:  %d , lastClkBit:  %u , fc:  %u " , * clock
,  lastClkBit
,( unsigned int )  fc
); 1633          dest
[ numBits
++] =  curPhase
;  //set first read bit 1634          for  ( i 
=  firstFullWave 
+  fullWaveLen 
-  1 ;  i 
< * size
- 3 ;  i
++){ 1635                  //top edge of wave = start of new wave  1636                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1637                          if  ( waveStart 
==  0 ) { 1640                                  avgWaveVal 
=  dest
[ i
+ 1 ]; 1643                                  waveLenCnt 
=  waveEnd
- waveStart
; 1644                                  lastAvgWaveVal 
=  avgWaveVal
/ waveLenCnt
; 1645                                  if  ( waveLenCnt 
>  fc
){   1646                                          //prnt("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal); 1647                                          //this wave is a phase shift 1648                                          //prnt("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc); 1649                                          if  ( i
+ 1  >=  lastClkBit 
+ * clock 
-  tol
){  //should be a clock bit 1651                                                  dest
[ numBits
++] =  curPhase
; 1652                                                  lastClkBit 
+= * clock
; 1653                                          }  else if  ( i 
<  lastClkBit
+ 10 + fc
){ 1654                                                  //noise after a phase shift - ignore 1655                                          }  else  {  //phase shift before supposed to based on clock 1657                                                  dest
[ numBits
++] =  7 ; 1659                                  }  else if  ( i
+ 1  >  lastClkBit 
+ * clock 
+  tol 
+  fc
){ 1660                                          lastClkBit 
+= * clock
;  //no phase shift but clock bit 1661                                          dest
[ numBits
++] =  curPhase
; 1662                                  }  else if  ( waveLenCnt 
<  fc 
-  1 ) {  //wave is smaller than field clock (shouldn't happen often) 1664                                          if ( errCnt2 
>  101 )  return  errCnt2
; 1670                  avgWaveVal 
+=  dest
[ i
+ 1 ]; 1677  //attempt to identify a Sequence Terminator in ASK modulated raw wave 1678  bool  DetectST ( uint8_t  buffer
[],  size_t  * size
,  int  * foundclock
) { 1679          size_t  bufsize 
= * size
; 1680          //need to loop through all samples and identify our clock, look for the ST pattern 1681          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 }; 1684          int  i
,  j
,  skip
,  start
,  end
,  low
,  high
,  minClk
,  waveStart
; 1685          bool  complete 
=  false ; 1686          int  tmpbuff
[ bufsize 
/  32 ];  //guess rf/32 clock, if click is smaller we will only have room for a fraction of the samples captured 1687          int  waveLen
[ bufsize 
/  32 ];  //  if clock is larger then we waste memory in array size that is not needed... 1688          size_t  testsize 
= ( bufsize 
<  512 ) ?  bufsize 
:  512 ; 1691          memset ( tmpbuff
,  0 ,  sizeof ( tmpbuff
)); 1692          memset ( waveLen
,  0 ,  sizeof ( waveLen
)); 1695          if  (  getHiLo ( buffer
,  testsize
, & high
, & low
,  80 ,  80 ) == - 1  ) { 1696                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: just noise detected - quitting" ); 1697                  return false ;  //just noise 1702          // get to first full low to prime loop and skip incomplete first pulse 1703          while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
)) 1705          while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1709          // populate tmpbuff buffer with pulse lengths 1710          while  ( i 
<  bufsize
) { 1711                  // measure from low to low 1712                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1715                  while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
)) 1717                  //first high point for this wave 1719                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1721                  if  ( j 
>= ( bufsize
/ 32 )) { 1724                  waveLen
[ j
] =  i 
-  waveStart
;  //first high to first low 1725                  tmpbuff
[ j
++] =  i 
-  start
; 1726                  if  ( i
- start 
<  minClk 
&&  i 
<  bufsize
) { 1730          // set clock  - might be able to get this externally and remove this work... 1732                  for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) { 1733                          tol 
=  fndClk
[ clkCnt
]/ 8 ; 1734                          if  ( minClk 
>=  fndClk
[ clkCnt
]- tol 
&&  minClk 
<=  fndClk
[ clkCnt
]+ 1 ) {  1739                  // clock not found - ERROR 1741                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: clock not found - quitting" ); 1748          // look for Sequence Terminator - should be pulses of clk*(1 or 1.5), clk*2, clk*(1.5 or 2) 1750          for  ( i 
=  0 ;  i 
<  j 
-  4 ; ++ i
) { 1752                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol 
&&  waveLen
[ i
] <  clk
+ tol
) {            //1 to 2 clocks depending on 2 bits prior 1753                          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 1754                                  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 1755                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit 1763          // first ST not found - ERROR 1765                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: first STT not found - quitting" ); 1768                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: first STT found at:  %d , j= %d " , start
,  j
); 1770          if  ( waveLen
[ i
+ 2 ] >  clk
* 1 + tol
) 1775          // skip over the remainder of ST 1776          skip 
+=  clk
* 7 / 2 ;  //3.5 clocks from tmpbuff[i] = end of st - also aligns for ending point 1778          // now do it again to find the end 1780          for  ( i 
+=  3 ;  i 
<  j 
-  4 ; ++ i
) { 1782                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol 
&&  waveLen
[ i
] <  clk
+ tol
) {            //1 to 2 clocks depending on 2 bits prior 1783                          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 1784                                  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 1785                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit 1794          //didn't find second ST - ERROR 1796                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: second STT not found - quitting" ); 1799          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
); 1800          //now begin to trim out ST so we can use normal demod cmds 1802          size_t  datalen 
=  end 
-  start
; 1803          // check validity of datalen (should be even clock increments)  - use a tolerance of up to 1/8th a clock 1804          if  (  clk 
- ( datalen 
%  clk
) <=  clk
/ 8 ) { 1805                  // padd the amount off - could be problematic...  but shouldn't happen often 1806                  datalen 
+=  clk 
- ( datalen 
%  clk
); 1807          }  else if  ( ( datalen 
%  clk
) <=  clk
/ 8  ) { 1808                  // padd the amount off - could be problematic...  but shouldn't happen often 1809                  datalen 
-=  datalen 
%  clk
; 1811                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen not divisible by clk:  %u  %%  %d  =  %d  - quitting" ,  datalen
,  clk
,  datalen 
%  clk
); 1814          // if datalen is less than one t55xx block - ERROR 1815          if  ( datalen
/ clk 
<  8 * 4 ) { 1816                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen is less than 1 full t55xx block - quitting" );               1819          size_t  dataloc 
=  start
; 1820          if  ( buffer
[ dataloc
-( clk
* 4 )-( clk
/ 8 )] <=  low 
&&  buffer
[ dataloc
] <=  low 
&&  buffer
[ dataloc
-( clk
* 4 )] >=  high
) { 1821                  //we have low drift (and a low just before the ST and a low just after the ST) - compensate by backing up the start  1822                  for  (  i
= 0 ;  i 
<= ( clk
/ 8 ); ++ i 
) { 1823                          if  (  buffer
[ dataloc 
- ( clk
* 4 ) -  i
] <=  low 
) { 1832          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: Starting STT trim - start:  %d , datalen:  %d  " , dataloc
,  datalen
);             1834          // warning - overwriting buffer given with raw wave data with ST removed... 1835          while  (  dataloc 
<  bufsize
-( clk
/ 2 ) ) { 1836                  //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) 1837                  if  ( buffer
[ dataloc
]< high 
&&  buffer
[ dataloc
]> low 
&&  buffer
[ dataloc
+ 3 ]< high 
&&  buffer
[ dataloc
+ 3 ]> low
) { 1838                          for ( i
= 0 ;  i 
<  clk
/ 2 - tol
; ++ i
) { 1839                                  buffer
[ dataloc
+ i
] =  high
+ 5 ; 1842                  for  ( i
= 0 ;  i
< datalen
; ++ i
) { 1843                          if  ( i
+ newloc 
<  bufsize
) { 1844                                  if  ( i
+ newloc 
<  dataloc
) 1845                                          buffer
[ i
+ newloc
] =  buffer
[ dataloc
]; 1851                  //skip next ST  -  we just assume it will be there from now on... 1852                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: skipping STT at  %d  to  %d " ,  dataloc
,  dataloc
+( clk
* 4 ));