+{
+ //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+ //set defaults
+ uint8_t rfLen = 50;
+ uint8_t invert=0;
+ //set options from parameters entered with the command
+ if (strlen(Cmd)>0 && strlen(Cmd)<=2) {
+ rfLen=param_get8(Cmd, 0); //if rfLen option only is used
+ if (rfLen==1){
+ invert=1; //if invert option only is used
+ rfLen = 50;
+ } else if(rfLen==0) rfLen=50;
+ }
+ if (strlen(Cmd)>2) {
+ rfLen=param_get8(Cmd, 0); //if both options are used
+ invert=param_get8(Cmd,1);
+ }
+ PrintAndLog("Args invert: %d \nClock:%d",invert,rfLen);
+
+ size_t size = fskdemod(rfLen,invert);
+
+ PrintAndLog("FSK decoded bitstream:");
+ // Now output the bitstream to the scrollback by line of 16 bits
+ if(size > (7*32)+2) size = (7*32)+2; //only output a max of 7 blocks of 32 bits most tags will have full bit stream inside that sample size
+
+ for (int i = 2; i < (size-16); i+=16) {
+ PrintAndLog("%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i",
+ GraphBuffer[i],
+ GraphBuffer[i+1],
+ GraphBuffer[i+2],
+ GraphBuffer[i+3],
+ GraphBuffer[i+4],
+ GraphBuffer[i+5],
+ GraphBuffer[i+6],
+ GraphBuffer[i+7],
+ GraphBuffer[i+8],
+ GraphBuffer[i+9],
+ GraphBuffer[i+10],
+ GraphBuffer[i+11],
+ GraphBuffer[i+12],
+ GraphBuffer[i+13],
+ GraphBuffer[i+14],
+ GraphBuffer[i+15]);
+ }
+ ClearGraph(1);
+ return 0;
+}
+
+int CmdFSKdemodHID(const char *Cmd)
+{
+ //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+ //set defaults
+ uint8_t rfLen = 50;
+ uint8_t invert=0;//param_get8(Cmd, 0);
+ size_t idx=0;
+ uint32_t hi2=0, hi=0, lo=0;
+
+ //get binary from fsk wave
+ size_t size = fskdemod(rfLen,invert);
+
+ // final loop, go over previously decoded fsk data and now manchester decode into usable tag ID
+ // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0
+ int frame_marker_mask[] = {1,1,1,0,0,0};
+ int numshifts = 0;
+ idx = 0;
+ while( idx + 6 < size) {
+ // search for a start of frame marker
+
+ if ( memcmp(GraphBuffer+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0)
+ { // frame marker found
+ idx+=6;//sizeof(frame_marker_mask); //size of int is >6
+ while(GraphBuffer[idx] != GraphBuffer[idx+1] && idx < size-2)
+ {
+ // Keep going until next frame marker (or error)
+ // Shift in a bit. Start by shifting high registers
+ hi2 = (hi2<<1)|(hi>>31);
+ hi = (hi<<1)|(lo>>31);
+ //Then, shift in a 0 or one into low
+ if (GraphBuffer[idx] && !GraphBuffer[idx+1]) // 1 0
+ lo=(lo<<1)|0;
+ else // 0 1
+ lo=(lo<<1)|1;
+ numshifts++;
+ idx += 2;
+ }
+
+ //PrintAndLog("Num shifts: %d ", numshifts);
+ // Hopefully, we read a tag and hit upon the next frame marker
+ if(idx + 6 < size)
+ {
+ if ( memcmp(GraphBuffer+(idx), frame_marker_mask, sizeof(frame_marker_mask)) == 0)
+ {
+ if (hi2 != 0){ //extra large HID tags
+ PrintAndLog("TAG ID: %x%08x%08x (%d)",
+ (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
+ }
+ else { //standard HID tags <38 bits
+ //Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd
+ uint8_t bitlen = 0;
+ uint32_t fc = 0;
+ uint32_t cardnum = 0;
+ if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
+ uint32_t lo2=0;
+ lo2=(((hi & 15) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
+ uint8_t idx3 = 1;
+ while(lo2>1){ //find last bit set to 1 (format len bit)
+ lo2=lo2>>1;
+ idx3++;
+ }
+ bitlen =idx3+19;
+ fc =0;
+ cardnum=0;
+ if(bitlen==26){
+ cardnum = (lo>>1)&0xFFFF;
+ fc = (lo>>17)&0xFF;
+ }
+ if(bitlen==37){
+ cardnum = (lo>>1)&0x7FFFF;
+ fc = ((hi&0xF)<<12)|(lo>>20);
+ }
+ if(bitlen==34){
+ cardnum = (lo>>1)&0xFFFF;
+ fc= ((hi&1)<<15)|(lo>>17);
+ }
+ if(bitlen==35){
+ cardnum = (lo>>1)&0xFFFFF;
+ fc = ((hi&1)<<11)|(lo>>21);
+ }
+ }
+ else { //if bit 38 is not set then 37 bit format is used
+ bitlen= 37;
+ fc =0;
+ cardnum=0;
+ if(bitlen==37){
+ cardnum = (lo>>1)&0x7FFFF;
+ fc = ((hi&0xF)<<12)|(lo>>20);
+ }
+ }
+
+ PrintAndLog("TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
+ (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
+ (unsigned int) bitlen, (unsigned int) fc, (unsigned int) cardnum);
+ ClearGraph(1);
+ return 0;
+ }
+ }
+ }
+ // reset
+ hi2 = hi = lo = 0;
+ numshifts = 0;
+ }else
+ {
+ idx++;
+ }
+ }
+ if (idx + sizeof(frame_marker_mask) >= size){
+ PrintAndLog("start bits for hid not found");
+ PrintAndLog("FSK decoded bitstream:");
+ // Now output the bitstream to the scrollback by line of 16 bits
+ if(size > (7*32)+2) size = (7*32)+2; //only output a max of 7 blocks of 32 bits most tags will have full bit stream inside that sample size
+
+ for (int i = 2; i < (size-16); i+=16) {
+ PrintAndLog("%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i",
+ GraphBuffer[i],
+ GraphBuffer[i+1],
+ GraphBuffer[i+2],
+ GraphBuffer[i+3],
+ GraphBuffer[i+4],
+ GraphBuffer[i+5],
+ GraphBuffer[i+6],
+ GraphBuffer[i+7],
+ GraphBuffer[i+8],
+ GraphBuffer[i+9],
+ GraphBuffer[i+10],
+ GraphBuffer[i+11],
+ GraphBuffer[i+12],
+ GraphBuffer[i+13],
+ GraphBuffer[i+14],
+ GraphBuffer[i+15]);
+ }
+ }
+ ClearGraph(1);
+ return 0;
+}
+
+
+int CmdFSKdemodIO(const char *Cmd)
+{
+ //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
+ if(size > (7*32)+2) size = (7*32)+2; //only output a max of 7 blocks of 32 bits most tags will have full bit stream inside that sample size
+
+ for (int i = 2; i < (size-16); i+=16) {
+ PrintAndLog("%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i",
+ GraphBuffer[i],
+ GraphBuffer[i+1],
+ GraphBuffer[i+2],
+ GraphBuffer[i+3],
+ GraphBuffer[i+4],
+ GraphBuffer[i+5],
+ GraphBuffer[i+6],
+ GraphBuffer[i+7],
+ GraphBuffer[i+8],
+ GraphBuffer[i+9],
+ GraphBuffer[i+10],
+ GraphBuffer[i+11],
+ GraphBuffer[i+12],
+ GraphBuffer[i+13],
+ GraphBuffer[i+14],
+ GraphBuffer[i+15]);
+ }
+ }
+ }
+ ClearGraph(1);
+ return 0;
+}
+/*
+int CmdFSKdemodHIDold(const char *Cmd)//not put in commands yet //old CmdFSKdemod needs updating