diff --git a/Display.cpp b/Display.cpp index 8e8822a..6deffd1 100644 --- a/Display.cpp +++ b/Display.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -265,6 +265,39 @@ void CDisplay::clearP25() } } +void CDisplay::writeNXDN(const char* source, bool group, unsigned int dest, const char* type) +{ + assert(source != NULL); + assert(type != NULL); + + m_timer1.start(); + m_mode1 = MODE_IDLE; + + writeNXDNInt(source, group, dest, type); +} + +void CDisplay::writeNXDNRSSI(unsigned char rssi) +{ + if (rssi != 0U) + writeNXDNRSSIInt(rssi); +} + +void CDisplay::writeNXDNBER(float ber) +{ + writeNXDNBERInt(ber); +} + +void CDisplay::clearNXDN() +{ + if (m_timer1.hasExpired()) { + clearNXDNInt(); + m_timer1.stop(); + m_mode1 = MODE_IDLE; + } else { + m_mode1 = MODE_NXDN; + } +} + void CDisplay::writeCW() { m_timer1.start(); @@ -298,6 +331,11 @@ void CDisplay::clock(unsigned int ms) m_mode1 = MODE_IDLE; m_timer1.stop(); break; + case MODE_NXDN: + clearNXDNInt(); + m_mode1 = MODE_IDLE; + m_timer1.stop(); + break; case MODE_CW: clearCWInt(); m_mode1 = MODE_IDLE; @@ -360,3 +398,11 @@ void CDisplay::writeP25RSSIInt(unsigned char rssi) void CDisplay::writeP25BERInt(float ber) { } + +void CDisplay::writeNXDNRSSIInt(unsigned char rssi) +{ +} + +void CDisplay::writeNXDNBERInt(float ber) +{ +} diff --git a/Display.h b/Display.h index b8f2763..fe6360b 100644 --- a/Display.h +++ b/Display.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,6 +56,11 @@ public: void writeP25BER(float ber); void clearP25(); + void writeNXDN(const char* source, bool group, unsigned int dest, const char* type); + void writeNXDNRSSI(unsigned char rssi); + void writeNXDNBER(float ber); + void clearNXDN(); + void writeCW(); void clearCW(); @@ -89,6 +94,11 @@ protected: virtual void writeP25BERInt(float ber); virtual void clearP25Int() = 0; + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) = 0; + virtual void writeNXDNRSSIInt(unsigned char rssi); + virtual void writeNXDNBERInt(float ber); + virtual void clearNXDNInt() = 0; + virtual void writeCWInt() = 0; virtual void clearCWInt() = 0; diff --git a/HD44780.cpp b/HD44780.cpp index 055e0fc..47b6329 100644 --- a/HD44780.cpp +++ b/HD44780.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016, 2017 by Jonathan Naylor G4KLX & Tony Corbett G0WFV + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX & Tony Corbett G0WFV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,8 +38,9 @@ char m_buffer4[128U]; const unsigned int DSTAR_RSSI_COUNT = 3U; // 3 * 420ms = 1260ms const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms -const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms +const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms +const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms CHD44780::CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, unsigned int i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex) : CDisplay(), @@ -890,6 +891,110 @@ void CHD44780::clearP25Int() } } +void CHD44780::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ + assert(source != NULL); + assert(type != NULL); + +#ifdef ADAFRUIT_DISPLAY + adafruitLCDColour(AC_RED); +#endif + + m_clockDisplayTimer.stop(); // Stop the clock display + ::lcdClear(m_fd); + + if (m_pwm) { + if (m_pwmPin != 1U) + ::softPwmWrite(m_pwmPin, m_pwmBright); + else + ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); + } + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "NXDN"); + + if (m_rows == 2U && m_cols == 16U) { + char m_buffer1[16U]; + ::sprintf(m_buffer1, "%.10s >", source); + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + } else if (m_rows == 4U && m_cols == 16U) { + char m_buffer1[16U]; + ::sprintf(m_buffer1, "%.10s >", source); + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + + ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); + ::lcdPosition(m_fd, 0, 2); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + } else if (m_rows == 4U && m_cols == 20U) { + char m_buffer1[20U]; + ::sprintf(m_buffer1, "%.10s >", source); + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + + ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); + ::lcdPosition(m_fd, 0, 2); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + } else if (m_rows == 2 && m_cols == 40U) { + char m_buffer1[40U]; + ::sprintf(m_buffer1, "%.10s > %s%u", source, group ? "TG" : "", dest); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); + } + + m_dmr = false; + m_rssiCount1 = 0U; +} + +void CHD44780::writeNXDNRSSIInt(unsigned char rssi) +{ + if (m_rssiCount1 == 0U && m_rows > 2) { + ::lcdPosition(m_fd, 0, 3); + ::lcdPrintf(m_fd, "-%3udBm", rssi); + } + + m_rssiCount1++; + if (m_rssiCount1 >= NXDN_RSSI_COUNT) + m_rssiCount1 = 0U; +} + +void CHD44780::clearNXDNInt() +{ +#ifdef ADAFRUIT_DISPLAY + adafruitLCDColour(AC_PURPLE); +#endif + + m_clockDisplayTimer.stop(); // Stop the clock display + + if (m_rows == 2U && m_cols == 16U) { + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); + } else if (m_rows == 4U && m_cols == 16U) { + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); + + ::lcdPosition(m_fd, 0, 2); + ::lcdPrintf(m_fd, "%.*s", m_cols, " "); + + ::lcdPosition(m_fd, 0, 3); + ::lcdPrintf(m_fd, "%.*s", m_cols, " "); + } else if (m_rows == 4U && m_cols == 20U) { + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); + + ::lcdPosition(m_fd, 0, 2); + ::lcdPrintf(m_fd, "%.*s", m_cols, " "); + + ::lcdPosition(m_fd, 0, 3); + ::lcdPrintf(m_fd, "%.*s", m_cols, " "); + } else if (m_rows == 2 && m_cols == 40U) { + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); + } +} + void CHD44780::writeCWInt() { ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); diff --git a/HD44780.h b/HD44780.h index 63bdee6..41b0e83 100644 --- a/HD44780.h +++ b/HD44780.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016, 2017 by Jonathan Naylor G4KLX & Tony Corbett G0WFV + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX & Tony Corbett G0WFV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -117,6 +117,10 @@ protected: virtual void writeP25RSSIInt(unsigned char rssi); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void writeNXDNRSSIInt(unsigned char rssi); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/LCDproc.cpp b/LCDproc.cpp index 1ca096f..b9fc31b 100644 --- a/LCDproc.cpp +++ b/LCDproc.cpp @@ -1,5 +1,6 @@ /* - * Copyright (C) 2016, 2017 by Tony Corbett G0WFV + * Copyright (C) 2016,2017 by Tony Corbett G0WFV + * Copyright (C) 2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,6 +44,11 @@ * Red 128 1000 0000 * Yellow 136 1000 1000 +* LED 5 (NXDN) +* Green 16 0001 0000 +* Red 255 1111 1111 +* Yellow 255 1111 1111 + */ #include "LCDproc.h" @@ -88,6 +94,7 @@ const unsigned int DSTAR_RSSI_COUNT = 3U; // 3 * 420ms = 1260ms const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms +const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms CLCDproc::CLCDproc(std::string address, unsigned int port, unsigned int localPort, const std::string& callsign, unsigned int dmrid, bool displayClock, bool utc, bool duplex, bool dimOnIdle) : CDisplay(), @@ -171,6 +178,7 @@ void CLCDproc::setIdleInt() socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); + socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Idle", m_cols - 3, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -189,6 +197,7 @@ void CLCDproc::setErrorInt(const char* text) socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); + socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Error", m_cols - 4, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -205,6 +214,7 @@ void CLCDproc::setLockoutInt() socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); + socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Lockout", m_cols - 6, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -459,6 +469,51 @@ void CLCDproc::clearP25Int() socketPrintf(m_socketfd, "output 2"); // Set LED2 color green } +// LED 5 Green 16 Red 255 Yellow 255 + +void CLCDproc::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ + assert(source != NULL); + assert(type != NULL); + + m_clockDisplayTimer.stop(); // Stop the clock display + + socketPrintf(m_socketfd, "screen_set NXDN -priority foreground"); + socketPrintf(m_socketfd, "widget_set NXDN Mode 1 1 NXDN"); + + if (m_rows == 2U) { + socketPrintf(m_socketfd, "widget_set NXDN Line2 1 2 15 2 h 3 \"%.10s > %s%u\"", source, group ? "TG" : "", dest); + } else { + socketPrintf(m_socketfd, "widget_set NXDN Line2 1 2 15 2 h 3 \"%.10s >\"", source); + socketPrintf(m_socketfd, "widget_set NXDN Line3 1 3 15 3 h 3 \"%s%u\"", group ? "TG" : "", dest); + socketPrintf(m_socketfd, "output 255"); // Set LED5 color red + } + + m_dmr = false; + m_rssiCount1 = 0U; +} + +void CLCDproc::writeNXDNRSSIInt(unsigned char rssi) +{ + if (m_rssiCount1 == 0U) { + socketPrintf(m_socketfd, "widget_set NXDN Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); + } + + m_rssiCount1++; + if (m_rssiCount1 >= NXDN_RSSI_COUNT) + m_rssiCount1 = 0U; +} + +void CLCDproc::clearNXDNInt() +{ + m_clockDisplayTimer.stop(); // Stop the clock display + + socketPrintf(m_socketfd, "widget_set NXDN Line3 1 2 15 2 h 3 Listening"); + socketPrintf(m_socketfd, "widget_set NXDN Line3 1 3 15 3 h 3 \"\""); + socketPrintf(m_socketfd, "widget_set NXDN Line4 1 4 15 4 h 3 \"\""); + socketPrintf(m_socketfd, "output 16"); // Set LED5 color green +} + void CLCDproc::writeCWInt() { } @@ -729,5 +784,21 @@ void CLCDproc::defineScreens() socketPrintf(m_socketfd, "widget_set P25 Line4 4 2 15 2 h 3 \" \""); */ + // The NXDN Screen + + socketPrintf(m_socketfd, "screen_add NXDN"); + socketPrintf(m_socketfd, "screen_set NXDN -name NXDN -heartbeat on -priority hidden -backlight on"); + + socketPrintf(m_socketfd, "widget_add NXDN Mode string"); + socketPrintf(m_socketfd, "widget_add NXDN Line2 scroller"); + socketPrintf(m_socketfd, "widget_add NXDN Line3 scroller"); + socketPrintf(m_socketfd, "widget_add NXDN Line4 scroller"); + +/* Do we need to pre-populate the values?? + socketPrintf(m_socketfd, "widget_set NXDN Line3 2 1 15 1 h 3 Listening"); + socketPrintf(m_socketfd, "widget_set NXDN Line3 3 1 15 1 h 3 \" \""); + socketPrintf(m_socketfd, "widget_set NXDN Line4 4 2 15 2 h 3 \" \""); +*/ + m_screensDefined = true; } diff --git a/LCDproc.h b/LCDproc.h index 015bf56..fcb1e59 100644 --- a/LCDproc.h +++ b/LCDproc.h @@ -1,5 +1,6 @@ /* - * Copyright (C) 2016, 2017 by Tony Corbett G0WFV + * Copyright (C) 2016,2017 by Tony Corbett G0WFV + * Copyright (C) 2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,6 +56,10 @@ protected: virtual void writeP25RSSIInt(unsigned char rssi); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void writeNXDNRSSIInt(unsigned char rssi); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/Nextion.cpp b/Nextion.cpp index d0495ba..c72146a 100644 --- a/Nextion.cpp +++ b/Nextion.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,6 +35,8 @@ const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int YSF_BER_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms const unsigned int P25_BER_COUNT = 7U; // 7 * 180ms = 1260ms +const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms +const unsigned int NXDN_BER_COUNT = 28U; // 28 * 40ms = 1120ms CNextion::CNextion(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool displayClock, bool utc, unsigned int idleBrightness, unsigned int screenLayout) : CDisplay(), @@ -695,6 +697,94 @@ void CNextion::clearP25Int() sendCommand("t3.txt=\"\""); } +void CNextion::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ + assert(source != NULL); + assert(type != NULL); + + if (m_mode != MODE_NXDN) { + sendCommand("page NXDN"); + sendCommandAction(5U); + } + + char text[30U]; + ::sprintf(text, "dim=%u", m_brightness); + sendCommand(text); + + ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); + sendCommand(text); + sendCommandAction(102U); + + ::sprintf(text, "t1.txt=\"%s%u\"", group ? "TG" : "", dest); + sendCommand(text); + sendCommandAction(103U); + + m_clockDisplayTimer.stop(); + + m_mode = MODE_NXDN; + m_rssiAccum1 = 0U; + m_berAccum1 = 0.0F; + m_rssiCount1 = 0U; + m_berCount1 = 0U; +} + +void CNextion::writeNXDNRSSIInt(unsigned char rssi) +{ + if (m_rssiCount1 == 0U) { + char text[20U]; + ::sprintf(text, "t2.txt=\"-%udBm\"", rssi); + sendCommand(text); + sendCommandAction(104U); + m_rssiCount1 = 1U; + return; + } + + m_rssiAccum1 += rssi; + m_rssiCount1++; + + if (m_rssiCount1 == NXDN_RSSI_COUNT) { + char text[20U]; + ::sprintf(text, "t2.txt=\"-%udBm\"", m_rssiAccum1 / NXDN_RSSI_COUNT); + sendCommand(text); + sendCommandAction(104U); + m_rssiAccum1 = 0U; + m_rssiCount1 = 1U; + } +} + +void CNextion::writeNXDNBERInt(float ber) +{ + if (m_berCount1 == 0U) { + char text[20U]; + ::sprintf(text, "t3.txt=\"%.1f%%\"", ber); + sendCommand(text); + sendCommandAction(105U); + m_berCount1 = 1U; + return; + } + + m_berAccum1 += ber; + m_berCount1++; + + if (m_berCount1 == NXDN_BER_COUNT) { + char text[20U]; + ::sprintf(text, "t3.txt=\"%.1f%%\"", m_berAccum1 / float(NXDN_BER_COUNT)); + sendCommand(text); + sendCommandAction(105U); + m_berAccum1 = 0.0F; + m_berCount1 = 1U; + } +} + +void CNextion::clearNXDNInt() +{ + sendCommand("t0.txt=\"Listening\""); + sendCommandAction(101U); + sendCommand("t1.txt=\"\""); + sendCommand("t2.txt=\"\""); + sendCommand("t3.txt=\"\""); +} + void CNextion::writeCWInt() { sendCommand("t1.txt=\"Sending CW Ident\""); diff --git a/Nextion.h b/Nextion.h index 8235867..b08ebf8 100644 --- a/Nextion.h +++ b/Nextion.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,6 +63,11 @@ protected: virtual void writeP25BERInt(float ber); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void writeNXDNRSSIInt(unsigned char rssi); + virtual void writeNXDNBERInt(float ber); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/NullDisplay.cpp b/NullDisplay.cpp index 411dcba..a70d4f8 100644 --- a/NullDisplay.cpp +++ b/NullDisplay.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -112,6 +112,20 @@ void CNullDisplay::clearP25Int() #endif } +void CNullDisplay::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ +#if defined(RASPBERRY_PI) + ::digitalWrite(LED_STATUS, 1); +#endif +} + +void CNullDisplay::clearNXDNInt() +{ +#if defined(RASPBERRY_PI) + ::digitalWrite(LED_STATUS, 0); +#endif +} + void CNullDisplay::writeCWInt() { } diff --git a/NullDisplay.h b/NullDisplay.h index 7bcb1f3..cacb3b2 100644 --- a/NullDisplay.h +++ b/NullDisplay.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,6 +50,9 @@ protected: virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/OLED.cpp b/OLED.cpp index 55b7ff4..1c64ec9 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -341,6 +341,33 @@ void COLED::clearP25Int() display.display(); } +void COLED::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ + m_mode = MODE_NXDN; + + display.clearDisplay(); + display.fillRect(0, OLED_LINE1, display.width(), display.height(), BLACK); + + display.setCursor(0,OLED_LINE2); + display.printf("%s %.10s", type, source); + + display.setCursor(0,OLED_LINE3); + display.printf(" %s%u", group ? "TG" : "", dest); + + OLED_statusbar(); + display.display(); +} + +void COLED::clearNXDNInt() +{ + display.fillRect(0, OLED_LINE1, display.width(), display.height(), BLACK); + + display.setCursor(40,38); + display.print("Listening"); + + display.display(); +} + void COLED::writeCWInt() { display.clearDisplay(); @@ -395,6 +422,8 @@ void COLED::OLED_statusbar() display.drawBitmap(0, 0, logo_fusion_bmp, 128, 16, WHITE); else if (m_mode == MODE_P25) display.print("P25"); + else if (m_mode == MODE_NXDN) + display.print("NXDN"); else display.drawBitmap(0, 0, logo_glcd_bmp, 128, 16, WHITE); diff --git a/OLED.h b/OLED.h index e822171..06c4739 100644 --- a/OLED.h +++ b/OLED.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -60,6 +60,9 @@ public: virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/TFTSerial.cpp b/TFTSerial.cpp index a0f7c44..08762b1 100644 --- a/TFTSerial.cpp +++ b/TFTSerial.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -354,6 +354,47 @@ void CTFTSerial::clearP25Int() displayText(" "); } +void CTFTSerial::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) +{ + assert(source != NULL); + assert(type != NULL); + + if (m_mode != MODE_NXDN) { + // Clear the screen + clearScreen(); + + setFontSize(FONT_MEDIUM); + + // Draw the P25 insignia + displayBitmap(0U, 0U, "NXDN_sm.bmp"); + } + + char text[30U]; + ::sprintf(text, "%s %.10s", type, source); + + gotoPosPixel(5U, 70U); + displayText(text); + + ::sprintf(text, " %s%u", group ? "TG" : "", dest); + + gotoPosPixel(5U, 90U); + displayText(text); + + m_mode = MODE_NXDN; +} + +void CTFTSerial::clearNXDNInt() +{ + gotoPosPixel(5U, 70U); + displayText(" Listening "); + + gotoPosPixel(5U, 90U); + displayText(" "); + + gotoPosPixel(5U, 110U); + displayText(" "); +} + void CTFTSerial::writeCWInt() { gotoPosPixel(45U, 90U); diff --git a/TFTSerial.h b/TFTSerial.h index 116b787..7ad1e88 100644 --- a/TFTSerial.h +++ b/TFTSerial.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,6 +52,9 @@ protected: virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); virtual void clearP25Int(); + virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); + virtual void clearNXDNInt(); + virtual void writeCWInt(); virtual void clearCWInt(); diff --git a/UMP/UMP.ino b/UMP/UMP.ino index a0c99aa..d35d18f 100644 --- a/UMP/UMP.ino +++ b/UMP/UMP.ino @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2018 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,29 +24,20 @@ #define PIN_LED 13 #endif -#if defined(__MK20DX256__) #define PIN_DSTAR 3 #define PIN_DMR 4 #define PIN_YSF 5 #define PIN_P25 6 +#define PIN_NXDN 7 #define PIN_TX 10 #define PIN_CD 11 #define PIN_LOCKOUT 12 +#if defined(__MK20DX256__) #define FLASH_DELAY 200000U #else -#define PIN_DSTAR 2 -#define PIN_DMR 3 -#define PIN_YSF 4 -#define PIN_P25 5 - -#define PIN_TX 6 -#define PIN_CD 7 - -#define PIN_LOCKOUT 12 - #define FLASH_DELAY 3200U #endif @@ -72,6 +63,7 @@ void setup() pinMode(PIN_DMR, OUTPUT); pinMode(PIN_YSF, OUTPUT); pinMode(PIN_P25, OUTPUT); + pinMode(PIN_NXDN, OUTPUT); pinMode(PIN_TX, OUTPUT); pinMode(PIN_CD, OUTPUT); pinMode(PIN_LOCKOUT, INPUT); @@ -80,6 +72,7 @@ void setup() digitalWrite(PIN_DMR, LOW); digitalWrite(PIN_YSF, LOW); digitalWrite(PIN_P25, LOW); + digitalWrite(PIN_NXDN, LOW); digitalWrite(PIN_TX, LOW); digitalWrite(PIN_CD, LOW); } @@ -101,6 +94,7 @@ void setup() #define MODE_DMR 2U #define MODE_YSF 3U #define MODE_P25 4U +#define MODE_NXDN 5U bool m_started = false; uint32_t m_count = 0U; @@ -139,6 +133,7 @@ void loop() digitalWrite(PIN_DMR, m_buffer[3U] == MODE_DMR ? HIGH : LOW); digitalWrite(PIN_YSF, m_buffer[3U] == MODE_YSF ? HIGH : LOW); digitalWrite(PIN_P25, m_buffer[3U] == MODE_P25 ? HIGH : LOW); + digitalWrite(PIN_NXDN, m_buffer[3U] == MODE_NXDN ? HIGH : LOW); break; case UMP_SET_TX: digitalWrite(PIN_TX, m_buffer[3U] == 0x01U ? HIGH : LOW);