#include <Wire.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "SparkFunISL29125.h"

// Firmware pro elektronickou platformu Arduino(master zařízení)
int ledPin = 13;            // Halogenová žárovka připojena k pinu 13
int count = 0;              // Počítadlo


void wakeUpNow()        // Co se stane po probuzení
{
  sleep_disable();      // Vypnutí spacího módu
  detachInterrupt (0);  // Vypnutí přerušení
}


// Deklarace objektu senzor
SFE_ISL29125 RGB_sensor;

void setup()
{

  pinMode(ledPin, OUTPUT);         // nastaví digitální výstup pro pin 13
  pinMode(2,INPUT_PULLUP);         // nastaví digitální vstup s pull-up rezistory pro pin 2
 
  // Iniciace výpisu na sériový monitor a I2C sběrnice 
  Serial.begin(9600);
  Wire.begin();

 // Iniciace senzoru ISL29125
  if (RGB_sensor.init())
  {
    Serial.println("Sensor Initialization Successful\n\r");
  }

}

void sleepNow() // Nastavení spacího režimu
{
  //Vypnutí ADC převodníku
  ADCSRA = 0;
 
  set_sleep_mode (SLEEP_MODE_PWR_DOWN); //nastaví mód spaní 
  noInterrupts ();                      // Zakáže přerušení 
  sleep_enable();
 
  
  MCUCR = bit (BODS) | bit (BODSE);  // Vypne detekci poklesu elektrického napětí
  MCUCR = bit (BODS);        
  interrupts ();             // Přerušení zprovozněny
  attachInterrupt (0,wakeUpNow, LOW); // Nastavení podmínky přerušení spánku (pokud na pinu 2 bude stav LOW)
  sleep_cpu ();              // Uvedení do režimu spánku
}  

// Čtení červené barvy ze senzoru a následný výpis na sériový monitor

void loop()
{
  detachInterrupt (0); 
  digitalWrite(ledPin, HIGH);
  delay (500);
  unsigned int red = RGB_sensor.readRed();
  //unsigned int green = RGB_sensor.readGreen();
  //unsigned int blue = RGB_sensor.readBlue();

  Serial.print("Red: "); Serial.println(red, DEC);
  //Serial.print("Green: "); Serial.println(green, DEC);
  //Serial.print("Blue: "); Serial.println(blue, DEC);
  Serial.println();
  
// Zapis hodnoty červené barvy do paměti NFC tagu
  Wire.beginTransmission(25); // spojení se zařízením jehož adresa je #25
  Wire.write(0x40); //Adresa registru
  Wire.write(0x55); //Příkaz: Zapiš do paměti
  Wire.write(0x00); //Parametrický bajt
  Wire.write(red);  //První bajt zapsaný do paměti NFC tagu
  Wire.write(red>>8); //Druhý bajt zapsaný do paměti NFC tagu (pokud je potřeba)
  Wire.write(0x00); //3 bajt (podle technické dokumentace)
  Wire.write(0x00); //4 bajt (podle technické dokumentace)
  Wire.endTransmission();      // poslání sekvence a Stop bitu

  delay(10); //Iprog

  count++;
/* Tato část kódu slouží pouze pro kontrolu. Výpis z paměti NFC tagu na seriový monitor
  uint16_t data = 0x0000;

  Wire.beginTransmission(25);//operace se vztahuje na zařízení s adresou #25
  Wire.write(0x40); //Adresa registru
  Wire.write(0xF0); //Příkaz: Čti z paměti
  Wire.write(0x00); //Parametrický bajt
  Wire.endTransmission(false); //Stop bit
  Wire.requestFrom(25,(uint8_t)2, true); //Opakovaný start bit na aresu zařízení #25   
  data = Wire.read(); //První bajt čtený z paměti NFC tagu
  data |= (Wire.read() << 8); //Druhý bajt čtený z paměti NFC tagu
     
  Serial.println(data, DEC);   //číslo by mělo být stejné jako proměnná "red"
  Serial.println();*/

  delay(5000); //Čeká 5s (doba na načtení hotdnoty do smartphonu bez opakovaného spuštění)
  
  if (count==1){
  digitalWrite(ledPin, LOW);
  count = 0;
  delay(100);
  sleepNow();
  }
}


