{
//raw fsk demod no manchester decoding no start bit finding just get binary from wave
uint8_t rfLen, invert, fchigh, fclow;
-
//set defaults
//set options from parameters entered with the command
- rfLen = param_get8ex(Cmd, 0, 0, 10);
- invert = param_get8ex(Cmd, 1, 0, 10);
- fchigh = param_get8ex(Cmd, 2, 0, 10);
- fclow = param_get8ex(Cmd, 3, 0, 10);
-
+ rfLen = param_get8(Cmd, 0);
+ invert = param_get8(Cmd, 1);
+ fchigh = param_get8(Cmd, 2);
+ fclow = param_get8(Cmd, 3);
if (strlen(Cmd)>0 && strlen(Cmd)<=2) {
if (rfLen==1){
invert = 1; //if invert option only is used
rfLen = 0;
}
}
-
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
size_t BitLen = getFromGraphBuf(BitStream);
if (BitLen==0) return 0;
//get field clock lengths
- uint16_t fcs=0;
+ uint8_t fc1=0, fc2=0, rf1=0;
if (!fchigh || !fclow) {
- fcs = countFC(BitStream, BitLen, 1);
- if (!fcs) {
- fchigh = 10;
- fclow = 8;
- } else {
- fchigh = (fcs >> 8) & 0x00FF;
- fclow = fcs & 0x00FF;
+ uint8_t ans = fskClocks(&fc1, &fc2, &rf1, false);
+ if (ans == 0) {
+ if (g_debugMode) PrintAndLog("\nError: cannot detect valid fsk field clocks");
+ return 0; // can't detect field clock
}
+ fchigh = fc1;
+ fclow = fc2;
+ if (rfLen == 0) rfLen = rf1;
}
//get bit clock length
if (!rfLen){
// Now output the bitstream to the scrollback by line of 16 bits
if (verbose || g_debugMode) {
- PrintAndLog("\nUsing Clock:%u, invert:%u, fchigh:%u, fclow:%u", rfLen, invert, fchigh, fclow);
+ PrintAndLog("\nUsing Clock:%d, invert:%d, fchigh:%d, fclow:%d", rfLen, invert, fchigh, fclow);
PrintAndLog("%s decoded bitstream:",GetFSKType(fchigh,fclow,invert));
printDemodBuff();
}
uint8_t bitRate = 0;\r
uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};\r
uint8_t cmdp = 0;\r
- config.Q5 = FALSE;\r
bool errors = FALSE;\r
while(param_getchar(Cmd, cmdp) != 0x00 && !errors)\r
{\r
\r
if (GetFskClock("", FALSE, FALSE)){ \r
fskClocks(&fc1, &fc2, &clk, FALSE);\r
- if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)){\r
+ if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
tests[hits].modulation = DEMOD_FSK;\r
if (fc1==8 && fc2 == 5)\r
tests[hits].modulation = DEMOD_FSK1a;\r
tests[hits].modulation = DEMOD_FSK1;\r
else if (fc1 == 10 && fc2 == 8)\r
tests[hits].modulation = DEMOD_FSK2a;\r
-\r
tests[hits].bitrate = bitRate;\r
tests[hits].inverted = TRUE;\r
tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
config.inverted = tests[0].inverted;\r
config.offset = tests[0].offset;\r
config.block0 = tests[0].block0;\r
+ config.Q5 = tests[0].Q5;\r
printConfiguration( config );\r
return TRUE;\r
}\r
return FALSE;\r
}\r
\r
+int convertQ5bitRate(uint8_t bitRateRead) {\r
+ uint8_t expected[] = {8, 16, 32, 40, 50, 64, 100, 128};\r
+ for (int i=0; i<8; i++)\r
+ if (expected[i] == bitRateRead)\r
+ return i;\r
+\r
+ return -1;\r
+}\r
+\r
bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){\r
\r
if ( DemodBufferLen < 64 ) return FALSE;\r
uint8_t safer = PackBits(si, 4, DemodBuffer); si += 4; //master key\r
uint8_t resv = PackBits(si, 8, DemodBuffer); si += 8;\r
// 2nibble must be zeroed.\r
- if (safer != 0x6) continue;\r
+ if (safer != 0x6 && safer != 0x9) continue;\r
if ( resv > 0x00) continue;\r
//uint8_t pageSel = PackBits(si, 1, DemodBuffer); si += 1;\r
//uint8_t fastWrite = PackBits(si, 1, DemodBuffer); si += 1;\r
si += 1+1;\r
- int bitRate = PackBits(si, 5, DemodBuffer)*2 + 2; si += 5; //bit rate\r
+ int bitRate = PackBits(si, 6, DemodBuffer)*2 + 2; si += 6; //bit rate\r
if (bitRate > 128 || bitRate < 8) continue;\r
\r
//uint8_t AOR = PackBits(si, 1, DemodBuffer); si += 1; \r
//test modulation\r
if (!testQ5Modulation(mode, modread)) continue;\r
if (bitRate != clk) continue;\r
- *fndBitRate = bitRate;\r
+ *fndBitRate = convertQ5bitRate(bitRate);\r
+ if (*fndBitRate < 0) continue;\r
*offset = idx;\r
\r
return TRUE;\r
return 1;\r
}\r
\r
-char * GetBitRateStr(uint32_t id){\r
- static char buf[25];\r
+char * GetBitRateStr(uint32_t id) {\r
+ static char buf[25];\r
\r
char *retStr = buf;\r
- switch (id){\r
- case 0: \r
- snprintf(retStr,sizeof(buf),"%d - RF/8",id);\r
- break;\r
- case 1:\r
- snprintf(retStr,sizeof(buf),"%d - RF/16",id);\r
- break;\r
- case 2: \r
- snprintf(retStr,sizeof(buf),"%d - RF/32",id);\r
- break;\r
- case 3:\r
- snprintf(retStr,sizeof(buf),"%d - RF/40",id);\r
- break;\r
- case 4:\r
- snprintf(retStr,sizeof(buf),"%d - RF/50",id);\r
- break;\r
- case 5:\r
- snprintf(retStr,sizeof(buf),"%d - RF/64",id);\r
- break;\r
- case 6:\r
- snprintf(retStr,sizeof(buf),"%d - RF/100",id);\r
- break;\r
- case 7:\r
- snprintf(retStr,sizeof(buf),"%d - RF/128",id);\r
- break;\r
- default:\r
- snprintf(retStr,sizeof(buf),"%d - (Unknown)",id);\r
- break;\r
- }\r
-\r
+ switch (id) {\r
+ case 0: snprintf(retStr,sizeof(buf),"%d - RF/8",id); break;\r
+ case 1: snprintf(retStr,sizeof(buf),"%d - RF/16",id); break;\r
+ case 2: snprintf(retStr,sizeof(buf),"%d - RF/32",id); break;\r
+ case 3: snprintf(retStr,sizeof(buf),"%d - RF/40",id); break;\r
+ case 4: snprintf(retStr,sizeof(buf),"%d - RF/50",id); break;\r
+ case 5: snprintf(retStr,sizeof(buf),"%d - RF/64",id); break;\r
+ case 6: snprintf(retStr,sizeof(buf),"%d - RF/100",id); break;\r
+ case 7: snprintf(retStr,sizeof(buf),"%d - RF/128",id); break;\r
+ default: snprintf(retStr,sizeof(buf),"%d - (Unknown)",id); break;\r
+ }\r
return buf;\r
}\r
\r
-char * GetSaferStr(uint32_t id){\r
+char * GetSaferStr(uint32_t id) {\r
static char buf[40];\r
char *retStr = buf;\r
\r