+ switch( config.modulation ){\r
+ case DEMOD_FSK:\r
+ sprintf(cmdStr,"0 %d", config.inverted );\r
+ FSKrawDemod(cmdStr, FALSE);\r
+ break;\r
+ case DEMOD_ASK:\r
+ sprintf(cmdStr,"0 %d 1", config.inverted );\r
+ ASKmanDemod(cmdStr, FALSE, FALSE);\r
+ break;\r
+ case DEMOD_PSK1:\r
+ sprintf(cmdStr,"0 %d 1", config.inverted );\r
+ PSKDemod(cmdStr, FALSE);\r
+ break;\r
+ case DEMOD_PSK2:\r
+ sprintf(cmdStr,"0 %d 1", config.inverted );\r
+ PSKDemod(cmdStr, FALSE);\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ break;\r
+ case DEMOD_PSK3:\r
+ sprintf(cmdStr,"0 %d 1", config.inverted );\r
+ PSKDemod(cmdStr, FALSE);\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ break;\r
+ case DEMOD_NRZ:\r
+ sprintf(cmdStr,"0 %d 1", config.inverted );\r
+ NRZrawDemod(cmdStr, FALSE);\r
+ break;\r
+ case DEMOD_BI:\r
+ sprintf(cmdStr,"0 0 %d 1", config.inverted );\r
+ ASKbiphaseDemod(cmdStr, FALSE);\r
+ break;\r
+ default:\r
+ return;\r
+ }\r
+}\r
+\r
+int CmdT55xxDetect(const char *Cmd){\r
+\r
+ char cmdp = param_getchar(Cmd, 0);\r
+ \r
+ if (strlen(Cmd) > 1 || cmdp == 'h' || cmdp == 'H') \r
+ return usage_t55xx_detect();\r
+\r
+ if ( strlen(Cmd)==0)\r
+ AquireData(CONFIGURATION_BLOCK);\r
+ \r
+ if ( !tryDetectModulation() )\r
+ PrintAndLog("Could not detect modulation automatically. Try setting it manually with \'lf t55xx config\'");\r
+\r
+ return 0;\r
+}\r
+\r
+bool tryDetectModulation(){\r
+ \r
+ uint8_t hits = 0;\r
+ t55xx_conf_block_t tests[15];\r
+ \r
+ if (GetFskClock("", FALSE, FALSE)){ \r
+ if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset)){\r
+ tests[hits].modulation = DEMOD_FSK;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_FSK;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ } else {\r
+ if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test(DEMOD_ASK, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_ASK;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+\r
+ if ( ASKmanDemod("0 1 1", FALSE, FALSE) && test(DEMOD_ASK, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_ASK;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+ \r
+ if ( NRZrawDemod("0 0 1", FALSE) && test(DEMOD_NRZ, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_NRZ;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+\r
+ if ( NRZrawDemod("0 1 1", FALSE) && test(DEMOD_NRZ, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_NRZ;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+ \r
+ if ( PSKDemod("0 0 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_PSK1;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ \r
+ if ( PSKDemod("0 1 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
+ tests[hits].modulation = DEMOD_PSK1;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+\r
+ // PSK2 - needs a call to psk1TOpsk2.\r
+ if ( PSKDemod("0 0 1", FALSE)) {\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ if (test(DEMOD_PSK2, &tests[hits].offset)){\r
+ tests[hits].modulation = DEMOD_PSK2;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ }\r
+ // PSK2 - needs a call to psk1TOpsk2.\r
+ if ( PSKDemod("0 1 1", FALSE)) {\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ if (test(DEMOD_PSK2, &tests[hits].offset)){\r
+ tests[hits].modulation = DEMOD_PSK2;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ }\r
+\r
+ // PSK3 - needs a call to psk1TOpsk2.\r
+ if ( PSKDemod("0 0 1", FALSE)) {\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ if (test(DEMOD_PSK3, &tests[hits].offset)){\r
+ tests[hits].modulation = DEMOD_PSK3;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); \r
+ ++hits;\r
+ }\r
+ }\r
+ // PSK3 - needs a call to psk1TOpsk2.\r
+ if ( PSKDemod("0 1 1", FALSE)) {\r
+ psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ if (test(DEMOD_PSK3, &tests[hits].offset)){\r
+ tests[hits].modulation = DEMOD_PSK3;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+ }\r
+ \r
+ if ( ASKbiphaseDemod("0 0 0 1", FALSE) && test(DEMOD_BI, &tests[hits].offset) ) {\r
+ tests[hits].modulation = DEMOD_BI;\r
+ tests[hits].inverted = FALSE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+ if ( ASKbiphaseDemod("0 0 1 1", FALSE) && test(DEMOD_BI, &tests[hits].offset) ) {\r
+ tests[hits].modulation = DEMOD_BI;\r
+ tests[hits].inverted = TRUE;\r
+ tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+ ++hits;\r
+ }\r
+ } \r
+\r
+ if ( hits == 1) {\r
+ config.modulation = tests[0].modulation;\r
+ config.inverted = tests[0].inverted;\r
+ config.offset = tests[0].offset;\r
+ \r
+ DecodeT55xxBlock();\r
+ if (DemodBufferLen > config.offset + 32) \r
+ config.block0 = PackBits(config.offset, 32, DemodBuffer);\r
+ printConfiguration( config );\r
+ return TRUE;\r