+//by marshmellow
+//attempt to detect the field clock and bit clock for FSK
+uint8_t GetFskClock(const char str[], bool printAns, bool verbose)
+{
+ int clock;
+ sscanf(str, "%i", &clock);
+ if (!strcmp(str, ""))
+ clock = 0;
+ if (clock != 0) return (uint8_t)clock;
+
+
+ uint8_t fc1=0, fc2=0, rf1=0;
+ uint8_t ans = fskClocks(&fc1, &fc2, &rf1, verbose);
+ if (ans == 0) return 0;
+ if ((fc1==10 && fc2==8) || (fc1==8 && fc2==5)){
+ if (printAns) PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1);
+ return rf1;
+ }
+ if (verbose){
+ PrintAndLog("DEBUG: unknown fsk field clock detected");
+ PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1);
+ }
+ return 0;
+}
+uint8_t fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, bool verbose)
+{
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN] = {0};
+ size_t size = getFromGraphBuf(BitStream);
+ if (size == 0) return 0;
+ uint16_t ans = countFC(BitStream, size, 1);
+ if (ans == 0) {
+ if (verbose || g_debugMode) PrintAndLog("DEBUG: No data found");
+ return 0;
+ }
+ *fc1 = (ans >> 8) & 0xFF;
+ *fc2 = ans & 0xFF;
+
+ int start = 0;
+ *rf1 = detectFSKClk_ext(BitStream, size, *fc1, *fc2, &start);
+ if (*rf1 == 0) {
+ if (verbose || g_debugMode) PrintAndLog("DEBUG: Clock detect error");
+ return 0;
+ }
+ if (verbose || g_debugMode)
+ PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d | Best Starting Position: %d", *fc1, *fc2, *rf1, start);
+ SetGraphClock(*rf1, start);
+ return 1;
+}
+
+// test samples are not just noise
+bool graphJustNoise(int *BitStream, int size)
+{
+ //might not be high enough for noisy environments
+ #define THRESHOLD 15;
+ bool isNoise = TRUE;
+ for(int i=0; i < size && isNoise; i++){
+ isNoise = BitStream[i] < THRESHOLD;
+ }
+ return isNoise;
+}