#include "io.h" #include "spi.h" #include "ports.h" #define EXPANDER_SIZE 3 static uint8_t _expanderState[EXPANDER_SIZE]; // copy of Shift register I/O expander //Port_State[BOTTOM_SR] |= TAP2_LF_ON; void io_expanderSet(uint8_t port, uint8_t pins, bool update) { _expanderState[port] |= pins; if (update) io_update(); } void io_expanderClear(uint8_t port, uint8_t pins, bool update) { _expanderState[port] &= ~pins; if (update) io_update(); } // update I/O expander void io_update(void) { SPI0_SendBytes(_expanderState, EXPANDER_SIZE, EXPANDER); } void io_expanderSetSafe(void) { io_expanderClearAll(NO_UPDATE); io_connectAmpAB(false, NO_UPDATE); io_backlightOn(true, NO_UPDATE); io_ampPsuOn(false, NO_UPDATE); io_update(); } void io_ampABOn(bool on, bool update) { if (on) { EXPANDER_SET(AMP_AB_ON, NO_UPDATE); } else { EXPANDER_CLEAR(AMP_AB_ON, NO_UPDATE); } if (update) io_update(); } void io_connectAmpAB(bool connect, bool update) { if (connect) { EXPANDER_CLEAR(DISCONNECT_AB, NO_UPDATE); } else { EXPANDER_SET(DISCONNECT_AB, NO_UPDATE); } if (update) io_update(); } void io_expanderClearAll(bool update) { _expanderState[BOT_SR] = 0; _expanderState[MID_SR] = 0; _expanderState[TOP_SR] = 0; if (update) io_update(); } void io_backlightOn(bool on, bool update) { if (on) { EXPANDER_SET(BACKLIGHT_ON, NO_UPDATE); } else { EXPANDER_CLEAR(BACKLIGHT_ON, NO_UPDATE); } if (update) io_update(); } void io_ampDEnable(bool enable, bool update) { if (enable) { EXPANDER_SET(AMP_D_EN, NO_UPDATE); } else { EXPANDER_CLEAR(AMP_D_EN, NO_UPDATE); } if (update) io_update(); } void io_ampDOn(bool on, bool update) { if (on) { EXPANDER_SET(AMP_D_ON, NO_UPDATE); } else { EXPANDER_CLEAR(AMP_D_ON, NO_UPDATE); } if (update) io_update(); } void io_broadcastOn(bool on, bool update) { if (on) { EXPANDER_SET(BROADCAST_AMP_EN, NO_UPDATE); EXPANDER_SET(BROADCAST_AMP_PWR, NO_UPDATE); } else { EXPANDER_CLEAR(BROADCAST_AMP_EN, NO_UPDATE); EXPANDER_CLEAR(BROADCAST_AMP_PWR, NO_UPDATE); } if (update) io_update(); } void io_selectAmpAB(bool update) { EXPANDER_SET(SELECT_AB_AMP, update); } void io_selectAmpD(bool update) { EXPANDER_CLEAR(SELECT_AB_AMP, update); } void io_ampPsuOn(bool on, bool update) { if (on) { EXPANDER_CLEAR( _AMP_PSU_ON, NO_UPDATE); } else { EXPANDER_SET(_AMP_PSU_ON, NO_UPDATE); } if (update) io_update(); } void io_setOutputPort(AccessoryPortId_t port, AccyChannelId_t channel) { if (port == ACCY_PORT_1) { EXPANDER_CLEAR(OUT_RELAY_OFF, NO_UPDATE); if (channel == CHANNEL_A) { EXPANDER_SET(PORT1A_ON, NO_UPDATE); } else if (channel == CHANNEL_B) { EXPANDER_SET(PORT1B_ON, NO_UPDATE); } } else if (port == ACCY_PORT_2) { EXPANDER_CLEAR(OUT_RELAY_OFF, NO_UPDATE); if (channel == CHANNEL_A) { EXPANDER_SET(PORT2A_ON, NO_UPDATE); } else if (channel == CHANNEL_B) { EXPANDER_SET(PORT2B_ON, NO_UPDATE); } } io_update(); } void io_bypassProtection(bool bypass, bool update) { if (bypass) { //if ((freqArray[frequency].frequency1 < MIN_BLOCK_FREQ) && (!Over_Voltage_Flag)) EXPANDER_SET(BYPASS_ON, NO_UPDATE); } else { EXPANDER_CLEAR(BYPASS_ON, NO_UPDATE); } if (update) io_update(); }