adjust thresholds for ask, fsk, io, psk based on more sample testing
adjust indala decode to set clock to 32 if no input (autodetect not
always correct)
 // optional arguments - same as CmdpskNRZrawDemod (clock & invert)
 int CmdIndalaDecode(const char *Cmd)
 {
 // optional arguments - same as CmdpskNRZrawDemod (clock & invert)
 int CmdIndalaDecode(const char *Cmd)
 {
+       int ans;
+       if (strlen(Cmd)>0)
+               ans=PSKnrzDemod(Cmd);
+       else
+               ans=PSKnrzDemod("32");
-       int ans=PSKnrzDemod(Cmd);
        if (ans < 0){
                PrintAndLog("Error1: %d",ans);
                return 0;
        if (ans < 0){
                PrintAndLog("Error1: %d",ans);
                return 0;
 
   i = 0;
   int phase = 0;
   for (bit = 0; bit < 64; bit++) {
   i = 0;
   int phase = 0;
   for (bit = 0; bit < 64; bit++) {
                phase = (bits[bit] == 0) ? 0 : 1;
                phase = (bits[bit] == 0) ? 0 : 1;
     int j;
     for (j = 0; j < 32; j++) {
       GraphBuffer[i++] = phase;
     int j;
     for (j = 0; j < 32; j++) {
       GraphBuffer[i++] = phase;
 
   RepaintGraphWindow();
   return 0;
 }
   RepaintGraphWindow();
   return 0;
 }
 int CmdIndalaDemod(const char *Cmd)
 {
   // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID
 int CmdIndalaDemod(const char *Cmd)
 {
   // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID
 
   if (rawbit>0){
     PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32);
     PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos);
   if (rawbit>0){
     PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32);
     PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos);
 
   if (start == rawbit - uidlen + 1) {
     PrintAndLog("nothing to wait for");
     return 0;
   if (start == rawbit - uidlen + 1) {
     PrintAndLog("nothing to wait for");
     return 0;
 
   int bit;
   i = start;
   int times = 0;
   int bit;
   i = start;
   int times = 0;
   if (uidlen > rawbit) {
     PrintAndLog("Warning: not enough raw bits to get a full UID");
     for (bit = 0; bit < rawbit; bit++) {
   if (uidlen > rawbit) {
     PrintAndLog("Warning: not enough raw bits to get a full UID");
     for (bit = 0; bit < rawbit; bit++) {
 
   //convert UID to HEX
   uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
   int idx;
        uid1 = uid2 = 0;
   //convert UID to HEX
   uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
   int idx;
        uid1 = uid2 = 0;
   if (uidlen==64){
     for( idx=0; idx<64; idx++) {
         if (showbits[idx] == '0') {
   if (uidlen==64){
     for( idx=0; idx<64; idx++) {
         if (showbits[idx] == '0') {
 
         } else {
         uid1=(uid1<<1)|(uid2>>31);
         uid2=(uid2<<1)|1;
         } else {
         uid1=(uid1<<1)|(uid2>>31);
         uid2=(uid2<<1)|1;
       }
     PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2);
   }
       }
     PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2);
   }
 
         uid4=(uid4<<1)|(uid5>>31);
         uid5=(uid5<<1)|(uid6>>31);
         uid6=(uid6<<1)|(uid7>>31);
         uid4=(uid4<<1)|(uid5>>31);
         uid5=(uid5<<1)|(uid6>>31);
         uid6=(uid6<<1)|(uid7>>31);
-                       
-                       if (showbits[idx] == '0') 
+
+                       if (showbits[idx] == '0')
                                uid7 = (uid7<<1) | 1;
       }
     PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
                                uid7 = (uid7<<1) | 1;
       }
     PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
 
   PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen);
 
   // Remodulating for tag cloning
   PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen);
 
   // Remodulating for tag cloning
-       // HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod) 
+       // HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod)
        // since this changes graphbuffer data.
   GraphTraceLen = 32*uidlen;
   i = 0;
        // since this changes graphbuffer data.
   GraphTraceLen = 32*uidlen;
   i = 0;
 
     ans=CmdSamples("20000");
   }
   if (GraphTraceLen<1000) return 0;
     ans=CmdSamples("20000");
   }
   if (GraphTraceLen<1000) return 0;
+  PrintAndLog("NOTE: some demods output possible binary\n  if it finds something that looks like a tag");
   PrintAndLog("Checking for known tags:");
   PrintAndLog("Checking for known tags:");
+  if (ans>0) {
+    PrintAndLog("Valid EM410x ID Found!");
+    return 1;
+  }
+  if (ans>0) {
+    PrintAndLog("Valid HID Prox ID Found!");
+    return 1;
+  }
+  if (ans>0) {
+    PrintAndLog("Valid IO Prox ID Found!");
+    return 1;
+  }
-  ans=CmdIndalaDemod("");
-  if (ans>0) return 1;
-  ans=CmdIndalaDemod("224");
-  if (ans>0) return 1;
+  ans=CmdIndalaDecode("");
+  if (ans>0) {
+    PrintAndLog("Valid Indala ID Found!");
+    return 1;
+  }
+ // ans=CmdIndalaDemod("224");
+ // if (ans>0) return 1;
   PrintAndLog("No Known Tags Found!\n");
   return 0;
 }
 
   PrintAndLog("No Known Tags Found!\n");
   return 0;
 }
 
-static command_t CommandTable[] = 
+static command_t CommandTable[] =
 {
   {"help",        CmdHelp,            1, "This help"},
   {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
 {
   {"help",        CmdHelp,            1, "This help"},
   {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
 
 int CmdLF(const char *Cmd)
 {
   CmdsParse(CommandTable, Cmd);
 int CmdLF(const char *Cmd)
 {
   CmdsParse(CommandTable, Cmd);
 }
 
 int CmdHelp(const char *Cmd)
 }
 
 int CmdHelp(const char *Cmd)
 
                else if (BinStream[i] < low)
                        low = BinStream[i];
        }
                else if (BinStream[i] < low)
                        low = BinStream[i];
        }
-       if ((high < 158)){  //throw away static
+       if ((high < 134)){  //throw away static  high has to be more than 6 on graph. noise <= -10 here
                //   PrintAndLog("no data found");
                return -2;
        }
                //   PrintAndLog("no data found");
                return -2;
        }
 
 {
        uint32_t last_transition = 0;
        uint32_t idx = 1;
 {
        uint32_t last_transition = 0;
        uint32_t idx = 1;
        if (fchigh==0) fchigh=10;
        if (fclow==0) fclow=8;
        if (fchigh==0) fchigh=10;
        if (fclow==0) fclow=8;
-       // we do care about the actual theshold value as sometimes near the center of the
-       // wave we may get static that changes direction of wave for one value
-       // if our value is too low it might affect the read.  and if our tag or
-       // antenna is weak a setting too high might not see anything. [marshmellow]
-       if (size<100) return 0;
-       for(idx=1; idx<100; idx++){
-               if(maxVal<dest[idx]) maxVal = dest[idx];
-       }
-       // set close to the top of the wave threshold with 25% margin for error
-       // less likely to get a false transition up there.
-       // (but have to be careful not to go too high and miss some short waves)
-       uint8_t threshold_value = (uint8_t)(((maxVal-128)*.75)+128);
+       //set the threshold close to 0 (graph) to avoid static
+       uint8_t threshold_value = 134; //(uint8_t)(((maxVal-128)*.75)+128);
 
        // sync to first lo-hi transition, and threshold
 
 
        // sync to first lo-hi transition, and threshold
 
 
 
 int IOdemodFSK(uint8_t *dest, size_t size)
 {
 
 int IOdemodFSK(uint8_t *dest, size_t size)
 {
-       static const uint8_t THRESHOLD = 140;
+       static const uint8_t THRESHOLD = 134;
        uint32_t idx=0;
        //make sure buffer has data
        if (size < 66) return -1;
        uint32_t idx=0;
        //make sure buffer has data
        if (size < 66) return -1;
 
-       peak=(int)(((peak-128)*.90)+128);
-       low= (int)(((low-128)*.90)+128);
+       peak=(int)(((peak-128)*.75)+128);
+       low= (int)(((low-128)*.75)+128);
        //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);
        int ii;
        uint8_t clkCnt;
        //PrintAndLog("DEBUG: peak: %d, low: %d",peak,low);
        int ii;
        uint8_t clkCnt;
 
        //test each valid clock from smallest to greatest to see which lines up
        for(clkCnt=0; clkCnt < 6; ++clkCnt){
                if (clk[clkCnt] == 32){
        //test each valid clock from smallest to greatest to see which lines up
        for(clkCnt=0; clkCnt < 6; ++clkCnt){
                if (clk[clkCnt] == 32){