mirror of
https://github.com/g4klx/MMDVM_HS.git
synced 2025-12-06 07:02:00 +01:00
Fix the incoming serial data from the screen.
This commit is contained in:
parent
29bb3cf352
commit
7ff74ed1ba
|
|
@ -88,12 +88,16 @@ const uint8_t PROTOCOL_VERSION = 1U;
|
||||||
char UDID[] = "00000000000000000000000000000000";
|
char UDID[] = "00000000000000000000000000000000";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Parameters for batching serial data
|
||||||
|
const int MAX_SERIAL_DATA = 250;
|
||||||
|
const uint16_t MAX_SERIAL_COUNT = 100U;
|
||||||
|
|
||||||
CSerialPort::CSerialPort() :
|
CSerialPort::CSerialPort() :
|
||||||
m_buffer(),
|
m_buffer(),
|
||||||
m_ptr(0U),
|
m_ptr(0U),
|
||||||
m_len(0U),
|
m_len(0U),
|
||||||
m_serial_buffer(),
|
m_lastSerialAvail(0),
|
||||||
m_serial_len(0U),
|
m_lastSerialAvailCount(0U),
|
||||||
m_debug(false),
|
m_debug(false),
|
||||||
m_firstCal(false)
|
m_firstCal(false)
|
||||||
{
|
{
|
||||||
|
|
@ -479,9 +483,9 @@ uint8_t CSerialPort::setFreq(const uint8_t* data, uint8_t length)
|
||||||
pocsag_freq_tx |= data[11U] << 8;
|
pocsag_freq_tx |= data[11U] << 8;
|
||||||
pocsag_freq_tx |= data[12U] << 16;
|
pocsag_freq_tx |= data[12U] << 16;
|
||||||
pocsag_freq_tx |= data[13U] << 24;
|
pocsag_freq_tx |= data[13U] << 24;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
pocsag_freq_tx = freq_tx;
|
pocsag_freq_tx = freq_tx;
|
||||||
|
}
|
||||||
|
|
||||||
return io.setFreq(freq_rx, freq_tx, rf_power, pocsag_freq_tx);
|
return io.setFreq(freq_rx, freq_tx, rf_power, pocsag_freq_tx);
|
||||||
}
|
}
|
||||||
|
|
@ -613,8 +617,7 @@ void CSerialPort::process()
|
||||||
m_buffer[0U] = c;
|
m_buffer[0U] = c;
|
||||||
m_ptr = 1U;
|
m_ptr = 1U;
|
||||||
m_len = 0U;
|
m_len = 0U;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m_ptr = 0U;
|
m_ptr = 0U;
|
||||||
m_len = 0U;
|
m_len = 0U;
|
||||||
}
|
}
|
||||||
|
|
@ -736,7 +739,7 @@ void CSerialPort::process()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_DMR_DATA1:
|
case MMDVM_DMR_DATA1:
|
||||||
#if defined(DUPLEX)
|
#if defined(DUPLEX)
|
||||||
if (m_dmrEnable) {
|
if (m_dmrEnable) {
|
||||||
if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) {
|
if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) {
|
||||||
if (m_duplex)
|
if (m_duplex)
|
||||||
|
|
@ -750,7 +753,7 @@ void CSerialPort::process()
|
||||||
DEBUG2("Received invalid DMR data", err);
|
DEBUG2("Received invalid DMR data", err);
|
||||||
sendNAK(err);
|
sendNAK(err);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_DMR_DATA2:
|
case MMDVM_DMR_DATA2:
|
||||||
|
|
@ -776,7 +779,7 @@ void CSerialPort::process()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_DMR_START:
|
case MMDVM_DMR_START:
|
||||||
#if defined(DUPLEX)
|
#if defined(DUPLEX)
|
||||||
if (m_dmrEnable) {
|
if (m_dmrEnable) {
|
||||||
err = 4U;
|
err = 4U;
|
||||||
if (m_len == 4U) {
|
if (m_len == 4U) {
|
||||||
|
|
@ -795,29 +798,29 @@ void CSerialPort::process()
|
||||||
DEBUG2("Received invalid DMR start", err);
|
DEBUG2("Received invalid DMR start", err);
|
||||||
sendNAK(err);
|
sendNAK(err);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_DMR_SHORTLC:
|
case MMDVM_DMR_SHORTLC:
|
||||||
#if defined(DUPLEX)
|
#if defined(DUPLEX)
|
||||||
if (m_dmrEnable)
|
if (m_dmrEnable)
|
||||||
err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U);
|
err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U);
|
||||||
if (err != 0U) {
|
if (err != 0U) {
|
||||||
DEBUG2("Received invalid DMR Short LC", err);
|
DEBUG2("Received invalid DMR Short LC", err);
|
||||||
sendNAK(err);
|
sendNAK(err);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_DMR_ABORT:
|
case MMDVM_DMR_ABORT:
|
||||||
#if defined(DUPLEX)
|
#if defined(DUPLEX)
|
||||||
if (m_dmrEnable)
|
if (m_dmrEnable)
|
||||||
err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U);
|
err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U);
|
||||||
if (err != 0U) {
|
if (err != 0U) {
|
||||||
DEBUG2("Received invalid DMR Abort", err);
|
DEBUG2("Received invalid DMR Abort", err);
|
||||||
sendNAK(err);
|
sendNAK(err);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MMDVM_YSF_DATA:
|
case MMDVM_YSF_DATA:
|
||||||
|
|
@ -964,32 +967,20 @@ void CSerialPort::process()
|
||||||
|
|
||||||
#if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1)
|
#if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1)
|
||||||
// Check for any incoming serial data from a device/screen on UART2
|
// Check for any incoming serial data from a device/screen on UART2
|
||||||
// !!Notice!! on powerup the Nextion screen dumps FF FF FF 88 FF FF FF to the serial port.
|
int serialAvail = availableInt(3U);
|
||||||
while (availableInt(3U))
|
if ((serialAvail > 0 && serialAvail == m_lastSerialAvail && m_lastSerialAvailCount >= MAX_SERIAL_COUNT) || (serialAvail >= MAX_SERIAL_DATA)) {
|
||||||
{
|
uint8_t buffer[MAX_SERIAL_DATA];
|
||||||
// read UART2
|
for (int i = 0; i < serialAvail && i < MAX_SERIAL_DATA; i++) {
|
||||||
m_serial_buffer[m_serial_len++] = readInt(3U);
|
buffer[i] = readInt(3U);
|
||||||
|
m_lastSerialAvail--;
|
||||||
if (m_serial_len >=3 && (m_serial_buffer[m_serial_len - 3] == 0xFF) && (m_serial_buffer[m_serial_len - 2] == 0xFF) && (m_serial_buffer[m_serial_len - 1] == 0xFF))
|
|
||||||
{
|
|
||||||
if (m_serial_len > 3)
|
|
||||||
serial.writeSerialRpt(m_serial_buffer, m_serial_len);
|
|
||||||
|
|
||||||
// if the last 3 bytes are FF's then the screen is done sending data so send the m_serial_buffer to serial.writeSerialRpt()
|
|
||||||
//
|
|
||||||
// TODO - BG5HHP
|
|
||||||
// modem serial data repeat should be generic instead of coupling with the nextion protocol.
|
|
||||||
//
|
|
||||||
m_serial_len = 0U;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_serial_len == sizeof(m_serial_buffer))
|
|
||||||
{
|
|
||||||
// buffer overflow
|
|
||||||
m_serial_len = 0U;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
serial.writeSerialRpt(buffer, serialAvail - m_lastSerialAvail);
|
||||||
|
m_lastSerialAvailCount = 0U;
|
||||||
|
} else if (serialAvail > 0 && serialAvail == m_lastSerialAvail) {
|
||||||
|
m_lastSerialAvailCount++;
|
||||||
|
} else {
|
||||||
|
m_lastSerialAvail = serialAvail;
|
||||||
|
m_lastSerialAvailCount = 0U;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -1010,7 +1001,6 @@ void CSerialPort::writeSerialRpt(const uint8_t* data, uint8_t length)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length)
|
void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length)
|
||||||
{
|
{
|
||||||
if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE)
|
if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE)
|
||||||
|
|
|
||||||
10
SerialPort.h
10
SerialPort.h
|
|
@ -71,11 +71,11 @@ public:
|
||||||
void writeDebug(const char* text, int16_t n1, int16_t n2);
|
void writeDebug(const char* text, int16_t n1, int16_t n2);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t m_buffer[256U];
|
uint8_t m_buffer[256U];
|
||||||
uint8_t m_ptr;
|
uint8_t m_ptr;
|
||||||
uint8_t m_len;
|
uint8_t m_len;
|
||||||
uint8_t m_serial_buffer[128U];
|
int m_lastSerialAvail;
|
||||||
uint8_t m_serial_len;
|
uint16_t m_lastSerialAvailCount;
|
||||||
|
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_firstCal;
|
bool m_firstCal;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue