bool CDMRIPSC::read(CDMRData& data) { if (m_status != RUNNING) return false; if (m_rxData.isEmpty()) return false; unsigned char length = 0U; m_rxData.getData(&length, 1U); m_rxData.getData(m_buffer, length); // Is this a data packet? if (::memcmp(m_buffer, "DMRD", 4U) != 0) return false; unsigned char seqNo = m_buffer[4U]; unsigned int srcId = (m_buffer[5U] << 16) | (m_buffer[6U] << 8) | (m_buffer[7U] << 0); unsigned int dstId = (m_buffer[8U] << 16) | (m_buffer[9U] << 8) | (m_buffer[10U] << 0); unsigned int slotNo = (m_buffer[15U] & 0x80U) == 0x80U ? 2U : 1U; // Individual slot disabling if (slotNo == 1U && !m_slot1) return false; if (slotNo == 2U && !m_slot2) return false; FLCO flco = (m_buffer[15U] & 0x40U) == 0x40U ? FLCO_USER_USER : FLCO_GROUP; data.setSeqNo(seqNo); data.setSlotNo(slotNo); data.setSrcId(srcId); data.setDstId(dstId); data.setFLCO(flco); bool dataSync = (m_buffer[15U] & 0x20U) == 0x20U; bool voiceSync = (m_buffer[15U] & 0x10U) == 0x10U; if (dataSync) { unsigned char dataType = m_buffer[15U] & 0x0FU; data.setData(m_buffer + 20U); data.setDataType(dataType); data.setN(0U); } else if (voiceSync) { data.setData(m_buffer + 20U); data.setDataType(DT_VOICE_SYNC); data.setN(0U); } else { unsigned char n = m_buffer[15U] & 0x0FU; data.setData(m_buffer + 20U); data.setDataType(DT_VOICE); data.setN(n); } return true; }
void CDMRSlot::writeNetwork(const unsigned char* data, unsigned char dataType) { assert(m_lc != NULL); if (m_network == NULL) return; // Don't send to the network if the timeout has expired if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) return; CDMRData dmrData; dmrData.setSlotNo(m_slotNo); dmrData.setDataType(dataType); dmrData.setSrcId(m_lc->getSrcId()); dmrData.setDstId(m_lc->getDstId()); dmrData.setFLCO(m_lc->getFLCO()); dmrData.setN(m_n); dmrData.setSeqNo(m_seqNo); m_seqNo++; dmrData.setData(data + 2U); m_network->write(dmrData); }