diff --git a/nxdn/CalNXDN.cpp b/nxdn/CalNXDN.cpp
index 8546c8f..3521d6f 100644
--- a/nxdn/CalNXDN.cpp
+++ b/nxdn/CalNXDN.cpp
@@ -88,17 +88,27 @@ CalNXDN::CalNXDN() :
///
void CalNXDN::process()
{
- nxdnTX.process();
+ if (m_transmit) {
+ nxdnTX.setCal(true);
+ nxdnTX.process();
+ }
+ else {
+ nxdnTX.setCal(false);
+ }
uint16_t space = nxdnTX.getSpace();
if (space < 1U)
return;
+ if (m_audioSeq > 3U) {
+ m_audioSeq = 0U;
+ }
+
switch (m_state) {
case NXDNCAL1K_TX:
nxdnTX.writeData(NXDN_CAL1K[m_audioSeq], NXDN_FRAME_LENGTH_BYTES + 1U);
- m_audioSeq = (m_audioSeq + 1U) % 4U;
- if(!m_transmit)
+ m_audioSeq++;
+ if (!m_transmit)
m_state = NXDNCAL1K_IDLE;
break;
default:
diff --git a/nxdn/NXDNTX.cpp b/nxdn/NXDNTX.cpp
index 36b46f8..99e6026 100644
--- a/nxdn/NXDNTX.cpp
+++ b/nxdn/NXDNTX.cpp
@@ -44,6 +44,7 @@ using namespace nxdn;
///
NXDNTX::NXDNTX() :
m_fifo(NXDN_TX_BUFFER_LEN),
+ m_state(NXDNTXSTATE_NORMAL),
m_poBuffer(),
m_poLen(0U),
m_poPtr(0U),
@@ -59,7 +60,8 @@ NXDNTX::NXDNTX() :
///
void NXDNTX::process()
{
- if (m_fifo.getData() == 0U && m_poLen == 0U && m_tailCnt > 0U) {
+ if (m_fifo.getData() == 0U && m_poLen == 0U && m_tailCnt > 0U &&
+ m_state != NXDNTXSTATE_CAL) {
// transmit silence until the hang timer has expired
uint16_t space = io.getSpace();
@@ -82,10 +84,14 @@ void NXDNTX::process()
}
if (m_poLen == 0U) {
+ if (m_state == NXDNTXSTATE_CAL)
+ m_tailCnt = 0U;
+
if (m_fifo.getData() == 0U)
return;
createData();
+
DEBUG2("NXDNTX: process(): poLen", m_poLen);
}
@@ -165,6 +171,15 @@ void NXDNTX::setTxHang(uint8_t txHang)
m_txHang = txHang * 600U;
}
+///
+/// Helper to set the calibration state for Tx.
+///
+///
+void NXDNTX::setCal(bool start)
+{
+ m_state = start ? NXDNTXSTATE_CAL : NXDNTXSTATE_NORMAL;
+}
+
///
/// Helper to get how much space the ring buffer has for samples.
///
diff --git a/nxdn/NXDNTX.h b/nxdn/NXDNTX.h
index 16006b4..f869afe 100644
--- a/nxdn/NXDNTX.h
+++ b/nxdn/NXDNTX.h
@@ -37,6 +37,17 @@
namespace nxdn
{
+ // ---------------------------------------------------------------------------
+ // Constants
+ // ---------------------------------------------------------------------------
+
+ #define NXDN_FIXED_TX_HANG 600
+
+ enum NXDNTXSTATE {
+ NXDNTXSTATE_NORMAL,
+ NXDNTXSTATE_CAL
+ };
+
// ---------------------------------------------------------------------------
// Class Declaration
// Implements transmitter logic for NXDN mode operation.
@@ -60,6 +71,8 @@ namespace nxdn
void setPreambleCount(uint8_t preambleCnt);
/// Sets the transmit hang time.
void setTxHang(uint8_t txHang);
+ /// Helper to set the calibration state for Tx.
+ void setCal(bool start);
/// Helper to get how much space the ring buffer has for samples.
uint8_t getSpace() const;
@@ -67,6 +80,8 @@ namespace nxdn
private:
SerialBuffer m_fifo;
+ NXDNTXSTATE m_state;
+
uint8_t m_poBuffer[60U];
uint16_t m_poLen;
uint16_t m_poPtr;