2025-06-11 10:55:00 -05:00
|
|
|
#include "io.h"
|
|
|
|
|
#include "spi.h"
|
2025-08-26 16:10:47 -05:00
|
|
|
#include "ports.h"
|
2025-06-11 10:55:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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;
|
|
|
|
|
|
2025-06-20 18:02:50 -05:00
|
|
|
if (update) io_update();
|
2025-06-11 10:55:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void io_expanderClear(uint8_t port, uint8_t pins, bool update)
|
|
|
|
|
{
|
|
|
|
|
_expanderState[port] &= ~pins;
|
|
|
|
|
|
2025-06-20 18:02:50 -05:00
|
|
|
if (update) io_update();
|
2025-06-11 10:55:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update I/O expander
|
|
|
|
|
void io_update(void)
|
|
|
|
|
{
|
|
|
|
|
SPI0_SendBytes(_expanderState, EXPANDER_SIZE, EXPANDER);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void io_expanderSetSafe(void)
|
|
|
|
|
{
|
2025-06-25 11:18:44 -05:00
|
|
|
|
|
|
|
|
io_expanderClearAll(NO_UPDATE);
|
|
|
|
|
|
|
|
|
|
io_connectAmpAB(false, NO_UPDATE);
|
|
|
|
|
io_backlightOn(true, NO_UPDATE);
|
|
|
|
|
io_ampPsuOn(false, NO_UPDATE);
|
2025-06-11 10:55:00 -05:00
|
|
|
|
|
|
|
|
io_update();
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
|
2025-08-26 16:10:47 -05:00
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-25 11:18:44 -05:00
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-20 18:02:50 -05:00
|
|
|
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)
|
|
|
|
|
{
|
2025-06-25 11:18:44 -05:00
|
|
|
EXPANDER_SET(BACKLIGHT_ON, NO_UPDATE);
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-06-25 11:18:44 -05:00
|
|
|
EXPANDER_CLEAR(BACKLIGHT_ON, NO_UPDATE);
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
|
2025-06-25 11:18:44 -05:00
|
|
|
if (update) io_update();
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
|
2025-08-26 16:10:47 -05:00
|
|
|
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();
|
|
|
|
|
}
|
2025-06-25 11:18:44 -05:00
|
|
|
|
2025-06-20 18:02:50 -05:00
|
|
|
void io_ampDOn(bool on, bool update)
|
|
|
|
|
{
|
|
|
|
|
if (on)
|
|
|
|
|
{
|
2025-08-26 16:10:47 -05:00
|
|
|
EXPANDER_SET(AMP_D_ON, NO_UPDATE);
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-08-26 16:10:47 -05:00
|
|
|
EXPANDER_CLEAR(AMP_D_ON, NO_UPDATE);
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
2025-06-25 11:18:44 -05:00
|
|
|
|
|
|
|
|
if (update) io_update();
|
2025-06-20 18:02:50 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-26 16:10:47 -05:00
|
|
|
void io_selectAmpAB(bool update)
|
|
|
|
|
{
|
|
|
|
|
EXPANDER_SET(SELECT_AB_AMP, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void io_selectAmpD(bool update)
|
|
|
|
|
{
|
|
|
|
|
EXPANDER_CLEAR(SELECT_AB_AMP, update);
|
|
|
|
|
}
|
2025-06-20 18:02:50 -05:00
|
|
|
|
|
|
|
|
void io_ampPsuOn(bool on, bool update)
|
|
|
|
|
{
|
2025-08-26 16:10:47 -05:00
|
|
|
if (on)
|
2025-06-20 18:02:50 -05:00
|
|
|
{
|
|
|
|
|
EXPANDER_CLEAR( _AMP_PSU_ON, NO_UPDATE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
EXPANDER_SET(_AMP_PSU_ON, NO_UPDATE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (update) io_update();
|
2025-06-25 11:18:44 -05:00
|
|
|
}
|
2025-08-26 16:10:47 -05:00
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|