]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/lfdemod.c
df30aba4628603d915d60dbd5af0ac434837219d
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 //-----------------------------------------------------------------------------
14 uint8_t justNoise(uint8_t *BitStream
, size_t size
)
16 static const uint8_t THRESHOLD
= 123;
17 //test samples are not just noise
18 uint8_t justNoise1
= 1;
19 for(size_t idx
=0; idx
< size
&& justNoise1
;idx
++){
20 justNoise1
= BitStream
[idx
] < THRESHOLD
;
26 //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
27 int getHiLo(uint8_t *BitStream
, size_t size
, int *high
, int *low
, uint8_t fuzzHi
, uint8_t fuzzLo
)
31 // get high and low thresholds
32 for (size_t i
=0; i
< size
; i
++){
33 if (BitStream
[i
] > *high
) *high
= BitStream
[i
];
34 if (BitStream
[i
] < *low
) *low
= BitStream
[i
];
36 if (*high
< 123) return -1; // just noise
37 *high
= ((*high
-128)*fuzzHi
+ 12800)/100;
38 *low
= ((*low
-128)*fuzzLo
+ 12800)/100;
43 // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType
44 // returns 1 if passed
45 uint8_t parityTest(uint32_t bits
, uint8_t bitLen
, uint8_t pType
)
48 for (uint8_t i
= 0; i
< bitLen
; i
++){
49 ans
^= ((bits
>> i
) & 1);
51 //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType);
52 return (ans
== pType
);
56 //search for given preamble in given BitStream and return success=1 or fail=0 and startIndex and length
57 uint8_t preambleSearch(uint8_t *BitStream
, uint8_t *preamble
, size_t pLen
, size_t *size
, size_t *startIdx
)
60 for (int idx
=0; idx
< *size
- pLen
; idx
++){
61 if (memcmp(BitStream
+idx
, preamble
, pLen
) == 0){
68 *size
= idx
- *startIdx
;
77 //takes 1s and 0s and searches for EM410x format - output EM ID
78 uint8_t Em410xDecode(uint8_t *BitStream
, size_t *size
, size_t *startIdx
, uint32_t *hi
, uint64_t *lo
)
80 //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future
81 // otherwise could be a void with no arguments
84 if (BitStream
[1]>1){ //allow only 1s and 0s
85 // PrintAndLog("no data found");
88 // 111111111 bit pattern represent start of frame
89 // include 0 in front to help get start pos
90 uint8_t preamble
[] = {0,1,1,1,1,1,1,1,1,1};
92 uint32_t parityBits
= 0;
96 errChk
= preambleSearch(BitStream
, preamble
, sizeof(preamble
), size
, startIdx
);
97 if (errChk
== 0 || *size
< 64) return 0;
98 if (*size
> 64) FmtLen
= 22;
99 *startIdx
+= 1; //get rid of 0 from preamble
101 for (i
=0; i
<FmtLen
; i
++){ //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)
102 parityBits
= bytebits_to_byte(BitStream
+(i
*5)+idx
,5);
103 //check even parity - quit if failed
104 if (parityTest(parityBits
, 5, 0) == 0) return 0;
105 //set uint64 with ID from BitStream
106 for (uint8_t ii
=0; ii
<4; ii
++){
107 *hi
= (*hi
<< 1) | (*lo
>> 63);
108 *lo
= (*lo
<< 1) | (BitStream
[(i
*5)+ii
+idx
]);
111 if (errChk
!= 0) return 1;
112 //skip last 5 bit parity test for simplicity.
117 // demodulates strong heavily clipped samples
118 int cleanAskRawDemod(uint8_t *BinStream
, size_t *size
, int clk
, int invert
, int high
, int low
)
120 size_t bitCnt
=0, smplCnt
=0, errCnt
=0;
121 uint8_t waveHigh
= 0;
122 //PrintAndLog("clk: %d", clk);
123 for (size_t i
=0; i
< *size
; i
++){
124 if (BinStream
[i
] >= high
&& waveHigh
){
126 } else if (BinStream
[i
] <= low
&& !waveHigh
){
128 } else { //transition
129 if ((BinStream
[i
] >= high
&& !waveHigh
) || (BinStream
[i
] <= low
&& waveHigh
)){
130 if (smplCnt
> clk
-(clk
/4)-1) { //full clock
131 if (smplCnt
> clk
+ (clk
/4)+1) { //too many samples
133 BinStream
[bitCnt
++]=77;
134 } else if (waveHigh
) {
135 BinStream
[bitCnt
++] = invert
;
136 BinStream
[bitCnt
++] = invert
;
137 } else if (!waveHigh
) {
138 BinStream
[bitCnt
++] = invert
^ 1;
139 BinStream
[bitCnt
++] = invert
^ 1;
143 } else if (smplCnt
> (clk
/2) - (clk
/4)-1) {
145 BinStream
[bitCnt
++] = invert
;
146 } else if (!waveHigh
) {
147 BinStream
[bitCnt
++] = invert
^ 1;
151 } else if (!bitCnt
) {
153 waveHigh
= (BinStream
[i
] >= high
);
157 //transition bit oops
159 } else { //haven't hit new high or new low yet
169 //takes 3 arguments - clock, invert, maxErr as integers
170 //attempts to demodulate ask while decoding manchester
171 //prints binary found and saves in graphbuffer for further commands
172 int askmandemod(uint8_t *BinStream
, size_t *size
, int *clk
, int *invert
, int maxErr
)
175 int start
= DetectASKClock(BinStream
, *size
, clk
, 20); //clock default
176 if (*clk
==0 || start
< 0) return -3;
177 if (*invert
!= 1) *invert
=0;
178 uint8_t initLoopMax
= 255;
179 if (initLoopMax
> *size
) initLoopMax
= *size
;
180 // Detect high and lows
181 // 25% fuzz in case highs and lows aren't clipped [marshmellow]
183 if (getHiLo(BinStream
, initLoopMax
, &high
, &low
, 75, 75) < 1) return -2; //just noise
185 // if clean clipped waves detected run alternate demod
186 if (DetectCleanAskWave(BinStream
, *size
, high
, low
)) {
187 cleanAskRawDemod(BinStream
, size
, *clk
, *invert
, high
, low
);
188 return manrawdecode(BinStream
, size
);
192 // PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);
193 int lastBit
= 0; //set first clock check
194 uint16_t bitnum
= 0; //output counter
195 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
196 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
198 //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance
199 if (!maxErr
&& initLoopMax
> *clk
*3) initLoopMax
= *clk
* 3;
200 uint16_t errCnt
= 0, MaxBits
= 512;
201 uint16_t bestStart
= start
;
202 uint16_t bestErrCnt
= 0;
203 // PrintAndLog("DEBUG - lastbit - %d",lastBit);
204 // if best start position not already found by detect clock then
205 if (start
<= 0 || start
> initLoopMax
){
206 bestErrCnt
= maxErr
+1;
207 // loop to find first wave that works
208 for (iii
=0; iii
< initLoopMax
-tol
-*clk
; ++iii
){
210 if (BinStream
[iii
] < high
&& BinStream
[iii
] > low
) continue;
212 lastBit
= iii
- *clk
;
213 // loop through to see if this start location works
214 for (i
= iii
; i
< *size
; ++i
) {
215 if ((i
-lastBit
) > (*clk
-tol
) && (BinStream
[i
] >= high
|| BinStream
[i
] <= low
)) {
217 } else if ((i
-lastBit
) > (*clk
+tol
)) {
221 if ((i
-iii
) > (MaxBits
* *clk
) || errCnt
> maxErr
) break; //got plenty of bits or too many errors
223 //we got more than 64 good bits and not all errors
224 if ((((i
-iii
)/ *clk
) > (32)) && (errCnt
<=maxErr
)) {
226 if (!errCnt
|| errCnt
< bestErrCnt
){
227 bestStart
= iii
; //set this as new best run
229 if (!errCnt
) break; //great read - finish
235 if (bestErrCnt
> maxErr
){
240 //best run is good enough set to best run and set overwrite BinStream
241 lastBit
= bestStart
- *clk
;
243 for (i
= bestStart
; i
< *size
; ++i
) {
244 if ((BinStream
[i
] >= high
) && ((i
-lastBit
) > (*clk
-tol
))){
245 //high found and we are expecting a bar
247 BinStream
[bitnum
++] = *invert
;
248 } else if ((BinStream
[i
] <= low
) && ((i
-lastBit
) > (*clk
-tol
))){
249 //low found and we are expecting a bar
251 BinStream
[bitnum
++] = *invert
^ 1;
252 } else if ((i
-lastBit
)>(*clk
+tol
)){
253 //should have hit a high or low based on clock!!
254 //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);
256 BinStream
[bitnum
++] = 77;
259 lastBit
+= *clk
;//skip over error
261 if (bitnum
>= MaxBits
) break;
268 //encode binary data into binary manchester
269 int ManchesterEncode(uint8_t *BitStream
, size_t size
)
271 size_t modIdx
=20000, i
=0;
272 if (size
>modIdx
) return -1;
273 for (size_t idx
=0; idx
< size
; idx
++){
274 BitStream
[idx
+modIdx
++] = BitStream
[idx
];
275 BitStream
[idx
+modIdx
++] = BitStream
[idx
]^1;
277 for (; i
<(size
*2); i
++){
278 BitStream
[i
] = BitStream
[i
+20000];
284 //take 10 and 01 and manchester decode
285 //run through 2 times and take least errCnt
286 int manrawdecode(uint8_t * BitStream
, size_t *size
)
288 uint16_t bitnum
=0, MaxBits
= 512, errCnt
= 0;
290 uint16_t bestErr
= 1000, bestRun
= 0;
291 if (size
== 0) return -1;
292 for (ii
=0;ii
<2;++ii
){
293 for (i
=ii
; i
<*size
-2; i
+=2)
294 if (BitStream
[i
]==BitStream
[i
+1])
303 for (i
=bestRun
; i
< *size
-2; i
+=2){
304 if(BitStream
[i
] == 1 && (BitStream
[i
+1] == 0)){
305 BitStream
[bitnum
++]=0;
306 } else if((BitStream
[i
] == 0) && BitStream
[i
+1] == 1){
307 BitStream
[bitnum
++]=1;
309 BitStream
[bitnum
++]=77;
311 if(bitnum
>MaxBits
) break;
318 //take 01 or 10 = 1 and 11 or 00 = 0
319 //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010
320 //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding
321 int BiphaseRawDecode(uint8_t *BitStream
, size_t *size
, int offset
, int invert
)
326 uint16_t MaxBits
=512;
327 //if not enough samples - error
328 if (*size
< 51) return -1;
329 //check for phase change faults - skip one sample if faulty
330 uint8_t offsetA
= 1, offsetB
= 1;
332 if (BitStream
[i
+1]==BitStream
[i
+2]) offsetA
=0;
333 if (BitStream
[i
+2]==BitStream
[i
+3]) offsetB
=0;
335 if (!offsetA
&& offsetB
) offset
++;
336 for (i
=offset
; i
<*size
-3; i
+=2){
337 //check for phase error
338 if (BitStream
[i
+1]==BitStream
[i
+2]) {
339 BitStream
[bitnum
++]=77;
342 if((BitStream
[i
]==1 && BitStream
[i
+1]==0) || (BitStream
[i
]==0 && BitStream
[i
+1]==1)){
343 BitStream
[bitnum
++]=1^invert
;
344 } else if((BitStream
[i
]==0 && BitStream
[i
+1]==0) || (BitStream
[i
]==1 && BitStream
[i
+1]==1)){
345 BitStream
[bitnum
++]=invert
;
347 BitStream
[bitnum
++]=77;
350 if(bitnum
>MaxBits
) break;
357 void askAmp(uint8_t *BitStream
, size_t size
)
361 for(size_t i
= 1; i
<size
; i
++){
362 if (BitStream
[i
]-BitStream
[i
-1]>=30) //large jump up
364 else if(BitStream
[i
]-BitStream
[i
-1]<=-20) //large jump down
367 shiftedVal
=BitStream
[i
]+shift
;
371 else if (shiftedVal
<0)
373 BitStream
[i
-1] = shiftedVal
;
379 //takes 3 arguments - clock, invert and maxErr as integers
380 //attempts to demodulate ask only
381 int askrawdemod(uint8_t *BinStream
, size_t *size
, int *clk
, int *invert
, int maxErr
, uint8_t amp
)
383 if (*size
==0) return -1;
384 int start
= DetectASKClock(BinStream
, *size
, clk
, 20); //clock default
385 if (*clk
==0 || start
< 0) return -1;
386 if (*invert
!= 1) *invert
= 0;
387 if (amp
==1) askAmp(BinStream
, *size
);
389 uint8_t initLoopMax
= 255;
390 if (initLoopMax
> *size
) initLoopMax
=*size
;
391 // Detect high and lows
392 //25% clip in case highs and lows aren't clipped [marshmellow]
394 if (getHiLo(BinStream
, initLoopMax
, &high
, &low
, 75, 75) < 1)
395 return -1; //just noise
397 // if clean clipped waves detected run alternate demod
398 if (DetectCleanAskWave(BinStream
, *size
, high
, low
))
399 return cleanAskRawDemod(BinStream
, size
, *clk
, *invert
, high
, low
);
401 int lastBit
= 0; //set first clock check - can go negative
403 size_t errCnt
= 0, bitnum
= 0; //output counter
405 size_t bestStart
= start
, bestErrCnt
= 0; //(*size/1000);
406 size_t MaxBits
= 1024;
408 //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance
409 if (!maxErr
&& initLoopMax
> *clk
*3) initLoopMax
= *clk
* 3;
410 //if best start not already found by detectclock
411 if (start
<= 0 || start
> initLoopMax
){
412 bestErrCnt
= maxErr
+1;
413 //PrintAndLog("DEBUG - lastbit - %d",lastBit);
414 //loop to find first wave that works
415 for (iii
=0; iii
< initLoopMax
- *clk
; ++iii
){
416 if ((BinStream
[iii
] >= high
) || (BinStream
[iii
] <= low
)){
417 lastBit
= iii
- *clk
;
418 //loop through to see if this start location works
419 for (i
= iii
; i
< *size
; ++i
) {
420 if (i
-lastBit
> *clk
&& (BinStream
[i
] >= high
|| BinStream
[i
] <= low
)){
423 } else if (i
-lastBit
> (*clk
/2) && midBit
== 0) {
425 } else if ((i
-lastBit
) > *clk
) {
426 //should have hit a high or low based on clock!!
427 //PrintAndLog("DEBUG - no wave in expected area - location: %d, expected: %d-%d, lastBit: %d - resetting search",i,(lastBit+(clk-((int)(tol)))),(lastBit+(clk+((int)(tol)))),lastBit);
429 lastBit
+= *clk
;//skip over until hit too many errors
433 if ((i
-iii
)>(MaxBits
* *clk
)) break; //got enough bits
435 //we got more than 32 good bits and not all errors
436 if ((((i
-iii
)/ *clk
) > 32) && (errCnt
<=maxErr
)) {
441 break; //great read - finish
443 if (errCnt
<bestErrCnt
){ //set this as new best run
452 if (bestErrCnt
> maxErr
){
457 //best run is good enough - set to best run and overwrite BinStream
458 lastBit
= bestStart
- *clk
- 1;
461 for (i
= bestStart
; i
< *size
; ++i
) {
462 if (i
- lastBit
> *clk
){
463 if (BinStream
[i
] >= high
) {
464 BinStream
[bitnum
++] = *invert
;
465 } else if (BinStream
[i
] <= low
) {
466 BinStream
[bitnum
++] = *invert
^ 1;
469 BinStream
[bitnum
++]=77;
475 } else if (i
-lastBit
> (*clk
/2) && midBit
== 0){
476 if (BinStream
[i
] >= high
) {
477 BinStream
[bitnum
++] = *invert
;
478 } else if (BinStream
[i
] <= low
) {
479 BinStream
[bitnum
++] = *invert
^ 1;
482 BinStream
[bitnum
] = BinStream
[bitnum
-1];
487 if (bitnum
>= MaxBits
) break;
493 // demod gProxIIDemod
494 // error returns as -x
495 // success returns start position in BitStream
496 // BitStream must contain previously askrawdemod and biphasedemoded data
497 int gProxII_Demod(uint8_t BitStream
[], size_t *size
)
500 uint8_t preamble
[] = {1,1,1,1,1,0};
502 uint8_t errChk
= preambleSearch(BitStream
, preamble
, sizeof(preamble
), size
, &startIdx
);
503 if (errChk
== 0) return -3; //preamble not found
504 if (*size
!= 96) return -2; //should have found 96 bits
505 //check first 6 spacer bits to verify format
506 if (!BitStream
[startIdx
+5] && !BitStream
[startIdx
+10] && !BitStream
[startIdx
+15] && !BitStream
[startIdx
+20] && !BitStream
[startIdx
+25] && !BitStream
[startIdx
+30]){
507 //confirmed proper separator bits found
508 //return start position
509 return (int) startIdx
;
514 //translate wave to 11111100000 (1 for each short wave 0 for each long wave)
515 size_t fsk_wave_demod(uint8_t * dest
, size_t size
, uint8_t fchigh
, uint8_t fclow
)
517 size_t last_transition
= 0;
520 if (fchigh
==0) fchigh
=10;
521 if (fclow
==0) fclow
=8;
522 //set the threshold close to 0 (graph) or 128 std to avoid static
523 uint8_t threshold_value
= 123;
525 // sync to first lo-hi transition, and threshold
527 // Need to threshold first sample
529 if(dest
[0] < threshold_value
) dest
[0] = 0;
533 // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)
534 // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere
535 // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
536 for(idx
= 1; idx
< size
; 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
]) { // 0 -> 1 transition
544 if ((idx
-last_transition
)<(fclow
-2)){ //0-5 = garbage noise
545 //do nothing with extra garbage
546 } else if ((idx
-last_transition
) < (fchigh
-1)) { //6-8 = 8 waves
548 } else if ((idx
-last_transition
) > (fchigh
+1) && !numBits
) { //12 + and first bit = garbage
549 //do nothing with beginning garbage
550 } else { //9+ = 10 waves
553 last_transition
= idx
;
556 return numBits
; //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0
559 //translate 11111100000 to 10
560 size_t aggregate_bits(uint8_t *dest
, size_t size
, uint8_t rfLen
,
561 uint8_t invert
, uint8_t fchigh
, uint8_t fclow
)
563 uint8_t lastval
=dest
[0];
567 for( idx
=1; idx
< size
; idx
++) {
569 if (dest
[idx
]==lastval
) continue;
571 //if lastval was 1, we have a 1->0 crossing
572 if (dest
[idx
-1]==1) {
573 if (!numBits
&& n
< rfLen
/fclow
) {
578 n
= (n
* fclow
+ rfLen
/2) / rfLen
;
579 } else {// 0->1 crossing
580 //test first bitsample too small
581 if (!numBits
&& n
< rfLen
/fchigh
) {
586 n
= (n
* fchigh
+ rfLen
/2) / rfLen
;
590 memset(dest
+numBits
, dest
[idx
-1]^invert
, n
);
595 // if valid extra bits at the end were all the same frequency - add them in
596 if (n
> rfLen
/fchigh
) {
597 if (dest
[idx
-2]==1) {
598 n
= (n
* fclow
+ rfLen
/2) / rfLen
;
600 n
= (n
* fchigh
+ rfLen
/2) / rfLen
;
602 memset(dest
+numBits
, dest
[idx
-1]^invert
, n
);
607 //by marshmellow (from holiman's base)
608 // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)
609 int fskdemod(uint8_t *dest
, size_t size
, uint8_t rfLen
, uint8_t invert
, uint8_t fchigh
, uint8_t fclow
)
612 size
= fsk_wave_demod(dest
, size
, fchigh
, fclow
);
613 size
= aggregate_bits(dest
, size
, rfLen
, invert
, fchigh
, fclow
);
617 // loop to get raw HID waveform then FSK demodulate the TAG ID from it
618 int HIDdemodFSK(uint8_t *dest
, size_t *size
, uint32_t *hi2
, uint32_t *hi
, uint32_t *lo
)
620 if (justNoise(dest
, *size
)) return -1;
622 size_t numStart
=0, size2
=*size
, startIdx
=0;
624 *size
= fskdemod(dest
, size2
,50,1,10,8); //fsk2a
625 if (*size
< 96*2) return -2;
626 // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
627 uint8_t preamble
[] = {0,0,0,1,1,1,0,1};
628 // find bitstring in array
629 uint8_t errChk
= preambleSearch(dest
, preamble
, sizeof(preamble
), size
, &startIdx
);
630 if (errChk
== 0) return -3; //preamble not found
632 numStart
= startIdx
+ sizeof(preamble
);
633 // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
634 for (size_t idx
= numStart
; (idx
-numStart
) < *size
- sizeof(preamble
); idx
+=2){
635 if (dest
[idx
] == dest
[idx
+1]){
636 return -4; //not manchester data
638 *hi2
= (*hi2
<<1)|(*hi
>>31);
639 *hi
= (*hi
<<1)|(*lo
>>31);
640 //Then, shift in a 0 or one into low
641 if (dest
[idx
] && !dest
[idx
+1]) // 1 0
646 return (int)startIdx
;
649 // loop to get raw paradox waveform then FSK demodulate the TAG ID from it
650 int ParadoxdemodFSK(uint8_t *dest
, size_t *size
, uint32_t *hi2
, uint32_t *hi
, uint32_t *lo
)
652 if (justNoise(dest
, *size
)) return -1;
654 size_t numStart
=0, size2
=*size
, startIdx
=0;
656 *size
= fskdemod(dest
, size2
,50,1,10,8); //fsk2a
657 if (*size
< 96) return -2;
659 // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
660 uint8_t preamble
[] = {0,0,0,0,1,1,1,1};
662 uint8_t errChk
= preambleSearch(dest
, preamble
, sizeof(preamble
), size
, &startIdx
);
663 if (errChk
== 0) return -3; //preamble not found
665 numStart
= startIdx
+ sizeof(preamble
);
666 // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
667 for (size_t idx
= numStart
; (idx
-numStart
) < *size
- sizeof(preamble
); idx
+=2){
668 if (dest
[idx
] == dest
[idx
+1])
669 return -4; //not manchester data
670 *hi2
= (*hi2
<<1)|(*hi
>>31);
671 *hi
= (*hi
<<1)|(*lo
>>31);
672 //Then, shift in a 0 or one into low
673 if (dest
[idx
] && !dest
[idx
+1]) // 1 0
678 return (int)startIdx
;
681 uint32_t bytebits_to_byte(uint8_t* src
, size_t numbits
)
684 for(int i
= 0 ; i
< numbits
; i
++)
686 num
= (num
<< 1) | (*src
);
692 int IOdemodFSK(uint8_t *dest
, size_t size
)
694 if (justNoise(dest
, size
)) return -1;
695 //make sure buffer has data
696 if (size
< 66*64) return -2;
698 size
= fskdemod(dest
, size
, 64, 1, 10, 8); // FSK2a RF/64
699 if (size
< 65) return -3; //did we get a good demod?
701 //0 10 20 30 40 50 60
703 //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
704 //-----------------------------------------------------------------------------
705 //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
707 //XSF(version)facility:codeone+codetwo
710 uint8_t preamble
[] = {0,0,0,0,0,0,0,0,0,1};
711 uint8_t errChk
= preambleSearch(dest
, preamble
, sizeof(preamble
), &size
, &startIdx
);
712 if (errChk
== 0) return -4; //preamble not found
714 if (!dest
[startIdx
+8] && dest
[startIdx
+17]==1 && dest
[startIdx
+26]==1 && dest
[startIdx
+35]==1 && dest
[startIdx
+44]==1 && dest
[startIdx
+53]==1){
715 //confirmed proper separator bits found
716 //return start position
717 return (int) startIdx
;
723 // takes a array of binary values, start position, length of bits per parity (includes parity bit),
724 // Parity Type (1 for odd 0 for even), and binary Length (length to run)
725 size_t removeParity(uint8_t *BitStream
, size_t startIdx
, uint8_t pLen
, uint8_t pType
, size_t bLen
)
727 uint32_t parityWd
= 0;
728 size_t j
= 0, bitCnt
= 0;
729 for (int word
= 0; word
< (bLen
); word
+=pLen
){
730 for (int bit
=0; bit
< pLen
; bit
++){
731 parityWd
= (parityWd
<< 1) | BitStream
[startIdx
+word
+bit
];
732 BitStream
[j
++] = (BitStream
[startIdx
+word
+bit
]);
735 // if parity fails then return 0
736 if (parityTest(parityWd
, pLen
, pType
) == 0) return -1;
740 // if we got here then all the parities passed
741 //return ID start index and size
746 // FSK Demod then try to locate an AWID ID
747 int AWIDdemodFSK(uint8_t *dest
, size_t *size
)
749 //make sure buffer has enough data
750 if (*size
< 96*50) return -1;
752 if (justNoise(dest
, *size
)) return -2;
755 *size
= fskdemod(dest
, *size
, 50, 1, 10, 8); // fsk2a RF/50
756 if (*size
< 96) return -3; //did we get a good demod?
758 uint8_t preamble
[] = {0,0,0,0,0,0,0,1};
760 uint8_t errChk
= preambleSearch(dest
, preamble
, sizeof(preamble
), size
, &startIdx
);
761 if (errChk
== 0) return -4; //preamble not found
762 if (*size
!= 96) return -5;
763 return (int)startIdx
;
767 // FSK Demod then try to locate an Farpointe Data (pyramid) ID
768 int PyramiddemodFSK(uint8_t *dest
, size_t *size
)
770 //make sure buffer has data
771 if (*size
< 128*50) return -5;
773 //test samples are not just noise
774 if (justNoise(dest
, *size
)) return -1;
777 *size
= fskdemod(dest
, *size
, 50, 1, 10, 8); // fsk2a RF/50
778 if (*size
< 128) return -2; //did we get a good demod?
780 uint8_t preamble
[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
782 uint8_t errChk
= preambleSearch(dest
, preamble
, sizeof(preamble
), size
, &startIdx
);
783 if (errChk
== 0) return -4; //preamble not found
784 if (*size
!= 128) return -3;
785 return (int)startIdx
;
789 uint8_t DetectCleanAskWave(uint8_t dest
[], size_t size
, int high
, int low
)
793 size_t loopEnd
= 572;
794 if (loopEnd
> size
) loopEnd
= size
;
795 for (size_t i
=60; i
<loopEnd
; i
++){
796 if (dest
[i
]>low
&& dest
[i
]<high
)
802 if (cntPeaks
> 300) return 1;
808 // to help detect clocks on heavily clipped samples
809 // based on counts between zero crossings
810 int DetectStrongAskClock(uint8_t dest
[], size_t size
)
812 int clk
[]={0,8,16,32,40,50,64,100,128};
818 for (;idx
< size
; idx
++){
823 if (highCnt
!= 0) highCnt2
= highCnt
;
825 } else if (cnt
> highCnt2
) {
832 } else if (dest
[idx
] <= 128){
836 if (highCnt
!= 0) highCnt2
= highCnt
;
838 } else if (cnt
> highCnt2
) {
848 for (idx
=8; idx
>0; idx
--){
850 if (clk
[idx
] >= highCnt
- tol
&& clk
[idx
] <= highCnt
+ tol
)
852 if (clk
[idx
] >= highCnt2
- tol
&& clk
[idx
] <= highCnt2
+ tol
)
859 // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)
860 // maybe somehow adjust peak trimming value based on samples to fix?
861 // return start index of best starting position for that clock and return clock (by reference)
862 int DetectASKClock(uint8_t dest
[], size_t size
, int *clock
, int maxErr
)
865 uint8_t clk
[]={8,16,32,40,50,64,100,128,255};
866 uint8_t loopCnt
= 255; //don't need to loop through entire array...
867 if (size
==0) return -1;
868 if (size
<= loopCnt
) loopCnt
= size
-1; //not enough samples
869 //if we already have a valid clock quit
872 if (clk
[i
] == *clock
) return 0;
874 //get high and low peak
876 if (getHiLo(dest
, loopCnt
, &peak
, &low
, 75, 75) < 1) return -1;
878 //test for large clean peaks
879 if (DetectCleanAskWave(dest
, size
, peak
, low
)==1){
880 int ans
= DetectStrongAskClock(dest
, size
);
889 uint8_t clkCnt
, tol
= 0;
890 uint16_t bestErr
[]={1000,1000,1000,1000,1000,1000,1000,1000,1000};
891 uint8_t bestStart
[]={0,0,0,0,0,0,0,0,0};
893 size_t arrLoc
, loopEnd
;
894 //test each valid clock from smallest to greatest to see which lines up
895 for(clkCnt
=0; clkCnt
< 8; clkCnt
++){
896 if (clk
[clkCnt
] == 32){
901 if (!maxErr
&& loopCnt
>clk
[clkCnt
]*2) loopCnt
=clk
[clkCnt
]*2;
902 bestErr
[clkCnt
]=1000;
903 //try lining up the peaks by moving starting point (try first 256)
904 for (ii
=0; ii
< loopCnt
-tol
-clk
[clkCnt
]; ii
++){
905 if (dest
[ii
] < peak
&& dest
[ii
] > low
) continue;
908 // now that we have the first one lined up test rest of wave array
909 loopEnd
= ((size
-ii
-tol
) / clk
[clkCnt
]) - 1;
910 for (i
=0; i
< loopEnd
; ++i
){
911 arrLoc
= ii
+ (i
* clk
[clkCnt
]);
912 if (dest
[arrLoc
] >= peak
|| dest
[arrLoc
] <= low
){
913 }else if (dest
[arrLoc
-tol
] >= peak
|| dest
[arrLoc
-tol
] <= low
){
914 }else if (dest
[arrLoc
+tol
] >= peak
|| dest
[arrLoc
+tol
] <= low
){
915 }else{ //error no peak detected
919 //if we found no errors then we can stop here
920 // this is correct one - return this clock
921 //PrintAndLog("DEBUG: clk %d, err %d, ii %d, i %d",clk[clkCnt],errCnt,ii,i);
922 if(errCnt
==0 && clkCnt
<6) {
923 *clock
= clk
[clkCnt
];
926 //if we found errors see if it is lowest so far and save it as best run
927 if(errCnt
<bestErr
[clkCnt
]){
928 bestErr
[clkCnt
]=errCnt
;
929 bestStart
[clkCnt
]=ii
;
935 for (iii
=0; iii
<8; ++iii
){
936 if (bestErr
[iii
] < bestErr
[best
]){
937 if (bestErr
[iii
] == 0) bestErr
[iii
]=1;
938 // current best bit to error ratio vs new bit to error ratio
939 if ( (size
/clk
[best
])/bestErr
[best
] < (size
/clk
[iii
])/bestErr
[iii
] ){
944 if (bestErr
[best
] > maxErr
) return -1;
946 return bestStart
[best
];
950 //detect psk clock by reading each phase shift
951 // a phase shift is determined by measuring the sample length of each wave
952 int DetectPSKClock(uint8_t dest
[], size_t size
, int clock
)
954 uint8_t clk
[]={255,16,32,40,50,64,100,128,255}; //255 is not a valid clock
955 uint16_t loopCnt
= 4096; //don't need to loop through entire array...
956 if (size
== 0) return 0;
957 if (size
<loopCnt
) loopCnt
= size
;
959 //if we already have a valid clock quit
962 if (clk
[i
] == clock
) return clock
;
964 size_t waveStart
=0, waveEnd
=0, firstFullWave
=0, lastClkBit
=0;
965 uint8_t clkCnt
, fc
=0, fullWaveLen
=0, tol
=1;
966 uint16_t peakcnt
=0, errCnt
=0, waveLenCnt
=0;
967 uint16_t bestErr
[]={1000,1000,1000,1000,1000,1000,1000,1000,1000};
968 uint16_t peaksdet
[]={0,0,0,0,0,0,0,0,0};
969 fc
= countFC(dest
, size
, 0);
970 if (fc
!=2 && fc
!=4 && fc
!=8) return -1;
971 //PrintAndLog("DEBUG: FC: %d",fc);
973 //find first full wave
974 for (i
=0; i
<loopCnt
; i
++){
975 if (dest
[i
] < dest
[i
+1] && dest
[i
+1] >= dest
[i
+2]){
976 if (waveStart
== 0) {
978 //PrintAndLog("DEBUG: waveStart: %d",waveStart);
981 //PrintAndLog("DEBUG: waveEnd: %d",waveEnd);
982 waveLenCnt
= waveEnd
-waveStart
;
983 if (waveLenCnt
> fc
){
984 firstFullWave
= waveStart
;
985 fullWaveLen
=waveLenCnt
;
992 //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen);
994 //test each valid clock from greatest to smallest to see which lines up
995 for(clkCnt
=7; clkCnt
>= 1 ; clkCnt
--){
996 lastClkBit
= firstFullWave
; //set end of wave as clock align
1000 //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d",clk[clkCnt],lastClkBit);
1002 for (i
= firstFullWave
+fullWaveLen
-1; i
< loopCnt
-2; i
++){
1003 //top edge of wave = start of new wave
1004 if (dest
[i
] < dest
[i
+1] && dest
[i
+1] >= dest
[i
+2]){
1005 if (waveStart
== 0) {
1010 waveLenCnt
= waveEnd
-waveStart
;
1011 if (waveLenCnt
> fc
){
1012 //if this wave is a phase shift
1013 //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, ii: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+clk[clkCnt]-tol,ii+1,fc);
1014 if (i
+1 >= lastClkBit
+ clk
[clkCnt
] - tol
){ //should be a clock bit
1016 lastClkBit
+=clk
[clkCnt
];
1017 } else if (i
<lastClkBit
+8){
1018 //noise after a phase shift - ignore
1019 } else { //phase shift before supposed to based on clock
1022 } else if (i
+1 > lastClkBit
+ clk
[clkCnt
] + tol
+ fc
){
1023 lastClkBit
+=clk
[clkCnt
]; //no phase shift but clock bit
1032 if (errCnt
<= bestErr
[clkCnt
]) bestErr
[clkCnt
]=errCnt
;
1033 if (peakcnt
> peaksdet
[clkCnt
]) peaksdet
[clkCnt
]=peakcnt
;
1035 //all tested with errors
1036 //return the highest clk with the most peaks found
1038 for (i
=7; i
>=1; i
--){
1039 if (peaksdet
[i
] > peaksdet
[best
]) {
1042 //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best]);
1048 //detect nrz clock by reading #peaks vs no peaks(or errors)
1049 int DetectNRZClock(uint8_t dest
[], size_t size
, int clock
)
1052 uint8_t clk
[]={8,16,32,40,50,64,100,128,255};
1053 size_t loopCnt
= 4096; //don't need to loop through entire array...
1054 if (size
== 0) return 0;
1055 if (size
<loopCnt
) loopCnt
= size
;
1057 //if we already have a valid clock quit
1059 if (clk
[i
] == clock
) return clock
;
1061 //get high and low peak
1063 if (getHiLo(dest
, loopCnt
, &peak
, &low
, 75, 75) < 1) return 0;
1065 //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);
1070 uint16_t peaksdet
[]={0,0,0,0,0,0,0,0};
1072 //test for large clipped waves
1073 for (i
=0; i
<loopCnt
; i
++){
1074 if (dest
[i
] >= peak
|| dest
[i
] <= low
){
1077 if (peakcnt
>0 && maxPeak
< peakcnt
){
1084 //test each valid clock from smallest to greatest to see which lines up
1085 for(clkCnt
=0; clkCnt
< 8; ++clkCnt
){
1086 //ignore clocks smaller than largest peak
1087 if (clk
[clkCnt
]<maxPeak
) continue;
1089 //try lining up the peaks by moving starting point (try first 256)
1090 for (ii
=0; ii
< loopCnt
; ++ii
){
1091 if ((dest
[ii
] >= peak
) || (dest
[ii
] <= low
)){
1093 // now that we have the first one lined up test rest of wave array
1094 for (i
=0; i
< ((int)((size
-ii
-tol
)/clk
[clkCnt
])-1); ++i
){
1095 if (dest
[ii
+(i
*clk
[clkCnt
])]>=peak
|| dest
[ii
+(i
*clk
[clkCnt
])]<=low
){
1099 if(peakcnt
>peaksdet
[clkCnt
]) {
1100 peaksdet
[clkCnt
]=peakcnt
;
1107 for (iii
=7; iii
> 0; iii
--){
1108 if (peaksdet
[iii
] > peaksdet
[best
]){
1111 //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best]);
1117 // convert psk1 demod to psk2 demod
1118 // only transition waves are 1s
1119 void psk1TOpsk2(uint8_t *BitStream
, size_t size
)
1122 uint8_t lastBit
=BitStream
[0];
1123 for (; i
<size
; i
++){
1124 if (BitStream
[i
]==77){
1126 } else if (lastBit
!=BitStream
[i
]){
1127 lastBit
=BitStream
[i
];
1137 // convert psk2 demod to psk1 demod
1138 // from only transition waves are 1s to phase shifts change bit
1139 void psk2TOpsk1(uint8_t *BitStream
, size_t size
)
1142 for (size_t i
=0; i
<size
; i
++){
1143 if (BitStream
[i
]==1){
1151 // redesigned by marshmellow adjusted from existing decode functions
1152 // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more
1153 int indala26decode(uint8_t *bitStream
, size_t *size
, uint8_t *invert
)
1155 //26 bit 40134 format (don't know other formats)
1157 int long_wait
=29;//29 leading zeros in format
1163 // Finding the start of a UID
1164 for (start
= 0; start
<= *size
- 250; start
++) {
1165 first
= bitStream
[start
];
1166 for (i
= start
; i
< start
+ long_wait
; i
++) {
1167 if (bitStream
[i
] != first
) {
1171 if (i
== (start
+ long_wait
)) {
1175 if (start
== *size
- 250 + 1) {
1176 // did not find start sequence
1179 // Inverting signal if needed
1181 for (i
= start
; i
< *size
; i
++) {
1182 bitStream
[i
] = !bitStream
[i
];
1188 //found start once now test length by finding next one
1189 for (ii
=start
+29; ii
<= *size
- 250; ii
++) {
1190 first2
= bitStream
[ii
];
1191 for (iii
= ii
; iii
< ii
+ long_wait
; iii
++) {
1192 if (bitStream
[iii
] != first2
) {
1196 if (iii
== (ii
+ long_wait
)) {
1200 if (ii
== *size
- 250 + 1){
1201 // did not find second start sequence
1208 for (ii
= 0; ii
< bitCnt
; ii
++) {
1209 bitStream
[ii
] = bitStream
[i
++];
1215 // by marshmellow - demodulate NRZ wave (both similar enough)
1216 // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak
1217 // there probably is a much simpler way to do this....
1218 int nrzRawDemod(uint8_t *dest
, size_t *size
, int *clk
, int *invert
, int maxErr
)
1220 if (justNoise(dest
, *size
)) return -1;
1221 *clk
= DetectNRZClock(dest
, *size
, *clk
);
1222 if (*clk
==0) return -2;
1223 size_t i
, gLen
= 4096;
1224 if (gLen
>*size
) gLen
= *size
;
1226 if (getHiLo(dest
, gLen
, &high
, &low
, 75, 75) < 1) return -3; //25% fuzz on high 25% fuzz on low
1227 int lastBit
= 0; //set first clock check
1228 size_t iii
= 0, bitnum
= 0; //bitnum counter
1229 uint16_t errCnt
= 0, MaxBits
= 1000;
1230 size_t bestErrCnt
= maxErr
+1;
1231 size_t bestPeakCnt
= 0, bestPeakStart
= 0;
1232 uint8_t bestFirstPeakHigh
=0, firstPeakHigh
=0, curBit
=0, bitHigh
=0, errBitHigh
=0;
1233 uint8_t tol
= 1; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
1235 uint8_t ignoreWindow
=4;
1236 uint8_t ignoreCnt
=ignoreWindow
; //in case of noise near peak
1237 //loop to find first wave that works - align to clock
1238 for (iii
=0; iii
< gLen
; ++iii
){
1239 if ((dest
[iii
]>=high
) || (dest
[iii
]<=low
)){
1240 if (dest
[iii
]>=high
) firstPeakHigh
=1;
1241 else firstPeakHigh
=0;
1245 //loop through to see if this start location works
1246 for (i
= iii
; i
< *size
; ++i
) {
1247 // if we are at a clock bit
1248 if ((i
>= lastBit
+ *clk
- tol
) && (i
<= lastBit
+ *clk
+ tol
)) {
1250 if (dest
[i
] >= high
|| dest
[i
] <= low
) {
1254 ignoreCnt
= ignoreWindow
;
1256 } else if (i
== lastBit
+ *clk
+ tol
) {
1259 //else if no bars found
1260 } else if (dest
[i
] < high
&& dest
[i
] > low
){
1263 if (errBitHigh
==1) errCnt
++;
1268 } else if ((dest
[i
]>=high
|| dest
[i
]<=low
) && (bitHigh
==0)) {
1269 //error bar found no clock...
1272 if (((i
-iii
) / *clk
)>=MaxBits
) break;
1274 //we got more than 64 good bits and not all errors
1275 if (((i
-iii
) / *clk
) > 64 && (errCnt
<= (maxErr
))) {
1276 //possible good read
1277 if (!errCnt
|| peakCnt
> bestPeakCnt
){
1278 bestFirstPeakHigh
=firstPeakHigh
;
1279 bestErrCnt
= errCnt
;
1280 bestPeakCnt
= peakCnt
;
1281 bestPeakStart
= iii
;
1282 if (!errCnt
) break; //great read - finish
1287 //PrintAndLog("DEBUG: bestErrCnt: %d, maxErr: %d, bestStart: %d, bestPeakCnt: %d, bestPeakStart: %d",bestErrCnt,maxErr,bestStart,bestPeakCnt,bestPeakStart);
1288 if (bestErrCnt
> maxErr
) return bestErrCnt
;
1290 //best run is good enough set to best run and set overwrite BinStream
1291 lastBit
= bestPeakStart
- *clk
;
1292 memset(dest
, bestFirstPeakHigh
^1, bestPeakStart
/ *clk
);
1293 bitnum
+= (bestPeakStart
/ *clk
);
1294 for (i
= bestPeakStart
; i
< *size
; ++i
) {
1295 // if expecting a clock bit
1296 if ((i
>= lastBit
+ *clk
- tol
) && (i
<= lastBit
+ *clk
+ tol
)) {
1298 if (dest
[i
] >= high
|| dest
[i
] <= low
) {
1302 ignoreCnt
= ignoreWindow
;
1304 if (dest
[i
] >= high
) curBit
^= 1;
1305 dest
[bitnum
++] = curBit
;
1307 //else no bars found in clock area
1308 } else if (i
== lastBit
+ *clk
+ tol
) {
1309 dest
[bitnum
++] = curBit
;
1312 //else if no bars found
1313 } else if (dest
[i
] < high
&& dest
[i
] > low
){
1314 if (ignoreCnt
== 0){
1316 if (errBitHigh
== 1){
1317 dest
[bitnum
++] = 77;
1324 } else if ((dest
[i
] >= high
|| dest
[i
] <= low
) && (bitHigh
== 0)) {
1325 //error bar found no clock...
1328 if (bitnum
>= MaxBits
) break;
1335 //detects the bit clock for FSK given the high and low Field Clocks
1336 uint8_t detectFSKClk(uint8_t *BitStream
, size_t size
, uint8_t fcHigh
, uint8_t fcLow
)
1338 uint8_t clk
[] = {8,16,32,40,50,64,100,128,0};
1339 uint16_t rfLens
[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1340 uint8_t rfCnts
[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1341 uint8_t rfLensFnd
= 0;
1342 uint8_t lastFCcnt
= 0;
1343 uint16_t fcCounter
= 0;
1344 uint16_t rfCounter
= 0;
1345 uint8_t firstBitFnd
= 0;
1347 if (size
== 0) return 0;
1349 uint8_t fcTol
= (uint8_t)(0.5+(float)(fcHigh
-fcLow
)/2);
1354 //PrintAndLog("DEBUG: fcTol: %d",fcTol);
1355 // prime i to first up transition
1356 for (i
= 1; i
< size
-1; i
++)
1357 if (BitStream
[i
] > BitStream
[i
-1] && BitStream
[i
]>=BitStream
[i
+1])
1360 for (; i
< size
-1; i
++){
1364 if (BitStream
[i
] <= BitStream
[i
-1] || BitStream
[i
] < BitStream
[i
+1])
1367 // if we got less than the small fc + tolerance then set it to the small fc
1368 if (fcCounter
< fcLow
+fcTol
)
1370 else //set it to the large fc
1373 //look for bit clock (rf/xx)
1374 if ((fcCounter
< lastFCcnt
|| fcCounter
> lastFCcnt
)){
1375 //not the same size as the last wave - start of new bit sequence
1376 if (firstBitFnd
> 1){ //skip first wave change - probably not a complete bit
1377 for (int ii
=0; ii
<15; ii
++){
1378 if (rfLens
[ii
] == rfCounter
){
1384 if (rfCounter
> 0 && rfLensFnd
< 15){
1385 //PrintAndLog("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter);
1386 rfCnts
[rfLensFnd
]++;
1387 rfLens
[rfLensFnd
++] = rfCounter
;
1393 lastFCcnt
=fcCounter
;
1397 uint8_t rfHighest
=15, rfHighest2
=15, rfHighest3
=15;
1399 for (i
=0; i
<15; i
++){
1400 //PrintAndLog("DEBUG: RF %d, cnts %d",rfLens[i], rfCnts[i]);
1401 //get highest 2 RF values (might need to get more values to compare or compare all?)
1402 if (rfCnts
[i
]>rfCnts
[rfHighest
]){
1403 rfHighest3
=rfHighest2
;
1404 rfHighest2
=rfHighest
;
1406 } else if(rfCnts
[i
]>rfCnts
[rfHighest2
]){
1407 rfHighest3
=rfHighest2
;
1409 } else if(rfCnts
[i
]>rfCnts
[rfHighest3
]){
1413 // set allowed clock remainder tolerance to be 1 large field clock length+1
1414 // we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off
1415 uint8_t tol1
= fcHigh
+1;
1417 //PrintAndLog("DEBUG: hightest: 1 %d, 2 %d, 3 %d",rfLens[rfHighest],rfLens[rfHighest2],rfLens[rfHighest3]);
1419 // loop to find the highest clock that has a remainder less than the tolerance
1420 // compare samples counted divided by
1422 for (; ii
>=0; ii
--){
1423 if (rfLens
[rfHighest
] % clk
[ii
] < tol1
|| rfLens
[rfHighest
] % clk
[ii
] > clk
[ii
]-tol1
){
1424 if (rfLens
[rfHighest2
] % clk
[ii
] < tol1
|| rfLens
[rfHighest2
] % clk
[ii
] > clk
[ii
]-tol1
){
1425 if (rfLens
[rfHighest3
] % clk
[ii
] < tol1
|| rfLens
[rfHighest3
] % clk
[ii
] > clk
[ii
]-tol1
){
1432 if (ii
<0) return 0; // oops we went too far
1438 //countFC is to detect the field clock lengths.
1439 //counts and returns the 2 most common wave lengths
1440 //mainly used for FSK field clock detection
1441 uint16_t countFC(uint8_t *BitStream
, size_t size
, uint8_t fskAdj
)
1443 uint8_t fcLens
[] = {0,0,0,0,0,0,0,0,0,0};
1444 uint16_t fcCnts
[] = {0,0,0,0,0,0,0,0,0,0};
1445 uint8_t fcLensFnd
= 0;
1446 uint8_t lastFCcnt
=0;
1447 uint8_t fcCounter
= 0;
1449 if (size
== 0) return 0;
1451 // prime i to first up transition
1452 for (i
= 1; i
< size
-1; i
++)
1453 if (BitStream
[i
] > BitStream
[i
-1] && BitStream
[i
] >= BitStream
[i
+1])
1456 for (; i
< size
-1; i
++){
1457 if (BitStream
[i
] > BitStream
[i
-1] && BitStream
[i
] >= BitStream
[i
+1]){
1458 // new up transition
1461 //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8)
1462 if (lastFCcnt
==5 && fcCounter
==9) fcCounter
--;
1463 //if fc=9 or 4 add one (for when we get a fc 9 instead of 10 or a 4 instead of a 5)
1464 if ((fcCounter
==9) || fcCounter
==4) fcCounter
++;
1465 // save last field clock count (fc/xx)
1466 lastFCcnt
= fcCounter
;
1468 // find which fcLens to save it to:
1469 for (int ii
=0; ii
<10; ii
++){
1470 if (fcLens
[ii
]==fcCounter
){
1476 if (fcCounter
>0 && fcLensFnd
<10){
1478 fcCnts
[fcLensFnd
]++;
1479 fcLens
[fcLensFnd
++]=fcCounter
;
1488 uint8_t best1
=9, best2
=9, best3
=9;
1490 // go through fclens and find which ones are bigest 2
1491 for (i
=0; i
<10; i
++){
1492 // PrintAndLog("DEBUG: FC %d, Cnt %d, Errs %d",fcLens[i],fcCnts[i],errCnt);
1493 // get the 3 best FC values
1494 if (fcCnts
[i
]>maxCnt1
) {
1499 } else if(fcCnts
[i
]>fcCnts
[best2
]){
1502 } else if(fcCnts
[i
]>fcCnts
[best3
]){
1506 uint8_t fcH
=0, fcL
=0;
1507 if (fcLens
[best1
]>fcLens
[best2
]){
1515 // TODO: take top 3 answers and compare to known Field clocks to get top 2
1517 uint16_t fcs
= (((uint16_t)fcH
)<<8) | fcL
;
1518 // PrintAndLog("DEBUG: Best %d best2 %d best3 %d",fcLens[best1],fcLens[best2],fcLens[best3]);
1519 if (fskAdj
) return fcs
;
1520 return fcLens
[best1
];
1523 //by marshmellow - demodulate PSK1 wave
1524 //uses wave lengths (# Samples)
1525 int pskRawDemod(uint8_t dest
[], size_t *size
, int *clock
, int *invert
)
1527 if (size
== 0) return -1;
1528 uint16_t loopCnt
= 4096; //don't need to loop through entire array...
1529 if (*size
<loopCnt
) loopCnt
= *size
;
1531 uint8_t curPhase
= *invert
;
1532 size_t i
, waveStart
=1, waveEnd
=0, firstFullWave
=0, lastClkBit
=0;
1533 uint8_t fc
=0, fullWaveLen
=0, tol
=1;
1534 uint16_t errCnt
=0, waveLenCnt
=0;
1535 fc
= countFC(dest
, *size
, 0);
1536 if (fc
!=2 && fc
!=4 && fc
!=8) return -1;
1537 //PrintAndLog("DEBUG: FC: %d",fc);
1538 *clock
= DetectPSKClock(dest
, *size
, *clock
);
1539 if (*clock
== 0) return -1;
1540 int avgWaveVal
=0, lastAvgWaveVal
=0;
1541 //find first phase shift
1542 for (i
=0; i
<loopCnt
; i
++){
1543 if (dest
[i
]+fc
< dest
[i
+1] && dest
[i
+1] >= dest
[i
+2]){
1545 //PrintAndLog("DEBUG: waveEnd: %d",waveEnd);
1546 waveLenCnt
= waveEnd
-waveStart
;
1547 if (waveLenCnt
> fc
&& waveStart
> fc
){ //not first peak and is a large wave
1548 lastAvgWaveVal
= avgWaveVal
/(waveLenCnt
);
1549 firstFullWave
= waveStart
;
1550 fullWaveLen
=waveLenCnt
;
1551 //if average wave value is > graph 0 then it is an up wave or a 1
1552 if (lastAvgWaveVal
> 123) curPhase
^= 1; //fudge graph 0 a little 123 vs 128
1558 avgWaveVal
+= dest
[i
+2];
1560 //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen);
1561 lastClkBit
= firstFullWave
; //set start of wave as clock align
1562 //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
1566 memset(dest
, curPhase
^1, firstFullWave
/ *clock
);
1567 numBits
+= (firstFullWave
/ *clock
);
1568 dest
[numBits
++] = curPhase
; //set first read bit
1569 for (i
= firstFullWave
+ fullWaveLen
- 1; i
< *size
-3; i
++){
1570 //top edge of wave = start of new wave
1571 if (dest
[i
]+fc
< dest
[i
+1] && dest
[i
+1] >= dest
[i
+2]){
1572 if (waveStart
== 0) {
1575 avgWaveVal
= dest
[i
+1];
1578 waveLenCnt
= waveEnd
-waveStart
;
1579 lastAvgWaveVal
= avgWaveVal
/waveLenCnt
;
1580 if (waveLenCnt
> fc
){
1581 //PrintAndLog("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal);
1582 //this wave is a phase shift
1583 //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc);
1584 if (i
+1 >= lastClkBit
+ *clock
- tol
){ //should be a clock bit
1586 dest
[numBits
++] = curPhase
;
1587 lastClkBit
+= *clock
;
1588 } else if (i
< lastClkBit
+10+fc
){
1589 //noise after a phase shift - ignore
1590 } else { //phase shift before supposed to based on clock
1592 dest
[numBits
++] = 77;
1594 } else if (i
+1 > lastClkBit
+ *clock
+ tol
+ fc
){
1595 lastClkBit
+= *clock
; //no phase shift but clock bit
1596 dest
[numBits
++] = curPhase
;
1602 avgWaveVal
+= dest
[i
+1];