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

#ifndef INC_CHANNEL_CONTROL_H_
#define INC_CHANNEL_CONTROL_H_

#include "stm32f3xx_hal.h"

typedef union {
  struct {
    uint8_t NC : 1;
    uint8_t en13 : 1;     // inverters
    uint8_t en2 : 1;      //servos regler
    uint8_t en1 : 1;      //acu
    uint8_t en4 : 1;      // reserved
    uint8_t en11 : 1;      //lidar
    uint8_t en8 : 1;      // sdc
    uint8_t alwayson : 1; // en7 ist always on 
  };
  uint8_t porta;
} gpio_port_a;

typedef union {
  struct {
    uint8_t en15: 1;      // epsc
    uint8_t en12 : 1;     // hyd aggregat 
    uint8_t NC : 1;       
    uint8_t en3 : 1;      // ebs cs valve
    uint8_t en6 : 1;      // ebs valve b
    uint8_t en5 : 1;     //ebs valve a
    uint8_t en14 : 1;    //servos
    uint8_t en16 : 1;     //misc
  };
  uint8_t portb;
} gpio_port_b;

typedef union {
  struct {
    gpio_port_a porta;
    gpio_port_b portb;
  };
  uint16_t gpios_bitmask;

} PortExtenderGPIO;

void ChannelControl_init(I2C_HandleTypeDef* hi2c, TIM_HandleTypeDef* timer3,
                         TIM_HandleTypeDef* timer2);
void ChannelControl_UpdateGPIOs(PortExtenderGPIO);

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

#endif /* INC_CHANNEL_CONTROL_H_ */
