#include "pcduSwitchCb.h"

#include <fsfw_hal/linux/gpio/LinuxLibgpioIF.h>

#include "devices/gpioIds.h"

void pcdu::switchCallback(GOMSPACE::Pdu pdu, uint8_t channel, bool state, void* args) {
  LinuxLibgpioIF* gpioComIF = reinterpret_cast<LinuxLibgpioIF*>(args);
  if (gpioComIF == nullptr) {
    return;
  }
  if (pdu == GOMSPACE::Pdu::PDU1) {
    PDU1::Channels typedChannel = static_cast<PDU1::Channels>(channel);
    if (typedChannel == PDU1::Channels::ACS_A_SIDE) {
      if (state) {
        gpioComIF->pullHigh(gpioIds::GNSS_0_NRESET);
      } else {
        gpioComIF->pullLow(gpioIds::GNSS_0_NRESET);
      }
    }

  } else if (pdu == GOMSPACE::Pdu::PDU2) {
    PDU2::Channels typedChannel = static_cast<PDU2::Channels>(channel);
    if (typedChannel == PDU2::Channels::ACS_B_SIDE) {
      if (state) {
        gpioComIF->pullHigh(gpioIds::GNSS_1_NRESET);
      } else {
        gpioComIF->pullLow(gpioIds::GNSS_1_NRESET);
      }
    }
  }
}