- //raw fsk demod no manchester decoding no start bit finding just get binary from wave
- //set defaults
- uint8_t rfLen = 64;
- uint8_t invert=1;
- size_t idx=0;
- uint8_t testMax=0;
- //test samples are not just noise
- if (GraphTraceLen < 64) return 0;
- for(idx=0;idx<64;idx++){
- if (testMax<GraphBuffer[idx]) testMax=GraphBuffer[idx];
- }
- idx=0;
- //get full binary from fsk wave
- size_t size = fskdemod(rfLen,invert);
-
- //if not just noise
- //PrintAndLog("testMax %d",testMax);
- if (testMax>40){
- //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 (raw)
- //Handle the data
- int mask[] = {0,0,0,0,0,0,0,0,0,1};
- for( idx=0; idx < (size - 74); idx++) {
- if ( memcmp(GraphBuffer + idx, mask, sizeof(mask))==0) {
- //frame marker found
- if (GraphBuffer[idx+17]==1 && GraphBuffer[idx+26]==1 && GraphBuffer[idx+35]==1 && GraphBuffer[idx+44]==1 && GraphBuffer[idx+53]==1){
- //confirmed proper separator bits found
-
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx], GraphBuffer[idx+1], GraphBuffer[idx+2], GraphBuffer[idx+3], GraphBuffer[idx+4], GraphBuffer[idx+5], GraphBuffer[idx+6], GraphBuffer[idx+7], GraphBuffer[idx+8]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx+9], GraphBuffer[idx+10], GraphBuffer[idx+11],GraphBuffer[idx+12],GraphBuffer[idx+13],GraphBuffer[idx+14],GraphBuffer[idx+15],GraphBuffer[idx+16],GraphBuffer[idx+17]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx+18], GraphBuffer[idx+19], GraphBuffer[idx+20],GraphBuffer[idx+21],GraphBuffer[idx+22],GraphBuffer[idx+23],GraphBuffer[idx+24],GraphBuffer[idx+25],GraphBuffer[idx+26]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx+27], GraphBuffer[idx+28], GraphBuffer[idx+29],GraphBuffer[idx+30],GraphBuffer[idx+31],GraphBuffer[idx+32],GraphBuffer[idx+33],GraphBuffer[idx+34],GraphBuffer[idx+35]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx+36], GraphBuffer[idx+37], GraphBuffer[idx+38],GraphBuffer[idx+39],GraphBuffer[idx+40],GraphBuffer[idx+41],GraphBuffer[idx+42],GraphBuffer[idx+43],GraphBuffer[idx+44]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d",GraphBuffer[idx+45], GraphBuffer[idx+46], GraphBuffer[idx+47],GraphBuffer[idx+48],GraphBuffer[idx+49],GraphBuffer[idx+50],GraphBuffer[idx+51],GraphBuffer[idx+52],GraphBuffer[idx+53]);
- PrintAndLog("%d%d%d%d%d%d%d%d %d%d",GraphBuffer[idx+54],GraphBuffer[idx+55],GraphBuffer[idx+56],GraphBuffer[idx+57],GraphBuffer[idx+58],GraphBuffer[idx+59],GraphBuffer[idx+60],GraphBuffer[idx+61],GraphBuffer[idx+62],GraphBuffer[idx+63]);
-
- uint32_t code = bytebits_to_byte(GraphBuffer+idx,32);
- uint32_t code2 = bytebits_to_byte(GraphBuffer+idx+32,32);
- short version = bytebits_to_byte(GraphBuffer+idx+27,8); //14,4
- uint8_t facilitycode = bytebits_to_byte(GraphBuffer+idx+19,8) ;
- uint16_t number = (bytebits_to_byte(GraphBuffer+idx+36,8)<<8)|(bytebits_to_byte(GraphBuffer+idx+45,8)); //36,9
-
- PrintAndLog("XSF(%02d)%02x:%d (%08x%08x)",version,facilitycode,number,code,code2);
- ClearGraph(1);
- return 0;
- } else {
- PrintAndLog("thought we had a valid tag but did not match format");
- }
- }
- }
- if (idx >= (size-74)){
- PrintAndLog("start bits for io prox not found");
- PrintAndLog("FSK decoded bitstream:");
- // Now output the bitstream to the scrollback by line of 16 bits
- printBitStream(GraphBuffer,size);
- }
- }
- ClearGraph(1);
- return 0;
+ if (GraphTraceLen < 65) {
+ PrintAndLog("data samples size is too small");
+ return 0;
+ }
+
+ //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+ //set defaults
+ int idx = 0;
+ uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
+ uint32_t bitlen = GetFromGraphBuf(bits);
+
+ //get binary from fsk wave
+ idx = IOdemodFSK(bits, bitlen);
+
+ if (idx == 0) {
+ return 0;
+ }
+ if (idx == -1) {
+ PrintAndLog("data samples size is too small");
+ return 0;
+ }
+ if (idx == -2) {
+ PrintAndLog("Data samples has too much noice");
+ return 0;
+ }
+ if (idx == -3){
+ PrintAndLog("No good demod");
+ return 0;
+ }
+
+ if (idx+64 > bitlen) return 0;
+
+ //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 (raw)
+ //Handle the data
+
+ PrintAndLog("%d%d%d%d%d%d%d%d %d", bits[idx] , bits[idx+1], bits[idx+2], bits[idx+3], bits[idx+4], bits[idx+5], bits[idx+6], bits[idx+7], bits[idx+8]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d", bits[idx+9] , bits[idx+10], bits[idx+11], bits[idx+12], bits[idx+13], bits[idx+14], bits[idx+15], bits[idx+16], bits[idx+17]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d facility", bits[idx+18], bits[idx+19], bits[idx+20], bits[idx+21], bits[idx+22], bits[idx+23], bits[idx+24], bits[idx+25], bits[idx+26]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d version", bits[idx+27], bits[idx+28], bits[idx+29], bits[idx+30], bits[idx+31], bits[idx+32], bits[idx+33], bits[idx+34], bits[idx+35]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d code1", bits[idx+36], bits[idx+37], bits[idx+38], bits[idx+39], bits[idx+40], bits[idx+41], bits[idx+42], bits[idx+43], bits[idx+44]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d code2", bits[idx+45], bits[idx+46], bits[idx+47], bits[idx+48], bits[idx+49], bits[idx+50], bits[idx+51], bits[idx+52], bits[idx+53]);
+ PrintAndLog("%d%d%d%d%d%d%d%d %d%d checksum", bits[idx+54], bits[idx+55], bits[idx+56], bits[idx+57], bits[idx+58], bits[idx+59], bits[idx+60], bits[idx+61], bits[idx+62], bits[idx+63]);
+
+ uint32_t code = bytebits_to_byte(bits+idx,32);
+ uint32_t code2 = bytebits_to_byte(bits+idx+32,32);
+ uint8_t version = bytebits_to_byte(bits+idx+27,8); //14,4
+ uint8_t facilitycode = bytebits_to_byte(bits+idx+18,8) ;
+ uint16_t number = (bytebits_to_byte(bits+idx+36,8)<<8)|(bytebits_to_byte(bits+idx+45,8)); //36,9
+
+ PrintAndLog("XSF(%02d)%02x:%05d (%08x%08x)", version, facilitycode, number, code, code2);
+ SetGraphBuf(bits, bitlen);
+ return 1;