diff --git a/interface2/firmware/include/NewCoax.h b/interface2/firmware/include/NewCoax.h index dc1cdc4..0ee0361 100644 --- a/interface2/firmware/include/NewCoax.h +++ b/interface2/firmware/include/NewCoax.h @@ -70,11 +70,13 @@ private: class NewCoaxDataBus { public: - void setMode(int mode); + void setMode(uint8_t mode, bool force); uint16_t read(); void write(uint16_t word); private: + int _mode = -1; + uint16_t encode(uint16_t word); uint16_t decode(uint16_t word); }; diff --git a/interface2/firmware/src/CoaxTransceiver.cpp b/interface2/firmware/src/CoaxTransceiver.cpp index a4c3743..8f57a47 100644 --- a/interface2/firmware/src/CoaxTransceiver.cpp +++ b/interface2/firmware/src/CoaxTransceiver.cpp @@ -23,7 +23,7 @@ NewCoaxTransmitter transmitter(dataBus, receiver); void CoaxTransceiver::setup() { - dataBus.setMode(INPUT); + dataBus.setMode(INPUT, true); receiver.begin(); transmitter.begin(); diff --git a/interface2/firmware/src/NewCoax.cpp b/interface2/firmware/src/NewCoax.cpp index 27d65ae..838e9e0 100644 --- a/interface2/firmware/src/NewCoax.cpp +++ b/interface2/firmware/src/NewCoax.cpp @@ -78,7 +78,7 @@ int NewCoaxTransmitter::transmit(uint16_t *buffer, size_t bufferCount) _receiver.disable(); - _dataBus.setMode(OUTPUT); + _dataBus.setMode(OUTPUT, true); for (int index = 0; index < bufferCount; index++) { while (digitalRead(TX_FULL_PIN)) { @@ -91,7 +91,7 @@ int NewCoaxTransmitter::transmit(uint16_t *buffer, size_t bufferCount) delayMicroseconds(2); } - _dataBus.setMode(INPUT); + _dataBus.setMode(INPUT, true); while (digitalRead(TX_ACTIVE_PIN)) { // NOP @@ -137,7 +137,7 @@ void NewCoaxReceiver::begin() void NewCoaxReceiver::enable() { - _dataBus.setMode(INPUT); + _dataBus.setMode(INPUT, false); _state = Idle; @@ -271,11 +271,17 @@ inline uint16_t NewCoaxReceiver::read() return word; } -void NewCoaxDataBus::setMode(int mode) +void NewCoaxDataBus::setMode(uint8_t mode, bool force) { + if (mode == _mode && !force) { + return; + } + for (int pin = DATA_BUS_START_PIN; pin <= DATA_BUS_END_PIN; pin++) { pinMode(pin, mode); } + + _mode = mode; } inline uint16_t NewCoaxDataBus::read()