mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 23:45:49 +08:00
Convert to the new EOF marker.
This commit is contained in:
@@ -325,35 +325,12 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_HEADER) {
|
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_EOT) {
|
||||||
#if defined(DUMP_M17)
|
#if defined(DUMP_M17)
|
||||||
writeFile(data + 2U);
|
writeFile(data + 2U);
|
||||||
#endif
|
#endif
|
||||||
if (m_duplex) {
|
if (m_duplex)
|
||||||
unsigned char rfData[M17_FRAME_LENGTH_BYTES + 2U];
|
writeQueueEOTRF();
|
||||||
|
|
||||||
// Create a Link Setup frame
|
|
||||||
rfData[0U] = TAG_HEADER;
|
|
||||||
rfData[1U] = 0x00U;
|
|
||||||
|
|
||||||
// Generate the sync
|
|
||||||
CSync::addM17LinkSetupSync(rfData + 2U);
|
|
||||||
|
|
||||||
m_rfLSF.setDataType(M17_DATA_TYPE_END);
|
|
||||||
|
|
||||||
unsigned char setup[M17_LSF_LENGTH_BYTES];
|
|
||||||
m_rfLSF.getLinkSetup(setup);
|
|
||||||
|
|
||||||
// Add the convolution FEC
|
|
||||||
CM17Convolution conv;
|
|
||||||
conv.encodeLinkSetup(setup, rfData + 2U + M17_SYNC_LENGTH_BYTES);
|
|
||||||
|
|
||||||
unsigned char temp[M17_FRAME_LENGTH_BYTES];
|
|
||||||
interleaver(rfData + 2U, temp);
|
|
||||||
decorrelator(temp, rfData + 2U);
|
|
||||||
|
|
||||||
writeQueueRF(rfData);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) {
|
if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) {
|
||||||
unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES];
|
unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES];
|
||||||
@@ -583,29 +560,7 @@ void CM17Control::writeNetwork()
|
|||||||
|
|
||||||
LogMessage("M17, received network end of transmission from %s to %s, %.1f seconds", source.c_str(), dest.c_str(), float(m_netFrames) / 25.0F);
|
LogMessage("M17, received network end of transmission from %s to %s, %.1f seconds", source.c_str(), dest.c_str(), float(m_netFrames) / 25.0F);
|
||||||
|
|
||||||
unsigned char rfData[M17_FRAME_LENGTH_BYTES + 2U];
|
writeQueueEOTNet();
|
||||||
|
|
||||||
// Create a Link Setup frame
|
|
||||||
rfData[0U] = TAG_HEADER;
|
|
||||||
rfData[1U] = 0x00U;
|
|
||||||
|
|
||||||
// Generate the sync
|
|
||||||
CSync::addM17LinkSetupSync(rfData + 2U);
|
|
||||||
|
|
||||||
m_netLSF.setDataType(M17_DATA_TYPE_END);
|
|
||||||
|
|
||||||
unsigned char setup[M17_LSF_LENGTH_BYTES];
|
|
||||||
m_netLSF.getLinkSetup(setup);
|
|
||||||
|
|
||||||
// Add the convolution FEC
|
|
||||||
CM17Convolution conv;
|
|
||||||
conv.encodeLinkSetup(setup, rfData + 2U + M17_SYNC_LENGTH_BYTES);
|
|
||||||
|
|
||||||
unsigned char temp[M17_FRAME_LENGTH_BYTES];
|
|
||||||
interleaver(rfData + 2U, temp);
|
|
||||||
decorrelator(temp, rfData + 2U);
|
|
||||||
|
|
||||||
writeQueueNet(rfData);
|
|
||||||
|
|
||||||
writeEndNet();
|
writeEndNet();
|
||||||
}
|
}
|
||||||
@@ -718,7 +673,7 @@ void CM17Control::writeQueueRF(const unsigned char *data)
|
|||||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = M17_FRAME_LENGTH_BYTES + 2U;
|
const unsigned char len = M17_FRAME_LENGTH_BYTES + 2U;
|
||||||
|
|
||||||
unsigned int space = m_queue.freeSpace();
|
unsigned int space = m_queue.freeSpace();
|
||||||
if (space < (len + 1U)) {
|
if (space < (len + 1U)) {
|
||||||
@@ -731,6 +686,28 @@ void CM17Control::writeQueueRF(const unsigned char *data)
|
|||||||
m_queue.addData(data, len);
|
m_queue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CM17Control::writeQueueEOTRF()
|
||||||
|
{
|
||||||
|
if (m_netState != RS_NET_IDLE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const unsigned char len = 1U;
|
||||||
|
|
||||||
|
unsigned int space = m_queue.freeSpace();
|
||||||
|
if (space < (len + 1U)) {
|
||||||
|
LogError("M17, overflow in the M17 RF queue");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_queue.addData(&len, 1U);
|
||||||
|
|
||||||
|
const unsigned char data = TAG_EOT;
|
||||||
|
m_queue.addData(&data, len);
|
||||||
|
}
|
||||||
|
|
||||||
void CM17Control::writeQueueNet(const unsigned char *data)
|
void CM17Control::writeQueueNet(const unsigned char *data)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
@@ -738,7 +715,7 @@ void CM17Control::writeQueueNet(const unsigned char *data)
|
|||||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = M17_FRAME_LENGTH_BYTES + 2U;
|
const unsigned char len = M17_FRAME_LENGTH_BYTES + 2U;
|
||||||
|
|
||||||
unsigned int space = m_queue.freeSpace();
|
unsigned int space = m_queue.freeSpace();
|
||||||
if (space < (len + 1U)) {
|
if (space < (len + 1U)) {
|
||||||
@@ -751,6 +728,25 @@ void CM17Control::writeQueueNet(const unsigned char *data)
|
|||||||
m_queue.addData(data, len);
|
m_queue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CM17Control::writeQueueEOTNet()
|
||||||
|
{
|
||||||
|
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const unsigned char len = 1U;
|
||||||
|
|
||||||
|
unsigned int space = m_queue.freeSpace();
|
||||||
|
if (space < (len + 1U)) {
|
||||||
|
LogError("M17, overflow in the M17 RF queue");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_queue.addData(&len, 1U);
|
||||||
|
|
||||||
|
const unsigned char data = TAG_EOT;
|
||||||
|
m_queue.addData(&data, len);
|
||||||
|
}
|
||||||
|
|
||||||
void CM17Control::interleaver(const unsigned char* in, unsigned char* out) const
|
void CM17Control::interleaver(const unsigned char* in, unsigned char* out) const
|
||||||
{
|
{
|
||||||
assert(in != NULL);
|
assert(in != NULL);
|
||||||
|
|||||||
@@ -82,7 +82,11 @@ private:
|
|||||||
bool processRFHeader(bool lateEntry);
|
bool processRFHeader(bool lateEntry);
|
||||||
|
|
||||||
void writeQueueRF(const unsigned char* data);
|
void writeQueueRF(const unsigned char* data);
|
||||||
|
void writeQueueEOTRF();
|
||||||
|
|
||||||
void writeQueueNet(const unsigned char* data);
|
void writeQueueNet(const unsigned char* data);
|
||||||
|
void writeQueueEOTNet();
|
||||||
|
|
||||||
void writeNetwork();
|
void writeNetwork();
|
||||||
|
|
||||||
void interleaver(const unsigned char* in, unsigned char* out) const;
|
void interleaver(const unsigned char* in, unsigned char* out) const;
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ const unsigned char M17_1600_SILENCE[] = {0x0CU, 0x41U, 0x09U, 0x03U, 0x0CU, 0x4
|
|||||||
const unsigned char M17_PACKET_TYPE = 0U;
|
const unsigned char M17_PACKET_TYPE = 0U;
|
||||||
const unsigned char M17_STREAM_TYPE = 1U;
|
const unsigned char M17_STREAM_TYPE = 1U;
|
||||||
|
|
||||||
const unsigned char M17_DATA_TYPE_END = 0x00U;
|
|
||||||
const unsigned char M17_DATA_TYPE_DATA = 0x01U;
|
const unsigned char M17_DATA_TYPE_DATA = 0x01U;
|
||||||
const unsigned char M17_DATA_TYPE_VOICE = 0x02U;
|
const unsigned char M17_DATA_TYPE_VOICE = 0x02U;
|
||||||
const unsigned char M17_DATA_TYPE_VOICE_DATA = 0x03U;
|
const unsigned char M17_DATA_TYPE_VOICE_DATA = 0x03U;
|
||||||
|
|||||||
41
Modem.cpp
41
Modem.cpp
@@ -78,6 +78,7 @@ const unsigned char MMDVM_M17_LINK_SETUP = 0x45U;
|
|||||||
const unsigned char MMDVM_M17_STREAM = 0x46U;
|
const unsigned char MMDVM_M17_STREAM = 0x46U;
|
||||||
const unsigned char MMDVM_M17_PACKET = 0x47U;
|
const unsigned char MMDVM_M17_PACKET = 0x47U;
|
||||||
const unsigned char MMDVM_M17_LOST = 0x48U;
|
const unsigned char MMDVM_M17_LOST = 0x48U;
|
||||||
|
const unsigned char MMDVM_M17_EOT = 0x49U;
|
||||||
|
|
||||||
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
|
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
|
||||||
|
|
||||||
@@ -690,6 +691,18 @@ void CModem::clock(unsigned int ms)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MMDVM_M17_EOT: {
|
||||||
|
if (m_trace)
|
||||||
|
CUtils::dump(1U, "RX M17 EOT", m_buffer, m_length);
|
||||||
|
|
||||||
|
unsigned char data = 1U;
|
||||||
|
m_rxM17Data.addData(&data, 1U);
|
||||||
|
|
||||||
|
data = TAG_EOT;
|
||||||
|
m_rxM17Data.addData(&data, 1U);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case MMDVM_M17_LOST: {
|
case MMDVM_M17_LOST: {
|
||||||
if (m_trace)
|
if (m_trace)
|
||||||
CUtils::dump(1U, "RX M17 Lost", m_buffer, m_length);
|
CUtils::dump(1U, "RX M17 Lost", m_buffer, m_length);
|
||||||
@@ -1041,8 +1054,8 @@ void CModem::clock(unsigned int ms)
|
|||||||
case MMDVM_M17_STREAM:
|
case MMDVM_M17_STREAM:
|
||||||
CUtils::dump(1U, "TX M17 Stream Data", m_buffer, len);
|
CUtils::dump(1U, "TX M17 Stream Data", m_buffer, len);
|
||||||
break;
|
break;
|
||||||
case MMDVM_M17_PACKET:
|
case MMDVM_M17_EOT:
|
||||||
CUtils::dump(1U, "TX M17 Packet Data", m_buffer, len);
|
CUtils::dump(1U, "TX M17 EOT", m_buffer, len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1504,20 +1517,26 @@ bool CModem::writeM17Data(const unsigned char* data, unsigned int length)
|
|||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
assert(length > 0U);
|
assert(length > 0U);
|
||||||
|
|
||||||
if (data[0U] != TAG_HEADER && data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
unsigned char buffer[130U];
|
unsigned char buffer[130U];
|
||||||
|
|
||||||
buffer[0U] = MMDVM_FRAME_START;
|
buffer[0U] = MMDVM_FRAME_START;
|
||||||
buffer[1U] = length + 2U;
|
buffer[1U] = length + 2U;
|
||||||
|
|
||||||
if (data[0U] == TAG_HEADER)
|
switch (data[0U]) {
|
||||||
buffer[2U] = MMDVM_M17_LINK_SETUP;
|
case TAG_HEADER:
|
||||||
else
|
buffer[2U] = MMDVM_M17_LINK_SETUP;
|
||||||
buffer[2U] = MMDVM_M17_STREAM;
|
::memcpy(buffer + 3U, data + 1U, length - 1U);
|
||||||
|
break;
|
||||||
::memcpy(buffer + 3U, data + 1U, length - 1U);
|
case TAG_DATA:
|
||||||
|
buffer[2U] = MMDVM_M17_STREAM;
|
||||||
|
::memcpy(buffer + 3U, data + 1U, length - 1U);
|
||||||
|
break;
|
||||||
|
case TAG_EOT:
|
||||||
|
buffer[2U] = MMDVM_M17_EOT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char len = length + 2U;
|
unsigned char len = length + 2U;
|
||||||
m_txM17Data.addData(&len, 1U);
|
m_txM17Data.addData(&len, 1U);
|
||||||
|
|||||||
Reference in New Issue
Block a user