char* hexdump(char *str, unsigned char *d, int l, bool appendNewLine)
{
  for (l--; l != -1; l--) {
    str = PrintHexByte(str, *d++);
  }

  if (appendNewLine) {
    *str++ = '\n';
  }

  return str;
}
Пример #2
0
boolean Plugin_075(byte function, char *string) {
      if ((RawSignal.Number != LIDL_PULSECOUNT) && (RawSignal.Number != LIDL_PULSECOUNT2)) return false;
      unsigned long bitstream=0;
      unsigned long bitstream2=0;
      
      int bitcount=0;      
      byte type=0;
      //==================================================================================
      // get all bits
      if (RawSignal.Number == LIDL_PULSECOUNT) {
         if (RawSignal.Pulses[1]*RawSignal.Multiply > 1000 && RawSignal.Pulses[2]*RawSignal.Multiply > 1000 &&
            RawSignal.Pulses[3]*RawSignal.Multiply > 1000 && RawSignal.Pulses[4]*RawSignal.Multiply > 1000 && 
            RawSignal.Pulses[5]*RawSignal.Multiply > 1000 && RawSignal.Pulses[6]*RawSignal.Multiply > 1000 &&
            RawSignal.Pulses[7]*RawSignal.Multiply > 1000 && RawSignal.Pulses[8]*RawSignal.Multiply > 1000 && RawSignal.Pulses[9]*RawSignal.Multiply > 1000 ) {  
            //
         } else {
            return false;
         }
         for(int x=10;x <=90;x+=2) {
            if (bitcount < 28){
               if (RawSignal.Pulses[x]*RawSignal.Multiply > 550) {
                  bitstream = (bitstream << 1);
                  bitcount++;
               } else {
                  bitstream = (bitstream << 1) | 0x1; 
                  bitcount++;
               }
            } else {
               if (RawSignal.Pulses[x]*RawSignal.Multiply > 550) {
                  bitstream2 = (bitstream2 << 1);
                  bitcount++;
               } else {
                  bitstream2 = (bitstream2 << 1) | 0x1; 
                  bitcount++;
               }
            }
         }
      } else {
         if (RawSignal.Pulses[0] != PLUGIN_ID) return false; // only accept plugin1 translated packets
         type=1;
         for(byte x=1;x < LIDL_PULSECOUNT2-1;x+=2) {
            if (RawSignal.Pulses[x]*RawSignal.Multiply > 200) {
               if (RawSignal.Pulses[x+1]*RawSignal.Multiply > 200) return false; // invalid pulse length
               if (bitcount > 23) { 
                  bitstream2 = (bitstream2 << 1);
               } else {
                  bitstream = (bitstream << 1);
               }
               bitcount++;
            } else {
               if (RawSignal.Pulses[x+1]*RawSignal.Multiply < 200) return false; // invalid pulse length
               if (bitcount > 23) {
                  bitstream2 = (bitstream2 << 1) | 0x1; 
               } else {
                  bitstream = (bitstream << 1) | 0x1; 
               }
               bitcount++;
            }
         }
      }
      //==================================================================================
      // all bytes received, make sure checksum is okay
      //==================================================================================
      if (type==0) {
         if ((bitstream2 &0xfff) != 0x00) return false; // these 8 bits are always 0
      } else {
         if (bitstream != 0x5ca588) return false;      
      }
      //==================================================================================
      // Prevent repeating signals from showing up
      //==================================================================================
      if((SignalHash!=SignalHashPrevious) || ((RepeatingTimer+2000)<millis()) || (SignalCRC != bitstream) ) { 
         SignalCRC=bitstream;                       // not seen the RF packet recently
      } else {
         return true;                               // already seen the RF packet recently
      }      
      //==================================================================================
      // Output
      // ----------------------------------
      Serial.print("20;");
      PrintHexByte(PKSequenceNumber++);
      // ----------------------------------
      if (type == 0) {
         Serial.print(";SilverCrest;");              // Label
         sprintf(pbuffer, "ID=%08lx;", bitstream);     // ID      
      } else {
         Serial.print(";SilverCrest;");              // Label
         sprintf(pbuffer, "ID=%08lx;", bitstream2);    // ID      
      }
      Serial.print( pbuffer );
      Serial.print(F("SWITCH=1;CMD=ON;"));  
      Serial.print(F("CHIME=01;"));
      Serial.println();
      //==================================================================================
      RawSignal.Repeats=true;                          // suppress repeats of the same RF packet
      RawSignal.Number=0;                              // do not process the packet any further
      return true;
}