diff --git a/host/calibrate/HostCal.cpp b/host/calibrate/HostCal.cpp index 2b9157b5..e27aebfc 100644 --- a/host/calibrate/HostCal.cpp +++ b/host/calibrate/HostCal.cpp @@ -400,8 +400,9 @@ int HostCal::run() writeConfig(); - displayHelp(); + getStatus(); + displayHelp(); printStatus(); bool end = false; @@ -517,19 +518,21 @@ int HostCal::run() case 'w': { - char value[5] = { '\0' }; - ::fprintf(stdout, "> P25 Correlation Count [%u] ? ", m_p25CorrCount); - ::fflush(stdout); + if (!m_isHotspot) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> P25 Correlation Count [%u] ? ", m_p25CorrCount); + ::fflush(stdout); - m_console.getLine(value, 5, 0); - if (value[0] != '\0') { - // bryanb: appease the compiler... - uint32_t p25CorrCount = m_p25CorrCount; - sscanf(value, "%u", &p25CorrCount); + m_console.getLine(value, 5, 0); + if (value[0] != '\0') { + // bryanb: appease the compiler... + uint32_t p25CorrCount = m_p25CorrCount; + sscanf(value, "%u", &p25CorrCount); - m_p25CorrCount = (uint8_t)p25CorrCount; + m_p25CorrCount = (uint8_t)p25CorrCount; - writeConfig(); + writeConfig(); + } } } break; @@ -1098,10 +1101,12 @@ void HostCal::displayHelp() } LogMessage(LOG_CAL, " N Set FDMA Preambles"); LogMessage(LOG_CAL, " W Set DMR Rx Delay"); - LogMessage(LOG_CAL, " w Set P25 Correlation Count"); + if (!m_isHotspot) { + LogMessage(LOG_CAL, " w Set P25 Correlation Count"); + } if (m_isHotspot) { - LogMessage(LOG_CAL, " F Set Rx Frequency Adjustment (hotspot modems only!)"); - LogMessage(LOG_CAL, " f Set Tx Frequency Adjustment (hotspot modems only!)"); + LogMessage(LOG_CAL, " F Set Rx Frequency Adjustment"); + LogMessage(LOG_CAL, " f Set Tx Frequency Adjustment"); } LogMessage(LOG_CAL, "Mode Commands:"); LogMessage(LOG_CAL, " Z %s", DMR_CAL_STR); @@ -1118,16 +1123,16 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, " x %s", RSSI_CAL_STR); LogMessage(LOG_CAL, "Engineering Commands:"); if (!m_isHotspot) { - LogMessage(LOG_CAL, " -/= Inc/Dec DMR +/- 3 Symbol Level (dedicated modems only!)"); - LogMessage(LOG_CAL, " _/+ Inc/Dec DMR +/- 1 Symbol Level (dedicated modems only!)"); - LogMessage(LOG_CAL, " [/] Inc/Dec P25 +/- 3 Symbol Level (dedicated modems only!)"); - LogMessage(LOG_CAL, " {/} Inc/Dec P25 +/- 1 Symbol Level (dedicated modems only!)"); + LogMessage(LOG_CAL, " -/= Inc/Dec DMR +/- 3 Symbol Level"); + LogMessage(LOG_CAL, " _/+ Inc/Dec DMR +/- 1 Symbol Level"); + LogMessage(LOG_CAL, " [/] Inc/Dec P25 +/- 3 Symbol Level"); + LogMessage(LOG_CAL, " {/} Inc/Dec P25 +/- 1 Symbol Level"); } else { - LogMessage(LOG_CAL, " 1 Set DMR Disc. Bandwidth Offset (hotspot modems only!)"); - LogMessage(LOG_CAL, " 2 Set P25 Disc. Bandwidth Offset (hotspot modems only!)"); - LogMessage(LOG_CAL, " 3 Set DMR Post Demod Bandwidth Offset (hotspot modems only!)"); - LogMessage(LOG_CAL, " 4 Set P25 Post Demod Bandwidth Offset (hotspot modems only!)"); + LogMessage(LOG_CAL, " 1 Set DMR Disc. Bandwidth Offset"); + LogMessage(LOG_CAL, " 2 Set P25 Disc. Bandwidth Offset"); + LogMessage(LOG_CAL, " 3 Set DMR Post Demod Bandwidth Offset"); + LogMessage(LOG_CAL, " 4 Set P25 Post Demod Bandwidth Offset"); } } @@ -2024,6 +2029,26 @@ void HostCal::timerStop() m_timer = 0U; } +/// +/// Retrieve the current status from the air interface modem. +/// +void HostCal::getStatus() +{ + uint8_t buffer[50U]; + + buffer[0U] = DVM_FRAME_START; + buffer[1U] = 4U; + buffer[2U] = CMD_GET_STATUS; + + int ret = m_modem->write(buffer, 4U); + if (ret <= 0) + return; + + sleep(25U); + + m_modem->clock(0U); +} + /// /// Prints the current status of the calibration. /// @@ -2046,27 +2071,21 @@ void HostCal::printStatus() m_pttInvert ? "yes" : "no", m_rxInvert ? "yes" : "no", m_txInvert ? "yes" : "no", m_dcBlocker ? "yes" : "no"); LogMessage(LOG_CAL, " - RX Level: %.1f%%, TX Level: %.1f%%, TX DC Offset: %d, RX DC Offset: %d", m_rxLevel, m_txLevel, m_txDCOffset, m_rxDCOffset); - LogMessage(LOG_CAL, " - DMR Symbol +/- 3 Level Adj.: %d, DMR Symbol +/- 1 Level Adj.: %d, P25 Symbol +/- 3 Level Adj.: %d, P25 Symbol +/- 1 Level Adj.: %d", - m_dmrSymLevel3Adj, m_dmrSymLevel1Adj, m_p25SymLevel3Adj, m_p25SymLevel1Adj); + if (!m_isHotspot) { + LogMessage(LOG_CAL, " - DMR Symbol +/- 3 Level Adj.: %d, DMR Symbol +/- 1 Level Adj.: %d, P25 Symbol +/- 3 Level Adj.: %d, P25 Symbol +/- 1 Level Adj.: %d", + m_dmrSymLevel3Adj, m_dmrSymLevel1Adj, m_p25SymLevel3Adj, m_p25SymLevel1Adj); + } + if (m_isHotspot) { + LogMessage(LOG_CAL, " - DMR Disc. BW: %d, P25 Disc. BW: %d, DMR Post Demod BW: %d, P25 Post Demod BW: %d", + m_dmrDiscBWAdj, m_p25DiscBWAdj, m_dmrPostBWAdj, m_p25PostBWAdj); + } LogMessage(LOG_CAL, " - FDMA Preambles: %u (%.1fms), DMR Rx Delay: %u (%.1fms), P25 Corr. Count: %u (%.1fms)", m_fdmaPreamble, float(m_fdmaPreamble) * 0.2083F, m_dmrRxDelay, float(m_dmrRxDelay) * 0.0416666F, m_p25CorrCount, float(m_p25CorrCount) * 0.667F); LogMessage(LOG_CAL, " - Rx Freq: %uHz, Tx Freq: %uHz, Rx Offset: %dHz, Tx Offset: %dHz", m_rxFrequency, m_txFrequency, m_rxTuning, m_txTuning); LogMessage(LOG_CAL, " - Rx Effective Freq: %uHz, Tx Effective Freq: %uHz", m_rxAdjustedFreq, m_txAdjustedFreq); } - uint8_t buffer[50U]; - - buffer[0U] = DVM_FRAME_START; - buffer[1U] = 4U; - buffer[2U] = CMD_GET_STATUS; - - int ret = m_modem->write(buffer, 4U); - if (ret <= 0) - return; - - sleep(25U); - - m_modem->clock(0U); + getStatus(); } /// diff --git a/host/calibrate/HostCal.h b/host/calibrate/HostCal.h index 05964212..313afaf6 100644 --- a/host/calibrate/HostCal.h +++ b/host/calibrate/HostCal.h @@ -184,6 +184,8 @@ private: /// Helper to stop the calibration BER timer. void timerStop(); + /// Retrieve the current status from the air interface modem. + void getStatus(); /// Prints the current status of the calibration. void printStatus(); diff --git a/p25/Control.cpp b/p25/Control.cpp index 40c5126d..a0ae9750 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -498,7 +498,8 @@ bool Control::writeControlRF() return false; } - if (m_ccSeq == 6U) { + const uint8_t maxSeq = 7U; + if (m_ccSeq == maxSeq) { m_ccSeq = 0U; } @@ -508,8 +509,12 @@ bool Control::writeControlRF() if (m_netState == RS_NET_IDLE && m_rfState == RS_RF_LISTENING) { m_trunk->writeRF_ControlData(m_ccFrameCnt, m_ccSeq, true); - m_ccFrameCnt++; + m_ccSeq++; + if (m_ccSeq == maxSeq) { + m_ccFrameCnt++; + } + return true; } diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index 442b60dd..4512ac05 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -1139,7 +1139,7 @@ TrunkPacket::TrunkPacket(Control* p25, network::BaseNetwork* network, bool dumpT m_noMessageAck(true), m_adjSiteUpdateTimer(1000U), m_adjSiteUpdateInterval(ADJ_SITE_TIMER_TIMEOUT), - m_dumpTSBK(false), + m_dumpTSBK(dumpTSBKData), m_verbose(verbose), m_debug(debug) { @@ -1201,66 +1201,70 @@ void TrunkPacket::writeNetworkRF(const uint8_t* data, bool autoReset) /// void TrunkPacket::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS) { - uint8_t i = 0U, seqCnt = 0U; - if (!m_p25->m_control) return; - // loop to generate 6 control sequences - if (frameCnt == 255U) { - seqCnt = 6U; + resetRF(); + + if (m_debug) { + LogDebug(LOG_P25, "writeRF_ControlData, mbfCnt = %u, frameCnt = %u, seq = %u, adjSS = %u", m_mbfCnt, frameCnt, n, adjSS); } - do + bool forcePad = false; + bool alt = (frameCnt % 2U) > 0U; + switch (n) { - resetRF(); - - if (m_debug) { - LogDebug(LOG_P25, "writeRF_ControlData, mbfCnt = %u, frameCnt = %u, seq = %u, adjSS = %u", m_mbfCnt, frameCnt, n, adjSS); - } - - switch (n) - { - case 1: + /** required data */ + case 0: + default: + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_IDEN_UP); + break; + case 1: + if (alt) queueRF_TSBK_Ctrl_MBF(TSBK_OSP_RFSS_STS_BCAST); - break; - case 2: + else queueRF_TSBK_Ctrl_MBF(TSBK_OSP_NET_STS_BCAST); + break; + case 2: + if (alt) + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_NET_STS_BCAST); + else + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_RFSS_STS_BCAST); + break; + case 3: + if (alt) + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_RFSS_STS_BCAST); + else + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_NET_STS_BCAST); + break; + /** extra data */ + case 4: + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_SNDCP_CH_ANN); + break; + case 5: + // write ADJSS + if (adjSS && m_adjSiteTable.size() > 0) { + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_ADJ_STS_BCAST); break; - case 3: - queueRF_TSBK_Ctrl_MBF(TSBK_OSP_SNDCP_CH_ANN); - break; - case 4: - // write ADJSS - if (adjSS) { - queueRF_TSBK_Ctrl_MBF(TSBK_OSP_ADJ_STS_BCAST); - break; - } - case 5: - // write SCCB - if (adjSS) { - queueRF_TSBK_Ctrl_MBF(TSBK_OSP_SCCB_EXP); - break; - } - case 0: - default: - queueRF_TSBK_Ctrl_MBF(TSBK_OSP_IDEN_UP); + } else { + forcePad = true; + } + case 6: + // write SCCB + if (adjSS && m_sccbTable.size() > 0) { + queueRF_TSBK_Ctrl_MBF(TSBK_OSP_SCCB_EXP); break; } - - if (seqCnt > 0U) - n++; - i++; - } while (i <= seqCnt); + } // should we insert the BSI bursts? - bool bsi = (frameCnt % 64U) == 0U; - if (bsi || frameCnt == 255U) { + bool bsi = (frameCnt % 127U) == 0U; + if (bsi && n > 3U) { queueRF_TSBK_Ctrl_MBF(TSBK_OSP_MOT_CC_BSI); } // add padding after the 4th sequence - if (seqCnt > 4U) { + if (n == 6U || forcePad) { // pad MBF if we have 1 queued TSDUs if (m_mbfCnt == 1U) { queueRF_TSBK_Ctrl_MBF(TSBK_OSP_RFSS_STS_BCAST);