#include <RFM69.h>         //get it here: http://github.com/lowpowerlab/rfm69
#include <SPIFlash.h>      //get it here: http://github.com/lowpowerlab/spiflash
#include <WirelessHEX69.h> //get it here: https://github.com/LowPowerLab/WirelessProgramming
#include <SPI.h>           //comes with Arduino IDE (www.arduino.cc)

#define GATEWAYID   1
#define NODEID      18
#define NETWORKID   98
#define FREQUENCY       RF69_915MHZ
#define ENCRYPTKEY      "somethingierased"
// #define SERIAL_BAUD  115200
// #define LED_PULSE_PERIOD  5000   //5s seems good value for pulsing/blinking (not too fast/slow)

RFM69 radio;
SPIFlash flash(8, 0xEF30);

#ifdef __AVR_ATmega1284P__
#define LED           15 // Moteino MEGAs have LEDs on D15
#define FLASH_SS      23 // and FLASH SS on D23
#else
#define LED           9 // Moteinos have LEDs on D9
#define FLASH_SS      8 // and FLASH SS on D8
#endif

int i;
char input[40];
char temp[60];
int in_pin;
int highlow;
int pin3=0;
int pin6=0;
int pin7=0;
int pin10=0;
int pin12=0;
int pin13=0;
int pin14=0;
int pin15=0;
int sendLen;
int pgmcheck=0;

