#include "Comunication.h"
#include "spi.h"
#include "Tab.h"
#include "PWM.h"
#include "Eeprom.h"

uint8_t Com_dispactch(uint8_t* mes){
	switch(mes[0]|MASKMES){
	case (WRITETABHEU):
		Com_WriteTabHeure(mes);
		return 0;
	case (WRITETABVAL):
		Com_WriteTabVal(mes);
		return 0;
	case (READVENT):
		Com_ReadVent(mes);
		return 0;
	case (WRITVENT):
		Com_WriteVent(mes);
		return 0;
	case (ERRORCOM):
		Com_ERROR(mes);
		return 0;
	case (WRITEVAL):
		Com_WriteVal(mes);
		return 0;
	case (STOP):
		Com_STOP(mes);
		return 0;
	case (RETABLIR):
		Com_Retablir(mes);
		return 0;
	case (SYNCRTC):
		Com_SyncRTC(mes);
		return 0;
	default:
		return -1;//erreur
	}
}

void Com_WriteTabHeure(uint8_t* mes){
	int i = mes[0] & MASKID;
	Heure h;
	h.heure=mes[1];
	h.minute=mes[2];
	if ((mes[0]&MASKTYPE)>>4)
		tabSortie[i].Demmarage=h;
	else
		tabSortie[i].Extinxtion=h;
	uint16_t add = (mes[0]*2)-2; //On ecrit la valeurs que l'on viens de modifier dans l'eeprom. Adresse dans l'eeprom = mes[0]*2-2 voir Tableau excel address
	writeData(add,&mes[1],2);
}

void Com_WriteTabVal(uint8_t* mes){
	int i = mes[0] & MASKID;
	if ((mes[0]&MASKTYPE)>>4)
		tabSortie[i].PuissanceMax=mes[1];
	else
		tabSortie[i].Pente=mes[1];
	uint16_t add = (mes[0]*2)+22;//On ecrit la valeurs que l'on viens de modifier dans l'eeprom. Adresse dans l'eeprom = mes[0]*2+22 voir Tableau excel address
	writeData(add,&mes[1],1);
}

void Com_ReadVent(uint8_t* mes){
	//TODO (RAMPES LED Amélioration) Rajout plus tard si ventilation sur la rampe
}

void Com_WriteVent(uint8_t* mes){
	//TODO (RAMPES LED Amélioration) Rajout plus tard si ventilation sur la rampe
}

void Com_ERROR(uint8_t* mes){
	//TODO (RAMPES LED Amélioration) Gestionnaire erreur
}

void Com_WriteVal(uint8_t* mes){
	int i = mes[0] & 0x0F;
	if (mes[1]!=0){//Si on force avec le slider blynk (mes!=0) la valeur de l'allumage est la valeurs envoyer -1.
		PWMSetDutyCycle(i,mes[1]-1);
		tabSortie[i].Fonctionement=1;
	}
	else{//Si on remet le slider a 0 on reprend le fonctionnement normal imediatement.
		Heure h;
		readHeure(&h);
		PWMSetDutyCycle(i,PWMPourcentage(&h,&tabSortie[i]));
		tabSortie[i].Fonctionement=0;
	}
	PWMStart(i);// On demare la sortie
}

void Com_STOP(uint8_t* mes){
	for (int i = 0; i<10; i++){
		PWMSetDutyCycle(i,0);
		PWMStart(i);
		tabSortie[i].Fonctionement=1;
	}
}

void Com_Retablir(uint8_t* mes){
	for (int i = 0; i<10; i++)
		tabSortie[i].Fonctionement=0;
}

void Com_SyncRTC(uint8_t* mes){
	Date d;
	d.annee=mes[1];
	d.mois=mes[2];
	d.jour=mes[3];
	d.joursemaine=mes[4];
	d.heure=mes[5];
	d.minute=mes[6];
	d.second=mes[7];
	writeDate(&d);
}
