From e9ba2e896ae136a4742f9c7110e12966353dde0d Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 1 Jun 2016 09:23:09 +0100 Subject: [PATCH] Assert optional output pins on mode change. --- Config.h | 3 +++ IO.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- IO.h | 3 ++- SerialPort.cpp | 2 ++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Config.h b/Config.h index 603b0a1..148fea1 100644 --- a/Config.h +++ b/Config.h @@ -31,6 +31,9 @@ // Allow the use of the COS line to lockout the modem // #define USE_COS_AS_LOCKOUT +// Use pins to output the current mode +// #define ARDUINO_MODE_PINS + // For the original Arduino Due pin layout // #define ARDUINO_DUE_PAPA diff --git a/IO.cpp b/IO.cpp index 2eb6d40..e4e2012 100644 --- a/IO.cpp +++ b/IO.cpp @@ -51,6 +51,9 @@ const uint16_t DC_OFFSET = 2048U; #define PIN_COS 52 #define PIN_PTT 23 #define PIN_COSLED 22 +#define PIN_DSTAR 132 +#define PIN_DMR 133 +#define PIN_YSF 134 #define ADC_CHER_Chan (1<<13) // ADC on Due pin A11 - Due AD13 - (1 << 13) (PB20) #define ADC_ISR_EOC_Chan ADC_ISR_EOC13 #define ADC_CDR_Chan 13 @@ -137,6 +140,13 @@ m_lockout(false) pinMode(PIN_COSLED, OUTPUT); pinMode(PIN_LED, OUTPUT); pinMode(PIN_COS, INPUT); + +#if defined(ARDUINO_MODE_PINS) + // Set up the mode output pins + pinMode(PIN_DSTAR, OUTPUT); + pinMode(PIN_DMR, OUTPUT); + pinMode(PIN_YSF, OUTPUT); +#endif #endif } @@ -204,7 +214,7 @@ void CIO::start() digitalWrite(PIN_PTT, m_pttInvert ? HIGH : LOW); digitalWrite(PIN_COSLED, LOW); - digitalWrite(PIN_LED, HIGH); + digitalWrite(PIN_LED, HIGH); #elif defined(__MBED__) m_ticker.attach(&ADC_Handler, 1.0 / 24000.0); @@ -215,6 +225,8 @@ void CIO::start() m_count = 0U; m_started = true; + + setMode(); } void CIO::process() @@ -227,6 +239,7 @@ void CIO::process() if (m_modemState == STATE_DMR && m_tx) dmrTX.setStart(false); m_modemState = STATE_IDLE; + setMode(); } m_watchdog = 0U; @@ -433,6 +446,36 @@ void CIO::setDecode(bool dcd) m_dcd = dcd; } +void CIO::setMode() +{ +#if !defined(__MBED__) +#if defined(ARDUINO_MODE_PINS) +switch (m_modemState) { + case STATE_DSTAR: + digitalWrite(PIN_DSTAR, HIGH); + digitalWrite(PIN_DMR, LOW); + digitalWrite(PIN_YSF, LOW); + break; + case STATE_DMR: + digitalWrite(PIN_DSTAR, LOW); + digitalWrite(PIN_DMR, HIGH); + digitalWrite(PIN_YSF, LOW); + break; + case STATE_YSF: + digitalWrite(PIN_DSTAR, LOW); + digitalWrite(PIN_DMR, LOW); + digitalWrite(PIN_YSF, HIGH); + break; + default: + digitalWrite(PIN_DSTAR, LOW); + digitalWrite(PIN_DMR, LOW); + digitalWrite(PIN_YSF, LOW); + break; +} +#endif +#endif +} + void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t txLevel) { m_pttInvert = pttInvert; diff --git a/IO.h b/IO.h index 4878d8d..bd8d985 100644 --- a/IO.h +++ b/IO.h @@ -36,7 +36,8 @@ public: uint16_t getSpace() const; void setDecode(bool dcd); - + void setMode(); + void interrupt(); void setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t txLevel); diff --git a/SerialPort.cpp b/SerialPort.cpp index fe16f81..4747a5a 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -315,6 +315,8 @@ void CSerialPort::setMode(MMDVM_STATE modemState) } m_modemState = modemState; + + io.setMode(); } void CSerialPort::start()