diff --git a/config.yml b/config.yml index 46b0a864..e19cd56e 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 @@ -48,9 +48,9 @@ protocols: enable: true tduPreambleCount: 6 control: - enable: false + enable: true ackRequests: true - dedicated: false + dedicated: true broadcast: true interval: 300 duration: 1 @@ -62,7 +62,7 @@ protocols: verifyReg: false dumpDataPacket: false repeatDataPacket: true - dumpTsbkData: false + dumpTsbkData: true callHang: 5 noStatusAck: false noMessageAck: true @@ -87,11 +87,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 @@ -101,9 +101,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" @@ -114,13 +114,15 @@ system: pttInvert: false dcBlocker: true cosLockout: false - fdmaPreamble: 80 + fdmaPreamble: 100 dmrRxDelay: 7 p25CorrCount: 8 rxDCOffset: 0 txDCOffset: 0 rxLevel: 50 txLevel: 50 + txTuning: 0 # freq offset for the hotspot, in hz + rxTuning: 0 # cwIdTxLevel: 50 # dmrTxLevel: 50 # p25TxLevel: 50 @@ -128,9 +130,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..803d625d Binary files /dev/null and b/dvmhost differ diff --git a/host/Host.cpp b/host/Host.cpp index a914b514..a3afdfeb 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1519,6 +1519,8 @@ bool Host::createModem() uint8_t p25CorrCount = (uint8_t)modemConf["p25CorrCount"].as(4U); int rxDCOffset = modemConf["rxDCOffset"].as(0); int txDCOffset = modemConf["txDCOffset"].as(0); + int rxTuning = modemConf["rxTuning"].as(0); + int txTuning = modemConf["txTuning"].as(0); uint8_t rfPower = (uint8_t)modemConf["rfPower"].as(100U); int dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as(0); int dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as(0); @@ -1622,6 +1624,10 @@ bool Host::createModem() LogInfo(" UDP Port: %u", udpPort); } + // apply the frequency tuning offsets + int adjustedRx = m_rxFrequency + rxTuning; + int adjustedTx = m_txFrequency + txTuning; + LogInfo(" RX Invert: %s", rxInvert ? "yes" : "no"); LogInfo(" TX Invert: %s", txInvert ? "yes" : "no"); LogInfo(" PTT Invert: %s", pttInvert ? "yes" : "no"); @@ -1632,6 +1638,10 @@ bool Host::createModem() LogInfo(" P25 Corr. Count: %u (%.1fms)", p25CorrCount, float(p25CorrCount) * 0.667F); LogInfo(" RX DC Offset: %d", rxDCOffset); LogInfo(" TX DC Offset: %d", txDCOffset); + LogInfo(" RX Tuning Offset: %dhz", rxTuning); + LogInfo(" TX Tuning Offset: %dhz", txTuning); + LogInfo(" RX Effective Frequency: %dhz", adjustedRx); + LogInfo(" TX Effective Frequency: %dhz", adjustedTx); LogInfo(" RF Power Level: %u", rfPower); LogInfo(" RX Level: %.1f%%", rxLevel); LogInfo(" CW Id TX Level: %.1f%%", cwIdTXLevel); @@ -1649,7 +1659,7 @@ bool Host::createModem() 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, rfPower); + m_modem->setRFParams(adjustedRx, adjustedTx, rfPower); 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 9952c2d7..79a9a1e2 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -1257,15 +1257,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); @@ -1586,6 +1588,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); @@ -1595,17 +1599,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); @@ -1630,12 +1639,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); @@ -1651,12 +1660,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); @@ -1671,11 +1680,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) {