mirror of https://github.com/g4klx/MMDVMHost
Merged branch master into develop
This commit is contained in:
commit
595f1b39e0
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
16
UMP/UMP.ino
16
UMP/UMP.ino
|
|
@ -25,15 +25,17 @@
|
||||||
#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
|
||||||
|
|
@ -44,6 +46,8 @@
|
||||||
#define PIN_CD 7
|
#define PIN_CD 7
|
||||||
|
|
||||||
#define PIN_LOCKOUT 8
|
#define PIN_LOCKOUT 8
|
||||||
|
|
||||||
|
#define FLASH_DELAY 3200U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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__)
|
||||||
|
|
@ -187,13 +191,13 @@ void loop()
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
||||||
|
|
@ -417,7 +417,7 @@ unsigned int CYSFPayload::processVDMode2AudioBlock(unsigned char* data)
|
||||||
// Deinterleave
|
// Deinterleave
|
||||||
for (unsigned int i = 0U; i < 104U; i++) {
|
for (unsigned int i = 0U; i < 104U; i++) {
|
||||||
unsigned int n = INTERLEAVE_TABLE_26_4[i];
|
unsigned int n = INTERLEAVE_TABLE_26_4[i];
|
||||||
bool s = READ_BIT1(data, n);
|
bool s = READ_BIT1(data, n) != 0x00U;
|
||||||
WRITE_BIT1(vch, i, s);
|
WRITE_BIT1(vch, i, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -426,29 +426,35 @@ unsigned int CYSFPayload::processVDMode2AudioBlock(unsigned char* data)
|
||||||
vch[i] ^= WHITENING_DATA[i];
|
vch[i] ^= WHITENING_DATA[i];
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < 81U; i += 3U) {
|
for (unsigned int i = 0U; i < 81U; i += 3U) {
|
||||||
unsigned int n = i;
|
unsigned int n1 = i + 0U;
|
||||||
bool bit1 = READ_BIT1(vch, n);
|
unsigned int n2 = i + 1U;
|
||||||
n++;
|
unsigned int n3 = i + 2U;
|
||||||
bool bit2 = READ_BIT1(vch, n);
|
|
||||||
n++;
|
|
||||||
bool bit3 = READ_BIT1(vch, n);
|
|
||||||
|
|
||||||
if ((bit1 && bit2 && !bit3) || (bit1 && !bit2 && bit3) || (!bit1 && bit2 && bit3)) {
|
unsigned char code = READ_BIT1(vch, n1) ? 1U : 0U +
|
||||||
unsigned int n = i;
|
READ_BIT1(vch, n2) ? 2U : 0U +
|
||||||
WRITE_BIT1(vch, n, true);
|
READ_BIT1(vch, n3) ? 4U : 0U;
|
||||||
n++;
|
|
||||||
WRITE_BIT1(vch, n, true);
|
switch (code) {
|
||||||
n++;
|
case 3U:
|
||||||
WRITE_BIT1(vch, n, true);
|
case 5U:
|
||||||
|
case 6U:
|
||||||
|
WRITE_BIT1(vch, n1, true);
|
||||||
|
WRITE_BIT1(vch, n2, true);
|
||||||
|
WRITE_BIT1(vch, n3, true);
|
||||||
errors++;
|
errors++;
|
||||||
} else if ((!bit1 && !bit2 && bit3) || (!bit1 && bit2 && !bit3) || (bit1 && !bit2 && !bit3)) {
|
break;
|
||||||
unsigned int n = i;
|
case 1U:
|
||||||
WRITE_BIT1(vch, n, false);
|
case 2U:
|
||||||
n++;
|
case 4U:
|
||||||
WRITE_BIT1(vch, n, false);
|
WRITE_BIT1(vch, n1, false);
|
||||||
n++;
|
WRITE_BIT1(vch, n2, false);
|
||||||
WRITE_BIT1(vch, n, false);
|
WRITE_BIT1(vch, n3, false);
|
||||||
errors++;
|
errors++;
|
||||||
|
break;
|
||||||
|
// case 0U:
|
||||||
|
// case 7U:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -459,7 +465,7 @@ unsigned int CYSFPayload::processVDMode2AudioBlock(unsigned char* data)
|
||||||
// Interleave
|
// Interleave
|
||||||
for (unsigned int i = 0U; i < 104U; i++) {
|
for (unsigned int i = 0U; i < 104U; i++) {
|
||||||
unsigned int n = INTERLEAVE_TABLE_26_4[i];
|
unsigned int n = INTERLEAVE_TABLE_26_4[i];
|
||||||
bool s = READ_BIT1(vch, i);
|
bool s = READ_BIT1(vch, i) != 0x00U;
|
||||||
WRITE_BIT1(data, n, s);
|
WRITE_BIT1(data, n, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue