+//by marshmellow
+// - ASK Demod then Biphase decode GraphBuffer samples
+int ASKbiphaseDemod(const char *Cmd, bool verbose)
+{
+ //ask raw demod GraphBuffer first
+ int offset=0, clk=0, invert=0, maxErr=0, ans=0;
+ ans = sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr);
+ if (ans>0)
+ ans = ASKrawDemod(Cmd+2, FALSE);
+ else
+ ans = ASKrawDemod(Cmd, FALSE);
+ if (!ans) {
+ if (g_debugMode || verbose) PrintAndLog("Error AskrawDemod: %d", ans);
+ return 0;
+ }
+
+ //attempt to Biphase decode DemodBuffer
+ size_t size = DemodBufferLen;
+ uint8_t BitStream[MAX_DEMOD_BUF_LEN];
+ memcpy(BitStream, DemodBuffer, DemodBufferLen);
+
+ int errCnt = BiphaseRawDecode(BitStream, &size, offset, invert);
+ if (errCnt < 0){
+ if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode: %d", errCnt);
+ return 0;
+ }
+ if (errCnt > maxErr) {
+ if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode too many errors: %d", errCnt);
+ return 0;
+ }
+ //success set DemodBuffer and return
+ setDemodBuf(BitStream, size, 0);
+ if (g_debugMode || verbose){
+ PrintAndLog("Biphase Decoded using offset: %d - # errors:%d - data:",offset,errCnt);
+ printDemodBuff();
+ }
+ return 1;
+}
+//by marshmellow - see ASKbiphaseDemod
+int Cmdaskbiphdemod(const char *Cmd)
+{
+ char cmdp = param_getchar(Cmd, 0);
+ if (strlen(Cmd) > 12 || cmdp == 'h' || cmdp == 'H') {
+ PrintAndLog("Usage: data rawdemod ab [offset] [clock] <invert> [maxError] <amplify>");
+ PrintAndLog(" [offset], offset to begin biphase, default=0");
+ PrintAndLog(" [set clock as integer] optional, if not set, autodetect");
+ PrintAndLog(" <invert>, 1 to invert output");
+ PrintAndLog(" [set maximum allowed errors], default = 100");
+ PrintAndLog(" <amplify>, 'a' to attempt demod with ask amplification, default = no amp");
+ PrintAndLog(" NOTE: <invert> can be entered as second or third argument");
+ PrintAndLog(" NOTE: <amplify> can be entered as first, second or last argument");
+ PrintAndLog(" NOTE: any other arg must have previous args set to work");
+ PrintAndLog("");
+ PrintAndLog(" sample: data rawdemod ab = demod an ask/biph tag from GraphBuffer");
+ PrintAndLog(" : data rawdemod ab a = demod an ask/biph tag from GraphBuffer, amplified");
+ PrintAndLog(" : data rawdemod ab 1 32 = demod an ask/biph tag from GraphBuffer using an offset of 1 and a clock of RF/32");
+ PrintAndLog(" : data rawdemod ab 0 32 1 = demod an ask/biph tag from GraphBuffer using a clock of RF/32 and inverting data");
+ PrintAndLog(" : data rawdemod ab 0 1 = demod an ask/biph tag from GraphBuffer while inverting data");
+ PrintAndLog(" : data rawdemod ab 0 64 1 0 = demod an ask/biph tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors");
+ PrintAndLog(" : data rawdemod ab 0 64 1 0 a = demod an ask/biph tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors, and amp");
+ return 0;
+ }
+ return ASKbiphaseDemod(Cmd, TRUE);
+}
+