/*
 * board.c
 *
 *  Created on: Apr 15, 2024
 *      Author: colorbass
 */
#include "main.h"
#include "board.h"

extern ADC_HandleTypeDef hadc1;

//TODO:
//TEMP READ
//GBT_TEMP_SENSORS

void RELAY_Write(relay_t num, uint8_t state){
	if(num==RELAY_1)HAL_GPIO_WritePin(RELAY1_GPIO_Port, RELAY1_Pin, state);
	if(num==RELAY_2)HAL_GPIO_WritePin(RELAY2_GPIO_Port, RELAY2_Pin, state);
	if(num==RELAY_3)HAL_GPIO_WritePin(RELAY3_GPIO_Port, RELAY3_Pin, state);
	if(num==RELAY_4)HAL_GPIO_WritePin(RELAY4_GPIO_Port, RELAY4_Pin, state);
	if(num==RELAY_5)HAL_GPIO_WritePin(RELAY5_GPIO_Port, RELAY5_Pin, state);
	if(num==RELAY_CC)HAL_GPIO_WritePin(RELAY_CC_GPIO_Port, RELAY_CC_Pin, state);
	if(num==RELAY_CP)HAL_GPIO_WritePin(CP_RELAY_GPIO_Port, CP_RELAY_Pin, state);

}

uint8_t IN_ReadInput(inputNum_t input_n){
	switch(input_n){
		case IN_ISO:
			return HAL_GPIO_ReadPin(ISO_IN_GPIO_Port, ISO_IN_Pin);
			break;
		case IN_ESTOP:
			return HAL_GPIO_ReadPin(IN_ESTOP_GPIO_Port, IN_ESTOP_Pin);
			break;
        case IN_FB1:
            return HAL_GPIO_ReadPin(IN_FB1_GPIO_Port, IN_FB1_Pin);
            break;
        case IN_FB2:
            return HAL_GPIO_ReadPin(IN_FB2_GPIO_Port, IN_FB2_Pin);
            break;
        case IN_SW0:
            return HAL_GPIO_ReadPin(IN_SW0_GPIO_Port, IN_SW0_Pin);
            break;
        case IN_SW1:
            return HAL_GPIO_ReadPin(IN_SW1_GPIO_Port, IN_SW1_Pin);
            break;
        case IN_0:
            return HAL_GPIO_ReadPin(IN0_GPIO_Port, IN0_Pin);
            break;
        case IN_ACOK:
            return HAL_GPIO_ReadPin(AC_OK_GPIO_Port, AC_OK_Pin);
            break;
        default:
            return 0;
            break;
	}
}

uint8_t GetBoardTemp(){
	//TODO
//	HAL_ADC_Start(&hadc1); // start the adc
//
//	HAL_ADC_PollForConversion(&hadc1, 100); // poll for conversion
//
//	adc_val = HAL_ADC_GetValue(&hadc1); // get the adc value
//
//	HAL_ADC_Stop(&hadc1); // stop adc
	return 0;
}

void Init_Peripheral(){
    HAL_ADCEx_Calibration_Start(&hadc1);
    RELAY_Write(RELAY_1, 0);
    RELAY_Write(RELAY_2, 0);
    RELAY_Write(RELAY_3, 0);
    RELAY_Write(RELAY_4, 0);
    RELAY_Write(RELAY_5, 0);
    RELAY_Write(RELAY_CC, 0);
    RELAY_Write(RELAY_CP, 0);

}

float pt1000_to_temperature(float resistance) {
    // Константы для PT1000
    const float R0 = 1000.0;  // Сопротивление при 0 °C
    const float C_A = 3.9083E-3f;
//    const float A = 3.9083e-03; // Коэффициент температурного изменения (°C^-1)
//    const float B = -5.775e-07; // Второй коэффициент (°C^-2)
//
//    // Расчет температуры по формуле
//    float temperature = -A / (B - (R0 / resistance - 1) * A);

    float temperature = (resistance-R0) / ( R0 * C_A);

    return temperature;
}


float calculate_NTC_resistance(int adc_value, float Vref, float Vin, float R) {
    // Преобразуем значение АЦП в выходное напряжение
    float Vout = (adc_value / 4095.0) * Vref;

    // Проверяем, чтобы Vout не было равно Vin
    if (Vout >= Vin) {
        return -1; // Ошибка: Vout не может быть больше или равно Vin
    }

    // Вычисляем сопротивление термистора
    float R_NTC = R * (Vout / (Vin - Vout));

    return R_NTC;
}

int16_t GBT_ReadTemp(uint8_t ch){
	//TODO
	if(ch)ADC_Select_Channel(ADC_CHANNEL_8);
	else ADC_Select_Channel(ADC_CHANNEL_9);
    // Начало конверсии
    HAL_ADC_Start(&hadc1);


    // Ожидание окончания конверсии
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

    // Получение значения
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1);

    // Остановка АЦП (по желанию)
    HAL_ADC_Stop(&hadc1);

    if(adcValue>4000) return 20; //Термодатчик не подключен

//    int adc_value = 2048; // Пример значения АЦП
    float Vref = 3.3;     // Напряжение опорное
    float Vin = 5.0;      // Входное напряжение
    float R = 1000;      // Сопротивление резистора в Омах

    float temp = pt1000_to_temperature(calculate_NTC_resistance(adcValue, Vref, Vin, R));



    return (int16_t)temp;

}




void ADC_Select_Channel(uint32_t ch) {
    ADC_ChannelConfTypeDef conf = {
        .Channel = ch,
        .Rank = 1,
        .SamplingTime = ADC_SAMPLETIME_28CYCLES_5,
    };
    if (HAL_ADC_ConfigChannel(&hadc1, &conf) != HAL_OK) {
        Error_Handler();
    }
}
//
//uint8_t SW_GetAddr(){
//	if(!HAL_GPIO_ReadPin(ADDR_0_GPIO_Port, ADDR_0_Pin)){
//		if(!HAL_GPIO_ReadPin(ADDR_1_GPIO_Port, ADDR_1_Pin)){
//			return 0x23;
//		}else{
//			return 0x21;
//		}
//
//	}else{
//		if(!HAL_GPIO_ReadPin(ADDR_1_GPIO_Port, ADDR_1_Pin)){
//			return 0x22;
//		}else{
//			return 0x20;
//		}
//
//	}
//}
