add frequency set command

pull/1/head
Nat Moore 4 years ago
parent 3fa0cbc150
commit ceb967b3c9

@ -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:

Binary file not shown.

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

@ -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,

@ -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()
/// </summary>
/// <param name="txDCOffset"></param>
/// <param name="rxDCOffset"></param>
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;
}
/// <summary>
/// Write configuration to the air interface modem.
/// </summary>
@ -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) {

@ -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();
/// <summary>Sets the RF DC offset parameters.</summary>
void setDCOffsetParams(int txDCOffset, int rxDCOffset);
void setRFParams(unsigned int rxFrequency, unsigned int txFrequency, int txDCOffset, int rxDCOffset);
/// <summary>Sets the enabled modes.</summary>
void setModeParams(bool dmrEnabled, bool p25Enabled);
/// <summary>Sets the RF deviation levels.</summary>
@ -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();
/// <summary>Write symbol level adjustments to the air interface modem.</summary>
bool writeSymbolAdjust();
bool writeFrequency();
/// <summary>Print debug air interface messages to the host log.</summary>
void printDebug(const uint8_t* buffer, uint16_t len);

Loading…
Cancel
Save

Powered by TurnKey Linux.