Example #1
0
void CDMRRX::processDataSync(const unsigned char* buffer)
{
	CDMRSlotType slotType;
	slotType.putData(buffer);

	unsigned char type = slotType.getDataType();
	unsigned char cc   = slotType.getColorCode();

	if (type == DT_IDLE) {
		unsigned int ber = idleBER(m_buffer);
		LogMessage("%u [Data Sync] [IDLE] CC=%u BER=%.1f%%", m_slotNo, cc, float(ber) / 1.96F);
		m_idleBits += 196U;
		m_idleErrs += ber;
	} else if (type == DT_VOICE_LC_HEADER) {
		CDMRFullLC fullLC;
		CDMRLC* lc = fullLC.decode(buffer, type);
		if (lc != NULL) {
			LogMessage("%u [Data Sync] [VOICE_LC_HEADER] CC=%u src=%u dest=%s%u", m_slotNo, cc, lc->getSrcId(), lc->getFLCO() == FLCO_GROUP ? "TG" : "", lc->getDstId());
			delete lc;
		} else {
			LogMessage("%u [Data Sync] [VOICE_LC_HEADER] CC=%u <Invalid LC>", m_slotNo, cc);
		}
	} else if (type == DT_TERMINATOR_WITH_LC) {
		CDMRFullLC fullLC;
		CDMRLC* lc = fullLC.decode(buffer, type);
		if (lc != NULL) {
			LogMessage("%u [Data Sync] [DT_TERMINATOR_WITH_LC] CC=%u src=%u dest=%s%u", m_slotNo, cc, lc->getSrcId(), lc->getFLCO() == FLCO_GROUP ? "TG" : "", lc->getDstId());
			delete lc;
		} else {
			LogMessage("%u [Data Sync] [DT_TERMINATOR_WITH_LC] CC=%u <Invalid LC>", m_slotNo, cc);
		}
	} else if (type == DT_VOICE_PI_HEADER) {
		LogMessage("%u [Data Sync] [VOICE_PI_HEADER] CC=%u", m_slotNo, cc);
	} else if (type == DT_DATA_HEADER) {
		CDMRDataHeader header;
		bool valid = header.put(buffer);
		if (valid)
			LogMessage("%u [Data Sync] [DATA_HEADER] CC=%u src=%u dest=%s%u", m_slotNo, cc, header.getSrcId(), header.getGI() ? "TG" : "", header.getDstId());
		else
			LogMessage("%u [Data Sync] [DATA_HEADER] CC=%u invalid", m_slotNo, cc);
	} else if (type == DT_RATE_12_DATA) {
		LogMessage("%u [Data Sync] [RATE_1/2_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_RATE_34_DATA) {
		LogMessage("%u [Data Sync] [RATE_3/4_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_RATE_1_DATA) {
		LogMessage("%u [Data Sync] [RATE_1_DATA] CC=%u", m_slotNo, cc);
	} else if (type == DT_CSBK) {
		CDMRCSBK csbk;
		bool valid = csbk.put(buffer);
        if (valid) {
            CSBKO csbko = csbk.getCSBKO();
            switch (csbko) {
            case CSBKO_UUVREQ:
                LogMessage("%u [Data Sync] [CSBK] [UUVREQ] CC=%u src=%u dest=%s%u", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId());
                break;
            case CSBKO_UUANSRSP:
                LogMessage("%u [Data Sync] [CSBK] [UUANSRSP] CC=%u src=%u dest=%s%u", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId());
                break;
            case CSBKO_NACKRSP:
                LogMessage("%u [Data Sync] [CSBK] [NACKRSP] CC=%u src=%u dest=%s%u", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId());
                break;
            case CSBKO_PRECCSBK:
                LogMessage("%u [Data Sync] [CSBK] [PRECCSBK] CC=%u src=%u dest=%s%u DETAILS: %s:%u", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId(), csbk.getDataContent() ? "Data" : "CSBK", csbk.getCBF());
                break;
            default:
                LogMessage("%u [Data Sync] [CSBK] [UNKNOWN] CC=%u src=%u dest=%s%u CSBKO: %02X", m_slotNo, cc, csbk.getSrcId(), csbk.getGI() ? "TG" : "", csbk.getDstId(), csbko);
                break;
            }
        } else {
            LogMessage("%u [Data Sync] [CSBK] CC=%u invalid", m_slotNo, cc);
        }
	} else {
		LogMessage("%u [Data Sync] [UNKNOWN] CC=%u type=%u", m_slotNo, cc, type);
	}
}