void setup()
{
        radio.initialize(FREQUENCY,NODEID,NETWORKID);
        radio.encrypt(ENCRYPTKEY);
        flash.initialize();
	pinMode(3, OUTPUT);
	pinMode(6, OUTPUT);
	pinMode(7, OUTPUT);
        pinMode(A0, OUTPUT);
        pinMode(A2, OUTPUT);
        pinMode(A3, OUTPUT);
        pinMode(A4, OUTPUT);
        pinMode(A5, OUTPUT);
        sprintf(temp,"%d is up",NODEID);
        sendLen=strlen(temp);
        radio.sendWithRetry(GATEWAYID, temp, sendLen);
}
void loop()
{
  if(pgmcheck>0)
      CheckForWirelessHEX(radio, flash, true);
  strcpy(input,"xxx");
  if (radio.receiveDone())
  {
    	for (byte i = 0; i < radio.DATALEN; i++)
    	{
      		input[i]=radio.DATA[i];
      		input[i+1]='\0';
    	}
  }
  radio.DATA[0]='\0';
  if (radio.ACKRequested())
      radio.sendACK();
  if(strncmp(input,"xxx",3)!=0)
  {
  if(strncmp(input,"reboot",6)==0)
  {
       sprintf(temp,"%d LED Rebooting",NODEID);
       sendLen=strlen(temp);
       radio.sendWithRetry(GATEWAYID, temp, sendLen);
       delay(40);
       resetUsingWatchdog(true);
  }
  if(strncmp(input,"command",7)==0)
  {
       sprintf(temp,"%d Commands are reboot, stat, testall or LED",NODEID);
       sendLen=strlen(temp);
       radio.sendWithRetry(GATEWAYID, temp, sendLen);
       if(pgmcheck==0)
           pgmcheck=1;
       else
           pgmcheck=0;
  }
  if(strncmp(input,"stat",4)==0)
  {
       sprintf(temp,"%d LED %d:%d:%d:%d:%d:%d:%d:%d",NODEID,pin3,pin6,pin7,pin10,pin12,pin13,pin14,pin15);
       sendLen=strlen(temp);
       radio.sendWithRetry(GATEWAYID, temp, sendLen);
  }  
  if(strncmp(input,"testall",7)==0)
        doledtest();        
  if(strncmp(input,"LED",3)==0)
  {
      strncpy(temp,&input[3],2);
      temp[2]='\0';
      in_pin=atoi(temp);
      strcpy(temp,&input[5]);
      temp[2]='\0';
      highlow=atoi(temp);
      if(highlow==1)
      {
            if(in_pin==3)
            {
                  digitalWrite(in_pin, HIGH);
                  pin3=1;
            }
            if(in_pin==6)
            {
                digitalWrite(in_pin, HIGH);
                digitalWrite(7, LOW);
                digitalWrite(A0, LOW);
                pin6=1;
                pin7=pin10=0;
            }
            if(in_pin==7)
            {
                digitalWrite(in_pin, HIGH);
                digitalWrite(6, LOW);
                digitalWrite(A0, LOW);
                pin7=1;
                pin6=pin10=0;
            }
            if(in_pin==10)
            {
                digitalWrite(A0, 500);
                digitalWrite(6, LOW);
                digitalWrite(7, LOW);
                pin10=1;
                pin6=pin7=0;
            }
            if(in_pin==12)
            {
                digitalWrite(A2, 500);
                digitalWrite(A3, LOW);
                digitalWrite(A4, LOW);
                pin12=1;
                pin13=pin14=0;
            }
            if(in_pin==13)
            {
                digitalWrite(A3, 500);
                digitalWrite(A2, LOW);
                digitalWrite(A4, LOW);
                pin13=1;
                pin12=pin14=0;
            }
            if(in_pin==14)
            {
                digitalWrite(A4, 500);
                digitalWrite(A2, LOW);
                digitalWrite(A3, LOW);
                pin14=1;
                pin12=pin13=0;
            }
            if(in_pin==15)
            {
                digitalWrite(A5, 500);
                pin15=1;
            }
      }
      else    // highlow=0
      {
            if(in_pin<8)
            {
                digitalWrite(in_pin, LOW);
                if(in_pin==3)
                    pin3=0;
                if(in_pin==6)
                    pin6=0;
                if(in_pin==7)
                    pin7=0;
            }
            else
            {
                  if(in_pin==10)
                  {
                      analogWrite(A0, LOW);
                      pin10=0;
                  }
                  if(in_pin==12)
                  {
                      digitalWrite(A2, LOW);
                      pin12=0;          
                  }
                  if(in_pin==13)
                  {
                      digitalWrite(A3, LOW);
                      pin13=0;
                  }
                  if(in_pin==14)
                  {
                      digitalWrite(A4, LOW);
                      pin14=0;
                  }
                  if(in_pin==15)
                  {
                      digitalWrite(A5, LOW);
                      pin15=0;
                  }
            }
      }
  }
  }
  Blink(LED,3);
}
void doledtest()
{
    int delaytime=10;
    for(i=0;i<25;i++)
    {
         digitalWrite(3, HIGH);
         delay(delaytime);
         digitalWrite(3, LOW);
         digitalWrite(6, HIGH);
         delay(delaytime);
         digitalWrite(6, LOW);
         digitalWrite(7, HIGH);
         delay(delaytime);
         digitalWrite(7, LOW);
         digitalWrite(A0, 500);
         delay(delaytime);
         digitalWrite(A0, LOW);
         digitalWrite(A5, 500);
         delay(delaytime);
         digitalWrite(A5, LOW);
         digitalWrite(A2, 500);
         delay(delaytime);
         digitalWrite(A2, LOW);
         digitalWrite(A3, 500);
         delay(delaytime);
         digitalWrite(A3, LOW);
         digitalWrite(A4, 500);
         delay(delaytime);
         digitalWrite(A4, LOW);
         delaytime+=5;         
    }
    if(pin3==1)
         digitalWrite(3, HIGH);
    if(pin6==1)
         digitalWrite(6, HIGH);
    if(pin7==1)
         digitalWrite(7, HIGH);
    if(pin10==1)
         digitalWrite(A0, 500);
    if(pin12==1)
         digitalWrite(A2, 500);
    if(pin13==1)
         digitalWrite(A3, 500);
    if(pin14==1)
         digitalWrite(A4, 500);
    if(pin15==1)
         digitalWrite(A5, 500);         
}
void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,HIGH);
  delay(DELAY_MS);
  digitalWrite(PIN,LOW);
}