+ size_t startIdx = 0;
+ // set size to 15 to only test first 9 positions for the preamble
+ size_t size = (15 > DemodBufferLen) ? DemodBufferLen : 15;
+ startIdx = 0;
+
+ //test preamble
+ bool errChk = EMpreambleSearch(DemodBuffer, preamble, sizeof(preamble), size, &startIdx);
+ if ( !errChk ) {
+ if (g_debugMode) PrintAndLog("DEBUG: Error - EM4305 preamble not found :: %d", startIdx);
+ return false;
+ }
+ if (readCmd) {
+ //test for even parity bits.
+ size = removeParity(DemodBuffer, startIdx + sizeof(preamble),9,0,44);
+ if (size == 0) {
+ if (g_debugMode) PrintAndLog("DEBUG: Error - Parity not detected");
+ return false;
+ }
+
+ //todo test last 8 bits for even parity || (xor)
+
+ setDemodBuf(DemodBuffer, 40, 0);
+
+ *word = bytebits_to_byteLSBF(DemodBuffer , 32);
+
+ uint8_t lo = (uint8_t) bytebits_to_byteLSBF(DemodBuffer , 8);
+ uint8_t lo2 = (uint8_t) bytebits_to_byteLSBF(DemodBuffer + 8, 8);
+ uint8_t hi = (uint8_t) bytebits_to_byteLSBF(DemodBuffer + 16, 8);
+ uint8_t hi2 = (uint8_t) bytebits_to_byteLSBF(DemodBuffer + 24, 8);
+ uint8_t cs = (uint8_t) bytebits_to_byteLSBF(DemodBuffer + 32, 8);
+ uint8_t cs2 = lo ^ lo2 ^ hi ^ hi2;
+ if (g_debugMode) PrintAndLog("EM4x05/4x69 : %08X CS: %02X %s",*word,cs, (cs2==cs) ? "Passed" : "Failed");
+
+ return (cs2==cs) ? true : false;
+ }
+ return true;
+}
+
+// FSK, PSK, ASK/MANCHESTER, ASK/BIPHASE, ASK/DIPHASE
+// should cover 90% of known used configs
+// the rest will need to be manually demoded for now...
+int demodEM4x05resp(uint32_t *word, bool readCmd) {
+ int ans = 0;
+ DemodBufferLen = 0x00;