]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/lfdemod.c 
4b17c6fdaad5a245376b6a0c42ba57c2fa4a56a1
   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 and length  146  uint8_t  preambleSearch ( uint8_t  * BitStream
,  uint8_t  * preamble
,  size_t  pLen
,  size_t  * size
,  size_t  * startIdx
)  148          // Sanity check.  If preamble length is bigger than bitstream length.  149          if  ( * size 
<=  pLen 
)  return  0 ;  151          uint8_t  foundCnt 
=  0 ;  152          for  ( int  idx 
=  0 ;  idx 
< * size 
-  pLen
;  idx
++){  153                  if  ( memcmp ( BitStream
+ idx
,  preamble
,  pLen
) ==  0 ){  160                                  * size 
=  idx 
- * startIdx
;  169  //takes 1s and 0s and searches for EM410x format - output EM ID  170  int  Em410xDecode ( uint8_t  * BitStream
,  size_t  * size
,  size_t  * startIdx
,  uint32_t  * hi
,  uint64_t  * lo
)  172          //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future  173          //  otherwise could be a void with no arguments  176          if  ( BitStream
[ 1 ]> 1 )  return  - 1 ;   //allow only 1s and 0s  178          // 111111111 bit pattern represent start of frame  179          //  include 0 in front to help get start pos  180          uint8_t  preamble
[] = { 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 };  182          uint32_t  parityBits 
=  0 ;  186          errChk 
=  preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
,  startIdx
);  187          if  ( errChk 
==  0  )  return  - 4 ;  188          if  (* size 
<  64 )  return  - 3 ;  189          if  (* size 
>  64 )  FmtLen 
=  22 ;  190          * startIdx 
+=  1 ;  //get rid of 0 from preamble  192          for  ( i
= 0 ;  i
< FmtLen
;  i
++){  //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)  193                  parityBits 
=  bytebits_to_byte ( BitStream
+( i
* 5 )+ idx
, 5 );  194                  //check even parity - quit if failed  195                  if  ( parityTest ( parityBits
,  5 ,  0 ) ==  0 )  return  - 5 ;  196                  //set uint64 with ID from BitStream  197                  for  ( uint8_t  ii
= 0 ;  ii
< 4 ;  ii
++){  198                          * hi 
= (* hi 
<<  1 ) | (* lo 
>>  63 );  199                          * lo 
= (* lo 
<<  1 ) | ( BitStream
[( i
* 5 )+ ii
+ idx
]);  202          if  ( errChk 
!=  0 )  return  1 ;  203          //skip last 5 bit parity test for simplicity.  209  //demodulates strong heavily clipped samples  210  int  cleanAskRawDemod ( uint8_t  * BinStream
,  size_t  * size
,  int  clk
,  int  invert
,  int  high
,  int  low
)  212          size_t  bitCnt
= 0 ,  smplCnt
= 0 ,  errCnt
= 0 ;  213          uint8_t  waveHigh 
=  0 ;  214          for  ( size_t  i
= 0 ;  i 
< * size
;  i
++){  215                  if  ( BinStream
[ i
] >=  high 
&&  waveHigh
){  217                  }  else if  ( BinStream
[ i
] <=  low 
&& ! waveHigh
){  219                  }  else  {  //transition  220                          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  282          if  (* clk
== 0  ||  start 
<  0 )  return  - 3 ;  283          if  (* invert 
!=  1 ) * invert 
=  0 ;  284          if  ( amp
== 1 )  askAmp ( BinStream
, * size
);  285          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: clk  %d , beststart  %d , amp  %d " , * clk
,  start
,  amp
);  287          uint8_t  initLoopMax 
=  255 ;  288          if  ( initLoopMax 
> * size
)  initLoopMax 
= * size
;  289          // Detect high and lows  290          //25% clip in case highs and lows aren't clipped [marshmellow]  292          if  ( getHiLo ( BinStream
,  initLoopMax
, & high
, & low
,  75 ,  75 ) <  1 )   293                  return  - 2 ;  //just noise  296          // if clean clipped waves detected run alternate demod  297          if  ( DetectCleanAskWave ( BinStream
, * size
,  high
,  low
)) {  298                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Clean Wave Detected - using clean wave demod" );  299                  errCnt 
=  cleanAskRawDemod ( BinStream
,  size
, * clk
, * invert
,  high
,  low
);  300                  if  ( askType
)  //askman  301                          return  manrawdecode ( BinStream
,  size
,  0 );          305          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Weak Wave Detected - using weak wave demod" );  307          int  lastBit
;   //set first clock check - can go negative  308          size_t  i
,  bitnum 
=  0 ;      //output counter  310          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  311          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  312          size_t  MaxBits 
=  3072 ;     //max bits to collect  313          lastBit 
=  start 
- * clk
;  315          for  ( i 
=  start
;  i 
< * size
; ++ i
) {  316                  if  ( i
- lastBit 
>= * clk
- tol
){  317                          if  ( BinStream
[ i
] >=  high
) {  318                                  BinStream
[ bitnum
++] = * invert
;  319                          }  else if  ( BinStream
[ i
] <=  low
) {  320                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  321                          }  else if  ( i
- lastBit 
>= * clk
+ tol
) {  323                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: Modulation Error at:  %u " ,  i
);  324                                          BinStream
[ bitnum
++]= 7 ;  327                          }  else  {  //in tolerance - looking for peak  332                  }  else if  ( i
- lastBit 
>= (* clk
/ 2 - tol
) && ! midBit 
&& ! askType
){  333                          if  ( BinStream
[ i
] >=  high
) {  334                                  BinStream
[ bitnum
++] = * invert
;  335                          }  else if  ( BinStream
[ i
] <=  low
) {  336                                  BinStream
[ bitnum
++] = * invert 
^  1 ;  337                          }  else if  ( i
- lastBit 
>= * clk
/ 2 + tol
) {  338                                  BinStream
[ bitnum
] =  BinStream
[ bitnum
- 1 ];  340                          }  else  {  //in tolerance - looking for peak  345                  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
){  354          int  errCnt 
=  0 ,  bestErr 
=  1000 ;  355          uint16_t  bitnum 
=  0 ,  MaxBits 
=  512 ,  bestRun 
=  0 ;  357          if  (* size 
<  16 )  return  - 1 ;  358          //find correct start position [alignment]  359          for  ( k
= 0 ;  k 
<  2 ; ++ k
){  360                  for  ( i
= k
;  i
<* size
- 3 ;  i 
+=  2 )  361                          if  ( BitStream
[ i
] ==  BitStream
[ i
+ 1 ])  364                  if  ( bestErr 
>  errCnt
){  371          for  ( i
= bestRun
;  i 
< * size
- 3 ;  i 
+=  2 ){  372                  if  ( BitStream
[ i
] ==  1  && ( BitStream
[ i
+ 1 ] ==  0 )){  373                          BitStream
[ bitnum
++] =  invert
;  374                  }  else if  (( BitStream
[ i
] ==  0 ) &&  BitStream
[ i
+ 1 ] ==  1 ){  375                          BitStream
[ bitnum
++] =  invert
^ 1 ;  377                          BitStream
[ bitnum
++] =  7 ;  379                  if  ( bitnum
> MaxBits
)  break ;  385  uint32_t  manchesterEncode2Bytes ( uint16_t  datain
) {  388          for  ( uint8_t  i
= 0 ;  i
< 16 ;  i
++) {  389                  curBit 
= ( datain 
>> ( 15 - i
) &  1 );  390                  output 
|= ( 1 <<((( 15 - i
)* 2 )+ curBit
));  396  //encode binary data into binary manchester   397  int  ManchesterEncode ( uint8_t  * BitStream
,  size_t  size
)  399          size_t  modIdx
= 20000 ,  i
= 0 ;  400          if  ( size
> modIdx
)  return  - 1 ;  401          for  ( size_t  idx
= 0 ;  idx 
<  size
;  idx
++){  402                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
];  403                  BitStream
[ idx
+ modIdx
++] =  BitStream
[ idx
]^ 1 ;  405          for  (;  i
<( size
* 2 );  i
++){  406                  BitStream
[ i
] =  BitStream
[ i
+ 20000 ];  412  //take 01 or 10 = 1 and 11 or 00 = 0  413  //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010  414  //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding  415  int  BiphaseRawDecode ( uint8_t  * BitStream
,  size_t  * size
,  int  offset
,  int  invert
)  420          uint16_t  MaxBits
= 512 ;  421          //if not enough samples - error  422          if  (* size 
<  51 )  return  - 1 ;  423          //check for phase change faults - skip one sample if faulty  424          uint8_t  offsetA 
=  1 ,  offsetB 
=  1 ;  426                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ])  offsetA
= 0 ;   427                  if  ( BitStream
[ i
+ 2 ]== BitStream
[ i
+ 3 ])  offsetB
= 0 ;                                    429          if  (! offsetA 
&&  offsetB
)  offset
++;  430          for  ( i
= offset
;  i
<* size
- 3 ;  i
+= 2 ){  431                  //check for phase error  432                  if  ( BitStream
[ i
+ 1 ]== BitStream
[ i
+ 2 ]) {  433                          BitStream
[ bitnum
++]= 7 ;  436                  if (( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 1 )){  437                          BitStream
[ bitnum
++]= 1 ^ invert
;  438                  }  else if (( BitStream
[ i
]== 0  &&  BitStream
[ i
+ 1 ]== 0 ) || ( BitStream
[ i
]== 1  &&  BitStream
[ i
+ 1 ]== 1 )){  439                          BitStream
[ bitnum
++]= invert
;  441                          BitStream
[ bitnum
++]= 7 ;  444                  if ( bitnum
> MaxBits
)  break ;  451  // demod gProxIIDemod   452  // error returns as -x   453  // success returns start position in BitStream  454  // BitStream must contain previously askrawdemod and biphasedemoded data  455  int  gProxII_Demod ( uint8_t  BitStream
[],  size_t  * size
)  458          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 0 };  460          uint8_t  errChk 
=  preambleSearch ( BitStream
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  461          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  462          if  (* size 
!=  96 )  return  - 2 ;  //should have found 96 bits  463          //check first 6 spacer bits to verify format  464          if  (! BitStream
[ startIdx
+ 5 ] && ! BitStream
[ startIdx
+ 10 ] && ! BitStream
[ startIdx
+ 15 ] && ! BitStream
[ startIdx
+ 20 ] && ! BitStream
[ startIdx
+ 25 ] && ! BitStream
[ startIdx
+ 30 ]){  465                  //confirmed proper separator bits found  466                  //return start position  467                  return  ( int )  startIdx
;  469          return  - 5 ;  //spacer bits not found - not a valid gproxII  472  //translate wave to 11111100000 (1 for each short wave [higher freq] 0 for each long wave [lower freq])  473  size_t  fsk_wave_demod ( uint8_t  *  dest
,  size_t  size
,  uint8_t  fchigh
,  uint8_t  fclow
)  475          size_t  last_transition 
=  0 ;  478          if  ( fchigh
== 0 )  fchigh
= 10 ;  479          if  ( fclow
== 0 )  fclow
= 8 ;  480          //set the threshold close to 0 (graph) or 128 std to avoid static  481          uint8_t  threshold_value 
=  123 ;   482          size_t  preLastSample 
=  0 ;  483          size_t  LastSample 
=  0 ;  484          size_t  currSample 
=  0 ;  485          if  (  size 
<  1024  )  return  0 ;  // not enough samples  487          // jump to modulating data by finding the first 4 threshold crossings (or first 2 waves)  488          // in case you have junk or noise at the beginning of the trace...  489          uint8_t  thresholdCnt 
=  0 ;  490          size_t  waveSizeCnt 
=  0 ;  491          bool  isAboveThreshold 
=  dest
[ idx
++] >=  threshold_value
;  492          for  (;  idx 
<  size
- 20 ;  idx
++ ) {  493                  if ( dest
[ idx
] <  threshold_value 
&&  isAboveThreshold
) {  495                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  fchigh
+ 1 )  break ;                    496                          isAboveThreshold 
=  false ;  498                  }  else if  ( dest
[ idx
] >=  threshold_value 
&& ! isAboveThreshold
) {  500                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  fchigh
+ 1 )  break ;                    501                          isAboveThreshold 
=  true ;  506                  if  ( thresholdCnt 
>  10 )  break ;  508          if  ( g_debugMode 
==  2 )  prnt ( "threshold Count reached at  %u " , idx
);  510          // Need to threshold first sample  511          if ( dest
[ idx
] <  threshold_value
)  dest
[ 0 ] =  0 ;  516          // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)  517          // or 10 (fc/10) cycles but in practice due to noise etc we may end up with anywhere  518          // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10  519          //  (could also be fc/5 && fc/7 for fsk1 = 4-9)  520          for (;  idx 
<  size
- 20 ;  idx
++) {  521                  // threshold current value  523                  if  ( dest
[ idx
] <  threshold_value
)  dest
[ idx
] =  0 ;  526                  // Check for 0->1 transition  527                  if  ( dest
[ idx
- 1 ] <  dest
[ idx
]) {  528                          preLastSample 
=  LastSample
;  529                          LastSample 
=  currSample
;  530                          currSample 
=  idx
- last_transition
;  531                          if  ( currSample 
< ( fclow
- 2 )){             //0-5 = garbage noise (or 0-3)  532                                  //do nothing with extra garbage  533                          }  else if  ( currSample 
< ( fchigh
- 1 )) {            //6-8 = 8 sample waves  (or 3-6 = 5)  534                                  //correct previous 9 wave surrounded by 8 waves (or 6 surrounded by 5)  535                                  if  ( LastSample 
> ( fchigh
- 2 ) && ( preLastSample 
< ( fchigh
- 1 ))){  540                          }  else if  ( currSample 
> ( fchigh
+ 1 ) &&  numBits 
<  3 ) {  //12 + and first two bit = unusable garbage  541                                  //do nothing with beginning garbage and reset..  should be rare..  543                          }  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)  545                          }  else  {                                         //9+ = 10 sample waves (or 6+ = 7)  548                          last_transition 
=  idx
;  551          return  numBits
;  //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0  554  //translate 11111100000 to 10  555  //rfLen = clock, fchigh = larger field clock, fclow = smaller field clock  556  size_t  aggregate_bits ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  557                  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  559          uint8_t  lastval
= dest
[ 0 ];  563          for (  idx
= 1 ;  idx 
<  size
;  idx
++) {  565                  if  ( dest
[ idx
]== lastval
)  continue ;  //skip until we hit a transition  567                  //find out how many bits (n) we collected  568                  //if lastval was 1, we have a 1->0 crossing  569                  if  ( dest
[ idx
- 1 ]== 1 ) {  570                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  571                  }  else  { // 0->1 crossing   572                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;   576                  //add to our destination the bits we collected            577                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  582          // if valid extra bits at the end were all the same frequency - add them in  583          if  ( n 
>  rfLen
/ fchigh
) {  584                  if  ( dest
[ idx
- 2 ]== 1 ) {  585                          n 
= ( n 
*  fclow 
+  rfLen
/ 2 ) /  rfLen
;  587                          n 
= ( n 
*  fchigh 
+  rfLen
/ 2 ) /  rfLen
;  589                  memset ( dest
+ numBits
,  dest
[ idx
- 1 ]^ invert 
,  n
);  595  //by marshmellow  (from holiman's base)  596  // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)  597  int  fskdemod ( uint8_t  * dest
,  size_t  size
,  uint8_t  rfLen
,  uint8_t  invert
,  uint8_t  fchigh
,  uint8_t  fclow
)  600          size 
=  fsk_wave_demod ( dest
,  size
,  fchigh
,  fclow
);  601          size 
=  aggregate_bits ( dest
,  size
,  rfLen
,  invert
,  fchigh
,  fclow
);  605  // loop to get raw HID waveform then FSK demodulate the TAG ID from it  606  int  HIDdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  608          if  ( justNoise ( dest
, * size
))  return  - 1 ;  610          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;   612          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  613          if  (* size 
<  96 * 2 )  return  - 2 ;  614          // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  615          uint8_t  preamble
[] = { 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 };  616          // find bitstring in array    617          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  618          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  620          numStart 
=  startIdx 
+  sizeof ( preamble
);  621          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  622          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  623                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ]){  624                          return  - 4 ;  //not manchester data  626                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  627                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  628                  //Then, shift in a 0 or one into low  630                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  635          return  ( int ) startIdx
;  638  // loop to get raw paradox waveform then FSK demodulate the TAG ID from it  639  int  ParadoxdemodFSK ( uint8_t  * dest
,  size_t  * size
,  uint32_t  * hi2
,  uint32_t  * hi
,  uint32_t  * lo
)  641          if  ( justNoise ( dest
, * size
))  return  - 1 ;  643          size_t  numStart
= 0 ,  size2 
= * size
,  startIdx
= 0 ;  645          * size 
=  fskdemod ( dest
,  size2
, 50 , 1 , 10 , 8 );  //fsk2a  646          if  (* size 
<  96 )  return  - 2 ;  648          // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1  649          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 };  651          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  652          if  ( errChk 
==  0 )  return  - 3 ;  //preamble not found  654          numStart 
=  startIdx 
+  sizeof ( preamble
);  655          // final loop, go over previously decoded FSK data and manchester decode into usable tag ID  656          for  ( size_t  idx 
=  numStart
; ( idx
- numStart
) < * size 
-  sizeof ( preamble
);  idx
+= 2 ){  657                  if  ( dest
[ idx
] ==  dest
[ idx
+ 1 ])   658                          return  - 4 ;  //not manchester data  659                  * hi2 
= (* hi2
<< 1 )|(* hi
>> 31 );  660                  * hi 
= (* hi
<< 1 )|(* lo
>> 31 );  661                  //Then, shift in a 0 or one into low  662                  if  ( dest
[ idx
] && ! dest
[ idx
+ 1 ])   // 1 0  667          return  ( int ) startIdx
;  670  int  IOdemodFSK ( uint8_t  * dest
,  size_t  size
)  672          if  ( justNoise ( dest
,  size
))  return  - 1 ;  673          //make sure buffer has data  674          if  ( size 
<  66 * 64 )  return  - 2 ;  676          size 
=  fskdemod ( dest
,  size
,  64 ,  1 ,  10 ,  8 );   // FSK2a RF/64   677          if  ( size 
<  65 )  return  - 3 ;   //did we get a good demod?  679          //0           10          20          30          40          50          60  681          //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23  682          //-----------------------------------------------------------------------------  683          //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11  685          //XSF(version)facility:codeone+codetwo  688          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  689          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
), & size
, & startIdx
);  690          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  692          if  (! dest
[ startIdx
+ 8 ] &&  dest
[ startIdx
+ 17 ]== 1  &&  dest
[ startIdx
+ 26 ]== 1  &&  dest
[ startIdx
+ 35 ]== 1  &&  dest
[ startIdx
+ 44 ]== 1  &&  dest
[ startIdx
+ 53 ]== 1 ){  693                  //confirmed proper separator bits found  694                  //return start position  695                  return  ( int )  startIdx
;  701  // find viking preamble 0xF200 in already demoded data  702  int  VikingDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  703          //make sure buffer has data  704          if  (* size 
<  64 * 2 )  return  - 2 ;  706          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 };  707          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  708          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  709          uint32_t  checkCalc 
=  bytebits_to_byte ( dest
+ startIdx
, 8 ) ^   710                                                   bytebits_to_byte ( dest
+ startIdx
+ 8 , 8 ) ^   711                                                   bytebits_to_byte ( dest
+ startIdx
+ 16 , 8 ) ^   712                                                   bytebits_to_byte ( dest
+ startIdx
+ 24 , 8 ) ^   713                                                   bytebits_to_byte ( dest
+ startIdx
+ 32 , 8 ) ^   714                                                   bytebits_to_byte ( dest
+ startIdx
+ 40 , 8 ) ^   715                                                   bytebits_to_byte ( dest
+ startIdx
+ 48 , 8 ) ^   716                                                   bytebits_to_byte ( dest
+ startIdx
+ 56 , 8 );  717          if  (  checkCalc 
!=  0xA8  )  return  - 5 ;       718          if  (* size 
!=  64 )  return  - 6 ;  719          //return start position  720          return  ( int ) startIdx
;  724  // find Visa2000 preamble in already demoded data  725  int  Visa2kDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  726          if  (* size 
<  96 )  return  - 1 ;  //make sure buffer has data  728          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 };  729          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  730          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  731          if  (* size 
!=  96 )  return  - 3 ;  //wrong demoded size  732          //return start position  733          return  ( int ) startIdx
;  736  // find Noralsy preamble in already demoded data  737  int  NoralsyDemod_AM ( uint8_t  * dest
,  size_t  * size
) {  738          if  (* size 
<  96 )  return  - 1 ;  //make sure buffer has data  740          uint8_t  preamble
[] = { 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 };  741          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  742          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  743          if  (* size 
!=  96 )  return  - 3 ;  //wrong demoded size  744          //return start position  745          return  ( int ) startIdx
;  747  // find presco preamble 0x10D in already demoded data  748  int  PrescoDemod ( uint8_t  * dest
,  size_t  * size
) {  749          if  (* size 
<  128 * 2 )  return  - 1 ;  //make sure buffer has data  751          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 };  752          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  753          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  754          if  (* size 
!=  128 )  return  - 3 ;  //wrong demoded size  755          //return start position  756          return  ( int ) startIdx
;  759  // Ask/Biphase Demod then try to locate an ISO 11784/85 ID  760  // BitStream must contain previously askrawdemod and biphasedemoded data  761  int  FDXBdemodBI ( uint8_t  * dest
,  size_t  * size
) {  762          if  (* size 
<  128 * 2 )  return  - 1 ;    //make sure buffer has enough data  764          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  765          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  766          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  767          if  (* size 
!=  128 )  return  - 3 ;  //wrong demoded size  768          //return start position  769          return  ( int ) startIdx
;  772  // ASK/Diphase fc/64 (inverted Biphase)  773  // Note: this i s not a demod, this is only a detection  774  // the parameter *dest needs to be demoded before call  775  // 0xFFFF preamble, 64bits  776  int  JablotronDemod ( uint8_t  * dest
,  size_t  * size
){  777          if  (* size 
<  64 * 2 )  return  - 1 ;     //make sure buffer has enough data  779          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  780          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  781          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  782          if  (* size 
!=  64 )  return  - 3 ;  // wrong demoded size  784          uint8_t  checkchksum 
=  0 ;  785          for  ( int  i
= 16 ;  i 
<  56 ;  i 
+=  8 ) {  786                  checkchksum 
+=  bytebits_to_byte ( dest
+ startIdx
+ i
, 8 );  789          uint8_t  crc 
=  bytebits_to_byte ( dest
+ startIdx
+ 56 ,  8 );  790          if  (  checkchksum 
!=  crc 
)  return  - 5 ;  791          return  ( int ) startIdx
;  795  // FSK Demod then try to locate an AWID ID  796  int  AWIDdemodFSK ( uint8_t  * dest
,  size_t  * size
)  798          //make sure buffer has enough data  799          if  (* size 
<  96 * 50 )  return  - 1 ;  801          if  ( justNoise ( dest
, * size
))  return  - 2 ;  804          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   805          if  (* size 
<  96 )  return  - 3 ;   //did we get a good demod?  807          uint8_t  preamble
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };  809          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  810          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  811          if  (* size 
!=  96 )  return  - 5 ;  812          return  ( int ) startIdx
;  816  // FSK Demod then try to locate a Farpointe Data (pyramid) ID  817  int  PyramiddemodFSK ( uint8_t  * dest
,  size_t  * size
)  819          //make sure buffer has data  820          if  (* size 
<  128 * 50 )  return  - 5 ;  822          //test samples are not just noise  823          if  ( justNoise ( dest
, * size
))  return  - 1 ;  826          * size 
=  fskdemod ( dest
, * size
,  50 ,  1 ,  10 ,  8 );   // fsk2a RF/50   827          if  (* size 
<  128 )  return  - 2 ;   //did we get a good demod?  829          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 };  831          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  832          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  833          if  (* size 
!=  128 )  return  - 3 ;  834          return  ( int ) startIdx
;  837  // find nedap preamble in already demoded data  838  int  NedapDemod ( uint8_t  * dest
,  size_t  * size
) {  839          //make sure buffer has data  840          if  (* size 
<  128 )  return  - 3 ;  843          //uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,0,0,0,1};  844          uint8_t  preamble
[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };  845          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  846          if  ( errChk 
==  0 )  return  - 4 ;  //preamble not found  847          return  ( int )  startIdx
;  850  // Find IDTEC PSK1, RF  Preamble == 0x4944544B, Demodsize 64bits  852  int  IdteckDemodPSK ( uint8_t  * dest
,  size_t  * size
) {  853          //make sure buffer has data  854          if  (* size 
<  64 * 2 )  return  - 1 ;      856          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 };  857          uint8_t  errChk 
=  preambleSearch ( dest
,  preamble
,  sizeof ( preamble
),  size
, & startIdx
);  858          if  ( errChk 
==  0 )  return  - 2 ;  //preamble not found  859          if  (* size 
!=  64 )  return  - 3 ;  // wrong demoded size  860          return  ( int )  startIdx
;  864  // to detect a wave that has heavily clipped (clean) samples  865  uint8_t  DetectCleanAskWave ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  867          bool  allArePeaks 
=  true ;  869          size_t  loopEnd 
=  512 + 160 ;  870          if  ( loopEnd 
>  size
)  loopEnd 
=  size
;  871          for  ( size_t  i
= 160 ;  i
< loopEnd
;  i
++){  872                  if  ( dest
[ i
]> low 
&&  dest
[ i
]< high
)   878                  if  ( cntPeaks 
>  300 )  return true ;  883  // to help detect clocks on heavily clipped samples  884  // based on count of low to low  885  int  DetectStrongAskClock ( uint8_t  dest
[],  size_t  size
,  uint8_t  high
,  uint8_t  low
)  887          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 };  891                  // get to first full low to prime loop and skip incomplete first pulse  892          while  (( dest
[ i
] <  high
) && ( i 
<  size
))  894          while  (( dest
[ i
] >  low
) && ( i 
<  size
))  897          // loop through all samples  899                  // measure from low to low  900                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  903                  while  (( dest
[ i
] <  high
) && ( i 
<  size
))  905                  while  (( dest
[ i
] >  low
) && ( i 
<  size
))  907                  //get minimum measured distance  908                  if  ( i
- startwave 
<  minClk 
&&  i 
<  size
)  909                          minClk 
=  i 
-  startwave
;  912          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectstrongASKclk smallest wave:  %d " , minClk
);  913          for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) {  914                  if  ( minClk 
>=  fndClk
[ clkCnt
]-( fndClk
[ clkCnt
]/ 8 ) &&  minClk 
<=  fndClk
[ clkCnt
]+ 1 )  915                          return  fndClk
[ clkCnt
];  921  // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)  922  // maybe somehow adjust peak trimming value based on samples to fix?  923  // return start index of best starting position for that clock and return clock (by reference)  924  int  DetectASKClock ( uint8_t  dest
[],  size_t  size
,  int  * clock
,  int  maxErr
)  927          uint8_t  clk
[] = { 255 , 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  929          uint8_t  loopCnt 
=  255 ;   //don't need to loop through entire array...  930          if  ( size 
<=  loopCnt
+ 60 )  return  - 1 ;  //not enough samples  931          size 
-=  60 ;  //sometimes there is a strange end wave - filter out this....  932          //if we already have a valid clock  935                  if  ( clk
[ i
] == * clock
)  clockFnd 
=  i
;  936                  //clock found but continue to find best startpos  938          //get high and low peak  940          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  - 1 ;  942          //test for large clean peaks  944                  if  ( DetectCleanAskWave ( dest
,  size
,  peak
,  low
)== 1 ){  945                          int  ans 
=  DetectStrongAskClock ( dest
,  size
,  peak
,  low
);  946                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG ASK: detectaskclk Clean Ask Wave Detected: clk  %d " , ans
);  947                          for  ( i
= clkEnd
- 1 ;  i
> 0 ;  i
--){  951                                          return  0 ;   // for strong waves i don't use the 'best start position' yet...  952                                          //break; //clock found but continue to find best startpos [not yet]  958          uint8_t  clkCnt
,  tol 
=  0 ;  959          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 };  960          uint8_t  bestStart
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };  962          size_t  arrLoc
,  loopEnd
;  971          //test each valid clock from smallest to greatest to see which lines up  972          for (;  clkCnt 
<  clkEnd
;  clkCnt
++) {  973                  if  ( clk
[ clkCnt
] <=  32 ) {  978                  //if no errors allowed - keep start within the first clock  979                  if  (! maxErr 
&&  size 
>  clk
[ clkCnt
]* 2  +  tol 
&&  clk
[ clkCnt
]< 128 )   980                          loopCnt 
=  clk
[ clkCnt
] *  2 ;  982                  bestErr
[ clkCnt
] =  1000 ;  984                  //try lining up the peaks by moving starting point (try first few clocks)  985                  for  ( ii
= 0 ;  ii 
<  loopCnt
;  ii
++){  986                          if  ( dest
[ ii
] <  peak 
&&  dest
[ ii
] >  low
)  continue ;  989                          // now that we have the first one lined up test rest of wave array  990                          loopEnd 
= (( size
- ii
- tol
) /  clk
[ clkCnt
]) -  1 ;  991                          for  ( i
= 0 ;  i 
<  loopEnd
; ++ i
){  992                                  arrLoc 
=  ii 
+ ( i 
*  clk
[ clkCnt
]);  993                                  if  ( dest
[ arrLoc
] >=  peak 
||  dest
[ arrLoc
] <=  low
){  994                                  } else if  ( dest
[ arrLoc
- tol
] >=  peak 
||  dest
[ arrLoc
- tol
] <=  low
){  995                                  } else if  ( dest
[ arrLoc
+ tol
] >=  peak 
||  dest
[ arrLoc
+ tol
] <=  low
){  996                                  } else {   //error no peak detected 1000                          //if we found no errors then we can stop here and a low clock (common clocks) 1001                          //  this is correct one - return this clock 1002                          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG ASK: clk  %d , err  %d , startpos  %d , endpos  %d " ,  clk
[ clkCnt
],  errCnt
,  ii
,  i
); 1003                          if  ( errCnt
== 0  &&  clkCnt
< 7 ) {  1004                                  if  (! clockFnd
) * clock 
=  clk
[ clkCnt
]; 1007                          //if we found errors see if it is lowest so far and save it as best run 1008                          if  ( errCnt 
<  bestErr
[ clkCnt
]) { 1009                                  bestErr
[ clkCnt
] =  errCnt
; 1010                                  bestStart
[ clkCnt
] =  ii
; 1016          for  ( k
= 1 ;  k 
<  clkEnd
; ++ k
){ 1017                  if  ( bestErr
[ k
] <  bestErr
[ best
]){ 1018                          if  ( bestErr
[ k
] ==  0 )  bestErr
[ k
]= 1 ; 1019                          // current best bit to error ratio     vs  new bit to error ratio 1020                          if  ( ( size
/ clk
[ best
])/ bestErr
[ best
] < ( size
/ clk
[ k
])/ bestErr
[ k
] ){ 1024                  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
]); 1026          if  (! clockFnd
) * clock 
=  clk
[ best
]; 1027          return  bestStart
[ best
]; 1031  //detect psk clock by reading each phase shift 1032  // a phase shift is determined by measuring the sample length of each wave 1033  int  DetectPSKClock ( uint8_t  dest
[],  size_t  size
,  int  clock
) 1035          uint8_t  clk
[]={ 255 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 };  //255 is not a valid clock 1036          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1037          if  ( size 
==  0 )  return  0 ; 1038          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ; 1040          //if we already have a valid clock quit 1043                  if  ( clk
[ i
] ==  clock
)  return  clock
; 1045          size_t  waveStart
= 0 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ; 1046          uint8_t  clkCnt
,  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ; 1047          uint16_t  peakcnt
= 0 ,  errCnt
= 0 ,  waveLenCnt
= 0 ; 1048          uint16_t  bestErr
[]={ 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 }; 1049          uint16_t  peaksdet
[]={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1050          fc 
=  countFC ( dest
,  size
,  0 ); 1051          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ; 1052          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: FC:  %d " , fc
); 1054          //find first full wave 1055          for  ( i
= 160 ;  i
< loopCnt
;  i
++){ 1056                  if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1057                          if  ( waveStart 
==  0 ) { 1059                                  //prnt("DEBUG: waveStart: %d",waveStart); 1062                                  //prnt("DEBUG: waveEnd: %d",waveEnd); 1063                                  waveLenCnt 
=  waveEnd
- waveStart
; 1064                                  if  ( waveLenCnt 
>  fc
){ 1065                                          firstFullWave 
=  waveStart
; 1066                                          fullWaveLen
= waveLenCnt
; 1073          if  ( g_debugMode 
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %d , waveLen:  %d " , firstFullWave
, fullWaveLen
); 1075          //test each valid clock from greatest to smallest to see which lines up 1076          for ( clkCnt
= 7 ;  clkCnt 
>=  1  ;  clkCnt
--){ 1077                  lastClkBit 
=  firstFullWave
;  //set end of wave as clock align 1081                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: clk:  %d , lastClkBit:  %d " , clk
[ clkCnt
], lastClkBit
); 1083                  for  ( i 
=  firstFullWave
+ fullWaveLen
- 1 ;  i 
<  loopCnt
- 2 ;  i
++){ 1084                          //top edge of wave = start of new wave  1085                          if  ( dest
[ i
] <  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1086                                  if  ( waveStart 
==  0 ) { 1091                                          waveLenCnt 
=  waveEnd
- waveStart
; 1092                                          if  ( waveLenCnt 
>  fc
){  1093                                                  //if this wave is a phase shift 1094                                                  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
); 1095                                                  if  ( i
+ 1  >=  lastClkBit 
+  clk
[ clkCnt
] -  tol
){  //should be a clock bit 1097                                                          lastClkBit
+= clk
[ clkCnt
]; 1098                                                  }  else if  ( i
< lastClkBit
+ 8 ){ 1099                                                          //noise after a phase shift - ignore 1100                                                  }  else  {  //phase shift before supposed to based on clock 1103                                          }  else if  ( i
+ 1  >  lastClkBit 
+  clk
[ clkCnt
] +  tol 
+  fc
){ 1104                                                  lastClkBit
+= clk
[ clkCnt
];  //no phase shift but clock bit 1113                  if  ( errCnt 
<=  bestErr
[ clkCnt
])  bestErr
[ clkCnt
]= errCnt
; 1114                  if  ( peakcnt 
>  peaksdet
[ clkCnt
])  peaksdet
[ clkCnt
]= peakcnt
; 1116          //all tested with errors  1117          //return the highest clk with the most peaks found 1119          for  ( i
= 7 ;  i
>= 1 ;  i
--){ 1120                  if  ( peaksdet
[ i
] >  peaksdet
[ best
]) { 1123                  if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: Clk:  %d , peaks:  %d , errs:  %d , bestClk:  %d " , clk
[ i
], peaksdet
[ i
], bestErr
[ i
], clk
[ best
]); 1128  int  DetectStrongNRZClk ( uint8_t  * dest
,  size_t  size
,  int  peak
,  int  low
){ 1129          //find shortest transition from high to low 1131          size_t  transition1 
=  0 ; 1132          int  lowestTransition 
=  255 ; 1133          bool  lastWasHigh 
=  false ; 1135          //find first valid beginning of a high or low wave 1136          while  (( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) && ( i 
<  size
)) 1138          while  (( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
) && ( i 
<  size
)) 1140          lastWasHigh 
= ( dest
[ i
] >=  peak
); 1142          if  ( i
== size
)  return  0 ; 1145          for  (; i 
<  size
;  i
++) { 1146                  if  (( dest
[ i
] >=  peak 
&& ! lastWasHigh
) || ( dest
[ i
] <=  low 
&&  lastWasHigh
)) { 1147                          lastWasHigh 
= ( dest
[ i
] >=  peak
); 1148                          if  ( i
- transition1 
<  lowestTransition
)  lowestTransition 
=  i
- transition1
; 1152          if  ( lowestTransition 
==  255 )  lowestTransition 
=  0 ; 1153          if  ( g_debugMode
== 2 )  prnt ( "DEBUG NRZ: detectstrongNRZclk smallest wave:  %d " , lowestTransition
); 1154          return  lowestTransition
; 1158  //detect nrz clock by reading #peaks vs no peaks(or errors) 1159  int  DetectNRZClock ( uint8_t  dest
[],  size_t  size
,  int  clock
) 1162          uint8_t  clk
[]={ 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 255 }; 1163          size_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1164          if  ( size 
==  0 )  return  0 ; 1165          if  ( size
< loopCnt
)  loopCnt 
=  size
- 20 ; 1166          //if we already have a valid clock quit 1168                  if  ( clk
[ i
] ==  clock
)  return  clock
; 1170          //get high and low peak 1172          if  ( getHiLo ( dest
,  loopCnt
, & peak
, & low
,  75 ,  75 ) <  1 )  return  0 ; 1174          int  lowestTransition 
=  DetectStrongNRZClk ( dest
,  size
- 20 ,  peak
,  low
); 1178          uint16_t  smplCnt 
=  0 ; 1179          int16_t  peakcnt 
=  0 ; 1180          int16_t  peaksdet
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1181          uint16_t  maxPeak 
=  255 ; 1182          bool  firstpeak 
=  false ; 1183          //test for large clipped waves 1184          for  ( i
= 0 ;  i
< loopCnt
;  i
++){ 1185                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
){ 1186                          if  (! firstpeak
)  continue ; 1191                                  if  ( maxPeak 
>  smplCnt
){ 1193                                          //prnt("maxPk: %d",maxPeak); 1196                                  //prnt("maxPk: %d, smplCnt: %d, peakcnt: %d",maxPeak,smplCnt,peakcnt); 1201          bool  errBitHigh 
=  0 ; 1203          uint8_t  ignoreCnt 
=  0 ; 1204          uint8_t  ignoreWindow 
=  4 ; 1205          bool  lastPeakHigh 
=  0 ; 1208          //test each valid clock from smallest to greatest to see which lines up 1209          for ( clkCnt
= 0 ;  clkCnt 
<  8 ; ++ clkCnt
){ 1210                  //ignore clocks smaller than smallest peak 1211                  if  ( clk
[ clkCnt
] <  maxPeak 
- ( clk
[ clkCnt
]/ 4 ))  continue ; 1212                  //try lining up the peaks by moving starting point (try first 256) 1213                  for  ( ii
= 20 ;  ii 
<  loopCnt
; ++ ii
){ 1214                          if  (( dest
[ ii
] >=  peak
) || ( dest
[ ii
] <=  low
)){ 1218                                  lastBit 
=  ii
- clk
[ clkCnt
];  1219                                  //loop through to see if this start location works 1220                                  for  ( i 
=  ii
;  i 
<  size
- 20 ; ++ i
) { 1221                                          //if we are at a clock bit 1222                                          if  (( i 
>=  lastBit 
+  clk
[ clkCnt
] -  tol
) && ( i 
<=  lastBit 
+  clk
[ clkCnt
] +  tol
)) { 1224                                                  if  ( dest
[ i
] >=  peak 
||  dest
[ i
] <=  low
) { 1225                                                          //if same peak don't count it 1226                                                          if  (( dest
[ i
] >=  peak 
&& ! lastPeakHigh
) || ( dest
[ i
] <=  low 
&&  lastPeakHigh
)) { 1229                                                          lastPeakHigh 
= ( dest
[ i
] >=  peak
); 1232                                                          ignoreCnt 
=  ignoreWindow
; 1233                                                          lastBit 
+=  clk
[ clkCnt
]; 1234                                                  }  else if  ( i 
==  lastBit 
+  clk
[ clkCnt
] +  tol
) { 1235                                                          lastBit 
+=  clk
[ clkCnt
]; 1237                                          //else if not a clock bit and no peaks 1238                                          }  else if  ( dest
[ i
] <  peak 
&&  dest
[ i
] >  low
){ 1241                                                          if  ( errBitHigh
== true )  peakcnt
--; 1246                                                  // else if not a clock bit but we have a peak 1247                                          }  else if  (( dest
[ i
]>= peak 
||  dest
[ i
]<= low
) && (! bitHigh
)) { 1248                                                  //error bar found no clock... 1252                                  if ( peakcnt
> peaksdet
[ clkCnt
]) { 1253                                          peaksdet
[ clkCnt
]= peakcnt
; 1260          for  ( iii
= 7 ;  iii 
>  0 ;  iii
--){ 1261                  if  (( peaksdet
[ iii
] >= ( peaksdet
[ best
]- 1 )) && ( peaksdet
[ iii
] <=  peaksdet
[ best
]+ 1 ) &&  lowestTransition
) { 1262                          if  ( clk
[ iii
] > ( lowestTransition 
- ( clk
[ iii
]/ 8 )) &&  clk
[ iii
] < ( lowestTransition 
+ ( clk
[ iii
]/ 8 ))) { 1265                  }  else if  ( peaksdet
[ iii
] >  peaksdet
[ best
]){ 1268                  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
); 1275  // convert psk1 demod to psk2 demod 1276  // only transition waves are 1s 1277  void  psk1TOpsk2 ( uint8_t  * bits
,  size_t  size
) { 1278          uint8_t  lastBit 
=  bits
[ 0 ]; 1279          for  ( size_t  i 
=  1 ;  i 
<  size
;  i
++){ 1281                  if  ( bits
[ i
] ==  7 )  continue ; 1283                  if  ( lastBit 
!=  bits
[ i
]){ 1293  // convert psk2 demod to psk1 demod 1294  // from only transition waves are 1s to phase shifts change bit 1295  void  psk2TOpsk1 ( uint8_t  * bits
,  size_t  size
) { 1297          for  ( size_t  i 
=  0 ;  i 
<  size
;  i
++){ 1305  // redesigned by marshmellow adjusted from existing decode functions 1306  // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more 1307  int  indala26decode ( uint8_t  * bitStream
,  size_t  * size
,  uint8_t  * invert
) 1309          //26 bit 40134 format  (don't know other formats) 1310          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 }; 1311          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 }; 1312          size_t  startidx 
=  0 ;  1313          if  (! preambleSearch ( bitStream
,  preamble
,  sizeof ( preamble
),  size
, & startidx
)){ 1314                  // if didn't find preamble try again inverting 1315                  if  (! preambleSearch ( bitStream
,  preamble_i
,  sizeof ( preamble_i
),  size
, & startidx
))  return  - 1 ; 1318          if  (* size 
!=  64  && * size 
!=  224 )  return  - 2 ; 1320                  for  ( size_t  i 
=  startidx
;  i 
< * size
;  i
++) 1323          return  ( int )  startidx
; 1326  // by marshmellow - demodulate NRZ wave - requires a read with strong signal 1327  // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak 1328  int  nrzRawDemod ( uint8_t  * dest
,  size_t  * size
,  int  * clk
,  int  * invert
){ 1329          if  ( justNoise ( dest
, * size
))  return  - 1 ; 1330          * clk 
=  DetectNRZClock ( dest
, * size
, * clk
); 1331          if  (* clk
== 0 )  return  - 2 ; 1332          size_t  i
,  gLen 
=  4096 ; 1333          if  ( gLen
>* size
)  gLen 
= * size
- 20 ; 1335          if  ( getHiLo ( dest
,  gLen
, & high
, & low
,  75 ,  75 ) <  1 )  return  - 3 ;  //25% fuzz on high 25% fuzz on low 1338          //convert wave samples to 1's and 0's 1339          for ( i
= 20 ;  i 
< * size
- 20 ;  i
++){ 1340                  if  ( dest
[ i
] >=  high
)  bit 
=  1 ; 1341                  if  ( dest
[ i
] <=  low
)   bit 
=  0 ; 1344          //now demod based on clock (rf/32 = 32 1's for one 1 bit, 32 0's for one 0 bit)  1347          for ( i
= 21 ;  i 
< * size
- 20 ;  i
++) { 1348                  //if transition detected or large number of same bits - store the passed bits 1349                  if  ( dest
[ i
] !=  dest
[ i
- 1 ] || ( i
- lastBit
) == ( 10  * * clk
)) { 1350                          memset ( dest
+ numBits
,  dest
[ i
- 1 ] ^ * invert
, ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
); 1351                          numBits 
+= ( i 
-  lastBit 
+ (* clk
/ 4 )) / * clk
; 1360  //detects the bit clock for FSK given the high and low Field Clocks 1361  uint8_t  detectFSKClk ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fcHigh
,  uint8_t  fcLow
) 1363          uint8_t  clk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 100 , 128 , 0 }; 1364          uint16_t  rfLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1365          uint8_t  rfCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1366          uint8_t  rfLensFnd 
=  0 ; 1367          uint8_t  lastFCcnt 
=  0 ; 1368          uint16_t  fcCounter 
=  0 ; 1369          uint16_t  rfCounter 
=  0 ; 1370          uint8_t  firstBitFnd 
=  0 ; 1372          if  ( size 
==  0 )  return  0 ; 1374          uint8_t  fcTol 
= (( fcHigh
* 100  -  fcLow
* 100 )/ 2  +  50 )/ 100 ;  //(uint8_t)(0.5+(float)(fcHigh-fcLow)/2); 1379          //prnt("DEBUG: fcTol: %d",fcTol); 1380          // prime i to first peak / up transition 1381          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++) 1382                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
]>= BitStream
[ i
+ 1 ]) 1385          for  (;  i 
<  size
- 20 ;  i
++){ 1389                  if  ( BitStream
[ i
] <=  BitStream
[ i
- 1 ] ||  BitStream
[ i
] <  BitStream
[ i
+ 1 ])  1392                  // if we got less than the small fc + tolerance then set it to the small fc 1393                  if  ( fcCounter 
<  fcLow
+ fcTol
)  1395                  else  //set it to the large fc 1398                  //look for bit clock  (rf/xx) 1399                  if  (( fcCounter 
<  lastFCcnt 
||  fcCounter 
>  lastFCcnt
)){ 1400                          //not the same size as the last wave - start of new bit sequence 1401                          if  ( firstBitFnd 
>  1 ){  //skip first wave change - probably not a complete bit 1402                                  for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){ 1403                                          if  ( rfLens
[ ii
] >= ( rfCounter
- 4 ) &&  rfLens
[ ii
] <= ( rfCounter
+ 4 )){ 1409                                  if  ( rfCounter 
>  0  &&  rfLensFnd 
<  15 ){ 1410                                          //prnt("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter); 1411                                          rfCnts
[ rfLensFnd
]++; 1412                                          rfLens
[ rfLensFnd
++] =  rfCounter
; 1418                          lastFCcnt
= fcCounter
; 1422          uint8_t  rfHighest
= 15 ,  rfHighest2
= 15 ,  rfHighest3
= 15 ; 1424          for  ( i
= 0 ;  i
< 15 ;  i
++){ 1425                  //get highest 2 RF values  (might need to get more values to compare or compare all?) 1426                  if  ( rfCnts
[ i
]> rfCnts
[ rfHighest
]){ 1427                          rfHighest3
= rfHighest2
; 1428                          rfHighest2
= rfHighest
; 1430                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest2
]){ 1431                          rfHighest3
= rfHighest2
; 1433                  }  else if ( rfCnts
[ i
]> rfCnts
[ rfHighest3
]){ 1436                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: RF  %d , cnts  %d " , rfLens
[ i
],  rfCnts
[ i
]); 1438          // set allowed clock remainder tolerance to be 1 large field clock length+1  1439          //   we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off   1440          uint8_t  tol1 
=  fcHigh
+ 1 ;  1442          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: most counted rf values: 1  %d , 2  %d , 3  %d " , rfLens
[ rfHighest
], rfLens
[ rfHighest2
], rfLens
[ rfHighest3
]); 1444          // loop to find the highest clock that has a remainder less than the tolerance 1445          //   compare samples counted divided by 1446          // test 128 down to 32 (shouldn't be possible to have fc/10 & fc/8 and rf/16 or less) 1448          for  (;  ii
>= 2 ;  ii
--){ 1449                  if  ( rfLens
[ rfHighest
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1450                          if  ( rfLens
[ rfHighest2
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest2
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1451                                  if  ( rfLens
[ rfHighest3
] %  clk
[ ii
] <  tol1 
||  rfLens
[ rfHighest3
] %  clk
[ ii
] >  clk
[ ii
]- tol1
){ 1452                                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG FSK: clk  %d  divides into the 3 most rf values within tolerance" , clk
[ ii
]); 1459          if  ( ii
< 0 )  return  0 ;  // oops we went too far 1465  //countFC is to detect the field clock lengths. 1466  //counts and returns the 2 most common wave lengths 1467  //mainly used for FSK field clock detection 1468  uint16_t  countFC ( uint8_t  * BitStream
,  size_t  size
,  uint8_t  fskAdj
) 1470          uint8_t  fcLens
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1471          uint16_t  fcCnts
[] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 1472          uint8_t  fcLensFnd 
=  0 ; 1473          uint8_t  lastFCcnt 
=  0 ; 1474          uint8_t  fcCounter 
=  0 ; 1476          if  ( size 
<  180 )  return  0 ; 1478          // prime i to first up transition 1479          for  ( i 
=  160 ;  i 
<  size
- 20 ;  i
++) 1480                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]) 1483          for  (;  i 
<  size
- 20 ;  i
++){ 1484                  if  ( BitStream
[ i
] >  BitStream
[ i
- 1 ] &&  BitStream
[ i
] >=  BitStream
[ i
+ 1 ]){ 1485                          // new up transition 1488                                  //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8) 1489                                  if  ( lastFCcnt
== 5  &&  fcCounter
== 9 )  fcCounter
--; 1490                                  //if fc=9 or 4 add one (for when we get a fc 9 instead of 10 or a 4 instead of a 5) 1491                                  if  (( fcCounter
== 9 ) ||  fcCounter
== 4 )  fcCounter
++; 1492                          // save last field clock count  (fc/xx) 1493                          lastFCcnt 
=  fcCounter
; 1495                          // find which fcLens to save it to: 1496                          for  ( int  ii
= 0 ;  ii
< 15 ;  ii
++){ 1497                                  if  ( fcLens
[ ii
]== fcCounter
){ 1503                          if  ( fcCounter
> 0  &&  fcLensFnd
< 15 ){ 1505                                  fcCnts
[ fcLensFnd
]++; 1506                                  fcLens
[ fcLensFnd
++]= fcCounter
; 1515          uint8_t  best1
= 14 ,  best2
= 14 ,  best3
= 14 ; 1517          // go through fclens and find which ones are bigest 2   1518          for  ( i
= 0 ;  i
< 15 ;  i
++){ 1519                  // get the 3 best FC values 1520                  if  ( fcCnts
[ i
]> maxCnt1
) { 1525                  }  else if ( fcCnts
[ i
]> fcCnts
[ best2
]){ 1528                  }  else if ( fcCnts
[ i
]> fcCnts
[ best3
]){ 1531                  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
]); 1533          if  ( fcLens
[ best1
]== 0 )  return  0 ; 1534          uint8_t  fcH
= 0 ,  fcL
= 0 ; 1535          if  ( fcLens
[ best1
]> fcLens
[ best2
]){ 1542          if  (( size
- 180 )/ fcH
/ 3  >  fcCnts
[ best1
]+ fcCnts
[ best2
]) { 1543                  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
]); 1544                  return  0 ;  //lots of waves not psk or fsk 1546          // TODO: take top 3 answers and compare to known Field clocks to get top 2 1548          uint16_t  fcs 
= ((( uint16_t ) fcH
)<< 8 ) |  fcL
; 1549          if  ( fskAdj
)  return  fcs
;  1550          return  fcLens
[ best1
]; 1553  //by marshmellow - demodulate PSK1 wave  1554  //uses wave lengths (# Samples)  1555  int  pskRawDemod ( uint8_t  dest
[],  size_t  * size
,  int  * clock
,  int  * invert
) 1557          if  ( size 
==  0 )  return  - 1 ; 1558          uint16_t  loopCnt 
=  4096 ;   //don't need to loop through entire array... 1559          if  (* size
< loopCnt
)  loopCnt 
= * size
; 1562          uint8_t  curPhase 
= * invert
; 1563          size_t  i
= 0 ,  waveStart
= 1 ,  waveEnd
= 0 ,  firstFullWave
= 0 ,  lastClkBit
= 0 ; 1564          uint8_t  fc
= 0 ,  fullWaveLen
= 0 ,  tol
= 1 ; 1565          uint16_t  errCnt
= 0 ,  waveLenCnt
= 0 ; 1566          fc 
=  countFC ( dest
, * size
,  0 ); 1567          if  ( fc
!= 2  &&  fc
!= 4  &&  fc
!= 8 )  return  - 1 ; 1568          //prnt("DEBUG: FC: %d",fc); 1569          * clock 
=  DetectPSKClock ( dest
, * size
, * clock
); 1570          if  (* clock 
==  0 )  return  - 1 ; 1571          // jump to modulating data by finding the first 2 threshold crossings (or first 1 waves) 1572          // in case you have junk or noise at the beginning of the trace... 1573          uint8_t  thresholdCnt 
=  0 ; 1574          size_t  waveSizeCnt 
=  0 ; 1575          uint8_t  threshold_value 
=  123 ;  //-5 1576          bool  isAboveThreshold 
=  dest
[ i
++] >=  threshold_value
; 1577          for  (;  i 
< * size
- 20 ;  i
++ ) { 1578                  if ( dest
[ i
] <  threshold_value 
&&  isAboveThreshold
) { 1580                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  fc
+ 1 )  break ;                       1581                          isAboveThreshold 
=  false ; 1583                  }  else if  ( dest
[ i
] >=  threshold_value 
&& ! isAboveThreshold
) { 1585                          if  ( thresholdCnt 
>  2  &&  waveSizeCnt 
<  fc
+ 1 )  break ;                       1586                          isAboveThreshold 
=  true ; 1591                  if  ( thresholdCnt 
>  10 )  break ; 1593          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: threshold Count reached at  %u , count:  %u " , i
,  thresholdCnt
); 1596          int  avgWaveVal
= 0 ,  lastAvgWaveVal
= 0 ; 1598          //find first phase shift 1599          for  (;  i
< loopCnt
;  i
++){ 1600                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1602                          if  ( g_debugMode 
==  2 )  prnt ( "DEBUG PSK: waveEnd:  %u , waveStart:  %u " , waveEnd
,  waveStart
); 1603                          waveLenCnt 
=  waveEnd
- waveStart
; 1604                          if  ( waveLenCnt 
>  fc 
&&  waveStart 
>  fc 
&& !( waveLenCnt 
>  fc
+ 3 )){  //not first peak and is a large wave but not out of whack 1605                                  lastAvgWaveVal 
=  avgWaveVal
/( waveLenCnt
); 1606                                  firstFullWave 
=  waveStart
; 1607                                  fullWaveLen
= waveLenCnt
; 1608                                  //if average wave value is > graph 0 then it is an up wave or a 1 1609                                  if  ( lastAvgWaveVal 
>  threshold_value
)  curPhase 
^=  1 ;   //fudge graph 0 a little 123 vs 128 1615                  avgWaveVal 
+=  dest
[ i
+ 2 ]; 1617          if  ( firstFullWave 
==  0 ) { 1618                  // no phase shift detected - could be all 1's or 0's - doesn't matter where we start 1619                  // so skip a little to ensure we are past any Start Signal 1620                  firstFullWave 
=  160 ; 1621                  memset ( dest
,  curPhase
,  firstFullWave 
/ * clock
); 1623                  memset ( dest
,  curPhase
^ 1 ,  firstFullWave 
/ * clock
); 1626          numBits 
+= ( firstFullWave 
/ * clock
); 1627          //set start of wave as clock align 1628          lastClkBit 
=  firstFullWave
; 1629          if  ( g_debugMode
== 2 )  prnt ( "DEBUG PSK: firstFullWave:  %u , waveLen:  %u " , firstFullWave
, fullWaveLen
);   1630          if  ( g_debugMode
== 2 )  prnt ( "DEBUG: clk:  %d , lastClkBit:  %u , fc:  %u " , * clock
,  lastClkBit
,( unsigned int )  fc
); 1632          dest
[ numBits
++] =  curPhase
;  //set first read bit 1633          for  ( i 
=  firstFullWave 
+  fullWaveLen 
-  1 ;  i 
< * size
- 3 ;  i
++){ 1634                  //top edge of wave = start of new wave  1635                  if  ( dest
[ i
]+ fc 
<  dest
[ i
+ 1 ] &&  dest
[ i
+ 1 ] >=  dest
[ i
+ 2 ]){ 1636                          if  ( waveStart 
==  0 ) { 1639                                  avgWaveVal 
=  dest
[ i
+ 1 ]; 1642                                  waveLenCnt 
=  waveEnd
- waveStart
; 1643                                  lastAvgWaveVal 
=  avgWaveVal
/ waveLenCnt
; 1644                                  if  ( waveLenCnt 
>  fc
){   1645                                          //prnt("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal); 1646                                          //this wave is a phase shift 1647                                          //prnt("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc); 1648                                          if  ( i
+ 1  >=  lastClkBit 
+ * clock 
-  tol
){  //should be a clock bit 1650                                                  dest
[ numBits
++] =  curPhase
; 1651                                                  lastClkBit 
+= * clock
; 1652                                          }  else if  ( i 
<  lastClkBit
+ 10 + fc
){ 1653                                                  //noise after a phase shift - ignore 1654                                          }  else  {  //phase shift before supposed to based on clock 1656                                                  dest
[ numBits
++] =  7 ; 1658                                  }  else if  ( i
+ 1  >  lastClkBit 
+ * clock 
+  tol 
+  fc
){ 1659                                          lastClkBit 
+= * clock
;  //no phase shift but clock bit 1660                                          dest
[ numBits
++] =  curPhase
; 1666                  avgWaveVal 
+=  dest
[ i
+ 1 ]; 1673  //attempt to identify a Sequence Terminator in ASK modulated raw wave 1674  bool  DetectST ( uint8_t  buffer
[],  size_t  * size
,  int  * foundclock
) { 1675          size_t  bufsize 
= * size
; 1676          //need to loop through all samples and identify our clock, look for the ST pattern 1677          uint8_t  fndClk
[] = { 8 , 16 , 32 , 40 , 50 , 64 , 128 }; 1680          int  i
,  j
,  skip
,  start
,  end
,  low
,  high
,  minClk
,  waveStart
; 1681          bool  complete 
=  false ; 1682          int  tmpbuff
[ bufsize 
/  32 ];  //guess rf/32 clock, if click is smaller we will only have room for a fraction of the samples captured 1683          int  waveLen
[ bufsize 
/  32 ];  //  if clock is larger then we waste memory in array size that is not needed... 1684          size_t  testsize 
= ( bufsize 
<  512 ) ?  bufsize 
:  512 ; 1687          memset ( tmpbuff
,  0 ,  sizeof ( tmpbuff
)); 1688          memset ( waveLen
,  0 ,  sizeof ( waveLen
)); 1691          if  (  getHiLo ( buffer
,  testsize
, & high
, & low
,  80 ,  80 ) == - 1  ) { 1692                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: just noise detected - quitting" ); 1693                  return false ;  //just noise 1698          // get to first full low to prime loop and skip incomplete first pulse 1699          while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
)) 1701          while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1705          // populate tmpbuff buffer with pulse lengths 1706          while  ( i 
<  bufsize
) { 1707                  // measure from low to low 1708                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1711                  while  (( buffer
[ i
] <  high
) && ( i 
<  bufsize
)) 1713                  //first high point for this wave 1715                  while  (( buffer
[ i
] >  low
) && ( i 
<  bufsize
)) 1717                  if  ( j 
>= ( bufsize
/ 32 )) { 1720                  waveLen
[ j
] =  i 
-  waveStart
;  //first high to first low 1721                  tmpbuff
[ j
++] =  i 
-  start
; 1722                  if  ( i
- start 
<  minClk 
&&  i 
<  bufsize
) { 1726          // set clock  - might be able to get this externally and remove this work... 1728                  for  ( uint8_t  clkCnt 
=  0 ;  clkCnt
< 7 ;  clkCnt
++) { 1729                          tol 
=  fndClk
[ clkCnt
]/ 8 ; 1730                          if  ( minClk 
>=  fndClk
[ clkCnt
]- tol 
&&  minClk 
<=  fndClk
[ clkCnt
]+ 1 ) {  1735                  // clock not found - ERROR 1737                          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: clock not found - quitting" ); 1744          // look for Sequence Terminator - should be pulses of clk*(1 or 1.5), clk*2, clk*(1.5 or 2) 1746          for  ( i 
=  0 ;  i 
<  j 
-  4 ; ++ i
) { 1748                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol 
&&  waveLen
[ i
] <  clk
+ tol
) {            //1 to 2 clocks depending on 2 bits prior 1749                          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 1750                                  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 1751                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit 1759          // first ST not found - ERROR 1761                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: first STT not found - quitting" ); 1764                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: first STT found at:  %d , j= %d " , start
,  j
); 1766          if  ( waveLen
[ i
+ 2 ] >  clk
* 1 + tol
) 1771          // skip over the remainder of ST 1772          skip 
+=  clk
* 7 / 2 ;  //3.5 clocks from tmpbuff[i] = end of st - also aligns for ending point 1774          // now do it again to find the end 1776          for  ( i 
+=  3 ;  i 
<  j 
-  4 ; ++ i
) { 1778                  if  ( tmpbuff
[ i
] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
] <= ( clk
* 2 )+ tol 
&&  waveLen
[ i
] <  clk
+ tol
) {            //1 to 2 clocks depending on 2 bits prior 1779                          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 1780                                  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 1781                                          if  ( tmpbuff
[ i
+ 3 ] >=  clk
* 1 - tol 
&&  tmpbuff
[ i
+ 3 ] <=  clk
* 2 + tol
) {  //1 to 2 clocks for end of ST + first bit 1790          //didn't find second ST - ERROR 1792                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: second STT not found - quitting" ); 1795          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
); 1796          //now begin to trim out ST so we can use normal demod cmds 1798          size_t  datalen 
=  end 
-  start
; 1799          // check validity of datalen (should be even clock increments)  - use a tolerance of up to 1/8th a clock 1800          if  (  clk 
- ( datalen 
%  clk
) <=  clk
/ 8 ) { 1801                  // padd the amount off - could be problematic...  but shouldn't happen often 1802                  datalen 
+=  clk 
- ( datalen 
%  clk
); 1803          }  else if  ( ( datalen 
%  clk
) <=  clk
/ 8  ) { 1804                  // padd the amount off - could be problematic...  but shouldn't happen often 1805                  datalen 
-=  datalen 
%  clk
; 1807                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen not divisible by clk:  %u  %%  %d  =  %d  - quitting" ,  datalen
,  clk
,  datalen 
%  clk
); 1810          // if datalen is less than one t55xx block - ERROR 1811          if  ( datalen
/ clk 
<  8 * 4 ) { 1812                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: datalen is less than 1 full t55xx block - quitting" );               1815          size_t  dataloc 
=  start
; 1816          if  ( buffer
[ dataloc
-( clk
* 4 )-( clk
/ 8 )] <=  low 
&&  buffer
[ dataloc
] <=  low 
&&  buffer
[ dataloc
-( clk
* 4 )] >=  high
) { 1817                  //we have low drift (and a low just before the ST and a low just after the ST) - compensate by backing up the start  1818                  for  (  i
= 0 ;  i 
<= ( clk
/ 8 ); ++ i 
) { 1819                          if  (  buffer
[ dataloc 
- ( clk
* 4 ) -  i
] <=  low 
) { 1828          if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: Starting STT trim - start:  %d , datalen:  %d  " , dataloc
,  datalen
);             1830          // warning - overwriting buffer given with raw wave data with ST removed... 1831          while  (  dataloc 
<  bufsize
-( clk
/ 2 ) ) { 1832                  //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) 1833                  if  ( buffer
[ dataloc
]< high 
&&  buffer
[ dataloc
]> low 
&&  buffer
[ dataloc
+ 3 ]< high 
&&  buffer
[ dataloc
+ 3 ]> low
) { 1834                          for ( i
= 0 ;  i 
<  clk
/ 2 - tol
; ++ i
) { 1835                                  buffer
[ dataloc
+ i
] =  high
+ 5 ; 1838                  for  ( i
= 0 ;  i
< datalen
; ++ i
) { 1839                          if  ( i
+ newloc 
<  bufsize
) { 1840                                  if  ( i
+ newloc 
<  dataloc
) 1841                                          buffer
[ i
+ newloc
] =  buffer
[ dataloc
]; 1847                  //skip next ST  -  we just assume it will be there from now on... 1848                  if  ( g_debugMode
== 2 )  prnt ( "DEBUG STT: skipping STT at  %d  to  %d " ,  dataloc
,  dataloc
+( clk
* 4 ));