void CDMRControl::clock() { if (m_network != NULL) { CDMRData data; bool ret = m_network->read(data); if (ret) { unsigned int slotNo = data.getSlotNo(); switch (slotNo) { case 1U: m_slot1.writeNetwork(data); break; case 2U: m_slot2.writeNetwork(data); break; default: LogError("Invalid slot no %u", slotNo); break; } } } m_slot1.clock(); m_slot2.clock(); }
bool CDMRNetwork::write(const CDMRData& data) { if (m_status != RUNNING) return false; unsigned char buffer[HOMEBREW_DATA_PACKET_LENGTH]; ::memset(buffer, 0x00U, HOMEBREW_DATA_PACKET_LENGTH); buffer[0U] = 'D'; buffer[1U] = 'M'; buffer[2U] = 'R'; buffer[3U] = 'D'; unsigned int srcId = data.getSrcId(); buffer[5U] = srcId >> 16; buffer[6U] = srcId >> 8; buffer[7U] = srcId >> 0; unsigned int dstId = data.getDstId(); buffer[8U] = dstId >> 16; buffer[9U] = dstId >> 8; buffer[10U] = dstId >> 0; ::memcpy(buffer + 11U, m_id, 4U); unsigned int slotNo = data.getSlotNo(); // Individual slot disabling if (slotNo == 1U && !m_slot1) return false; if (slotNo == 2U && !m_slot2) return false; buffer[15U] = slotNo == 1U ? 0x00U : 0x80U; FLCO flco = data.getFLCO(); buffer[15U] |= flco == FLCO_GROUP ? 0x00U : 0x40U; unsigned int slotIndex = slotNo - 1U; unsigned int count = 1U; unsigned char dataType = data.getDataType(); if (dataType == DT_VOICE_SYNC) { buffer[15U] |= 0x10U; } else if (dataType == DT_VOICE) { buffer[15U] |= data.getN(); } else { if (dataType == DT_VOICE_LC_HEADER) { m_streamId[slotIndex] = ::rand() + 1U; count = 2U; } if (dataType == DT_CSBK || dataType == DT_DATA_HEADER) { m_streamId[slotIndex] = ::rand() + 1U; count = 1U; } buffer[15U] |= (0x20U | dataType); } buffer[4U] = data.getSeqNo(); ::memcpy(buffer + 16U, m_streamId + slotIndex, 4U); data.getData(buffer + 20U); buffer[53U] = data.getBER(); if (m_rssi) buffer[54U] = data.getRSSI(); else buffer[54U] = 0x00U; if (m_debug) CUtils::dump(1U, "Network Transmitted", buffer, HOMEBREW_DATA_PACKET_LENGTH); for (unsigned int i = 0U; i < count; i++) write(buffer, HOMEBREW_DATA_PACKET_LENGTH); return true; }