#include <Wire.h>
#include "KTGame.h"
#include <avr/sleep.h>

#define START 1
#define SLEEP 2
#define SERIAL_EVEN 10 //ex 213478927398
#define SERIAL_ODD  11 //ex 213478927391

volatile int _fail;
volatile int _done;
volatile int _serialEven=false;
int _ledSolved;
int _ledOn;

void requestEvent() {
   Wire.write(_fail);
   Wire.write(_done);
}

void receiveEvent(int bytes){
   while (Wire.available() > 0){
      int read = Wire.read();
	  switch (read){
		  case(START):
		    KTGame::restart();
			break;
		  case(SLEEP):
		    KTGame::sleepUntil();
			break;
		  case(SERIAL_EVEN):
			_serialEven=true;
			break;
		  case(SERIAL_ODD):
			_serialEven=false;
			break;
   }
 }
}
  
KTGame::KTGame(int nodeAdress, int ledSolved, int ledOn){
   Wire.begin(nodeAdress);  // Activate I2C network
//   Wire.onReceive([] (int howMany) {receiveEvent(howMany);});
  
   Wire.onRequest(requestEvent); // master node requests some writing
   Wire.onReceive(receiveEvent); // master node requests some reading
   if (ledSolved>=0){
	pinMode(ledSolved, OUTPUT);
   }
   if (ledOn>=0){
	pinMode(ledOn, OUTPUT);
   }
   _ledSolved=ledSolved;
   _ledOn=ledOn;
}

static boolean KTGame::isSerialEven(){
	return _serialEven;
}

void KTGame::moduleSolved() {
  Serial.print("Well done, fault:");Serial.println(_fail);
  _done=true;
  updateLed();
}
void KTGame::madeAFault(){
	_fail++;
	Serial.print("Fault:");Serial.println(_fail);
}
static void KTGame::restart(){
	_fail=0;
	_done=false;
	updateLed();
	Serial.println("Restart module:");
}

static void KTGame::updateLed(){
	 if (_ledSolved>=0){
		digitalWrite(_ledSolved, _done);
	 }
	  if (_ledOn>=0){
		digitalWrite(_ledOn, !_done);
	 }
}

static void KTGame::sleepUntil(){
	 if (_ledSolved>=0){
		digitalWrite(_ledSolved, LOW);
	 }
	 if (_ledOn>=0){
		digitalWrite(_ledOn, LOW);
	 }
	set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
	sleep_enable();
	sleep_mode();                        // System sleeps here
	sleep_disable();                     // System continues execution here when interrupt is received
}

//KTGame game;//= KTGame();