/*
 * Channel_Control.c
 *
 *  Created on: 24. April, 2024
 *      Author: nived
 */

#include "Channel_Control.h"
#include "PCA9535D_Driver.h"

PortExtenderGPIO EN_Ports;

uint8_t timer3_running = 0;
uint8_t timer2_running = 0;
TIM_HandleTypeDef* pwmtimer3;
TIM_HandleTypeDef* pwmtimer2;

void ChannelControl_init(I2C_HandleTypeDef* hi2c, TIM_HandleTypeDef* timer3,
                         TIM_HandleTypeDef* timer2) {

  pwmtimer3 = timer3;
  pwmtimer2 = timer2;
  PCA9535_init(hi2c, 0);
  PCA9535_setGPIOPortOutput(PC9535_PORTA, 0x00);
  PCA9535_setGPIOPortOutput(PC9535_PORTB, 0x00);
  PCA9535_setGPIOPortDirection(PC9535_PORTA, 0x00);
  PCA9535_setGPIOPortDirection(PC9535_PORTB, 0x00);

  EN_Ports.porta.porta = 0;
  EN_Ports.portb.portb = 0;
  EN_Ports.porta.alwayson = 1;
  ChannelControl_UpdateGPIOs(EN_Ports);
  ChannelControl_UpdatePWMs(0, 0, 0, 0);
}

void ChannelControl_UpdateGPIOs(PortExtenderGPIO UpdatePorts) { // ctrl + left click auf portextender 
  EN_Ports = UpdatePorts;
  UpdatePorts.porta.alwayson = 1; // Always on stays always on
 // PCA9535_setGPIOPortOutput(PC9535_PORTA, UpdatePorts.porta.porta);
  // PCA9535_setGPIOPortOutput(PC9535_PORTB, UpdatePorts.portb.portb);
 gpio_port_b testb={};
 testb.en14=1;
  PCA9535_setGPIOPortOutput(PC9535_PORTB, testb.portb);
  gpio_port_a testa={};
  testa.en13=1;
  PCA9535_setGPIOPortOutput(PC9535_PORTA, testa.porta);


}

void ChannelControl_UpdatePWMs(uint8_t radiatorfans,uint8_t tsacfans ,  uint8_t pwmaggregat,
                               uint8_t pwmpumps){
  return;

  pwmtimer3->Instance->CCR4 = pwmpumps << 8;
  pwmtimer3->Instance->CCR1 = radiatorfans << 8;
  pwmtimer2->Instance->CCR2 = tsacfans << 8;

  if (timer3_running) {
    if ((pwmpumps == 0) && (radiatorfans == 0)) {
      timer3_running = 0;
      HAL_TIM_PWM_Stop(pwmtimer3, TIM_CHANNEL_4); 
      HAL_TIM_PWM_Stop(pwmtimer3, TIM_CHANNEL_1); 
    }
  } else {
    if ( (pwmpumps != 0) || (radiatorfans != 0)) {
      timer3_running = 1;
      HAL_TIM_PWM_Start(pwmtimer3, TIM_CHANNEL_4); 
      HAL_TIM_PWM_Start(pwmtimer3, TIM_CHANNEL_1);       
}
  }

  if (timer2_running) {
    if (tsacfans == 0) {
      timer2_running = 0;
      HAL_TIM_PWM_Stop(pwmtimer2, TIM_CHANNEL_2);
    }
  } else {
    if (tsacfans != 0) {
      timer2_running = 1;
      HAL_TIM_PWM_Start(pwmtimer2, TIM_CHANNEL_2);
    }
  }


}