diff --git a/config.yml b/config.yml
index 9fc5e862..66acc3fc 100644
--- a/config.yml
+++ b/config.yml
@@ -22,10 +22,10 @@ network:
updateLookups: false
allowActivityTransfer: false
allowDiagnosticTransfer: false
- debug: false
+ debug: true
protocols:
dmr:
- enable: true
+ enable: false
beacons:
enable: false
interval: 60
@@ -58,7 +58,7 @@ protocols:
verifyReg: false
dumpDataPacket: false
repeatDataPacket: true
- dumpTsbkData: false
+ dumpTsbkData: true
callHang: 5
noStatusAck: false
noMessageAck: true
@@ -66,7 +66,7 @@ protocols:
disableNetworkHDU: false
queueSize: 5000
verbose: true
- debug: false
+ debug: true
system:
identity: ABCD123
timeout: 180
@@ -83,11 +83,11 @@ system:
power: 10
location: "Repeater Site, USA"
config:
- channelId: 2
- channelNo: 1
+ channelId: 3
+ channelNo: 50
dmrNetId: 1
voiceChNo:
- - 1
+ - 80
colorCode: 5
nac: 293
pSuperGroup: FFFF
@@ -97,9 +97,9 @@ system:
siteId: 1
modem:
protocol:
- type: "null" # Valid values are "null", "uart", and "udp"
+ type: "uart" # Valid values are "null", "uart", and "udp"
uart:
- port: /dev/ttyUSB0
+ port: '/dev/ttyAMA0'
speed: 115200
udp:
mode: master # Valid values are "master", and "peer"
@@ -110,7 +110,7 @@ system:
pttInvert: false
dcBlocker: true
cosLockout: false
- fdmaPreamble: 80
+ fdmaPreamble: 100
dmrRxDelay: 7
p25CorrCount: 8
rxDCOffset: 0
@@ -124,9 +124,9 @@ system:
packetPlayoutTime: 10
disableOFlowReset: false
trace: false
- debug: false
+ debug: true
cwId:
- enable: true
+ enable: false
time: 15
callsign: ABCD123
iden_table:
diff --git a/dvmhost b/dvmhost
new file mode 100755
index 00000000..5802d8b7
Binary files /dev/null and b/dvmhost differ
diff --git a/host/Host.cpp b/host/Host.cpp
index 82fab4ec..aa88a7c1 100644
--- a/host/Host.cpp
+++ b/host/Host.cpp
@@ -1550,7 +1550,7 @@ bool Host::createModem()
m_modem->setModeParams(m_dmrEnabled, m_p25Enabled);
m_modem->setLevels(rxLevel, cwIdTXLevel, dmrTXLevel, p25TXLevel);
m_modem->setSymbolAdjust(dmrSymLevel3Adj, dmrSymLevel1Adj, p25SymLevel3Adj, p25SymLevel1Adj);
- m_modem->setDCOffsetParams(txDCOffset, rxDCOffset);
+ m_modem->setRFParams(m_rxFrequency, m_txFrequency, txDCOffset, rxDCOffset);
m_modem->setDMRColorCode(m_dmrColorCode);
m_modem->setP25NAC(m_p25NAC);
diff --git a/iden_table.dat b/iden_table.dat
index 4dfac5e8..a925f506 100644
--- a/iden_table.dat
+++ b/iden_table.dat
@@ -6,3 +6,4 @@
1,762006250,6.25,30.000,12.5,
15,935001250,6.25,-39.00000,12.5,
2,450000000,6.25,5.000,12.5,
+3,146000000,6.25,1.000,12.5,
diff --git a/modem/Modem.cpp b/modem/Modem.cpp
index ee416103..c37bf17b 100644
--- a/modem/Modem.cpp
+++ b/modem/Modem.cpp
@@ -94,6 +94,8 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert,
m_p25Enabled(false),
m_rxDCOffset(0),
m_txDCOffset(0),
+ m_rxFrequency(0U),
+ m_txFrequency(0U),
m_dmrSymLevel3Adj(0),
m_dmrSymLevel1Adj(0),
m_p25SymLevel3Adj(0),
@@ -148,8 +150,10 @@ Modem::~Modem()
///
///
///
-void Modem::setDCOffsetParams(int txDCOffset, int rxDCOffset)
+void Modem::setRFParams(unsigned int rxFrequency, unsigned int txFrequency, int txDCOffset, int rxDCOffset)
{
+ m_rxFrequency = rxFrequency;
+ m_txFrequency = txFrequency;
m_txDCOffset = txDCOffset;
m_rxDCOffset = rxDCOffset;
}
@@ -358,6 +362,16 @@ bool Modem::open()
return true;
}
+ ret = writeFrequency();
+ if (!ret) {
+ ret = writeFrequency();
+ if (!ret) {
+ LogError(LOG_MODEM, "Modem unresponsive to frequency set after 2 attempts. Stopping.");
+ m_port->close();
+ return false;
+ }
+ }
+
ret = writeConfig();
if (!ret) {
ret = writeConfig();
@@ -1230,15 +1244,17 @@ bool Modem::getFirmwareVersion()
// Utils::dump(1U, "F/W Ver Written", buffer, 3U);
int ret = write(buffer, 3U);
+ //LogMessage(LOG_MODEM, "Asking for F/W");
if (ret != 3)
return false;
for (uint32_t count = 0U; count < MAX_RESPONSES; count++) {
Thread::sleep(10U);
RESP_TYPE_DVM resp = getResponse();
+
if (resp == RTM_OK && m_buffer[2U] == CMD_GET_VERSION) {
+ LogMessage(LOG_MODEM, "Proto ver: %02x, cpu: %02X", m_buffer[3U], m_buffer[4U]);
uint8_t protoVer = m_buffer[3U];
-
switch (protoVer) {
case PROTOCOL_VERSION:
LogInfoEx(LOG_MODEM, MODEM_VERSION_STR, m_length - 21U, m_buffer + 21U, protoVer);
@@ -1293,6 +1309,65 @@ bool Modem::getStatus()
return write(buffer, 3U) == 3;
}
+bool Modem::writeFrequency()
+{
+ unsigned char buffer[20U];
+ unsigned char len;
+ //buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F);
+ // RF level 100 is probably fine, i'm too lazy to implement it rn
+ buffer[12U] = (unsigned char)(100 * 2.55F + 0.5F);
+
+ len = 17U;
+
+ buffer[0U] = DVM_FRAME_START;
+
+ buffer[1U] = len;
+
+ buffer[2U] = CMD_SET_FREQUENCY;
+
+ buffer[3U] = 0x00U;
+
+ buffer[4U] = (m_rxFrequency >> 0) & 0xFFU;
+ buffer[5U] = (m_rxFrequency >> 8) & 0xFFU;
+ buffer[6U] = (m_rxFrequency >> 16) & 0xFFU;
+ buffer[7U] = (m_rxFrequency >> 24) & 0xFFU;
+
+ buffer[8U] = (m_txFrequency >> 0) & 0xFFU;
+ buffer[9U] = (m_txFrequency >> 8) & 0xFFU;
+ buffer[10U] = (m_txFrequency >> 16) & 0xFFU;
+ buffer[11U] = (m_txFrequency >> 24) & 0xFFU;
+
+ // CUtils::dump(1U, "Written", buffer, len);
+
+ int ret = m_port->write(buffer, len);
+ if (ret != len)
+ return false;
+
+ unsigned int count = 0U;
+ RESP_TYPE_DVM resp;
+ do {
+ Thread::sleep(10U);
+
+ resp = getResponse();
+ if (resp == RTM_OK && m_buffer[2U] != RSN_OK && m_buffer[2U] != RSN_NAK) {
+ count++;
+ if (count >= MAX_RESPONSES) {
+ LogError(LOG_MODEM, "The MMDVM is not responding to the SET_FREQ command");
+ return false;
+ }
+ }
+ } while (resp == RTM_OK && m_buffer[2U] != RSN_OK && m_buffer[2U] != RSN_NAK);
+
+ // CUtils::dump(1U, "Response", m_buffer, m_length);
+
+ if (resp == RTM_OK && m_buffer[2U] == RSN_NAK) {
+ LogError(LOG_MODEM, "Received a NAK to the SET_FREQ command from the modem");
+ return false;
+ }
+
+ return true;
+}
+
///
/// Write configuration to the air interface modem.
///
@@ -1502,6 +1577,8 @@ RESP_TYPE_DVM Modem::getResponse()
{
m_rspDoubleLength = false;
+ //LogDebug(LOG_MODEM, "getResponse(), checking if we have data");
+
// get the start of the frame or nothing at all
if (m_rspState == RESP_START) {
int ret = m_port->read(m_buffer + 0U, 1U);
@@ -1511,17 +1588,22 @@ RESP_TYPE_DVM Modem::getResponse()
return RTM_ERROR;
}
- if (ret == 0)
+ if (ret == 0) {
+ //LogDebug(LOG_MODEM, "getResponse(), no data available");
return RTM_TIMEOUT;
+ }
- if (m_buffer[0U] != DVM_FRAME_START)
+ if (m_buffer[0U] != DVM_FRAME_START) {
+ LogDebug(LOG_MODEM, "getResponse(), first byte not a frame start");
return RTM_TIMEOUT;
+ }
- // LogDebug(LOG_MODEM, "getResponse(), RESP_START");
+ //LogDebug(LOG_MODEM, "getResponse(), RESP_START");
m_rspState = RESP_LENGTH1;
}
+ //LogDebug(LOG_MODEM, "getResponse(), getting frame length 1/2");
// get the length of the frame, 1/2
if (m_rspState == RESP_LENGTH1) {
int ret = m_port->read(m_buffer + 1U, 1U);
@@ -1546,12 +1628,12 @@ RESP_TYPE_DVM Modem::getResponse()
else
m_rspState = RESP_TYPE;
- // LogDebug(LOG_MODEM, "getResponse(), RESP_LENGTH1, len = %u", m_length);
+ //LogDebug(LOG_MODEM, "getResponse(), RESP_LENGTH1, len = %u", m_length);
m_rspDoubleLength = false;
m_rspOffset = 2U;
}
-
+ //LogDebug(LOG_MODEM, "getResponse(), getting frame length 2/2");
// get the length of the frame, 2/2
if (m_rspState == RESP_LENGTH2) {
int ret = m_port->read(m_buffer + 2U, 1U);
@@ -1567,12 +1649,12 @@ RESP_TYPE_DVM Modem::getResponse()
m_length = m_buffer[2U] + 255U;
m_rspState = RESP_TYPE;
- // LogDebug(LOG_MODEM, "getResponse(), RESP_LENGTH2, len = %u", m_length);
+ //LogDebug(LOG_MODEM, "getResponse(), RESP_LENGTH2, len = %u", m_length);
m_rspDoubleLength = true;
m_rspOffset = 3U;
}
-
+ //LogDebug(LOG_MODEM, "getResponse(), getting frame type");
// get the frame type
if (m_rspState == RESP_TYPE) {
int ret = m_port->read(m_buffer + m_rspOffset, 1U);
@@ -1587,11 +1669,12 @@ RESP_TYPE_DVM Modem::getResponse()
m_rspType = (DVM_COMMANDS)m_buffer[m_rspOffset];
- // LogDebug(LOG_MODEM, "getResponse(), RESP_TYPE, len = %u, type = %u", m_length, m_rspType);
+ //LogDebug(LOG_MODEM, "getResponse(), RESP_TYPE, len = %u, type = %u", m_length, m_rspType);
m_rspState = RESP_DATA;
m_rspOffset++;
}
+ //LogDebug(LOG_MODEM, "getResponse(), getting frame data");
// get the frame data
if (m_rspState == RESP_DATA) {
diff --git a/modem/Modem.h b/modem/Modem.h
index c6ac59b6..61801eee 100644
--- a/modem/Modem.h
+++ b/modem/Modem.h
@@ -100,6 +100,7 @@ namespace modem
CMD_SET_SYMLVLADJ = 0x04U,
CMD_SET_RXLEVEL = 0x05U,
+ CMD_SET_FREQUENCY = 0x06U,
CMD_CAL_DATA = 0x08U,
CMD_RSSI_DATA = 0x09U,
@@ -183,7 +184,7 @@ namespace modem
~Modem();
/// Sets the RF DC offset parameters.
- void setDCOffsetParams(int txDCOffset, int rxDCOffset);
+ void setRFParams(unsigned int rxFrequency, unsigned int txFrequency, int txDCOffset, int rxDCOffset);
/// Sets the enabled modes.
void setModeParams(bool dmrEnabled, bool p25Enabled);
/// Sets the RF deviation levels.
@@ -312,6 +313,9 @@ namespace modem
int m_rxDCOffset;
int m_txDCOffset;
+ uint32_t m_rxFrequency;
+ uint32_t m_txFrequency;
+
int m_dmrSymLevel3Adj;
int m_dmrSymLevel1Adj;
int m_p25SymLevel3Adj;
@@ -360,6 +364,7 @@ namespace modem
bool writeConfig();
/// Write symbol level adjustments to the air interface modem.
bool writeSymbolAdjust();
+ bool writeFrequency();
/// Print debug air interface messages to the host log.
void printDebug(const uint8_t* buffer, uint16_t len);