#include "Status.h"
#include "gpio.h"
#include "spi.h"

uint8_t gl_tmpAir,gl_tmpEau,gl_PH,gl_Salinity;

uint8_t gl_Notification,gl_Erreur;

float readSPI(uint8_t channel){
	uint8_t commandHigh;
	switch (channel) {
		case 0:
			commandHigh = 0b10000111; // Commande pour le channel 0
			break;
		case 1:
			commandHigh = 0b11000111; // Commande pour le channel 1
			break;
		case 2:
			commandHigh = 0b10010111; // Commande pour le channel 2
			break;
		case 3:
			commandHigh = 0b11010111; // Commande pour le channel 3
			break;
		case 4:
			commandHigh = 0b10100111; // Commande pour le channel 4
			break;
		case 5:
			commandHigh = 0b11100111; // Commande pour le channel 5
			break;
		case 6:
			commandHigh = 0b10110111; // Commande pour le channel 6
			break;
		case 7:
			commandHigh = 0b11110111; // Commande pour le channel 7
			break;
		default:
			return -1; // Retourner une valeur d'erreur si le channel est invalide
	}

	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // Activer le CS

	uint8_t txBuffer[3] = {commandHigh, 0x00, 0x00}; // Préparer les données à envoyer
	uint8_t rxBuffer[3] = {0x00, 0x00, 0x00}; // Buffer pour les données reçues

	HAL_SPI_Transmit(&hspi1, &txBuffer[0], 1, HAL_MAX_DELAY); // Envoyer la commande
	HAL_Delay(10); // Attendre un peu pour la stabilisation du signal
	HAL_SPI_Receive(&hspi1, &rxBuffer[1], 2, HAL_MAX_DELAY); // Lire la réponse

	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // Désactiver le CS

	// Combiner les parties haute et basse du résultat
	int16_t valeur = (rxBuffer[1] << 8) | rxBuffer[2];
	float tension = valeur * (3.3 / (65536 / 2));

	return tension;
}

uint8_t readTempAir() {
	//Todo
	return gl_tmpAir;
}

uint8_t readTempEau() {
	//Todo
	return gl_tmpEau;
}

uint8_t readPH() {
	//Todo
	return gl_PH;
}

uint8_t readSalinity() {
	//Todo
	return gl_Salinity;
}

uint8_t readNiveau() {
	uint8_t res = 0;
	res = res | (HAL_GPIO_ReadPin(TechBas_GPIO_Port, TechBas_Pin) << 7);
	res = res | (HAL_GPIO_ReadPin(TechHaut_GPIO_Port, TechHaut_Pin) << 6);
	res = res | (HAL_GPIO_ReadPin(CuveHaut_GPIO_Port, CuveHaut_Pin) << 5);
	res = res | (HAL_GPIO_ReadPin(ReserveBAs_GPIO_Port, ReserveBAs_Pin) << 4);

	res = res | (HAL_GPIO_ReadPin(CaptAutre1_GPIO_Port, CaptAutre1_Pin) << 3);
	res = res | (HAL_GPIO_ReadPin(CaptAutre2_GPIO_Port, CaptAutre2_Pin) << 2);
	return res;
}


uint8_t ReadNotif(){
	uint8_t val = gl_Notification; //On lit et on remet a 0 les notif
	gl_Notification =0;
	return val;
}

uint8_t ReadErreur(){
	return gl_Erreur;
}

uint8_t convertADC_tmp(uint16_t val) {
	float V1 = val * 0.000871675; // Le chiffre a était trouvé par l'expérimentation
	float R = V1 / ((3.3 - V1) / 467.0); // tension mesuré / (tension de ref - tension mesure)/Résistance du pont avec PT100
	float tmp = ((R - 100) / ALPHA)-0.40; // conversion de la Resistance PT100 (R) en température -0.45 (Temperature d'echauffement)
	uint8_t t = (tmp - 10.0) * 10.0; //codage de la temperature en uint8_t (temp -15°C)  * 10
	return t;
}

int moyen(int tmp,int* oldtmp){
	int res = 0;
	for (int i = 0; i< 9;i++){
		oldtmp[i]=oldtmp[i+1];
		res += oldtmp[i];
	}
	res+=tmp;
	oldtmp[9]=tmp;
	return res/10;
}


