Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
5ac1b2875c
7 changed files with 66 additions and 22 deletions
|
@ -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) {
|
} 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]);
|
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];
|
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;
|
m_dstRewriteID[slot - 1U] = did;
|
||||||
dmrLC->setFLCO(FLCO_GROUP);
|
dmrLC->setFLCO(FLCO_GROUP);
|
||||||
LogMessage("DMR Slot %u, Rewrite outbound private call to %u Group Call (Connect talkgroup by private call)", slot, did);
|
LogMessage("DMR Slot %u, Rewrite outbound private call to %u Group Call (Connect talkgroup by private call)", slot, did);
|
||||||
return 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;
|
m_dstRewriteID[slot - 1U] = did;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
const unsigned char UDTF_NMEA = 0x05U;
|
||||||
|
|
||||||
CDMRDataHeader::CDMRDataHeader() :
|
CDMRDataHeader::CDMRDataHeader() :
|
||||||
m_data(NULL),
|
m_data(NULL),
|
||||||
m_GI(false),
|
m_GI(false),
|
||||||
|
@ -78,13 +80,13 @@ bool CDMRDataHeader::put(const unsigned char* bytes)
|
||||||
|
|
||||||
switch (dpf) {
|
switch (dpf) {
|
||||||
case DPF_UNCONFIRMED_DATA:
|
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_F = (m_data[8U] & 0x80U) == 0x80U;
|
||||||
m_blocks = m_data[8U] & 0x7FU;
|
m_blocks = m_data[8U] & 0x7FU;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_CONFIRMED_DATA:
|
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_F = (m_data[8U] & 0x80U) == 0x80U;
|
||||||
m_blocks = m_data[8U] & 0x7FU;
|
m_blocks = m_data[8U] & 0x7FU;
|
||||||
m_S = (m_data[9U] & 0x80U) == 0x80U;
|
m_S = (m_data[9U] & 0x80U) == 0x80U;
|
||||||
|
@ -92,38 +94,46 @@ bool CDMRDataHeader::put(const unsigned char* bytes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_RESPONSE:
|
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;
|
m_blocks = m_data[8U] & 0x7FU;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_PROPRIETARY:
|
case DPF_PROPRIETARY:
|
||||||
CUtils::dump(1U, "Proprietary Data Header", m_data, 12U);
|
CUtils::dump(1U, "DMR, Proprietary Data Header", m_data, 12U);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_DEFINED_RAW:
|
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_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU);
|
||||||
m_F = (m_data[8U] & 0x01U) == 0x01U;
|
m_F = (m_data[8U] & 0x01U) == 0x01U;
|
||||||
m_S = (m_data[8U] & 0x02U) == 0x02U;
|
m_S = (m_data[8U] & 0x02U) == 0x02U;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_DEFINED_SHORT:
|
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_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU);
|
||||||
m_F = (m_data[8U] & 0x01U) == 0x01U;
|
m_F = (m_data[8U] & 0x01U) == 0x01U;
|
||||||
m_S = (m_data[8U] & 0x02U) == 0x02U;
|
m_S = (m_data[8U] & 0x02U) == 0x02U;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DPF_UDT:
|
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;
|
m_blocks = m_data[8U] & 0x03U;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CUtils::dump("Unknown Data Header", m_data, 12U);
|
CUtils::dump("DMR, Unknown Data Header", m_data, 12U);
|
||||||
break;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -522,8 +522,16 @@ bool CDMRNetwork::writeConfig()
|
||||||
char longitude[20U];
|
char longitude[20U];
|
||||||
::sprintf(longitude, "%09f", m_longitude);
|
::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(),
|
::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);
|
m_description.c_str(), slots, m_url.c_str(), m_version, software);
|
||||||
|
|
||||||
return write((unsigned char*)buffer, 302U);
|
return write((unsigned char*)buffer, 302U);
|
||||||
|
|
|
@ -1144,6 +1144,12 @@ void CMMDVMHost::createDisplay()
|
||||||
m_display = new CNullDisplay;
|
m_display = new CNullDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_display == NULL) {
|
||||||
|
LogWarning("No valid display found, disabling");
|
||||||
|
m_display = new CNullDisplay;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool ret = m_display->open();
|
bool ret = m_display->open();
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
delete m_display;
|
delete m_display;
|
||||||
|
|
|
@ -422,7 +422,6 @@ void CModem::clock(unsigned int ms)
|
||||||
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
||||||
|
|
||||||
m_tx = (m_buffer[5U] & 0x01U) == 0x01U;
|
m_tx = (m_buffer[5U] & 0x01U) == 0x01U;
|
||||||
m_cd = (m_buffer[5U] & 0x02U) == 0x02U;
|
|
||||||
|
|
||||||
bool adcOverflow = (m_buffer[5U] & 0x02U) == 0x02U;
|
bool adcOverflow = (m_buffer[5U] & 0x02U) == 0x02U;
|
||||||
if (adcOverflow)
|
if (adcOverflow)
|
||||||
|
@ -441,6 +440,8 @@ void CModem::clock(unsigned int ms)
|
||||||
bool dacOverflow = (m_buffer[5U] & 0x20U) == 0x20U;
|
bool dacOverflow = (m_buffer[5U] & 0x20U) == 0x20U;
|
||||||
if (dacOverflow)
|
if (dacOverflow)
|
||||||
LogError("MMDVM DAC levels have overflowed");
|
LogError("MMDVM DAC levels have overflowed");
|
||||||
|
|
||||||
|
m_cd = (m_buffer[5U] & 0x40U) == 0x40U;
|
||||||
|
|
||||||
m_dstarSpace = m_buffer[6U];
|
m_dstarSpace = m_buffer[6U];
|
||||||
m_dmrSpace1 = m_buffer[7U];
|
m_dmrSpace1 = m_buffer[7U];
|
||||||
|
|
37
UMP/UMP.ino
37
UMP/UMP.ino
|
@ -16,20 +16,26 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega32U4__) && !defined(__SAM3X8E__) && !defined(__MK20DX256__)
|
||||||
|
#include <AltSoftSerial.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(PIN_LED)
|
#if !defined(PIN_LED)
|
||||||
#define PIN_LED 13
|
#define PIN_LED 13
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__MK20DX256__)
|
#if defined(__MK20DX256__)
|
||||||
#define PIN_DSTAR 2
|
#define PIN_DSTAR 3
|
||||||
#define PIN_DMR 3
|
#define PIN_DMR 4
|
||||||
#define PIN_YSF 4
|
#define PIN_YSF 5
|
||||||
#define PIN_P25 5
|
#define PIN_P25 6
|
||||||
|
|
||||||
#define PIN_TX 10
|
#define PIN_TX 10
|
||||||
#define PIN_CD 11
|
#define PIN_CD 11
|
||||||
|
|
||||||
#define PIN_LOCKOUT 12
|
#define PIN_LOCKOUT 12
|
||||||
|
|
||||||
|
#define FLASH_DELAY 200000U
|
||||||
#else
|
#else
|
||||||
#define PIN_DSTAR 2
|
#define PIN_DSTAR 2
|
||||||
#define PIN_DMR 3
|
#define PIN_DMR 3
|
||||||
|
@ -39,7 +45,13 @@
|
||||||
#define PIN_TX 6
|
#define PIN_TX 6
|
||||||
#define PIN_CD 7
|
#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
|
#endif
|
||||||
|
|
||||||
// Use the LOCKOUT function on the UMP
|
// 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__)
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__)
|
||||||
Serial1.begin(9600);
|
Serial1.begin(9600);
|
||||||
|
#else
|
||||||
|
mySerial.begin(9600);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pinMode(PIN_LED, OUTPUT);
|
pinMode(PIN_LED, OUTPUT);
|
||||||
|
@ -132,11 +146,13 @@ void loop()
|
||||||
case UMP_SET_CD:
|
case UMP_SET_CD:
|
||||||
digitalWrite(PIN_CD, m_buffer[3U] == 0x01U ? HIGH : LOW);
|
digitalWrite(PIN_CD, m_buffer[3U] == 0x01U ? HIGH : LOW);
|
||||||
break;
|
break;
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__)
|
|
||||||
case UMP_WRITE_SERIAL:
|
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);
|
Serial1.write(m_buffer + 3U, m_length - 3U);
|
||||||
break;
|
#else
|
||||||
|
mySerial.write(m_buffer + 3U, m_length - 3U);
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -165,17 +181,20 @@ void loop()
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__)
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || defined(__MK20DX256__)
|
||||||
while (Serial1.available())
|
while (Serial1.available())
|
||||||
Serial1.read();
|
Serial1.read();
|
||||||
|
#else
|
||||||
|
while (mySerial.available())
|
||||||
|
mySerial.read();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_count++;
|
m_count++;
|
||||||
if (m_started) {
|
if (m_started) {
|
||||||
if (m_count > 3200U) {
|
if (m_count > FLASH_DELAY) {
|
||||||
digitalWrite(PIN_LED, m_led ? LOW : HIGH);
|
digitalWrite(PIN_LED, m_led ? LOW : HIGH);
|
||||||
m_led = !m_led;
|
m_led = !m_led;
|
||||||
m_count = 0U;
|
m_count = 0U;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (m_count > 32000U) {
|
if (m_count > (FLASH_DELAY * 3U)) {
|
||||||
digitalWrite(PIN_LED, m_led ? LOW : HIGH);
|
digitalWrite(PIN_LED, m_led ? LOW : HIGH);
|
||||||
m_led = !m_led;
|
m_led = !m_led;
|
||||||
m_count = 0U;
|
m_count = 0U;
|
||||||
|
|
|
@ -19,6 +19,6 @@
|
||||||
#if !defined(VERSION_H)
|
#if !defined(VERSION_H)
|
||||||
#define VERSION_H
|
#define VERSION_H
|
||||||
|
|
||||||
const char* VERSION = "20161021";
|
const char* VERSION = "20161124";
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue