+ hidproxcard_t data;
+ memset(&data, 0, sizeof(hidproxcard_t));
+ uint8_t cmdp = 1;
+ while(param_getchar(Cmd, cmdp) != 0x00) {
+ switch(param_getchar(Cmd, cmdp)) {
+ case 'I':
+ case 'i':
+ data.IssueLevel = param_get32ex(Cmd, cmdp+1, 0, 10);
+ cmdp += 2;
+ break;
+ case 'F':
+ case 'f':
+ data.FacilityCode = param_get32ex(Cmd, cmdp+1, 0, 10);
+ cmdp += 2;
+ break;
+ case 'C':
+ case 'c':
+ data.CardNumber = param_get64ex(Cmd, cmdp+1, 0, 10);
+ cmdp += 2;
+ break;
+ case 'o':
+ case 'O':
+ data.OEM = param_get32ex(Cmd, cmdp+1, 0, 10);
+ cmdp += 2;
+ break;
+ default:
+ PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
+ return false;
+ }
+ }
+ memset(packed, 0, sizeof(hidproxmessage_t));
+ if (!HIDPack(formatIndex, &data, packed))
+ {
+ PrintAndLog("The card data could not be encoded in the selected format.");
+ return false;
+ } else {
+ return true;
+ }
+
+}
+void Write(hidproxmessage_t *packed){
+ UsbCommand c;
+ c.d.asBytes[0] = (packed->top != 0 && ((packed->mid & 0xFFFFFFC0) != 0))
+ ? 1 : 0; // Writing long format?
+ c.cmd = CMD_HID_CLONE_TAG;
+ c.arg[0] = (packed->top & 0x000FFFFF);
+ c.arg[1] = packed->mid;
+ c.arg[2] = packed->bot;
+ SendCommand(&c);
+}
+
+
+//by marshmellow (based on existing demod + holiman's refactor)
+//HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
+//print full HID Prox ID and some bit format details if found
+int CmdFSKdemodHID(const char *Cmd)
+{
+ //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+ uint32_t hi2=0, hi=0, lo=0;
+
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+ size_t BitLen = getFromGraphBuf(BitStream);
+ if (BitLen==0) return 0;
+ //get binary from fsk wave
+ int waveIdx = 0;
+ int idx = HIDdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo, &waveIdx);
+ if (idx<0){
+ if (g_debugMode){
+ if (idx==-1){
+ PrintAndLog("DEBUG: Just Noise Detected");
+ } else if (idx == -2) {
+ PrintAndLog("DEBUG: Error demoding fsk");
+ } else if (idx == -3) {
+ PrintAndLog("DEBUG: Preamble not found");
+ } else if (idx == -4) {
+ PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen);
+ } else {
+ PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+ }
+ }
+ return 0;
+ }
+ if (hi2==0 && hi==0 && lo==0) {
+ if (g_debugMode) PrintAndLog("DEBUG: Error - no values found");
+ return 0;
+ }
+
+ hidproxmessage_t packed = initialize_proxmessage_object(hi2, hi, lo);
+ PrintProxTagId(&packed);
+
+ bool ret = HIDTryUnpack(&packed, false);
+ if (!ret) {
+ PrintAndLog("Invalid or unsupported tag length.");
+ }
+ setDemodBuf(BitStream,BitLen,idx);
+ setClockGrid(50, waveIdx + (idx*50));
+ if (g_debugMode){
+ PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
+ printDemodBuff();
+ }
+ return 1;