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