#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "MCP23017.h"

#define OUVERT 1
#define FERME 2

// Informations Blynk
char auth[] = "VOTRE_AUTH_TOKEN"; // Remplacez par votre Auth Token Blynk
char ssid[] = "VOTRE_SSID";       // Remplacez par votre SSID WiFi
char pass[] = "VOTRE_MDP";        // Remplacez par votre mot de passe WiFi


// Pin pour l'interruption
const int interruptPin = 12;

//Pin Actionneur
const int OUT3 = 0+8;
const int PompeRemonter = 1+8;
const int OUT4 = 2+8;
const int Reducteur = 3+8;
const int PompeBooster = 4+8;
const int OUT1 = 5+8;
const int OUT2 = 6+8;
const int EntreeEau = 7+8;

const int IN2 = 4;
const int IN1 = 5;
const int NiveauHaut = 6;
const int INPistolet = 7;


#define MCP23017_ADDR 0x20
MCP23017 mcp = MCP23017(MCP23017_ADDR);

//Element pour Bynk
BlynkTimer timer;

// Fonction appelée lors de l'interruption
void ICACHE_RAM_ATTR handleInterrupt() {
	uint8_t portA;
	uint8_t portB;
	interruptedBy(uint8_t& portA, uint8_t& portB);
	
	// Pistolet
	if ((portA & (1 << 7)) == 0) {
		Pistolet();
	}
	
	// Niveau Haut
	if ((portA & (1 << 6)) == 0) {
		Eteint();
	}
	
	// Niveau Bas
	if ((portA & (1 << 5)) == 0) {
		Alume();
	}
	
	// Vérifier si le bit 4 est à 0
	if ((portA & (1 << 4)) == 0) {
		;
	}
}

void closeVanne(){
	mcp.digitalWrite(Reducteur,FERME);
}

void Alume(){
	Serial.println("start");
	timer.setTimeout(60000L, closeVanne);
	mcp.digitalWrite(EntreeEau,OUVERT);
	mcp.digitalWrite(Reducteur,OUVERT);
	mcp.digitalWrite(PompeBooster,OUVERT);
}

void Eteint(){
	Serial.println("Stop");
	mcp.digitalWrite(EntreeEau,FERME);
	mcp.digitalWrite(PompeBooster,FERME);
}

void Pistolet(){
	if(mcp.digitalRead(INPistolet)==0
		mcp.digitalWrite(PompeRemonter,OUVERT);
	else
		mcp.digitalWrite(PompeRemonter,FERME);
}


void setup() {
	// Initialiser la communication série pour le débogage
	Serial.begin(115200);
	
	mcp.init();
	mcp.portMode(MCP23017Port::B, 0);          
    mcp.portMode(MCP23017Port::A, 0b11110000); 
	
	mcp.digitalWrite(OUT3,FERME);
	mcp.digitalWrite(PompeRemonter,FERME);
	mcp.digitalWrite(OUT4,FERME);
	mcp.digitalWrite(Reducteur,FERME);
	mcp.digitalWrite(PompeBooster,FERME);
	mcp.digitalWrite(OUT1,FERME);
	mcp.digitalWrite(OUT2,FERME);
	mcp.digitalWrite(EntreeEau,FERME);
	mcp.digitalWrite(,FERME);
		
	mcp.interruptMode(MCP23017InterruptMode::Separated);      
    mcp.interrupt(MCP23017Port::A, Change);
    mcp.writeRegister(MCP23017Register::IPOL_A, 0x00);
	
	mcp.clearInterrupts();
	
	// Initialiser Blynk
	Blynk.begin(auth, ssid, pass);
	
	pinMode(interruptPin, INPUT);
	attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}

void loop() {
	Blynk.run();
}
