-// loop to get raw HID waveform then FSK demodulate the TAG ID from it
-int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo)
-{
- if (justNoise(dest, *size)) return -1;
-
- size_t numStart=0, size2=*size, startIdx=0;
- // FSK demodulator
- *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
- if (*size < 96*2) return -2;
- // 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
- uint8_t preamble[] = {0,0,0,1,1,1,0,1};
- // find bitstring in array
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -3; //preamble not found
-
- numStart = startIdx + sizeof(preamble);
- // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
- for (size_t idx = numStart; (idx-numStart) < *size - sizeof(preamble); idx+=2){
- if (dest[idx] == dest[idx+1]){
- return -4; //not manchester data
- }
- *hi2 = (*hi2<<1)|(*hi>>31);
- *hi = (*hi<<1)|(*lo>>31);
- //Then, shift in a 0 or one into low
- if (dest[idx] && !dest[idx+1]) // 1 0
- *lo=(*lo<<1)|1;
- else // 0 1
- *lo=(*lo<<1)|0;
- }
- return (int)startIdx;
-}
-
-// loop to get raw paradox waveform then FSK demodulate the TAG ID from it
-int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo)
-{
- if (justNoise(dest, *size)) return -1;
-
- size_t numStart=0, size2=*size, startIdx=0;
- // FSK demodulator
- *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
- if (*size < 96) return -2;
-
- // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
- uint8_t preamble[] = {0,0,0,0,1,1,1,1};
-
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -3; //preamble not found
-
- numStart = startIdx + sizeof(preamble);
- // final loop, go over previously decoded FSK data and manchester decode into usable tag ID
- for (size_t idx = numStart; (idx-numStart) < *size - sizeof(preamble); idx+=2){
- if (dest[idx] == dest[idx+1])
- return -4; //not manchester data
- *hi2 = (*hi2<<1)|(*hi>>31);
- *hi = (*hi<<1)|(*lo>>31);
- //Then, shift in a 0 or one into low
- if (dest[idx] && !dest[idx+1]) // 1 0
- *lo=(*lo<<1)|1;
- else // 0 1
- *lo=(*lo<<1)|0;
- }
- return (int)startIdx;
-}
-
-int IOdemodFSK(uint8_t *dest, size_t size)
-{
- if (justNoise(dest, size)) return -1;
- //make sure buffer has data
- if (size < 66*64) return -2;
- // FSK demodulator
- size = fskdemod(dest, size, 64, 1, 10, 8); // FSK2a RF/64
- if (size < 65) return -3; //did we get a good demod?
- //Index map
- //0 10 20 30 40 50 60
- //| | | | | | |
- //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
- //-----------------------------------------------------------------------------
- //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
- //
- //XSF(version)facility:codeone+codetwo
- //Handle the data
- size_t startIdx = 0;
- uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,1};
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), &size, &startIdx);
- if (errChk == 0) return -4; //preamble not found
-
- if (!dest[startIdx+8] && dest[startIdx+17]==1 && dest[startIdx+26]==1 && dest[startIdx+35]==1 && dest[startIdx+44]==1 && dest[startIdx+53]==1){
- //confirmed proper separator bits found
- //return start position
- return (int) startIdx;
- }
- return -5;
-}
-
-// by marshmellow
-// find viking preamble 0xF200 in already demoded data
-int VikingDemod_AM(uint8_t *dest, size_t *size) {
- //make sure buffer has data
- if (*size < 64*2) return -2;
-
- size_t startIdx = 0;
- uint8_t preamble[] = {1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -4; //preamble not found
- uint32_t checkCalc = bytebits_to_byte(dest+startIdx,8) ^ bytebits_to_byte(dest+startIdx+8,8) ^ bytebits_to_byte(dest+startIdx+16,8)
- ^ bytebits_to_byte(dest+startIdx+24,8) ^ bytebits_to_byte(dest+startIdx+32,8) ^ bytebits_to_byte(dest+startIdx+40,8)
- ^ bytebits_to_byte(dest+startIdx+48,8) ^ bytebits_to_byte(dest+startIdx+56,8);
- if ( checkCalc != 0xA8 ) return -5;
- if (*size != 64) return -6;
- //return start position
- return (int) startIdx;
-}
-
-// find presco preamble 0x10D in already demoded data
-int PrescoDemod(uint8_t *dest, size_t *size) {
- //make sure buffer has data
- if (*size < 64*2) return -2;
-
- size_t startIdx = 0;
- uint8_t preamble[] = {1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0};
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -4; //preamble not found
- //return start position
- return (int) startIdx;
-}
-
-// Ask/Biphase Demod then try to locate an ISO 11784/85 ID
-// BitStream must contain previously askrawdemod and biphasedemoded data
-int FDXBdemodBI(uint8_t *dest, size_t *size)
-{
- //make sure buffer has enough data
- if (*size < 128) return -1;
-
- size_t startIdx = 0;
- uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,1};
-
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -2; //preamble not found
- return (int)startIdx;
-}
-
-// by marshmellow
-// FSK Demod then try to locate an AWID ID
-int AWIDdemodFSK(uint8_t *dest, size_t *size)
-{
- //make sure buffer has enough data
- if (*size < 96*50) return -1;
-
- if (justNoise(dest, *size)) return -2;
-
- // FSK demodulator
- *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50
- if (*size < 96) return -3; //did we get a good demod?
-
- uint8_t preamble[] = {0,0,0,0,0,0,0,1};
- size_t startIdx = 0;
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -4; //preamble not found
- if (*size != 96) return -5;
- return (int)startIdx;
-}
-
-// by marshmellow
-// FSK Demod then try to locate a Farpointe Data (pyramid) ID
-int PyramiddemodFSK(uint8_t *dest, size_t *size)
-{
- //make sure buffer has data
- if (*size < 128*50) return -5;
-
- //test samples are not just noise
- if (justNoise(dest, *size)) return -1;
-
- // FSK demodulator
- *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50
- if (*size < 128) return -2; //did we get a good demod?
-
- uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
- size_t startIdx = 0;
- uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
- if (errChk == 0) return -4; //preamble not found
- if (*size != 128) return -3;
- return (int)startIdx;
-}
-
-// by marshmellow
-// to detect a wave that has heavily clipped (clean) samples
-uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, uint8_t high, uint8_t low)
-{
- bool allArePeaks = true;
- uint16_t cntPeaks=0;
- size_t loopEnd = 512+160;
- if (loopEnd > size) loopEnd = size;
- for (size_t i=160; i<loopEnd; i++){
- if (dest[i]>low && dest[i]<high)
- allArePeaks = false;
- else
- cntPeaks++;
- }
- if (!allArePeaks){
- if (cntPeaks > 300) return true;
- }
- return allArePeaks;
-}
-// by marshmellow
-// to help detect clocks on heavily clipped samples
-// based on count of low to low
-int DetectStrongAskClock(uint8_t dest[], size_t size, uint8_t high, uint8_t low, int *clock) {
- uint8_t fndClk[] = {8,16,32,40,50,64,128};
- size_t startwave;
- size_t i = 100;
- size_t minClk = 255;
- int shortestWaveIdx = 0;
- // get to first full low to prime loop and skip incomplete first pulse
- while ((dest[i] < high) && (i < size))
- ++i;
- while ((dest[i] > low) && (i < size))
- ++i;