/*
  Example for receiving
  
  https://github.com/sui77/rc-switch/
  
  If you want to visualize a telegram copy the raw data and 
  paste it into http://test.sui.li/oszi/
*/
                                      // 31 bit +   25bit                            26bit
#define Code1Up  0b1010010110010101011001010101011 //0100101101001011001100101   01010101010101011010101001 1s
#define Code1Low 0b01001011010010110011

#define Code2Up  0b1001101010101001010110100110010 //1011010011001010110100101   01010101011001010110101001 1s
#define Code2Low 0b10110100110010101101

#define Code3Up  0b1001100110010110100101011001100 //1100101101001100101100101   01010101010110101001100110 1s
#define Code3Low 0b11001011010011001011

#define Code4Up  0b1001101010100110010110011001011 //0100101101001011010100101   01100101011010100101010110 1s
#define Code4Low 0b01001011010010110101


uint16_t BitCounter;
unsigned long lastTime = 0; 
uint8_t   CodeReceived = 0;
uint8_t  CodeCount = 0;
uint32_t  UpperCode = 0;
uint32_t  LowerCode = 0;
uint32_t  UpperBits = 0;
uint32_t  LowerBits = 0;
#define intPin 2

// ************Interrupt rutin************
void handleInterrupt() {
  uint8_t Tol = 60;                    // Tolerancce in microseconds
  unsigned long actTime = micros();
     
  unsigned long sigTime = actTime - lastTime;
  lastTime = actTime;
 

 if(BitCounter < 55)
 {  
    if(digitalRead(intPin) == 0 && sigTime < (200 + Tol) && sigTime > (200 - Tol))
  {
    LowerCode = (LowerCode<<1) +1;
    BitCounter ++;
  }
  else if(digitalRead(intPin) == 0 && sigTime < (400 + Tol) && sigTime > (400 - Tol))
  {
    LowerCode = (LowerCode<<2) +3;
    BitCounter = BitCounter + 2;
  }
  else if(digitalRead(intPin) == 1 && sigTime < (200 + Tol) && sigTime > (200 - Tol))
  {
    LowerCode = (LowerCode<<1) ;
    BitCounter ++;
  }
  else if(digitalRead(intPin) == 1 && sigTime < (400 + Tol) && sigTime > (400 - Tol))
  {
    LowerCode = (LowerCode<<2) ;
    BitCounter = BitCounter + 2; 
  }
  else if(sigTime < (1200 + Tol) && sigTime > (1200 - Tol))
  {
    UpperCode = 0;
    LowerCode = 0;
    BitCounter = 0;
    CodeReceived = 0;
   }
   else
   {
     BitCounter = 53;
   }
   
  if(BitCounter == 31)
  {
    UpperCode = LowerCode;
    LowerCode = 0;
  }
  if(BitCounter == 51)
  {
    UpperBits = UpperCode;
    LowerBits = LowerCode;
    CodeReceived = 1;    
  }
 }
  if(BitCounter == 65530) BitCounter = 55;

}
//**************************************************

void setup() {
  Serial.begin(115200);
  pinMode(intPin, INPUT);
  attachInterrupt(0, handleInterrupt, CHANGE);
}

void loop() {

  if(CodeReceived)
  {
    if(UpperBits == Code1Up && LowerBits == Code1Low)
    {
      //CODE1 kapcsol
      Serial.println("Adó1 jele érkezett");
      CodeReceived = 0;
    }
    if(UpperBits == Code2Up && LowerBits == Code2Low)
    {
      //CODE2 kapcsol
      Serial.println("Adó2 jele érkezett");
      CodeReceived = 0;
    }
    if(UpperBits == Code3Up && LowerBits == Code3Low)
    {
      //CODE3 kapcsol
      Serial.println("Adó3 jele érkezett");
      CodeReceived = 0;
    }
    if(UpperBits == Code4Up && LowerBits == Code4Low)
    {
      //CODE4 kapcsol
      Serial.println("Adó4 jele érkezett");
      CodeReceived = 0;
    }
  }

}
