#include <Arduino.h>

#define MY_RADIO_NRF5_ESB
//#define MY_DEBUG
//#define NODE_DEBUG
#define MY_NODE_ID 11
#define MY_REPEATER_FEATURE

#include <MySensors.h>
#include <Bounce2.h>

#define RELAY1 9
#define RELAY2 10
#define LED_BUILDIN 6
#define INPUT1 26
#define INPUT2 25

MyMessage msg1(1,V_LIGHT);
MyMessage msg2(2,V_LIGHT);
bool state1;
bool state2;
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();


void setup() { 
  debouncer1.attach(INPUT1,INPUT_PULLDOWN);
  debouncer1.interval(200);  
  debouncer2.attach(INPUT2,INPUT_PULLDOWN);
  debouncer2.interval(200);  
  pinMode(LED_BUILDIN,OUTPUT);
  digitalWrite(LED_BUILDIN,LOW);
  pinMode(RELAY1,OUTPUT);
  digitalWrite(RELAY1,LOW);
  pinMode(RELAY2,OUTPUT);
  digitalWrite(RELAY2,LOW);

  state1 = loadState(1);
  digitalWrite(RELAY1,state1?HIGH:LOW);
  state2 = loadState(2);  
  digitalWrite(RELAY2,state2?HIGH:LOW);  

  digitalWrite(LED_BUILDIN,HIGH);
  sleep(500);
  digitalWrite(LED_BUILDIN,LOW);
  sleep(500);
  digitalWrite(LED_BUILDIN,HIGH);
  sleep(500);
  digitalWrite(LED_BUILDIN,LOW);
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Patch Relay", "1.0");

  // Register all sensors to gw (they will be created as child devices)
  present(1, S_LIGHT);
  present(2, S_LIGHT);
}

void loop() {
  debouncer1.update();
  debouncer2.update();

   if (debouncer1.rose() ) {
    state1 = !state1;
    digitalWrite(RELAY1,state1);
    saveState(1,state1);   
    send(msg1.set(state1));
    digitalWrite(LED_BUILDIN,HIGH);
    sleep(500);
    digitalWrite(LED_BUILDIN,LOW);
    sleep(2000); // just to avoid relay bouncing
  }

  if (debouncer2.rose() ) {
    state2 = !state2;
    digitalWrite(RELAY2,state2);
    saveState(2,state2);        
    send(msg2.set(state2));
    digitalWrite(LED_BUILDIN,HIGH);
    sleep(500);
    digitalWrite(LED_BUILDIN,LOW);
    sleep(2000); // just to avoid relay bouncing    
  }
  sleep(100);
}

void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.isAck()) {
  }

  if (message.type == V_LIGHT && message.sensor == 1) {
    // Change relay state
    state1 = message.getBool();
    digitalWrite(RELAY1, state1?HIGH:LOW);
    saveState(1, state1);    
    digitalWrite(LED_BUILDIN,HIGH);
    sleep(500);
    digitalWrite(LED_BUILDIN,LOW);
  }   
  if (message.type == V_LIGHT && message.sensor == 2) {
    // Change relay state
    state2 = message.getBool();
    digitalWrite(RELAY2, state2?HIGH:LOW);
    saveState(1, state2);    
    digitalWrite(LED_BUILDIN,HIGH);
    sleep(500);
    digitalWrite(LED_BUILDIN,LOW);
  }  
}