diff --git a/DMRAccessControl.cpp b/DMRAccessControl.cpp index 89f59f1..4fed8de 100644 --- a/DMRAccessControl.cpp +++ b/DMRAccessControl.cpp @@ -232,12 +232,12 @@ unsigned int CDMRAccessControl::dstIdRewrite(unsigned int did, unsigned int sid, } else if (m_bmAutoRewrite && did == 9U && m_dstRewriteID[slot - 1U] != 9U && m_dstRewriteID[slot - 1U] != 0U && (m_time[slot - 1U] + m_callHang) > currenttime && dmrLC->getFLCO() == FLCO_GROUP) { LogMessage("DMR Slot %u, Rewrite DST ID (TG) of outbound network traffic from %u to %u (return traffic during CallHang)", slot, did, m_dstRewriteID[slot - 1U]); return m_dstRewriteID[slot - 1U]; - } else if (m_bmAutoRewrite && (did < 4000U || did > 5000U) && did > 0U && did != 9U && did != 9990U && did < 99999U && dmrLC->getFLCO() == FLCO_USER_USER) { + } else if (m_bmAutoRewrite && (did < 4000U || did > 5000U) && did > 0U && did != 9U && did != 9990U && did < 999999U && dmrLC->getFLCO() == FLCO_USER_USER) { m_dstRewriteID[slot - 1U] = did; dmrLC->setFLCO(FLCO_GROUP); LogMessage("DMR Slot %u, Rewrite outbound private call to %u Group Call (Connect talkgroup by private call)", slot, did); return did; - } else if (m_bmAutoRewrite && (did < 4000U || did > 5000U) && did > 0U && did != 9U && did != 9990U && did > 99999U) { + } else if (m_bmAutoRewrite && (did < 4000U || did > 5000U) && did > 0U && did != 9U && did != 9990U && did > 999999U) { m_dstRewriteID[slot - 1U] = did; } diff --git a/DMRDataHeader.cpp b/DMRDataHeader.cpp index ef0922d..d1864a5 100644 --- a/DMRDataHeader.cpp +++ b/DMRDataHeader.cpp @@ -29,6 +29,8 @@ #include #include +const unsigned char UDTF_NMEA = 0x05U; + CDMRDataHeader::CDMRDataHeader() : m_data(NULL), m_GI(false), @@ -78,13 +80,13 @@ bool CDMRDataHeader::put(const unsigned char* bytes) switch (dpf) { case DPF_UNCONFIRMED_DATA: - CUtils::dump(1U, "Unconfirmed Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Unconfirmed Data Header", m_data, 12U); m_F = (m_data[8U] & 0x80U) == 0x80U; m_blocks = m_data[8U] & 0x7FU; break; case DPF_CONFIRMED_DATA: - CUtils::dump(1U, "Confirmed Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Confirmed Data Header", m_data, 12U); m_F = (m_data[8U] & 0x80U) == 0x80U; m_blocks = m_data[8U] & 0x7FU; m_S = (m_data[9U] & 0x80U) == 0x80U; @@ -92,38 +94,46 @@ bool CDMRDataHeader::put(const unsigned char* bytes) break; case DPF_RESPONSE: - CUtils::dump(1U, "Response Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Response Data Header", m_data, 12U); m_blocks = m_data[8U] & 0x7FU; break; case DPF_PROPRIETARY: - CUtils::dump(1U, "Proprietary Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Proprietary Data Header", m_data, 12U); break; case DPF_DEFINED_RAW: - CUtils::dump(1U, "Raw or Status/Precoded Short Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Raw or Status/Precoded Short Data Header", m_data, 12U); m_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU); m_F = (m_data[8U] & 0x01U) == 0x01U; m_S = (m_data[8U] & 0x02U) == 0x02U; break; case DPF_DEFINED_SHORT: - CUtils::dump(1U, "Defined Short Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Defined Short Data Header", m_data, 12U); m_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU); m_F = (m_data[8U] & 0x01U) == 0x01U; m_S = (m_data[8U] & 0x02U) == 0x02U; break; case DPF_UDT: - CUtils::dump(1U, "Unified Data Transport Header", m_data, 12U); + CUtils::dump(1U, "DMR, Unified Data Transport Header", m_data, 12U); m_blocks = m_data[8U] & 0x03U; break; default: - CUtils::dump("Unknown Data Header", m_data, 12U); + CUtils::dump("DMR, Unknown Data Header", m_data, 12U); break; } + if (dpf == DPF_UDT && m_blocks == 0U) { + unsigned char format = m_data[1U] & 0x0FU; + if (format == UDTF_NMEA) { + LogDebug("DMR, fixing broken Tytera MD-390 GPS data block count"); + m_blocks = 3U; + } + } + return true; } diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index f902d2f..6bb182f 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -522,8 +522,16 @@ bool CDMRNetwork::writeConfig() char longitude[20U]; ::sprintf(longitude, "%09f", m_longitude); + unsigned int power = m_power; + if (power > 99U) + power = 99U; + + int height = m_height; + if (height > 999) + height = 999; + ::sprintf(buffer + 8U, "%-8.8s%09u%09u%02u%02u%8.8s%9.9s%03d%-20.20s%-19.19s%c%-124.124s%-40.40s%-40.40s", m_callsign.c_str(), - m_rxFrequency, m_txFrequency, m_power, m_colorCode, latitude, longitude, m_height, m_location.c_str(), + m_rxFrequency, m_txFrequency, power, m_colorCode, latitude, longitude, height, m_location.c_str(), m_description.c_str(), slots, m_url.c_str(), m_version, software); return write((unsigned char*)buffer, 302U); diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index b2faa0d..6b495db 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1144,6 +1144,12 @@ void CMMDVMHost::createDisplay() m_display = new CNullDisplay; } + if (m_display == NULL) { + LogWarning("No valid display found, disabling"); + m_display = new CNullDisplay; + return; + } + bool ret = m_display->open(); if (!ret) { delete m_display; diff --git a/Modem.cpp b/Modem.cpp index 8efcb9e..990b526 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -422,7 +422,6 @@ void CModem::clock(unsigned int ms) // CUtils::dump(1U, "GET_STATUS", m_buffer, m_length); m_tx = (m_buffer[5U] & 0x01U) == 0x01U; - m_cd = (m_buffer[5U] & 0x02U) == 0x02U; bool adcOverflow = (m_buffer[5U] & 0x02U) == 0x02U; if (adcOverflow) @@ -441,6 +440,8 @@ void CModem::clock(unsigned int ms) bool dacOverflow = (m_buffer[5U] & 0x20U) == 0x20U; if (dacOverflow) LogError("MMDVM DAC levels have overflowed"); + + m_cd = (m_buffer[5U] & 0x40U) == 0x40U; m_dstarSpace = m_buffer[6U]; m_dmrSpace1 = m_buffer[7U]; diff --git a/UMP/UMP.ino b/UMP/UMP.ino index 501737b..a0c99aa 100644 --- a/UMP/UMP.ino +++ b/UMP/UMP.ino @@ -16,20 +16,26 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega32U4__) && !defined(__SAM3X8E__) && !defined(__MK20DX256__) +#include +#endif + #if !defined(PIN_LED) #define PIN_LED 13 #endif #if defined(__MK20DX256__) -#define PIN_DSTAR 2 -#define PIN_DMR 3 -#define PIN_YSF 4 -#define PIN_P25 5 +#define PIN_DSTAR 3 +#define PIN_DMR 4 +#define PIN_YSF 5 +#define PIN_P25 6 #define PIN_TX 10 #define PIN_CD 11 #define PIN_LOCKOUT 12 + +#define FLASH_DELAY 200000U #else #define PIN_DSTAR 2 #define PIN_DMR 3 @@ -39,7 +45,13 @@ #define PIN_TX 6 #define PIN_CD 7 -#define PIN_LOCKOUT 8 +#define PIN_LOCKOUT 12 + +#define FLASH_DELAY 3200U +#endif + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega32U4__) && !defined(__SAM3X8E__) && !defined(__MK20DX256__) +AltSoftSerial mySerial; #endif // Use the LOCKOUT function on the UMP @@ -51,6 +63,8 @@ void setup() #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__) Serial1.begin(9600); +#else + mySerial.begin(9600); #endif pinMode(PIN_LED, OUTPUT); @@ -132,11 +146,13 @@ void loop() case UMP_SET_CD: digitalWrite(PIN_CD, m_buffer[3U] == 0x01U ? HIGH : LOW); break; -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__) case UMP_WRITE_SERIAL: +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__) Serial1.write(m_buffer + 3U, m_length - 3U); - break; +#else + mySerial.write(m_buffer + 3U, m_length - 3U); #endif + break; default: break; } @@ -165,17 +181,20 @@ void loop() #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__) while (Serial1.available()) Serial1.read(); +#else + while (mySerial.available()) + mySerial.read(); #endif m_count++; if (m_started) { - if (m_count > 3200U) { + if (m_count > FLASH_DELAY) { digitalWrite(PIN_LED, m_led ? LOW : HIGH); m_led = !m_led; m_count = 0U; } } else { - if (m_count > 32000U) { + if (m_count > (FLASH_DELAY * 3U)) { digitalWrite(PIN_LED, m_led ? LOW : HIGH); m_led = !m_led; m_count = 0U; diff --git a/Version.h b/Version.h index 865c176..3bce33e 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20161021"; +const char* VERSION = "20161124"; #endif