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);