]> git.zerfleddert.de Git - proxmark3-svn/blob - common/lfdemod.c
Reclaim more than 19K of ARM flash memory.
[proxmark3-svn] / common / lfdemod.c
1 //-----------------------------------------------------------------------------
2 // Copyright (C) 2014
3 //
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
6 // the license.
7 //-----------------------------------------------------------------------------
8 // Low frequency demod/decode commands
9 //-----------------------------------------------------------------------------
10
11 #include <stdlib.h>
12 #include <string.h>
13 #include "lfdemod.h"
14
15
16 uint8_t justNoise(uint8_t *BitStream, size_t size)
17 {
18 static const uint8_t THRESHOLD = 123;
19 //test samples are not just noise
20 uint8_t justNoise1 = 1;
21 for(size_t idx=0; idx < size && justNoise1 ;idx++){
22 justNoise1 = BitStream[idx] < THRESHOLD;
23 }
24 return justNoise1;
25 }
26
27 //by marshmellow
28 //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
29 int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo)
30 {
31 *high=0;
32 *low=255;
33 // get high and low thresholds
34 for (int i=0; i < size; i++){
35 if (BitStream[i] > *high) *high = BitStream[i];
36 if (BitStream[i] < *low) *low = BitStream[i];
37 }
38 if (*high < 123) return -1; // just noise
39 *high = ((*high-128)*fuzzHi + 12800)/100;
40 *low = ((*low-128)*fuzzLo + 12800)/100;
41 return 1;
42 }
43
44 // by marshmellow
45 // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType
46 // returns 1 if passed
47 uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType)
48 {
49 uint8_t ans = 0;
50 for (uint8_t i = 0; i < bitLen; i++){
51 ans ^= ((bits >> i) & 1);
52 }
53 //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType);
54 return (ans == pType);
55 }
56
57 //by marshmellow
58 //search for given preamble in given BitStream and return success=1 or fail=0 and startIndex and length
59 uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx)
60 {
61 uint8_t foundCnt=0;
62 for (int idx=0; idx < *size - pLen; idx++){
63 if (memcmp(BitStream+idx, preamble, pLen) == 0){
64 //first index found
65 foundCnt++;
66 if (foundCnt == 1){
67 *startIdx = idx;
68 }
69 if (foundCnt == 2){
70 *size = idx - *startIdx;
71 return 1;
72 }
73 }
74 }
75 return 0;
76 }
77
78 //by marshmellow
79 //takes 1s and 0s and searches for EM410x format - output EM ID
80 uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo)
81 {
82 //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future
83 // otherwise could be a void with no arguments
84 //set defaults
85 uint32_t i = 0;
86 if (BitStream[1]>1){ //allow only 1s and 0s
87 // PrintAndLog("no data found");
88 return 0;
89 }
90 // 111111111 bit pattern represent start of frame
91 // include 0 in front to help get start pos
92 uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
93 uint32_t idx = 0;
94 uint32_t parityBits = 0;
95 uint8_t errChk = 0;
96 uint8_t FmtLen = 10;
97 *startIdx = 0;
98 errChk = preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx);
99 if (errChk == 0 || *size < 64) return 0;
100 if (*size > 64) FmtLen = 22;
101 *startIdx += 1; //get rid of 0 from preamble
102 idx = *startIdx + 9;
103 for (i=0; i<FmtLen; i++){ //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)
104 parityBits = bytebits_to_byte(BitStream+(i*5)+idx,5);
105 //check even parity
106 if (parityTest(parityBits, 5, 0) == 0){
107 //parity failed quit
108 return 0;
109 }
110 //set uint64 with ID from BitStream
111 for (uint8_t ii=0; ii<4; ii++){
112 *hi = (*hi << 1) | (*lo >> 63);
113 *lo = (*lo << 1) | (BitStream[(i*5)+ii+idx]);
114 }
115 }
116 if (errChk != 0) return 1;
117 //skip last 5 bit parity test for simplicity.
118 // *size = 64 | 128;
119 return 0;
120 }
121
122 //by marshmellow
123 //takes 3 arguments - clock, invert, maxErr as integers
124 //attempts to demodulate ask while decoding manchester
125 //prints binary found and saves in graphbuffer for further commands
126 int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr)
127 {
128 int i;
129 //int clk2=*clk;
130 int start = DetectASKClock(BinStream, *size, clk, 20); //clock default
131 if (*clk==0) return -3;
132 if (start < 0) return -3;
133 // if autodetected too low then adjust //MAY NEED ADJUSTMENT
134 //if (clk2==0 && *clk<8) *clk =64;
135 //if (clk2==0 && *clk<32) *clk=32;
136 if (*invert != 0 && *invert != 1) *invert=0;
137 uint32_t initLoopMax = 200;
138 if (initLoopMax > *size) initLoopMax=*size;
139 // Detect high and lows
140 // 25% fuzz in case highs and lows aren't clipped [marshmellow]
141 int high, low, ans;
142 ans = getHiLo(BinStream, initLoopMax, &high, &low, 75, 75);
143 if (ans<1) return -2; //just noise
144
145 // PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);
146 int lastBit = 0; //set first clock check
147 uint32_t bitnum = 0; //output counter
148 int tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
149 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
150 int iii = 0;
151 uint32_t gLen = *size;
152 if (gLen > 3000) gLen=3000;
153 //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance
154 if (!maxErr) gLen=*clk*2;
155 uint8_t errCnt =0;
156 uint16_t MaxBits = 500;
157 uint32_t bestStart = *size;
158 int bestErrCnt = maxErr+1;
159 // PrintAndLog("DEBUG - lastbit - %d",lastBit);
160 // loop to find first wave that works
161 for (iii=0; iii < gLen; ++iii){
162 if ((BinStream[iii] >= high) || (BinStream[iii] <= low)){
163 lastBit=iii-*clk;
164 errCnt=0;
165 // loop through to see if this start location works
166 for (i = iii; i < *size; ++i) {
167 if ((BinStream[i] >= high) && ((i-lastBit) > (*clk-tol))){
168 lastBit+=*clk;
169 } else if ((BinStream[i] <= low) && ((i-lastBit) > (*clk-tol))){
170 //low found and we are expecting a bar
171 lastBit+=*clk;
172 } else {
173 //mid value found or no bar supposed to be here
174 if ((i-lastBit)>(*clk+tol)){
175 //should have hit a high or low based on clock!!
176
177 //debug
178 //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);
179
180 errCnt++;
181 lastBit+=*clk;//skip over until hit too many errors
182 if (errCnt>(maxErr)) break; //allow 1 error for every 1000 samples else start over
183 }
184 }
185 if ((i-iii) >(MaxBits * *clk)) break; //got plenty of bits
186 }
187 //we got more than 64 good bits and not all errors
188 if ((((i-iii)/ *clk) > (64)) && (errCnt<=maxErr)) {
189 //possible good read
190 if (errCnt==0){
191 bestStart=iii;
192 bestErrCnt=errCnt;
193 break; //great read - finish
194 }
195 if (errCnt<bestErrCnt){ //set this as new best run
196 bestErrCnt=errCnt;
197 bestStart = iii;
198 }
199 }
200 }
201 }
202 if (bestErrCnt<=maxErr){
203 //best run is good enough set to best run and set overwrite BinStream
204 iii=bestStart;
205 lastBit = bestStart - *clk;
206 bitnum=0;
207 for (i = iii; i < *size; ++i) {
208 if ((BinStream[i] >= high) && ((i-lastBit) > (*clk-tol))){
209 lastBit += *clk;
210 BinStream[bitnum] = *invert;
211 bitnum++;
212 } else if ((BinStream[i] <= low) && ((i-lastBit) > (*clk-tol))){
213 //low found and we are expecting a bar
214 lastBit+=*clk;
215 BinStream[bitnum] = 1-*invert;
216 bitnum++;
217 } else {
218 //mid value found or no bar supposed to be here
219 if ((i-lastBit)>(*clk+tol)){
220 //should have hit a high or low based on clock!!
221
222 //debug
223 //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);
224 if (bitnum > 0){
225 BinStream[bitnum]=77;
226 bitnum++;
227 }
228
229 lastBit+=*clk;//skip over error
230 }
231 }
232 if (bitnum >=MaxBits) break;
233 }
234 *size=bitnum;
235 } else{
236 *invert=bestStart;
237 *clk=iii;
238 return -1;
239 }
240 return bestErrCnt;
241 }
242
243 //by marshmellow
244 //encode binary data into binary manchester
245 int ManchesterEncode(uint8_t *BitStream, size_t size)
246 {
247 size_t modIdx=20000, i=0;
248 if (size>modIdx) return -1;
249 for (size_t idx=0; idx < size; idx++){
250 BitStream[idx+modIdx++] = BitStream[idx];
251 BitStream[idx+modIdx++] = BitStream[idx]^1;
252 }
253 for (; i<(size*2); i++){
254 BitStream[i] = BitStream[i+20000];
255 }
256 return i;
257 }
258
259 //by marshmellow
260 //take 10 and 01 and manchester decode
261 //run through 2 times and take least errCnt
262 int manrawdecode(uint8_t * BitStream, size_t *size)
263 {
264 uint16_t bitnum=0, MaxBits = 512, errCnt = 0;
265 size_t i, ii;
266 uint16_t bestErr = 1000, bestRun = 0;
267 if (size == 0) return -1;
268 for (ii=0;ii<2;++ii){
269 i=0;
270 for (i=i+ii;i<*size-2;i+=2){
271 if(BitStream[i]==1 && (BitStream[i+1]==0)){
272 } else if((BitStream[i]==0)&& BitStream[i+1]==1){
273 } else {
274 errCnt++;
275 }
276 if(bitnum>MaxBits) break;
277 }
278 if (bestErr>errCnt){
279 bestErr=errCnt;
280 bestRun=ii;
281 }
282 errCnt=0;
283 }
284 errCnt=bestErr;
285 if (errCnt<20){
286 ii=bestRun;
287 i=0;
288 for (i=i+ii; i < *size-2; i+=2){
289 if(BitStream[i] == 1 && (BitStream[i+1] == 0)){
290 BitStream[bitnum++]=0;
291 } else if((BitStream[i] == 0) && BitStream[i+1] == 1){
292 BitStream[bitnum++]=1;
293 } else {
294 BitStream[bitnum++]=77;
295 //errCnt++;
296 }
297 if(bitnum>MaxBits) break;
298 }
299 *size=bitnum;
300 }
301 return errCnt;
302 }
303
304 //by marshmellow
305 //take 01 or 10 = 1 and 11 or 00 = 0
306 //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010
307 //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding
308 int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert)
309 {
310 uint16_t bitnum=0;
311 uint32_t errCnt =0;
312 size_t i=offset;
313 uint16_t MaxBits=512;
314 //if not enough samples - error
315 if (*size < 51) return -1;
316 //check for phase change faults - skip one sample if faulty
317 uint8_t offsetA = 1, offsetB = 1;
318 for (; i<48; i+=2){
319 if (BitStream[i+1]==BitStream[i+2]) offsetA=0;
320 if (BitStream[i+2]==BitStream[i+3]) offsetB=0;
321 }
322 if (!offsetA && offsetB) offset++;
323 for (i=offset; i<*size-3; i+=2){
324 //check for phase error
325 if (BitStream[i+1]==BitStream[i+2]) {
326 BitStream[bitnum++]=77;
327 errCnt++;
328 }
329 if((BitStream[i]==1 && BitStream[i+1]==0) || (BitStream[i]==0 && BitStream[i+1]==1)){
330 BitStream[bitnum++]=1^invert;
331 } else if((BitStream[i]==0 && BitStream[i+1]==0) || (BitStream[i]==1 && BitStream[i+1]==1)){
332 BitStream[bitnum++]=invert;
333 } else {
334 BitStream[bitnum++]=77;
335 errCnt++;
336 }
337 if(bitnum>MaxBits) break;
338 }
339 *size=bitnum;
340 return errCnt;
341 }
342
343 //by marshmellow
344 void askAmp(uint8_t *BitStream, size_t size)
345 {
346 int shift = 127;
347 int shiftedVal=0;
348 for(int i = 1; i<size; i++){
349 if (BitStream[i]-BitStream[i-1]>=30) //large jump up
350 shift=127;
351 else if(BitStream[i]-BitStream[i-1]<=-20) //large jump down
352 shift=-127;
353
354 shiftedVal=BitStream[i]+shift;
355
356 if (shiftedVal>255)
357 shiftedVal=255;
358 else if (shiftedVal<0)
359 shiftedVal=0;
360 BitStream[i-1] = shiftedVal;
361 }
362 return;
363 }
364
365 int cleanAskRawDemod(uint8_t *BinStream, size_t *size, int clk, int invert, int high, int low)
366 {
367 size_t bitCnt=0, smplCnt=0, errCnt=0;
368 uint8_t waveHigh = 0;
369 //PrintAndLog("clk: %d", clk);
370 for (size_t i=0; i < *size; i++){
371 if (BinStream[i] >= high && waveHigh){
372 smplCnt++;
373 } else if (BinStream[i] <= low && !waveHigh){
374 smplCnt++;
375 } else { //transition
376 if ((BinStream[i] >= high && !waveHigh) || (BinStream[i] <= low && waveHigh)){
377 if (smplCnt > clk-(clk/4)-1) { //full clock
378 if (smplCnt > clk + (clk/4)+1) { //too many samples
379 errCnt++;
380 BinStream[bitCnt++]=77;
381 } else if (waveHigh) {
382 BinStream[bitCnt++] = invert;
383 BinStream[bitCnt++] = invert;
384 } else if (!waveHigh) {
385 BinStream[bitCnt++] = invert ^ 1;
386 BinStream[bitCnt++] = invert ^ 1;
387 }
388 waveHigh ^= 1;
389 smplCnt = 0;
390 } else if (smplCnt > (clk/2) - (clk/4)-1) {
391 if (waveHigh) {
392 BinStream[bitCnt++] = invert;
393 } else if (!waveHigh) {
394 BinStream[bitCnt++] = invert ^ 1;
395 }
396 waveHigh ^= 1;
397 smplCnt = 0;
398 } else if (!bitCnt) {
399 //first bit
400 waveHigh = (BinStream[i] >= high);
401 smplCnt = 1;
402 } else {
403 smplCnt++;
404 //transition bit oops
405 }
406 } else { //haven't hit new high or new low yet
407 smplCnt++;
408 }
409 }
410 }
411 *size = bitCnt;
412 return errCnt;
413 }
414
415 //by marshmellow
416 //takes 3 arguments - clock, invert and maxErr as integers
417 //attempts to demodulate ask only
418 int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp)
419 {
420 uint32_t i;
421 if (*size==0) return -1;
422 int start = DetectASKClock(BinStream, *size, clk, 20); //clock default
423 if (*clk==0) return -1;
424 if (start<0) return -1;
425 if (*invert != 0 && *invert != 1) *invert =0;
426 if (amp==1) askAmp(BinStream, *size);
427
428 uint32_t initLoopMax = 200;
429 if (initLoopMax > *size) initLoopMax=*size;
430 // Detect high and lows
431 //25% clip in case highs and lows aren't clipped [marshmellow]
432 uint8_t clip = 75;
433 int high, low, ans;
434 ans = getHiLo(BinStream, initLoopMax, &high, &low, clip, clip);
435 if (ans<1) return -1; //just noise
436
437 if (DetectCleanAskWave(BinStream, *size, high, low)) {
438 //PrintAndLog("Clean");
439 return cleanAskRawDemod(BinStream, size, *clk, *invert, high, low);
440 }
441
442 //PrintAndLog("DEBUG - valid high: %d - valid low: %d",high,low);
443 int lastBit = 0; //set first clock check
444 uint32_t bitnum = 0; //output counter
445 uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock
446 // if they fall + or - this value + clock from last valid wave
447 if (*clk == 32) tol=0; //clock tolerance may not be needed anymore currently set to
448 // + or - 1 but could be increased for poor waves or removed entirely
449 uint32_t iii = 0;
450 uint32_t gLen = *size;
451 if (gLen > 500) gLen=500;
452 //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance
453 if (!maxErr) gLen = *clk * 2;
454 uint8_t errCnt =0;
455 uint32_t bestStart = *size;
456 uint32_t bestErrCnt = maxErr; //(*size/1000);
457 uint8_t midBit=0;
458 uint16_t MaxBits=1000;
459
460 //PrintAndLog("DEBUG - lastbit - %d",lastBit);
461 //loop to find first wave that works
462 for (iii=start; iii < gLen; ++iii){
463 if ((BinStream[iii]>=high) || (BinStream[iii]<=low)){
464 lastBit=iii-*clk;
465 errCnt=0;
466 //loop through to see if this start location works
467 for (i = iii; i < *size; ++i) {
468 if ((BinStream[i] >= high) && ((i-lastBit)>(*clk-tol))){
469 lastBit+=*clk;
470 midBit=0;
471 } else if ((BinStream[i] <= low) && ((i-lastBit)>(*clk-tol))){
472 //low found and we are expecting a bar
473 lastBit+=*clk;
474 midBit=0;
475 } else if ((BinStream[i]<=low) && (midBit==0) && ((i-lastBit)>((*clk/2)-tol))){
476 //mid bar?
477 midBit=1;
478 } else if ((BinStream[i]>=high) && (midBit==0) && ((i-lastBit)>((*clk/2)-tol))){
479 //mid bar?
480 midBit=1;
481 } else if ((i-lastBit)>((*clk/2)+tol) && (midBit==0)){
482 //no mid bar found
483 midBit=1;
484 } else {
485 //mid value found or no bar supposed to be here
486
487 if ((i-lastBit)>(*clk+tol)){
488 //should have hit a high or low based on clock!!
489 //debug
490 //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);
491
492 errCnt++;
493 lastBit+=*clk;//skip over until hit too many errors
494 if (errCnt > maxErr){
495 //errCnt=0;
496 break;
497 }
498 }
499 }
500 if ((i-iii)>(MaxBits * *clk)) break; //got enough bits
501 }
502 //we got more than 64 good bits and not all errors
503 if ((((i-iii)/ *clk) > (64)) && (errCnt<=maxErr)) {
504 //possible good read
505 if (errCnt==0){
506 bestStart=iii;
507 bestErrCnt=errCnt;
508 break; //great read - finish
509 }
510 if (errCnt<bestErrCnt){ //set this as new best run
511 bestErrCnt=errCnt;
512 bestStart = iii;
513 }
514 }
515 }
516 }
517 if (bestErrCnt<=maxErr){
518 //best run is good enough - set to best run and overwrite BinStream
519 iii = bestStart;
520 lastBit = bestStart - *clk;
521 bitnum=0;
522 for (i = iii; i < *size; ++i) {
523 if ((BinStream[i] >= high) && ((i-lastBit) > (*clk-tol))){
524 lastBit += *clk;
525 BinStream[bitnum] = *invert;
526 bitnum++;
527 midBit=0;
528 } else if ((BinStream[i] <= low) && ((i-lastBit) > (*clk-tol))){
529 //low found and we are expecting a bar
530 lastBit+=*clk;
531 BinStream[bitnum] = 1 - *invert;
532 bitnum++;
533 midBit=0;
534 } else if ((BinStream[i]<=low) && (midBit==0) && ((i-lastBit)>((*clk/2)-tol))){
535 //mid bar?
536 midBit=1;
537 BinStream[bitnum] = 1 - *invert;
538 bitnum++;
539 } else if ((BinStream[i]>=high) && (midBit==0) && ((i-lastBit)>((*clk/2)-tol))){
540 //mid bar?
541 midBit=1;
542 BinStream[bitnum] = *invert;
543 bitnum++;
544 } else if ((i-lastBit)>((*clk/2)+tol) && (midBit==0)){
545 //no mid bar found
546 midBit=1;
547 if (bitnum!=0) BinStream[bitnum] = BinStream[bitnum-1];
548 bitnum++;
549
550 } else {
551 //mid value found or no bar supposed to be here
552 if ((i-lastBit)>(*clk+tol)){
553 //should have hit a high or low based on clock!!
554
555 //debug
556 //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);
557 if (bitnum > 0){
558 BinStream[bitnum]=77;
559 bitnum++;
560 }
561 lastBit+=*clk;//skip over error
562 }
563 }
564 if (bitnum >= MaxBits) break;
565 }
566 *size=bitnum;
567 } else{
568 *invert=bestStart;
569 *clk=iii;
570 return -1;
571 }
572 return bestErrCnt;
573 }
574
575 // demod gProxIIDemod
576 // error returns as -x
577 // success returns start position in BitStream
578 // BitStream must contain previously askrawdemod and biphasedemoded data
579 int gProxII_Demod(uint8_t BitStream[], size_t *size)
580 {
581 size_t startIdx=0;
582 uint8_t preamble[] = {1,1,1,1,1,0};
583
584 uint8_t errChk = preambleSearch(BitStream, preamble, sizeof(preamble), size, &startIdx);
585 if (errChk == 0) return -3; //preamble not found
586 if (*size != 96) return -2; //should have found 96 bits
587 //check first 6 spacer bits to verify format
588 if (!BitStream[startIdx+5] && !BitStream[startIdx+10] && !BitStream[startIdx+15] && !BitStream[startIdx+20] && !BitStream[startIdx+25] && !BitStream[startIdx+30]){
589 //confirmed proper separator bits found
590 //return start position
591 return (int) startIdx;
592 }
593 return -5;
594 }
595
596 //translate wave to 11111100000 (1 for each short wave 0 for each long wave)
597 size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow)
598 {
599 uint32_t last_transition = 0;
600 uint32_t idx = 1;
601 //uint32_t maxVal=0;
602 if (fchigh==0) fchigh=10;
603 if (fclow==0) fclow=8;
604 //set the threshold close to 0 (graph) or 128 std to avoid static
605 uint8_t threshold_value = 123;
606
607 // sync to first lo-hi transition, and threshold
608
609 // Need to threshold first sample
610
611 if(dest[0] < threshold_value) dest[0] = 0;
612 else dest[0] = 1;
613
614 size_t numBits = 0;
615 // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)
616 // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere
617 // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
618 for(idx = 1; idx < size; idx++) {
619 // threshold current value
620
621 if (dest[idx] < threshold_value) dest[idx] = 0;
622 else dest[idx] = 1;
623
624 // Check for 0->1 transition
625 if (dest[idx-1] < dest[idx]) { // 0 -> 1 transition
626 if ((idx-last_transition)<(fclow-2)){ //0-5 = garbage noise
627 //do nothing with extra garbage
628 } else if ((idx-last_transition) < (fchigh-1)) { //6-8 = 8 waves
629 dest[numBits]=1;
630 } else if ((idx-last_transition) > (fchigh+1) && !numBits) { //12 + and first bit = garbage
631 //do nothing with beginning garbage
632 } else { //9+ = 10 waves
633 dest[numBits]=0;
634 }
635 last_transition = idx;
636 numBits++;
637 }
638 }
639 return numBits; //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0
640 }
641
642 //translate 11111100000 to 10
643 size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t maxConsequtiveBits,
644 uint8_t invert, uint8_t fchigh, uint8_t fclow)
645 {
646 uint8_t lastval=dest[0];
647 uint32_t idx=0;
648 size_t numBits=0;
649 uint32_t n=1;
650 for( idx=1; idx < size; idx++) {
651
652 if (dest[idx]==lastval) {
653 n++;
654 continue;
655 }
656 n++;
657 //if lastval was 1, we have a 1->0 crossing
658 if (dest[idx-1]==1) {
659 if (!numBits && n < rfLen/fclow) {
660 n=0;
661 lastval = dest[idx];
662 continue;
663 }
664 n = (n * fclow + rfLen/2) / rfLen;
665 } else {// 0->1 crossing
666 //test first bitsample too small
667 if (!numBits && n < rfLen/fchigh) {
668 n=0;
669 lastval = dest[idx];
670 continue;
671 }
672 n = (n * fchigh + rfLen/2) / rfLen; //-1 for fudge factor
673 }
674 if (n == 0) n = 1;
675
676 if(n < maxConsequtiveBits) //Consecutive
677 {
678 if(invert==0){ //invert bits
679 memset(dest+numBits, dest[idx-1] , n);
680 }else{
681 memset(dest+numBits, dest[idx-1]^1 , n);
682 }
683 numBits += n;
684 }
685 n=0;
686 lastval=dest[idx];
687 }//end for
688
689 // if valid extra bits at the end were all the same frequency - add them in
690 if (n > rfLen/fclow && n > rfLen/fchigh) {
691 if (dest[idx-2]==1) {
692 n = ((n+1) * fclow + rfLen/2) / rfLen;
693 } else {// 0->1 crossing
694 n = ((n+1) * fchigh + (rfLen-1)/2) / (rfLen-1); //-1 for fudge factor
695 }
696 memset(dest, dest[idx-1]^invert , n);
697 numBits += n;
698 }
699 return numBits;
700 }
701 //by marshmellow (from holiman's base)
702 // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)
703 int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow)
704 {
705 // FSK demodulator
706 size = fsk_wave_demod(dest, size, fchigh, fclow);
707 size = aggregate_bits(dest, size, rfLen, 192, invert, fchigh, fclow);
708 return size;
709 }
710
711 // loop to get raw HID waveform then FSK demodulate the TAG ID from it
712 int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo)
713 {
714 if (justNoise(dest, *size)) return -1;
715
716 size_t numStart=0, size2=*size, startIdx=0;
717 // FSK demodulator
718 *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
719 if (*size < 96) return -2;
720 // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
721 uint8_t preamble[] = {0,0,0,1,1,1,0,1};
722 // find bitstring in array
723 uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
724 if (errChk == 0) return -3; //preamble not found
725
726 numStart = startIdx + sizeof(preamble);
727 // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
728 for (size_t idx = numStart; (idx-numStart) < *size - sizeof(preamble); idx+=2){
729 if (dest[idx] == dest[idx+1]){
730 return -4; //not manchester data
731 }
732 *hi2 = (*hi2<<1)|(*hi>>31);
733 *hi = (*hi<<1)|(*lo>>31);
734 //Then, shift in a 0 or one into low
735 if (dest[idx] && !dest[idx+1]) // 1 0
736 *lo=(*lo<<1)|1;
737 else // 0 1
738 *lo=(*lo<<1)|0;
739 }
740 return (int)startIdx;
741 }
742
743 // loop to get raw paradox waveform then FSK demodulate the TAG ID from it
744 int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo)
745 {
746 if (justNoise(dest, *size)) return -1;
747
748 size_t numStart=0, size2=*size, startIdx=0;
749 // FSK demodulator
750 *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
751 if (*size < 96) return -2;
752
753 // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
754 uint8_t preamble[] = {0,0,0,0,1,1,1,1};
755
756 uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
757 if (errChk == 0) return -3; //preamble not found
758
759 numStart = startIdx + sizeof(preamble);
760 // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
761 for (size_t idx = numStart; (idx-numStart) < *size - sizeof(preamble); idx+=2){
762 if (dest[idx] == dest[idx+1])
763 return -4; //not manchester data
764 *hi2 = (*hi2<<1)|(*hi>>31);
765 *hi = (*hi<<1)|(*lo>>31);
766 //Then, shift in a 0 or one into low
767 if (dest[idx] && !dest[idx+1]) // 1 0
768 *lo=(*lo<<1)|1;
769 else // 0 1
770 *lo=(*lo<<1)|0;
771 }
772 return (int)startIdx;
773 }
774
775 uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
776 {
777 uint32_t num = 0;
778 for(int i = 0 ; i < numbits ; i++)
779 {
780 num = (num << 1) | (*src);
781 src++;
782 }
783 return num;
784 }
785
786 int IOdemodFSK(uint8_t *dest, size_t size)
787 {
788 if (justNoise(dest, size)) return -1;
789 //make sure buffer has data
790 if (size < 66*64) return -2;
791 // FSK demodulator
792 size = fskdemod(dest, size, 64, 1, 10, 8); // FSK2a RF/64
793 if (size < 65) return -3; //did we get a good demod?
794 //Index map
795 //0 10 20 30 40 50 60
796 //| | | | | | |
797 //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
798 //-----------------------------------------------------------------------------
799 //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
800 //
801 //XSF(version)facility:codeone+codetwo
802 //Handle the data
803 size_t startIdx = 0;
804 uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,1};
805 uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), &size, &startIdx);
806 if (errChk == 0) return -4; //preamble not found
807
808 if (!dest[startIdx+8] && dest[startIdx+17]==1 && dest[startIdx+26]==1 && dest[startIdx+35]==1 && dest[startIdx+44]==1 && dest[startIdx+53]==1){
809 //confirmed proper separator bits found
810 //return start position
811 return (int) startIdx;
812 }
813 return -5;
814 }
815
816 // by marshmellow
817 // takes a array of binary values, start position, length of bits per parity (includes parity bit),
818 // Parity Type (1 for odd 0 for even), and binary Length (length to run)
819 size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen)
820 {
821 uint32_t parityWd = 0;
822 size_t j = 0, bitCnt = 0;
823 for (int word = 0; word < (bLen); word+=pLen){
824 for (int bit=0; bit < pLen; bit++){
825 parityWd = (parityWd << 1) | BitStream[startIdx+word+bit];
826 BitStream[j++] = (BitStream[startIdx+word+bit]);
827 }
828 j--;
829 // if parity fails then return 0
830 if (parityTest(parityWd, pLen, pType) == 0) return -1;
831 bitCnt+=(pLen-1);
832 parityWd = 0;
833 }
834 // if we got here then all the parities passed
835 //return ID start index and size
836 return bitCnt;
837 }
838
839 // by marshmellow
840 // FSK Demod then try to locate an AWID ID
841 int AWIDdemodFSK(uint8_t *dest, size_t *size)
842 {
843 //make sure buffer has enough data
844 if (*size < 96*50) return -1;
845
846 if (justNoise(dest, *size)) return -2;
847
848 // FSK demodulator
849 *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50
850 if (*size < 96) return -3; //did we get a good demod?
851
852 uint8_t preamble[] = {0,0,0,0,0,0,0,1};
853 size_t startIdx = 0;
854 uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
855 if (errChk == 0) return -4; //preamble not found
856 if (*size != 96) return -5;
857 return (int)startIdx;
858 }
859
860 // by marshmellow
861 // FSK Demod then try to locate an Farpointe Data (pyramid) ID
862 int PyramiddemodFSK(uint8_t *dest, size_t *size)
863 {
864 //make sure buffer has data
865 if (*size < 128*50) return -5;
866
867 //test samples are not just noise
868 if (justNoise(dest, *size)) return -1;
869
870 // FSK demodulator
871 *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50
872 if (*size < 128) return -2; //did we get a good demod?
873
874 uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
875 size_t startIdx = 0;
876 uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
877 if (errChk == 0) return -4; //preamble not found
878 if (*size != 128) return -3;
879 return (int)startIdx;
880 }
881
882
883 uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, int high, int low)
884 {
885 uint16_t allPeaks=1;
886 uint16_t cntPeaks=0;
887 size_t loopEnd = 572;
888 if (loopEnd > size) loopEnd = size;
889 for (size_t i=60; i<loopEnd; i++){
890 if (dest[i]>low && dest[i]<high)
891 allPeaks=0;
892 else
893 cntPeaks++;
894 }
895 if (allPeaks == 0){
896 if (cntPeaks > 300) return 1;
897 }
898 return allPeaks;
899 }
900
901 int DetectStrongAskClock(uint8_t dest[], size_t size)
902 {
903 int clk[]={0,8,16,32,40,50,64,100,128,256};
904 size_t idx = 40;
905 uint8_t high=0;
906 size_t cnt = 0;
907 size_t highCnt = 0;
908 size_t highCnt2 = 0;
909 for (;idx < size; idx++){
910 if (dest[idx]>128) {
911 if (!high){
912 high=1;
913 if (cnt > highCnt){
914 if (highCnt != 0) highCnt2 = highCnt;
915 highCnt = cnt;
916 } else if (cnt > highCnt2) {
917 highCnt2 = cnt;
918 }
919 cnt=1;
920 } else {
921 cnt++;
922 }
923 } else if (dest[idx] <= 128){
924 if (high) {
925 high=0;
926 if (cnt > highCnt) {
927 if (highCnt != 0) highCnt2 = highCnt;
928 highCnt = cnt;
929 } else if (cnt > highCnt2) {
930 highCnt2 = cnt;
931 }
932 cnt=1;
933 } else {
934 cnt++;
935 }
936 }
937 }
938 uint8_t tol;
939 for (idx=8; idx>0; idx--){
940 tol = clk[idx]/8;
941 if (clk[idx] >= highCnt - tol && clk[idx] <= highCnt + tol)
942 return clk[idx];
943 if (clk[idx] >= highCnt2 - tol && clk[idx] <= highCnt2 + tol)
944 return clk[idx];
945 }
946 return -1;
947 }
948
949 // by marshmellow
950 // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping)
951 // maybe somehow adjust peak trimming value based on samples to fix?
952 // return start index of best starting position for that clock and return clock (by reference)
953 int DetectASKClock(uint8_t dest[], size_t size, int *clock, int maxErr)
954 {
955 int i=0;
956 int clk[]={8,16,32,40,50,64,100,128,256};
957 int loopCnt = 256; //don't need to loop through entire array...
958 if (size == 0) return -1;
959 if (size<loopCnt) loopCnt = size;
960 //if we already have a valid clock quit
961
962 for (;i<8;++i)
963 if (clk[i] == *clock) return 0;
964
965 //get high and low peak
966 int peak, low;
967 getHiLo(dest, loopCnt, &peak, &low, 75, 75);
968
969 //test for large clean peaks
970 if (DetectCleanAskWave(dest, size, peak, low)==1){
971 int ans = DetectStrongAskClock(dest, size);
972 for (i=7; i>0; i--){
973 if (clk[i] == ans) {
974 *clock=ans;
975 return 0;
976 }
977 }
978 }
979 int ii;
980 int clkCnt;
981 int tol = 0;
982 int bestErr[]={1000,1000,1000,1000,1000,1000,1000,1000,1000};
983 int bestStart[]={0,0,0,0,0,0,0,0,0};
984 int errCnt=0;
985 //test each valid clock from smallest to greatest to see which lines up
986 for(clkCnt=0; clkCnt < 8; clkCnt++){
987 if (clk[clkCnt] == 32){
988 tol=1;
989 }else{
990 tol=0;
991 }
992 if (!maxErr) loopCnt=clk[clkCnt]*2;
993 bestErr[clkCnt]=1000;
994 //try lining up the peaks by moving starting point (try first 256)
995 for (ii=0; ii < loopCnt; ii++){
996 if ((dest[ii] >= peak) || (dest[ii] <= low)){
997 errCnt=0;
998 // now that we have the first one lined up test rest of wave array
999 for (i=0; i<((int)((size-ii-tol)/clk[clkCnt])-1); ++i){
1000 if (dest[ii+(i*clk[clkCnt])]>=peak || dest[ii+(i*clk[clkCnt])]<=low){
1001 }else if(dest[ii+(i*clk[clkCnt])-tol]>=peak || dest[ii+(i*clk[clkCnt])-tol]<=low){
1002 }else if(dest[ii+(i*clk[clkCnt])+tol]>=peak || dest[ii+(i*clk[clkCnt])+tol]<=low){
1003 }else{ //error no peak detected
1004 errCnt++;
1005 }
1006 }
1007 //if we found no errors then we can stop here
1008 // this is correct one - return this clock
1009 //PrintAndLog("DEBUG: clk %d, err %d, ii %d, i %d",clk[clkCnt],errCnt,ii,i);
1010 if(errCnt==0 && clkCnt<6) {
1011 *clock = clk[clkCnt];
1012 return ii;
1013 }
1014 //if we found errors see if it is lowest so far and save it as best run
1015 if(errCnt<bestErr[clkCnt]){
1016 bestErr[clkCnt]=errCnt;
1017 bestStart[clkCnt]=ii;
1018 }
1019 }
1020 }
1021 }
1022 uint8_t iii=0;
1023 uint8_t best=0;
1024 for (iii=0; iii<8; ++iii){
1025 if (bestErr[iii]<bestErr[best]){
1026 if (bestErr[iii]==0) bestErr[iii]=1;
1027 // current best bit to error ratio vs new bit to error ratio
1028 if (((size/clk[best])/bestErr[best] < (size/clk[iii])/bestErr[iii]) ){
1029 best = iii;
1030 }
1031 }
1032 }
1033 if (bestErr[best]>maxErr) return -1;
1034 *clock=clk[best];
1035 return bestStart[best];
1036 }
1037
1038 //by marshmellow
1039 //detect psk clock by reading each phase shift
1040 // a phase shift is determined by measuring the sample length of each wave
1041 int DetectPSKClock(uint8_t dest[], size_t size, int clock)
1042 {
1043 uint8_t clk[]={255,16,32,40,50,64,100,128,255}; //255 is not a valid clock
1044 uint16_t loopCnt = 4096; //don't need to loop through entire array...
1045 if (size == 0) return 0;
1046 if (size<loopCnt) loopCnt = size;
1047
1048 //if we already have a valid clock quit
1049 size_t i=1;
1050 for (; i < 8; ++i)
1051 if (clk[i] == clock) return clock;
1052
1053 size_t waveStart=0, waveEnd=0, firstFullWave=0, lastClkBit=0;
1054 uint8_t clkCnt, fc=0, fullWaveLen=0, tol=1;
1055 uint16_t peakcnt=0, errCnt=0, waveLenCnt=0;
1056 uint16_t bestErr[]={1000,1000,1000,1000,1000,1000,1000,1000,1000};
1057 uint16_t peaksdet[]={0,0,0,0,0,0,0,0,0};
1058 countFC(dest, size, &fc);
1059 //PrintAndLog("DEBUG: FC: %d",fc);
1060
1061 //find first full wave
1062 for (i=0; i<loopCnt; i++){
1063 if (dest[i] < dest[i+1] && dest[i+1] >= dest[i+2]){
1064 if (waveStart == 0) {
1065 waveStart = i+1;
1066 //PrintAndLog("DEBUG: waveStart: %d",waveStart);
1067 } else {
1068 waveEnd = i+1;
1069 //PrintAndLog("DEBUG: waveEnd: %d",waveEnd);
1070 waveLenCnt = waveEnd-waveStart;
1071 if (waveLenCnt > fc){
1072 firstFullWave = waveStart;
1073 fullWaveLen=waveLenCnt;
1074 break;
1075 }
1076 waveStart=0;
1077 }
1078 }
1079 }
1080 //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen);
1081
1082 //test each valid clock from greatest to smallest to see which lines up
1083 for(clkCnt=7; clkCnt >= 1 ; clkCnt--){
1084 lastClkBit = firstFullWave; //set end of wave as clock align
1085 waveStart = 0;
1086 errCnt=0;
1087 peakcnt=0;
1088 //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d",clk[clkCnt],lastClkBit);
1089
1090 for (i = firstFullWave+fullWaveLen-1; i < loopCnt-2; i++){
1091 //top edge of wave = start of new wave
1092 if (dest[i] < dest[i+1] && dest[i+1] >= dest[i+2]){
1093 if (waveStart == 0) {
1094 waveStart = i+1;
1095 waveLenCnt=0;
1096 } else { //waveEnd
1097 waveEnd = i+1;
1098 waveLenCnt = waveEnd-waveStart;
1099 if (waveLenCnt > fc){
1100 //if this wave is a phase shift
1101 //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, ii: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+clk[clkCnt]-tol,ii+1,fc);
1102 if (i+1 >= lastClkBit + clk[clkCnt] - tol){ //should be a clock bit
1103 peakcnt++;
1104 lastClkBit+=clk[clkCnt];
1105 } else if (i<lastClkBit+8){
1106 //noise after a phase shift - ignore
1107 } else { //phase shift before supposed to based on clock
1108 errCnt++;
1109 }
1110 } else if (i+1 > lastClkBit + clk[clkCnt] + tol + fc){
1111 lastClkBit+=clk[clkCnt]; //no phase shift but clock bit
1112 }
1113 waveStart=i+1;
1114 }
1115 }
1116 }
1117 if (errCnt == 0){
1118 return clk[clkCnt];
1119 }
1120 if (errCnt <= bestErr[clkCnt]) bestErr[clkCnt]=errCnt;
1121 if (peakcnt > peaksdet[clkCnt]) peaksdet[clkCnt]=peakcnt;
1122 }
1123 //all tested with errors
1124 //return the highest clk with the most peaks found
1125 uint8_t best=7;
1126 for (i=7; i>=1; i--){
1127 if (peaksdet[i] > peaksdet[best]) {
1128 best = i;
1129 }
1130 //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best]);
1131 }
1132 return clk[best];
1133 }
1134
1135 //by marshmellow
1136 //detect nrz clock by reading #peaks vs no peaks(or errors)
1137 int DetectNRZClock(uint8_t dest[], size_t size, int clock)
1138 {
1139 int i=0;
1140 int clk[]={8,16,32,40,50,64,100,128,256};
1141 int loopCnt = 4096; //don't need to loop through entire array...
1142 if (size == 0) return 0;
1143 if (size<loopCnt) loopCnt = size;
1144
1145 //if we already have a valid clock quit
1146 for (; i < 8; ++i)
1147 if (clk[i] == clock) return clock;
1148
1149 //get high and low peak
1150 int peak, low;
1151 getHiLo(dest, loopCnt, &peak, &low, 75, 75);
1152
1153 //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);
1154 int ii;
1155 uint8_t clkCnt;
1156 uint8_t tol = 0;
1157 int peakcnt=0;
1158 int peaksdet[]={0,0,0,0,0,0,0,0};
1159 int maxPeak=0;
1160 //test for large clipped waves
1161 for (i=0; i<loopCnt; i++){
1162 if (dest[i] >= peak || dest[i] <= low){
1163 peakcnt++;
1164 } else {
1165 if (peakcnt>0 && maxPeak < peakcnt){
1166 maxPeak = peakcnt;
1167 }
1168 peakcnt=0;
1169 }
1170 }
1171 peakcnt=0;
1172 //test each valid clock from smallest to greatest to see which lines up
1173 for(clkCnt=0; clkCnt < 8; ++clkCnt){
1174 //ignore clocks smaller than largest peak
1175 if (clk[clkCnt]<maxPeak) continue;
1176
1177 //try lining up the peaks by moving starting point (try first 256)
1178 for (ii=0; ii< loopCnt; ++ii){
1179 if ((dest[ii] >= peak) || (dest[ii] <= low)){
1180 peakcnt=0;
1181 // now that we have the first one lined up test rest of wave array
1182 for (i=0; i < ((int)((size-ii-tol)/clk[clkCnt])-1); ++i){
1183 if (dest[ii+(i*clk[clkCnt])]>=peak || dest[ii+(i*clk[clkCnt])]<=low){
1184 peakcnt++;
1185 }
1186 }
1187 if(peakcnt>peaksdet[clkCnt]) {
1188 peaksdet[clkCnt]=peakcnt;
1189 }
1190 }
1191 }
1192 }
1193 int iii=7;
1194 int best=0;
1195 for (iii=7; iii > 0; iii--){
1196 if (peaksdet[iii] > peaksdet[best]){
1197 best = iii;
1198 }
1199 //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best]);
1200 }
1201 return clk[best];
1202 }
1203
1204 // by marshmellow
1205 // convert psk1 demod to psk2 demod
1206 // only transition waves are 1s
1207 void psk1TOpsk2(uint8_t *BitStream, size_t size)
1208 {
1209 size_t i=1;
1210 uint8_t lastBit=BitStream[0];
1211 for (; i<size; i++){
1212 if (BitStream[i]==77){
1213 //ignore errors
1214 } else if (lastBit!=BitStream[i]){
1215 lastBit=BitStream[i];
1216 BitStream[i]=1;
1217 } else {
1218 BitStream[i]=0;
1219 }
1220 }
1221 return;
1222 }
1223
1224 // by marshmellow
1225 // convert psk2 demod to psk1 demod
1226 // from only transition waves are 1s to phase shifts change bit
1227 void psk2TOpsk1(uint8_t *BitStream, size_t size)
1228 {
1229 uint8_t phase=0;
1230 for (size_t i=0; i<size; i++){
1231 if (BitStream[i]==1){
1232 phase ^=1;
1233 }
1234 BitStream[i]=phase;
1235 }
1236 return;
1237 }
1238
1239 // redesigned by marshmellow adjusted from existing decode functions
1240 // indala id decoding - only tested on 26 bit tags, but attempted to make it work for more
1241 int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
1242 {
1243 //26 bit 40134 format (don't know other formats)
1244 int i;
1245 int long_wait=29;//29 leading zeros in format
1246 int start;
1247 int first = 0;
1248 int first2 = 0;
1249 int bitCnt = 0;
1250 int ii;
1251 // Finding the start of a UID
1252 for (start = 0; start <= *size - 250; start++) {
1253 first = bitStream[start];
1254 for (i = start; i < start + long_wait; i++) {
1255 if (bitStream[i] != first) {
1256 break;
1257 }
1258 }
1259 if (i == (start + long_wait)) {
1260 break;
1261 }
1262 }
1263 if (start == *size - 250 + 1) {
1264 // did not find start sequence
1265 return -1;
1266 }
1267 // Inverting signal if needed
1268 if (first == 1) {
1269 for (i = start; i < *size; i++) {
1270 bitStream[i] = !bitStream[i];
1271 }
1272 *invert = 1;
1273 }else *invert=0;
1274
1275 int iii;
1276 //found start once now test length by finding next one
1277 for (ii=start+29; ii <= *size - 250; ii++) {
1278 first2 = bitStream[ii];
1279 for (iii = ii; iii < ii + long_wait; iii++) {
1280 if (bitStream[iii] != first2) {
1281 break;
1282 }
1283 }
1284 if (iii == (ii + long_wait)) {
1285 break;
1286 }
1287 }
1288 if (ii== *size - 250 + 1){
1289 // did not find second start sequence
1290 return -2;
1291 }
1292 bitCnt=ii-start;
1293
1294 // Dumping UID
1295 i = start;
1296 for (ii = 0; ii < bitCnt; ii++) {
1297 bitStream[ii] = bitStream[i++];
1298 }
1299 *size=bitCnt;
1300 return 1;
1301 }
1302
1303 // by marshmellow - demodulate NRZ wave (both similar enough)
1304 // peaks invert bit (high=1 low=0) each clock cycle = 1 bit determined by last peak
1305 // there probably is a much simpler way to do this....
1306 int nrzRawDemod(uint8_t *dest, size_t *size, int *clk, int *invert, int maxErr)
1307 {
1308 if (justNoise(dest, *size)) return -1;
1309 *clk = DetectNRZClock(dest, *size, *clk);
1310 if (*clk==0) return -2;
1311 uint32_t i;
1312 uint32_t gLen = 4096;
1313 if (gLen>*size) gLen = *size;
1314 int high, low;
1315 if (getHiLo(dest, gLen, &high, &low, 75, 75) < 1) return -3; //25% fuzz on high 25% fuzz on low
1316 int lastBit = 0; //set first clock check
1317 uint32_t bitnum = 0; //output counter
1318 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
1319 uint32_t iii = 0;
1320 uint16_t errCnt =0;
1321 uint16_t MaxBits = 1000;
1322 uint32_t bestErrCnt = maxErr+1;
1323 uint32_t bestPeakCnt = 0;
1324 uint32_t bestPeakStart=0;
1325 uint8_t bestFirstPeakHigh=0;
1326 uint8_t firstPeakHigh=0;
1327 uint8_t curBit=0;
1328 uint8_t bitHigh=0;
1329 uint8_t errBitHigh=0;
1330 uint16_t peakCnt=0;
1331 uint8_t ignoreWindow=4;
1332 uint8_t ignoreCnt=ignoreWindow; //in case of noice near peak
1333 //loop to find first wave that works - align to clock
1334 for (iii=0; iii < gLen; ++iii){
1335 if ((dest[iii]>=high) || (dest[iii]<=low)){
1336 if (dest[iii]>=high) firstPeakHigh=1;
1337 else firstPeakHigh=0;
1338 lastBit=iii-*clk;
1339 peakCnt=0;
1340 errCnt=0;
1341 bitnum=0;
1342 //loop through to see if this start location works
1343 for (i = iii; i < *size; ++i) {
1344 //if we found a high bar and we are at a clock bit
1345 if ((dest[i]>=high ) && (i>=lastBit+*clk-tol && i<=lastBit+*clk+tol)){
1346 bitHigh=1;
1347 lastBit+=*clk;
1348 bitnum++;
1349 peakCnt++;
1350 errBitHigh=0;
1351 ignoreCnt=ignoreWindow;
1352 //else if low bar found and we are at a clock point
1353 }else if ((dest[i]<=low ) && (i>=lastBit+*clk-tol && i<=lastBit+*clk+tol)){
1354 bitHigh=1;
1355 lastBit+=*clk;
1356 bitnum++;
1357 peakCnt++;
1358 errBitHigh=0;
1359 ignoreCnt=ignoreWindow;
1360 //else if no bars found
1361 }else if(dest[i] < high && dest[i] > low) {
1362 if (ignoreCnt==0){
1363 bitHigh=0;
1364 if (errBitHigh==1){
1365 errCnt++;
1366 }
1367 errBitHigh=0;
1368 } else {
1369 ignoreCnt--;
1370 }
1371 //if we are past a clock point
1372 if (i >= lastBit+*clk+tol){ //clock val
1373 lastBit+=*clk;
1374 bitnum++;
1375 }
1376 //else if bar found but we are not at a clock bit and we did not just have a clock bit
1377 }else if ((dest[i]>=high || dest[i]<=low) && (i<lastBit+*clk-tol || i>lastBit+*clk+tol) && (bitHigh==0)){
1378 //error bar found no clock...
1379 errBitHigh=1;
1380 }
1381 if (bitnum>=MaxBits) break;
1382 }
1383 //we got more than 64 good bits and not all errors
1384 if (bitnum > (64) && (errCnt <= (maxErr))) {
1385 //possible good read
1386 if (errCnt == 0){
1387 //bestStart = iii;
1388 bestFirstPeakHigh=firstPeakHigh;
1389 bestErrCnt = errCnt;
1390 bestPeakCnt = peakCnt;
1391 bestPeakStart = iii;
1392 break; //great read - finish
1393 }
1394 if (errCnt < bestErrCnt){ //set this as new best run
1395 bestErrCnt = errCnt;
1396 //bestStart = iii;
1397 }
1398 if (peakCnt > bestPeakCnt){
1399 bestFirstPeakHigh=firstPeakHigh;
1400 bestPeakCnt=peakCnt;
1401 bestPeakStart=iii;
1402 }
1403 }
1404 }
1405 }
1406 //PrintAndLog("DEBUG: bestErrCnt: %d, maxErr: %d, bestStart: %d, bestPeakCnt: %d, bestPeakStart: %d",bestErrCnt,maxErr,bestStart,bestPeakCnt,bestPeakStart);
1407 if (bestErrCnt <= maxErr){
1408 //best run is good enough set to best run and set overwrite BinStream
1409 iii=bestPeakStart;
1410 lastBit=bestPeakStart-*clk;
1411 bitnum=0;
1412 memset(dest, bestFirstPeakHigh^1, bestPeakStart / *clk);
1413 bitnum += (bestPeakStart / *clk);
1414 for (i = iii; i < *size; ++i) {
1415 //if we found a high bar and we are at a clock bit
1416 if ((dest[i] >= high ) && (i>=lastBit+*clk-tol && i<=lastBit+*clk+tol)){
1417 bitHigh=1;
1418 lastBit+=*clk;
1419 curBit=1-*invert;
1420 dest[bitnum]=curBit;
1421 bitnum++;
1422 errBitHigh=0;
1423 ignoreCnt=ignoreWindow;
1424 //else if low bar found and we are at a clock point
1425 }else if ((dest[i]<=low ) && (i>=lastBit+*clk-tol && i<=lastBit+*clk+tol)){
1426 bitHigh=1;
1427 lastBit+=*clk;
1428 curBit=*invert;
1429 dest[bitnum]=curBit;
1430 bitnum++;
1431 errBitHigh=0;
1432 ignoreCnt=ignoreWindow;
1433 //else if no bars found
1434 }else if(dest[i]<high && dest[i]>low) {
1435 if (ignoreCnt==0){
1436 bitHigh=0;
1437 //if peak is done was it an error peak?
1438 if (errBitHigh==1){
1439 dest[bitnum]=77;
1440 bitnum++;
1441 errCnt++;
1442 }
1443 errBitHigh=0;
1444 } else {
1445 ignoreCnt--;
1446 }
1447 //if we are past a clock point
1448 if (i>=lastBit+*clk+tol){ //clock val
1449 lastBit+=*clk;
1450 dest[bitnum]=curBit;
1451 bitnum++;
1452 }
1453 //else if bar found but we are not at a clock bit and we did not just have a clock bit
1454 }else if ((dest[i]>=high || dest[i]<=low) && ((i<lastBit+*clk-tol) || (i>lastBit+*clk+tol)) && (bitHigh==0)){
1455 //error bar found no clock...
1456 errBitHigh=1;
1457 }
1458 if (bitnum >= MaxBits) break;
1459 }
1460 *size=bitnum;
1461 } else{
1462 *size=bitnum;
1463 return bestErrCnt;
1464 }
1465
1466 if (bitnum>16){
1467 *size=bitnum;
1468 } else return -5;
1469 return errCnt;
1470 }
1471
1472 //by marshmellow
1473 //detects the bit clock for FSK given the high and low Field Clocks
1474 uint8_t detectFSKClk(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow)
1475 {
1476 uint8_t clk[] = {8,16,32,40,50,64,100,128,0};
1477 uint16_t rfLens[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1478 uint8_t rfCnts[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1479 uint8_t rfLensFnd = 0;
1480 uint8_t lastFCcnt=0;
1481 uint32_t fcCounter = 0;
1482 uint16_t rfCounter = 0;
1483 uint8_t firstBitFnd = 0;
1484 size_t i;
1485 if (size == 0) return 0;
1486
1487 uint8_t fcTol = (uint8_t)(0.5+(float)(fcHigh-fcLow)/2);
1488 rfLensFnd=0;
1489 fcCounter=0;
1490 rfCounter=0;
1491 firstBitFnd=0;
1492 //PrintAndLog("DEBUG: fcTol: %d",fcTol);
1493 // prime i to first up transition
1494 for (i = 1; i < size-1; i++)
1495 if (BitStream[i] > BitStream[i-1] && BitStream[i]>=BitStream[i+1])
1496 break;
1497
1498 for (; i < size-1; i++){
1499 if (BitStream[i] > BitStream[i-1] && BitStream[i]>=BitStream[i+1]){
1500 // new peak
1501 fcCounter++;
1502 rfCounter++;
1503 // if we got less than the small fc + tolerance then set it to the small fc
1504 if (fcCounter < fcLow+fcTol)
1505 fcCounter = fcLow;
1506 else //set it to the large fc
1507 fcCounter = fcHigh;
1508
1509 //look for bit clock (rf/xx)
1510 if ((fcCounter<lastFCcnt || fcCounter>lastFCcnt)){
1511 //not the same size as the last wave - start of new bit sequence
1512
1513 if (firstBitFnd>1){ //skip first wave change - probably not a complete bit
1514 for (int ii=0; ii<15; ii++){
1515 if (rfLens[ii]==rfCounter){
1516 rfCnts[ii]++;
1517 rfCounter=0;
1518 break;
1519 }
1520 }
1521 if (rfCounter>0 && rfLensFnd<15){
1522 //PrintAndLog("DEBUG: rfCntr %d, fcCntr %d",rfCounter,fcCounter);
1523 rfCnts[rfLensFnd]++;
1524 rfLens[rfLensFnd++]=rfCounter;
1525 }
1526 } else {
1527 firstBitFnd++;
1528 }
1529 rfCounter=0;
1530 lastFCcnt=fcCounter;
1531 }
1532 fcCounter=0;
1533 } else {
1534 // count sample
1535 fcCounter++;
1536 rfCounter++;
1537 }
1538 }
1539 uint8_t rfHighest=15, rfHighest2=15, rfHighest3=15;
1540
1541 for (i=0; i<15; i++){
1542 //PrintAndLog("DEBUG: RF %d, cnts %d",rfLens[i], rfCnts[i]);
1543 //get highest 2 RF values (might need to get more values to compare or compare all?)
1544 if (rfCnts[i]>rfCnts[rfHighest]){
1545 rfHighest3=rfHighest2;
1546 rfHighest2=rfHighest;
1547 rfHighest=i;
1548 } else if(rfCnts[i]>rfCnts[rfHighest2]){
1549 rfHighest3=rfHighest2;
1550 rfHighest2=i;
1551 } else if(rfCnts[i]>rfCnts[rfHighest3]){
1552 rfHighest3=i;
1553 }
1554 }
1555 // set allowed clock remainder tolerance to be 1 large field clock length+1
1556 // we could have mistakenly made a 9 a 10 instead of an 8 or visa versa so rfLens could be 1 FC off
1557 uint8_t tol1 = fcHigh+1;
1558
1559 //PrintAndLog("DEBUG: hightest: 1 %d, 2 %d, 3 %d",rfLens[rfHighest],rfLens[rfHighest2],rfLens[rfHighest3]);
1560
1561 // loop to find the highest clock that has a remainder less than the tolerance
1562 // compare samples counted divided by
1563 int ii=7;
1564 for (; ii>=0; ii--){
1565 if (rfLens[rfHighest] % clk[ii] < tol1 || rfLens[rfHighest] % clk[ii] > clk[ii]-tol1){
1566 if (rfLens[rfHighest2] % clk[ii] < tol1 || rfLens[rfHighest2] % clk[ii] > clk[ii]-tol1){
1567 if (rfLens[rfHighest3] % clk[ii] < tol1 || rfLens[rfHighest3] % clk[ii] > clk[ii]-tol1){
1568 break;
1569 }
1570 }
1571 }
1572 }
1573
1574 if (ii<0) return 0; // oops we went too far
1575
1576 return clk[ii];
1577 }
1578
1579 //by marshmellow
1580 //countFC is to detect the field clock lengths.
1581 //counts and returns the 2 most common wave lengths
1582 //mainly used for FSK field clock detection
1583 uint16_t countFC(uint8_t *BitStream, size_t size, uint8_t *mostFC)
1584 {
1585 uint8_t fcLens[] = {0,0,0,0,0,0,0,0,0,0};
1586 uint16_t fcCnts[] = {0,0,0,0,0,0,0,0,0,0};
1587 uint8_t fcLensFnd = 0;
1588 uint8_t lastFCcnt=0;
1589 uint32_t fcCounter = 0;
1590 size_t i;
1591 if (size == 0) return 0;
1592
1593 // prime i to first up transition
1594 for (i = 1; i < size-1; i++)
1595 if (BitStream[i] > BitStream[i-1] && BitStream[i] >= BitStream[i+1])
1596 break;
1597
1598 for (; i < size-1; i++){
1599 if (BitStream[i] > BitStream[i-1] && BitStream[i] >= BitStream[i+1]){
1600 // new up transition
1601 fcCounter++;
1602
1603 //if we had 5 and now have 9 then go back to 8 (for when we get a fc 9 instead of an 8)
1604 if (lastFCcnt==5 && fcCounter==9) fcCounter--;
1605 //if odd and not rc/5 add one (for when we get a fc 9 instead of 10)
1606 if ((fcCounter==9 && fcCounter & 1) || fcCounter==4) fcCounter++;
1607
1608 // save last field clock count (fc/xx)
1609 // find which fcLens to save it to:
1610 for (int ii=0; ii<10; ii++){
1611 if (fcLens[ii]==fcCounter){
1612 fcCnts[ii]++;
1613 fcCounter=0;
1614 break;
1615 }
1616 }
1617 if (fcCounter>0 && fcLensFnd<10){
1618 //add new fc length
1619 fcCnts[fcLensFnd]++;
1620 fcLens[fcLensFnd++]=fcCounter;
1621 }
1622 fcCounter=0;
1623 } else {
1624 // count sample
1625 fcCounter++;
1626 }
1627 }
1628
1629 uint8_t best1=9, best2=9, best3=9;
1630 uint16_t maxCnt1=0;
1631 // go through fclens and find which ones are bigest 2
1632 for (i=0; i<10; i++){
1633 // PrintAndLog("DEBUG: FC %d, Cnt %d, Errs %d",fcLens[i],fcCnts[i],errCnt);
1634 // get the 3 best FC values
1635 if (fcCnts[i]>maxCnt1) {
1636 best3=best2;
1637 best2=best1;
1638 maxCnt1=fcCnts[i];
1639 best1=i;
1640 } else if(fcCnts[i]>fcCnts[best2]){
1641 best3=best2;
1642 best2=i;
1643 } else if(fcCnts[i]>fcCnts[best3]){
1644 best3=i;
1645 }
1646 }
1647 uint8_t fcH=0, fcL=0;
1648 if (fcLens[best1]>fcLens[best2]){
1649 fcH=fcLens[best1];
1650 fcL=fcLens[best2];
1651 } else{
1652 fcH=fcLens[best2];
1653 fcL=fcLens[best1];
1654 }
1655
1656 *mostFC=fcLens[best1];
1657 // TODO: take top 3 answers and compare to known Field clocks to get top 2
1658
1659 uint16_t fcs = (((uint16_t)fcH)<<8) | fcL;
1660 // PrintAndLog("DEBUG: Best %d best2 %d best3 %d",fcLens[best1],fcLens[best2],fcLens[best3]);
1661
1662 return fcs;
1663 }
1664
1665 //by marshmellow
1666 //countPSK_FC is to detect the psk carrier clock length.
1667 //counts and returns the 1 most common wave length
1668 uint8_t countPSK_FC(uint8_t *BitStream, size_t size)
1669 {
1670 uint8_t fcLens[] = {0,0,0,0,0,0,0,0,0,0};
1671 uint16_t fcCnts[] = {0,0,0,0,0,0,0,0,0,0};
1672 uint8_t fcLensFnd = 0;
1673 uint32_t fcCounter = 0;
1674 size_t i;
1675 if (size == 0) return 0;
1676
1677 // prime i to first up transition
1678 for (i = 1; i < size-1; i++)
1679 if (BitStream[i] > BitStream[i-1] && BitStream[i] >= BitStream[i+1])
1680 break;
1681
1682 for (; i < size-1; i++){
1683 if (BitStream[i] > BitStream[i-1] && BitStream[i] >= BitStream[i+1]){
1684 // new up transition
1685 fcCounter++;
1686
1687 // save last field clock count (fc/xx)
1688 // find which fcLens to save it to:
1689 for (int ii=0; ii<10; ii++){
1690 if (fcLens[ii]==fcCounter){
1691 fcCnts[ii]++;
1692 fcCounter=0;
1693 break;
1694 }
1695 }
1696 if (fcCounter>0 && fcLensFnd<10){
1697 //add new fc length
1698 fcCnts[fcLensFnd]++;
1699 fcLens[fcLensFnd++]=fcCounter;
1700 }
1701 fcCounter=0;
1702 } else {
1703 // count sample
1704 fcCounter++;
1705 }
1706 }
1707
1708 uint8_t best1=9;
1709 uint16_t maxCnt1=0;
1710 // go through fclens and find which ones are bigest
1711 for (i=0; i<10; i++){
1712 //PrintAndLog("DEBUG: FC %d, Cnt %d",fcLens[i],fcCnts[i]);
1713 // get the best FC value
1714 if (fcCnts[i]>maxCnt1) {
1715 maxCnt1=fcCnts[i];
1716 best1=i;
1717 }
1718 }
1719 return fcLens[best1];
1720 }
1721
1722 //by marshmellow - demodulate PSK1 wave
1723 //uses wave lengths (# Samples)
1724 int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
1725 {
1726 uint16_t loopCnt = 4096; //don't need to loop through entire array...
1727 if (size == 0) return -1;
1728 if (*size<loopCnt) loopCnt = *size;
1729
1730 uint8_t curPhase = *invert;
1731 size_t i, waveStart=1, waveEnd=0, firstFullWave=0, lastClkBit=0;
1732 uint8_t fc=0, fullWaveLen=0, tol=1;
1733 uint16_t errCnt=0, waveLenCnt=0;
1734 fc = countPSK_FC(dest, *size);
1735 if (fc!=2 && fc!=4 && fc!=8) return -1;
1736 //PrintAndLog("DEBUG: FC: %d",fc);
1737 *clock = DetectPSKClock(dest, *size, *clock);
1738 if (*clock==0) return -1;
1739 int avgWaveVal=0, lastAvgWaveVal=0;
1740 //find first phase shift
1741 for (i=0; i<loopCnt; i++){
1742 if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){
1743 waveEnd = i+1;
1744 //PrintAndLog("DEBUG: waveEnd: %d",waveEnd);
1745 waveLenCnt = waveEnd-waveStart;
1746 if (waveLenCnt > fc && waveStart > fc){ //not first peak and is a large wave
1747 lastAvgWaveVal = avgWaveVal/(waveLenCnt);
1748 firstFullWave = waveStart;
1749 fullWaveLen=waveLenCnt;
1750 //if average wave value is > graph 0 then it is an up wave or a 1
1751 if (lastAvgWaveVal > 123) curPhase^=1; //fudge graph 0 a little 123 vs 128
1752 break;
1753 }
1754 waveStart = i+1;
1755 avgWaveVal = 0;
1756 }
1757 avgWaveVal+=dest[i+2];
1758 }
1759 //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen);
1760 lastClkBit = firstFullWave; //set start of wave as clock align
1761 //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
1762 waveStart = 0;
1763 errCnt=0;
1764 size_t numBits=0;
1765 //set skipped bits
1766 memset(dest,curPhase^1,firstFullWave / *clock);
1767 numBits += (firstFullWave / *clock);
1768 dest[numBits++] = curPhase; //set first read bit
1769 for (i = firstFullWave+fullWaveLen-1; i < *size-3; i++){
1770 //top edge of wave = start of new wave
1771 if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){
1772 if (waveStart == 0) {
1773 waveStart = i+1;
1774 waveLenCnt=0;
1775 avgWaveVal = dest[i+1];
1776 } else { //waveEnd
1777 waveEnd = i+1;
1778 waveLenCnt = waveEnd-waveStart;
1779 lastAvgWaveVal = avgWaveVal/waveLenCnt;
1780 if (waveLenCnt > fc){
1781 //PrintAndLog("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal);
1782 //if this wave is a phase shift
1783 //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc);
1784 if (i+1 >= lastClkBit + *clock - tol){ //should be a clock bit
1785 curPhase^=1;
1786 dest[numBits++] = curPhase;
1787 lastClkBit += *clock;
1788 } else if (i<lastClkBit+10+fc){
1789 //noise after a phase shift - ignore
1790 } else { //phase shift before supposed to based on clock
1791 errCnt++;
1792 dest[numBits++] = 77;
1793 }
1794 } else if (i+1 > lastClkBit + *clock + tol + fc){
1795 lastClkBit += *clock; //no phase shift but clock bit
1796 dest[numBits++] = curPhase;
1797 }
1798 avgWaveVal=0;
1799 waveStart=i+1;
1800 }
1801 }
1802 avgWaveVal+=dest[i+1];
1803 }
1804 *size = numBits;
1805 return errCnt;
1806 }
Impressum, Datenschutz