Add the DMO mode sync bytes in DMO mode.

This commit is contained in:
Jonathan Naylor 2016-08-23 19:06:16 +01:00
parent dd45dae63d
commit 02f555d299
4 changed files with 130 additions and 36 deletions

View file

@ -167,8 +167,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = TAG_DATA;
data[1U] = 0x00U;
@ -209,8 +212,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
// Regenerate the payload
CBPTC19696 bptc;
@ -236,8 +242,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Set the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = TAG_EOT;
data[1U] = 0x00U;
@ -282,8 +291,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = m_rfFrames == 0U ? TAG_EOT : TAG_DATA;
data[1U] = 0x00U;
@ -329,8 +341,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
m_rfSeqNo = 0U;
@ -387,8 +402,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Regenerate the Slot Type
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
m_rfFrames--;
@ -405,8 +423,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
} else if (audioSync) {
if (m_rfState == RS_RF_AUDIO) {
// Convert the Audio Sync to be from the BS
CSync::addDMRAudioSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRAudioSync(data + 2U);
else
CSync::addDMRAudioSync(m_slotNo, data + 2U);
unsigned int errors = 0U;
unsigned char fid = m_rfLC->getFID();
@ -490,7 +511,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// Create a dummy start frame to replace the received frame
unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(data + 2U);
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
CDMRFullLC fullLC;
fullLC.encode(*m_rfLC, start + 2U, DT_VOICE_LC_HEADER);
@ -589,7 +613,10 @@ void CDMRSlot::endOfRFData()
if (m_duplex) {
unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(bytes + 2U);
if (m_duplex)
CSync::addDMRDataSync(bytes + 2U);
else
CSync::addDMRDataSync(m_slotNo, bytes + 2U);
CDMRSlotType slotType;
slotType.setDataType(DT_TERMINATOR_WITH_LC);
@ -629,7 +656,10 @@ void CDMRSlot::writeEndRF(bool writeEnd)
// Create a dummy start end frame
unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(data + 2U);
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
CDMRFullLC fullLC;
fullLC.encode(*m_rfLC, data + 2U, DT_TERMINATOR_WITH_LC);
@ -658,7 +688,10 @@ void CDMRSlot::endOfNetData()
if (m_duplex) {
unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(bytes + 2U);
if (m_duplex)
CSync::addDMRDataSync(bytes + 2U);
else
CSync::addDMRDataSync(m_slotNo, bytes + 2U);
CDMRSlotType slotType;
slotType.setDataType(DT_TERMINATOR_WITH_LC);
@ -702,7 +735,10 @@ void CDMRSlot::writeEndNet(bool writeEnd)
// Create a dummy start end frame
unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(data + 2U);
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
CDMRFullLC fullLC;
fullLC.encode(*m_netLC, data + 2U, DT_TERMINATOR_WITH_LC);
@ -772,8 +808,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setDataType(DT_VOICE_LC_HEADER);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = TAG_DATA;
data[1U] = 0x00U;
@ -831,8 +870,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setDataType(DT_VOICE_PI_HEADER);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
// Regenerate the payload
CBPTC19696 bptc;
@ -867,8 +909,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setDataType(DT_TERMINATOR_WITH_LC);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = TAG_EOT;
data[1U] = 0x00U;
@ -920,8 +965,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setDataType(DT_DATA_HEADER);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = m_netFrames == 0U ? TAG_EOT : TAG_DATA;
data[1U] = 0x00U;
@ -971,7 +1019,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
// Create a dummy start frame
unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U];
CSync::addDMRDataSync(start + 2U);
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
CDMRFullLC fullLC;
fullLC.encode(*m_netLC, start + 2U, DT_VOICE_LC_HEADER);
@ -1017,8 +1068,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
data[0U] = TAG_DATA;
data[1U] = 0x00U;
// Convert the Audio Sync to be from the BS
CSync::addDMRAudioSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRAudioSync(data + 2U);
else
CSync::addDMRAudioSync(m_slotNo, data + 2U);
// Initialise the lost packet data
if (m_netFrames == 0U) {
@ -1124,8 +1178,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setColorCode(m_colorCode);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
data[0U] = TAG_DATA;
data[1U] = 0x00U;
@ -1182,8 +1239,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
slotType.setColorCode(m_colorCode);
slotType.getData(data + 2U);
// Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U);
// Clean up the Data Sync
if (m_duplex)
CSync::addDMRDataSync(data + 2U);
else
CSync::addDMRDataSync(m_slotNo, data + 2U);
m_netFrames--;
@ -1562,7 +1622,10 @@ void CDMRSlot::insertSilence(unsigned int count)
}
if (n == 0U) {
CSync::addDMRAudioSync(data + 2U);
if (m_duplex)
CSync::addDMRAudioSync(data + 2U);
else
CSync::addDMRAudioSync(m_slotNo, data + 2U);
} else {
unsigned char lcss = m_netEmbeddedLC.getData(data + 2U, n);

View file

@ -784,7 +784,7 @@ bool CModem::setConfig()
buffer[3U] |= 0x02U;
if (m_pttInvert)
buffer[3U] |= 0x04U;
if (m_duplex)
if (!m_duplex)
buffer[3U] |= 0x80U;
buffer[4U] = 0x00U;

View file

@ -50,6 +50,34 @@ void CSync::addDMRAudioSync(unsigned char* data)
data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | BS_SOURCED_AUDIO_SYNC[i];
}
void CSync::addDMRDataSync(unsigned int slotNo, unsigned char* data)
{
assert(slotNo == 1U || slotNo == 2U);
assert(data != NULL);
if (slotNo == 1U) {
for (unsigned int i = 0U; i < 7U; i++)
data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | DIRECT_SLOT1_DATA_SYNC[i];
} else {
for (unsigned int i = 0U; i < 7U; i++)
data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | DIRECT_SLOT2_DATA_SYNC[i];
}
}
void CSync::addDMRAudioSync(unsigned int slotNo, unsigned char* data)
{
assert(slotNo == 1U || slotNo == 2U);
assert(data != NULL);
if (slotNo == 1U) {
for (unsigned int i = 0U; i < 7U; i++)
data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | DIRECT_SLOT1_AUDIO_SYNC[i];
} else {
for (unsigned int i = 0U; i < 7U; i++)
data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | DIRECT_SLOT2_AUDIO_SYNC[i];
}
}
void CSync::addYSFSync(unsigned char* data)
{
assert(data != NULL);

3
Sync.h
View file

@ -27,6 +27,9 @@ public:
static void addDMRDataSync(unsigned char* data);
static void addDMRAudioSync(unsigned char* data);
static void addDMRDataSync(unsigned int slotNo, unsigned char* data);
static void addDMRAudioSync(unsigned int slotNo, unsigned char* data);
static void addYSFSync(unsigned char* data);
private: