-/*
-int CmdFSKdemodHIDold(const char *Cmd)//not put in commands yet //old CmdFSKdemod needs updating
-{
- static const int LowTone[] = {
- 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
- 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
- 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
- 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
- 1, 1, 1, 1, 1, -1, -1, -1, -1, -1
- };
- static const int HighTone[] = {
- 1, 1, 1, 1, 1, -1, -1, -1, -1,
- 1, 1, 1, 1, -1, -1, -1, -1,
- 1, 1, 1, 1, -1, -1, -1, -1,
- 1, 1, 1, 1, -1, -1, -1, -1,
- 1, 1, 1, 1, -1, -1, -1, -1,
- 1, 1, 1, 1, -1, -1, -1, -1, -1,
- };
-
- int lowLen = sizeof (LowTone) / sizeof (int);
- int highLen = sizeof (HighTone) / sizeof (int);
- int convLen = (highLen > lowLen) ? highLen : lowLen; //if highlen > lowLen then highlen else lowlen
- uint32_t hi = 0, lo = 0;
-
- int i, j;
- int minMark = 0, maxMark = 0;
-
- for (i = 0; i < GraphTraceLen - convLen; ++i) {
- int lowSum = 0, highSum = 0;
-
- for (j = 0; j < lowLen; ++j) {
- lowSum += LowTone[j]*GraphBuffer[i+j];
- }
- for (j = 0; j < highLen; ++j) {
- highSum += HighTone[j] * GraphBuffer[i + j];
- }
- lowSum = abs(100 * lowSum / lowLen);
- highSum = abs(100 * highSum / highLen);
- GraphBuffer[i] = (highSum << 16) | lowSum;
- }
-
- for(i = 0; i < GraphTraceLen - convLen - 16; ++i) {
- int lowTot = 0, highTot = 0;
- // 10 and 8 are f_s divided by f_l and f_h, rounded
- for (j = 0; j < 10; ++j) {
- lowTot += (GraphBuffer[i+j] & 0xffff);
- }
- for (j = 0; j < 8; j++) {
- highTot += (GraphBuffer[i + j] >> 16);
- }
- GraphBuffer[i] = lowTot - highTot;
- if (GraphBuffer[i] > maxMark) maxMark = GraphBuffer[i];
- if (GraphBuffer[i] < minMark) minMark = GraphBuffer[i];
- }
-
- GraphTraceLen -= (convLen + 16);
- RepaintGraphWindow();
-
- // Find bit-sync (3 lo followed by 3 high) (HID ONLY)
- int max = 0, maxPos = 0;
- for (i = 0; i < 6000; ++i) {
- int dec = 0;
- for (j = 0; j < 3 * lowLen; ++j) {
- dec -= GraphBuffer[i + j];
- }
- for (; j < 3 * (lowLen + highLen ); ++j) {
- dec += GraphBuffer[i + j];
- }
- if (dec > max) {
- max = dec;
- maxPos = i;
- }
- }
-
- // place start of bit sync marker in graph
- GraphBuffer[maxPos] = maxMark;
- GraphBuffer[maxPos + 1] = minMark;
-
- maxPos += j;
-
- // place end of bit sync marker in graph
- GraphBuffer[maxPos] = maxMark;
- GraphBuffer[maxPos+1] = minMark;
-
- PrintAndLog("actual data bits start at sample %d", maxPos);
- PrintAndLog("length %d/%d", highLen, lowLen);
-
- uint8_t bits[46];
- bits[sizeof(bits)-1] = '\0';
-
- // find bit pairs and manchester decode them
- for (i = 0; i < arraylen(bits) - 1; ++i) {
- int dec = 0;
- for (j = 0; j < lowLen; ++j) {
- dec -= GraphBuffer[maxPos + j];
- }
- for (; j < lowLen + highLen; ++j) {
- dec += GraphBuffer[maxPos + j];
- }
- maxPos += j;
- // place inter bit marker in graph
- GraphBuffer[maxPos] = maxMark;
- GraphBuffer[maxPos + 1] = minMark;
-
- // hi and lo form a 64 bit pair
- hi = (hi << 1) | (lo >> 31);
- lo = (lo << 1);
- // store decoded bit as binary (in hi/lo) and text (in bits[])
- if(dec < 0) {
- bits[i] = '1';
- lo |= 1;
- } else {
- bits[i] = '0';
- }
- }
- PrintAndLog("bits: '%s'", bits);
- PrintAndLog("hex: %08x %08x", hi, lo);
- return 0;
-}
-*/
+
+//by marshmellow
+//Pyramid Prox demod - FSK RF/50 with preamble of 0000000000000001 (always a 128 bit data stream)
+//print full Farpointe Data/Pyramid Prox ID and some bit format details if found
+int CmdFSKdemodPyramid(const char *Cmd)
+{
+ //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+ size_t size = getFromGraphBuf(BitStream);
+ if (size==0) return 0;
+
+ //get binary from fsk wave
+ int idx = PyramiddemodFSK(BitStream, &size);
+ if (idx < 0){
+ if (g_debugMode==1){
+ if (idx == -5)
+ PrintAndLog("DEBUG: Error - not enough samples");
+ else if (idx == -1)
+ PrintAndLog("DEBUG: Error - only noise found");
+ else if (idx == -2)
+ PrintAndLog("DEBUG: Error - problem during FSK demod");
+ else if (idx == -3)
+ PrintAndLog("DEBUG: Error - Size not correct: %d", size);
+ else if (idx == -4)
+ PrintAndLog("DEBUG: Error - Pyramid preamble not found");
+ else
+ PrintAndLog("DEBUG: Error - idx: %d",idx);
+ }
+ return 0;
+ }
+ // Index map
+ // 0 10 20 30 40 50 60
+ // | | | | | | |
+ // 0123456 7 8901234 5 6789012 3 4567890 1 2345678 9 0123456 7 8901234 5 6789012 3
+ // -----------------------------------------------------------------------------
+ // 0000000 0 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1
+ // premable xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o
+
+ // 64 70 80 90 100 110 120
+ // | | | | | | |
+ // 4567890 1 2345678 9 0123456 7 8901234 5 6789012 3 4567890 1 2345678 9 0123456 7
+ // -----------------------------------------------------------------------------
+ // 0000000 1 0000000 1 0000000 1 0110111 0 0011000 1 0000001 0 0001100 1 1001010 0
+ // xxxxxxx o xxxxxxx o xxxxxxx o xswffff o ffffccc o ccccccc o ccccccw o ppppppp o
+ // |---115---||---------71---------|
+ // s = format start bit, o = odd parity of last 7 bits
+ // f = facility code, c = card number
+ // w = wiegand parity, x = extra space for other formats
+ // p = unknown checksum
+ // (26 bit format shown)
+
+ //get bytes for checksum calc
+ uint8_t checksum = bytebits_to_byte(BitStream + idx + 120, 8);
+ uint8_t csBuff[14] = {0x00};
+ for (uint8_t i = 0; i < 13; i++){
+ csBuff[i] = bytebits_to_byte(BitStream + idx + 16 + (i*8), 8);
+ }
+ //check checksum calc
+ //checksum calc thanks to ICEMAN!!
+ uint32_t checkCS = CRC8Maxim(csBuff,13);
+
+ //get raw ID before removing parities
+ uint32_t rawLo = bytebits_to_byte(BitStream+idx+96,32);
+ uint32_t rawHi = bytebits_to_byte(BitStream+idx+64,32);
+ uint32_t rawHi2 = bytebits_to_byte(BitStream+idx+32,32);
+ uint32_t rawHi3 = bytebits_to_byte(BitStream+idx,32);
+ setDemodBuf(BitStream,128,idx);
+
+ size = removeParity(BitStream, idx+8, 8, 1, 120);
+ if (size != 105){
+ if (g_debugMode==1)
+ PrintAndLog("DEBUG: Error at parity check - tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
+ return 0;
+ }
+
+ // ok valid card found!
+
+ // Index map
+ // 0 10 20 30 40 50 60 70
+ // | | | | | | | |
+ // 01234567890123456789012345678901234567890123456789012345678901234567890
+ // -----------------------------------------------------------------------
+ // 00000000000000000000000000000000000000000000000000000000000000000000000
+ // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+ // 71 80 90 100
+ // | | | |
+ // 1 2 34567890 1234567890123456 7 8901234
+ // ---------------------------------------
+ // 1 1 01110011 0000000001000110 0 1001010
+ // s w ffffffff cccccccccccccccc w ppppppp
+ // |--115-| |------71------|
+ // s = format start bit, o = odd parity of last 7 bits
+ // f = facility code, c = card number
+ // w = wiegand parity, x = extra space for other formats
+ // p = unknown checksum
+ // (26 bit format shown)
+
+ //find start bit to get fmtLen
+ int j;
+ for (j=0; j<size; j++){
+ if(BitStream[j]) break;
+ }
+ uint8_t fmtLen = size-j-8;
+ uint32_t fc = 0;
+ uint32_t cardnum = 0;
+ uint32_t code1 = 0;
+ //uint32_t code2 = 0;
+ if (fmtLen==26){
+ fc = bytebits_to_byte(BitStream+73, 8);
+ cardnum = bytebits_to_byte(BitStream+81, 16);
+ code1 = bytebits_to_byte(BitStream+72,fmtLen);
+ PrintAndLog("Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi3, rawHi2, rawHi, rawLo);
+ } else if (fmtLen==45){
+ fmtLen=42; //end = 10 bits not 7 like 26 bit fmt
+ fc = bytebits_to_byte(BitStream+53, 10);
+ cardnum = bytebits_to_byte(BitStream+63, 32);
+ PrintAndLog("Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+ } else {
+ cardnum = bytebits_to_byte(BitStream+81, 16);
+ if (fmtLen>32){
+ //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen-32);
+ //code2 = bytebits_to_byte(BitStream+(size-32),32);
+ PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+ } else{
+ //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen);
+ PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+ }
+ }
+ if (checksum == checkCS)
+ PrintAndLog("Checksum %02x passed", checksum);
+ else
+ PrintAndLog("Checksum %02x failed - should have been %02x", checksum, checkCS);
+
+ if (g_debugMode){
+ PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, 128);
+ printDemodBuff();
+ }
+ return 1;
+}
+
+int CmdFSKdemod(const char *Cmd) //old CmdFSKdemod needs updating
+{
+ static const int LowTone[] = {
+ 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
+ 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
+ 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
+ 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
+ 1, 1, 1, 1, 1, -1, -1, -1, -1, -1
+ };
+ static const int HighTone[] = {
+ 1, 1, 1, 1, 1, -1, -1, -1, -1,
+ 1, 1, 1, 1, -1, -1, -1, -1,
+ 1, 1, 1, 1, -1, -1, -1, -1,
+ 1, 1, 1, 1, -1, -1, -1, -1,
+ 1, 1, 1, 1, -1, -1, -1, -1,
+ 1, 1, 1, 1, -1, -1, -1, -1, -1,
+ };
+
+ int lowLen = sizeof (LowTone) / sizeof (int);
+ int highLen = sizeof (HighTone) / sizeof (int);
+ int convLen = (highLen > lowLen) ? highLen : lowLen;
+ uint32_t hi = 0, lo = 0;
+
+ int i, j;
+ int minMark = 0, maxMark = 0;
+
+ for (i = 0; i < GraphTraceLen - convLen; ++i) {
+ int lowSum = 0, highSum = 0;
+
+ for (j = 0; j < lowLen; ++j) {
+ lowSum += LowTone[j]*GraphBuffer[i+j];
+ }
+ for (j = 0; j < highLen; ++j) {
+ highSum += HighTone[j] * GraphBuffer[i + j];
+ }
+ lowSum = abs(100 * lowSum / lowLen);
+ highSum = abs(100 * highSum / highLen);
+ GraphBuffer[i] = (highSum << 16) | lowSum;
+ }
+
+ for(i = 0; i < GraphTraceLen - convLen - 16; ++i) {
+ int lowTot = 0, highTot = 0;
+ // 10 and 8 are f_s divided by f_l and f_h, rounded
+ for (j = 0; j < 10; ++j) {
+ lowTot += (GraphBuffer[i+j] & 0xffff);
+ }
+ for (j = 0; j < 8; j++) {
+ highTot += (GraphBuffer[i + j] >> 16);
+ }
+ GraphBuffer[i] = lowTot - highTot;
+ if (GraphBuffer[i] > maxMark) maxMark = GraphBuffer[i];
+ if (GraphBuffer[i] < minMark) minMark = GraphBuffer[i];
+ }
+
+ GraphTraceLen -= (convLen + 16);
+ RepaintGraphWindow();
+
+ // Find bit-sync (3 lo followed by 3 high) (HID ONLY)
+ int max = 0, maxPos = 0;
+ for (i = 0; i < 6000; ++i) {
+ int dec = 0;
+ for (j = 0; j < 3 * lowLen; ++j) {
+ dec -= GraphBuffer[i + j];
+ }
+ for (; j < 3 * (lowLen + highLen ); ++j) {
+ dec += GraphBuffer[i + j];
+ }
+ if (dec > max) {
+ max = dec;
+ maxPos = i;
+ }
+ }
+
+ // place start of bit sync marker in graph
+ GraphBuffer[maxPos] = maxMark;
+ GraphBuffer[maxPos + 1] = minMark;
+
+ maxPos += j;
+
+ // place end of bit sync marker in graph
+ GraphBuffer[maxPos] = maxMark;
+ GraphBuffer[maxPos+1] = minMark;
+
+ PrintAndLog("actual data bits start at sample %d", maxPos);
+ PrintAndLog("length %d/%d", highLen, lowLen);
+
+ uint8_t bits[46] = {0x00};
+
+ // find bit pairs and manchester decode them
+ for (i = 0; i < arraylen(bits) - 1; ++i) {
+ int dec = 0;
+ for (j = 0; j < lowLen; ++j) {
+ dec -= GraphBuffer[maxPos + j];
+ }
+ for (; j < lowLen + highLen; ++j) {
+ dec += GraphBuffer[maxPos + j];
+ }
+ maxPos += j;
+ // place inter bit marker in graph
+ GraphBuffer[maxPos] = maxMark;
+ GraphBuffer[maxPos + 1] = minMark;
+
+ // hi and lo form a 64 bit pair
+ hi = (hi << 1) | (lo >> 31);
+ lo = (lo << 1);
+ // store decoded bit as binary (in hi/lo) and text (in bits[])
+ if(dec < 0) {
+ bits[i] = '1';
+ lo |= 1;
+ } else {
+ bits[i] = '0';
+ }
+ }
+ PrintAndLog("bits: '%s'", bits);
+ PrintAndLog("hex: %08x %08x", hi, lo);
+ return 0;
+}
+
+//by marshmellow
+//attempt to psk1 demod graph buffer
+int PSKDemod(const char *Cmd, bool verbose)
+{
+ int invert=0;
+ int clk=0;
+ int maxErr=100;
+ sscanf(Cmd, "%i %i %i", &clk, &invert, &maxErr);
+ if (clk==1){
+ invert=1;
+ clk=0;
+ }
+ if (invert != 0 && invert != 1) {
+ if (verbose) PrintAndLog("Invalid argument: %s", Cmd);
+ return 0;
+ }
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+ size_t BitLen = getFromGraphBuf(BitStream);
+ if (BitLen==0) return -1;
+ uint8_t carrier=countPSK_FC(BitStream, BitLen);
+ if (carrier!=2 && carrier!=4 && carrier!=8){
+ //invalid carrier
+ return 0;
+ }
+ int errCnt=0;
+ errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
+ if (errCnt > maxErr){
+ if (g_debugMode==1 && verbose) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
+ return 0;
+ }
+ if (errCnt<0|| BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first)
+ if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
+ return 0;
+ }
+ if (verbose){
+ PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+ if (errCnt>0){
+ PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
+ }
+ }
+ //prime demod buffer for output
+ setDemodBuf(BitStream,BitLen,0);
+ return 1;
+}
+
+// Indala 26 bit decode
+// by marshmellow
+// optional arguments - same as CmdpskNRZrawDemod (clock & invert)
+int CmdIndalaDecode(const char *Cmd)
+{
+ int ans;
+ if (strlen(Cmd)>0){
+ ans = PSKDemod(Cmd, 0);
+ } else{ //default to RF/32
+ ans = PSKDemod("32", 0);
+ }
+
+ if (!ans){
+ if (g_debugMode==1)
+ PrintAndLog("Error1: %d",ans);
+ return 0;
+ }
+ uint8_t invert=0;
+ ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert);
+ if (ans < 1) {
+ if (g_debugMode==1)
+ PrintAndLog("Error2: %d",ans);
+ return -1;
+ }
+ char showbits[251]={0x00};
+ if (invert)
+ if (g_debugMode==1)
+ PrintAndLog("Had to invert bits");
+
+ //convert UID to HEX
+ uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
+ int idx;
+ uid1=0;
+ uid2=0;
+ PrintAndLog("BitLen: %d",DemodBufferLen);
+ if (DemodBufferLen==64){
+ for( idx=0; idx<64; idx++) {
+ uid1=(uid1<<1)|(uid2>>31);
+ if (DemodBuffer[idx] == 0) {
+ uid2=(uid2<<1)|0;
+ showbits[idx]='0';
+ } else {
+ uid2=(uid2<<1)|1;
+ showbits[idx]='1';
+ }
+ }
+ showbits[idx]='\0';
+ PrintAndLog("Indala UID=%s (%x%08x)", showbits, uid1, uid2);
+ }
+ else {
+ uid3=0;
+ uid4=0;
+ uid5=0;
+ uid6=0;
+ uid7=0;
+ for( idx=0; idx<DemodBufferLen; idx++) {
+ uid1=(uid1<<1)|(uid2>>31);
+ uid2=(uid2<<1)|(uid3>>31);
+ uid3=(uid3<<1)|(uid4>>31);
+ uid4=(uid4<<1)|(uid5>>31);
+ uid5=(uid5<<1)|(uid6>>31);
+ uid6=(uid6<<1)|(uid7>>31);
+ if (DemodBuffer[idx] == 0) {
+ uid7=(uid7<<1)|0;
+ showbits[idx]='0';
+ }
+ else {
+ uid7=(uid7<<1)|1;
+ showbits[idx]='1';
+ }
+ }
+ showbits[idx]='\0';
+ PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
+ }
+ if (g_debugMode){
+ PrintAndLog("DEBUG: printing demodbuffer:");
+ printDemodBuff();
+ }
+ return 1;
+}
+
+// by marshmellow
+// takes 3 arguments - clock, invert, maxErr as integers
+// attempts to demodulate nrz only
+// prints binary found and saves in demodbuffer for further commands
+
+int NRZrawDemod(const char *Cmd, bool verbose)
+{
+ int invert=0;
+ int clk=0;
+ int maxErr=100;
+ sscanf(Cmd, "%i %i %i", &clk, &invert, &maxErr);
+ if (clk==1){
+ invert=1;
+ clk=0;
+ }
+ if (invert != 0 && invert != 1) {
+ PrintAndLog("Invalid argument: %s", Cmd);
+ return 0;
+ }
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+ size_t BitLen = getFromGraphBuf(BitStream);
+ if (BitLen==0) return 0;
+ int errCnt=0;
+ errCnt = nrzRawDemod(BitStream, &BitLen, &clk, &invert, maxErr);
+ if (errCnt > maxErr){
+ if (g_debugMode) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
+ return 0;
+ }
+ if (errCnt<0|| BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first)
+ if (g_debugMode) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
+ return 0;
+ }
+ if (verbose || g_debugMode) PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+ //prime demod buffer for output
+ setDemodBuf(BitStream,BitLen,0);
+
+ if (errCnt>0 && (verbose || g_debugMode)) PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
+ if (verbose || g_debugMode) {
+ PrintAndLog("NRZ demoded bitstream:");
+ // Now output the bitstream to the scrollback by line of 16 bits
+ printDemodBuff();
+ }
+ return 1;
+}
+
+int CmdNRZrawDemod(const char *Cmd)
+{
+ char cmdp = param_getchar(Cmd, 0);
+ if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
+ PrintAndLog("Usage: data rawdemod nr [clock] <0|1> [maxError]");
+ PrintAndLog(" [set clock as integer] optional, if not set, autodetect.");
+ PrintAndLog(" <invert>, 1 for invert output");
+ PrintAndLog(" [set maximum allowed errors], default = 100.");
+ PrintAndLog("");
+ PrintAndLog(" sample: data rawdemod nr = demod a nrz/direct tag from GraphBuffer");
+ PrintAndLog(" : data rawdemod nr 32 = demod a nrz/direct tag from GraphBuffer using a clock of RF/32");
+ PrintAndLog(" : data rawdemod nr 32 1 = demod a nrz/direct tag from GraphBuffer using a clock of RF/32 and inverting data");
+ PrintAndLog(" : data rawdemod nr 1 = demod a nrz/direct tag from GraphBuffer while inverting data");
+ PrintAndLog(" : data rawdemod nr 64 1 0 = demod a nrz/direct tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors");
+ return 0;
+ }
+ return NRZrawDemod(Cmd, TRUE);
+}
+
+// by marshmellow
+// takes 3 arguments - clock, invert, maxErr as integers
+// attempts to demodulate psk only
+// prints binary found and saves in demodbuffer for further commands
+int CmdPSK1rawDemod(const char *Cmd)
+{
+ int ans;
+ char cmdp = param_getchar(Cmd, 0);
+ if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
+ PrintAndLog("Usage: data rawdemod p1 [clock] <0|1> [maxError]");
+ PrintAndLog(" [set clock as integer] optional, if not set, autodetect.");
+ PrintAndLog(" <invert>, 1 for invert output");
+ PrintAndLog(" [set maximum allowed errors], default = 100.");
+ PrintAndLog("");
+ PrintAndLog(" sample: data rawdemod p1 = demod a psk1 tag from GraphBuffer");
+ PrintAndLog(" : data rawdemod p1 32 = demod a psk1 tag from GraphBuffer using a clock of RF/32");
+ PrintAndLog(" : data rawdemod p1 32 1 = demod a psk1 tag from GraphBuffer using a clock of RF/32 and inverting data");
+ PrintAndLog(" : data rawdemod p1 1 = demod a psk1 tag from GraphBuffer while inverting data");
+ PrintAndLog(" : data rawdemod p1 64 1 0 = demod a psk1 tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors");
+ return 0;
+ }
+ ans = PSKDemod(Cmd, TRUE);
+ //output
+ if (!ans){
+ if (g_debugMode) PrintAndLog("Error demoding: %d",ans);
+ return 0;
+ }
+
+ PrintAndLog("PSK demoded bitstream:");
+ // Now output the bitstream to the scrollback by line of 16 bits
+ printDemodBuff();
+ return 1;
+}
+
+// by marshmellow
+// takes same args as cmdpsk1rawdemod
+int CmdPSK2rawDemod(const char *Cmd)
+{
+ int ans=0;
+ char cmdp = param_getchar(Cmd, 0);
+ if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
+ PrintAndLog("Usage: data rawdemod p2 [clock] <0|1> [maxError]");
+ PrintAndLog(" [set clock as integer] optional, if not set, autodetect.");
+ PrintAndLog(" <invert>, 1 for invert output");
+ PrintAndLog(" [set maximum allowed errors], default = 100.");
+ PrintAndLog("");
+ PrintAndLog(" sample: data rawdemod p2 = demod a psk2 tag from GraphBuffer, autodetect clock");
+ PrintAndLog(" : data rawdemod p2 32 = demod a psk2 tag from GraphBuffer using a clock of RF/32");
+ PrintAndLog(" : data rawdemod p2 32 1 = demod a psk2 tag from GraphBuffer using a clock of RF/32 and inverting output");
+ PrintAndLog(" : data rawdemod p2 1 = demod a psk2 tag from GraphBuffer, autodetect clock and invert output");
+ PrintAndLog(" : data rawdemod p2 64 1 0 = demod a psk2 tag from GraphBuffer using a clock of RF/64, inverting output and allowing 0 demod errors");
+ return 0;
+ }
+ ans=PSKDemod(Cmd, TRUE);
+ if (!ans){
+ if (g_debugMode) PrintAndLog("Error demoding: %d",ans);
+ return 0;
+ }
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);
+ PrintAndLog("PSK2 demoded bitstream:");
+ // Now output the bitstream to the scrollback by line of 16 bits
+ printDemodBuff();
+ return 1;
+}
+
+// by marshmellow - combines all raw demod functions into one menu command
+int CmdRawDemod(const char *Cmd)
+{
+ char cmdp = Cmd[0]; //param_getchar(Cmd, 0);
+
+ if (strlen(Cmd) > 14 || cmdp == 'h' || cmdp == 'H' || strlen(Cmd)<2) {
+ PrintAndLog("Usage: data rawdemod [modulation] <help>|<options>");
+ PrintAndLog(" [modulation] as 2 char, 'ab' for ask/biphase, 'am' for ask/manchester, 'ar' for ask/raw, 'fs' for fsk, ...");
+ PrintAndLog(" 'nr' for nrz/direct, 'p1' for psk1, 'p2' for psk2");
+ PrintAndLog(" <help> as 'h', prints the help for the specific modulation");
+ PrintAndLog(" <options> see specific modulation help for optional parameters");
+ PrintAndLog("");
+ PrintAndLog(" sample: data rawdemod fs h = print help specific to fsk demod");
+ PrintAndLog(" : data rawdemod fs = demod GraphBuffer using: fsk - autodetect");
+ PrintAndLog(" : data rawdemod ab = demod GraphBuffer using: ask/biphase - autodetect");
+ PrintAndLog(" : data rawdemod am = demod GraphBuffer using: ask/manchester - autodetect");
+ PrintAndLog(" : data rawdemod ar = demod GraphBuffer using: ask/raw - autodetect");
+ PrintAndLog(" : data rawdemod nr = demod GraphBuffer using: nrz/direct - autodetect");
+ PrintAndLog(" : data rawdemod p1 = demod GraphBuffer using: psk1 - autodetect");
+ PrintAndLog(" : data rawdemod p2 = demod GraphBuffer using: psk2 - autodetect");
+ return 0;
+ }
+ char cmdp2 = Cmd[1];
+ int ans = 0;
+ if (cmdp == 'f' && cmdp2 == 's'){
+ ans = CmdFSKrawdemod(Cmd+3);
+ } else if(cmdp == 'a' && cmdp2 == 'b'){
+ ans = Cmdaskbiphdemod(Cmd+3);
+ } else if(cmdp == 'a' && cmdp2 == 'm'){
+ ans = Cmdaskmandemod(Cmd+3);
+ } else if(cmdp == 'a' && cmdp2 == 'r'){
+ ans = Cmdaskrawdemod(Cmd+3);
+ } else if(cmdp == 'n' && cmdp2 == 'r'){
+ ans = CmdNRZrawDemod(Cmd+3);
+ } else if(cmdp == 'p' && cmdp2 == '1'){
+ ans = CmdPSK1rawDemod(Cmd+3);
+ } else if(cmdp == 'p' && cmdp2 == '2'){
+ ans = CmdPSK2rawDemod(Cmd+3);
+ } else {
+ PrintAndLog("unknown modulation entered - see help ('h') for parameter structure");
+ }
+ return ans;
+}
+