Create a dummy FM Control class.
This commit is contained in:
parent
bc791577e7
commit
b3d287965f
113
FMControl.cpp
Normal file
113
FMControl.cpp
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FMControl.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
CFMControl::CFMControl(CFMNetwork* network) :
|
||||||
|
m_network(network),
|
||||||
|
m_queue(3000U, "FM Control"),
|
||||||
|
m_enabled(false),
|
||||||
|
m_fp(NULL)
|
||||||
|
{
|
||||||
|
assert(network != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFMControl::~CFMControl()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CFMControl::writeModem(unsigned char* data, unsigned int len)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
assert(len > 0U);
|
||||||
|
|
||||||
|
// Unpack serial data (12-bit unsigned values)
|
||||||
|
|
||||||
|
// De-emphasise the data
|
||||||
|
|
||||||
|
// Repack the data (16-bit unsigned values)
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CFMControl::readModem(unsigned char* data, unsigned int space)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
assert(space > 0U);
|
||||||
|
|
||||||
|
// Unpack serial data (16-bit unsigned values)
|
||||||
|
|
||||||
|
// Pre-emphasise the data
|
||||||
|
|
||||||
|
// Repack the data (12-bit unsigned values)
|
||||||
|
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMControl::clock(unsigned int ms)
|
||||||
|
{
|
||||||
|
// May not be needed
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMControl::enable(bool enabled)
|
||||||
|
{
|
||||||
|
// May not be needed
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CFMControl::openFile()
|
||||||
|
{
|
||||||
|
if (m_fp != NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
::time(&t);
|
||||||
|
|
||||||
|
struct tm* tm = ::localtime(&t);
|
||||||
|
|
||||||
|
char name[100U];
|
||||||
|
::sprintf(name, "FM_%04d%02d%02d_%02d%02d%02d.ambe", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
|
||||||
|
m_fp = ::fopen(name, "wb");
|
||||||
|
if (m_fp == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
::fwrite("FM", 1U, 2U, m_fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CFMControl::writeFile(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
if (m_fp == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
::fwrite(data, 1U, length, m_fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMControl::closeFile()
|
||||||
|
{
|
||||||
|
if (m_fp != NULL) {
|
||||||
|
::fclose(m_fp);
|
||||||
|
m_fp = NULL;
|
||||||
|
}
|
||||||
|
}
|
14
FMControl.h
14
FMControl.h
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015-2019 by Jonathan Naylor G4KLX
|
* Copyright (C) 2020 by Jonathan Naylor G4KLX
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -33,7 +33,7 @@ public:
|
||||||
CFMControl(CFMNetwork* network);
|
CFMControl(CFMNetwork* network);
|
||||||
~CFMControl();
|
~CFMControl();
|
||||||
|
|
||||||
bool writeModem(unsigned char* data, unsigned int len);
|
bool writeModem(unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
unsigned int readModem(unsigned char* data, unsigned int space);
|
unsigned int readModem(unsigned char* data, unsigned int space);
|
||||||
|
|
||||||
|
@ -42,13 +42,13 @@ public:
|
||||||
void enable(bool enabled);
|
void enable(bool enabled);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CFMNetwork* m_network;
|
CFMNetwork* m_network;
|
||||||
CRingBuffer<unsigned char> m_queue;
|
CRingBuffer<unsigned short> m_queue;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
FILE* m_fp;
|
FILE* m_fp;
|
||||||
|
|
||||||
bool openFile();
|
bool openFile();
|
||||||
bool writeFile(const unsigned char* data);
|
bool writeFile(const unsigned char* data, unsigned int length);
|
||||||
void closeFile();
|
void closeFile();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
141
FMNetwork.cpp
Normal file
141
FMNetwork.cpp
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FMNetwork.h"
|
||||||
|
#include "Defines.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "Log.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
const unsigned int BUFFER_LENGTH = 500U;
|
||||||
|
|
||||||
|
CFMNetwork::CFMNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
|
||||||
|
m_socket(localAddress, localPort),
|
||||||
|
m_address(),
|
||||||
|
m_port(gatewayPort),
|
||||||
|
m_debug(debug),
|
||||||
|
m_enabled(false),
|
||||||
|
m_buffer(2000U, "FM Network")
|
||||||
|
{
|
||||||
|
assert(gatewayPort > 0U);
|
||||||
|
assert(!gatewayAddress.empty());
|
||||||
|
|
||||||
|
m_address = CUDPSocket::lookup(gatewayAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFMNetwork::~CFMNetwork()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CFMNetwork::open()
|
||||||
|
{
|
||||||
|
LogMessage("Opening FM network connection");
|
||||||
|
|
||||||
|
if (m_address.s_addr == INADDR_NONE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return m_socket.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CFMNetwork::write(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
unsigned char buffer[500U];
|
||||||
|
::memset(buffer, 0x00U, 500U);
|
||||||
|
|
||||||
|
buffer[0U] = 'F';
|
||||||
|
buffer[1U] = 'M';
|
||||||
|
buffer[2U] = 'D';
|
||||||
|
|
||||||
|
::memcpy(buffer + 3U, data, length);
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
CUtils::dump(1U, "FM Network Data Sent", buffer, length + 3U);
|
||||||
|
|
||||||
|
return m_socket.write(buffer, length + 3U, m_address, m_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMNetwork::clock(unsigned int ms)
|
||||||
|
{
|
||||||
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
|
in_addr address;
|
||||||
|
unsigned int port;
|
||||||
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
||||||
|
if (length <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check if the data is for us
|
||||||
|
if (m_address.s_addr != address.s_addr || port != m_port) {
|
||||||
|
LogMessage("FM packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid packet type?
|
||||||
|
if (::memcmp(buffer, "FMD", 3U) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!m_enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
CUtils::dump(1U, "FM Network Data Received", buffer, length);
|
||||||
|
|
||||||
|
m_buffer.addData(buffer + 3U, length - 3U);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CFMNetwork::read(unsigned char* data, unsigned int space)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
unsigned int bytes = m_buffer.dataSize();
|
||||||
|
if (bytes == 0U)
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
if (bytes < space)
|
||||||
|
space = bytes;
|
||||||
|
|
||||||
|
m_buffer.getData(data, space);
|
||||||
|
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMNetwork::reset()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMNetwork::close()
|
||||||
|
{
|
||||||
|
m_socket.close();
|
||||||
|
|
||||||
|
LogMessage("Closing FM network connection");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFMNetwork::enable(bool enabled)
|
||||||
|
{
|
||||||
|
if (enabled && !m_enabled)
|
||||||
|
reset();
|
||||||
|
else if (!enabled && m_enabled)
|
||||||
|
m_buffer.clear();
|
||||||
|
|
||||||
|
m_enabled = enabled;
|
||||||
|
}
|
|
@ -35,7 +35,9 @@ public:
|
||||||
|
|
||||||
void enable(bool enabled);
|
void enable(bool enabled);
|
||||||
|
|
||||||
unsigned int read(unsigned char* data);
|
bool write(const unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
|
unsigned int read(unsigned char* data, unsigned int space);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
|
|
@ -1274,7 +1274,6 @@ bool CMMDVMHost::createModem()
|
||||||
bool callsignAtEnd = m_conf.getFMCallsignAtEnd();
|
bool callsignAtEnd = m_conf.getFMCallsignAtEnd();
|
||||||
bool callsignAtLatch = m_conf.getFMCallsignAtLatch();
|
bool callsignAtLatch = m_conf.getFMCallsignAtLatch();
|
||||||
std::string rfAck = m_conf.getFMRFAck();
|
std::string rfAck = m_conf.getFMRFAck();
|
||||||
std::string extAck = m_conf.getFMExtAck();
|
|
||||||
unsigned int ackSpeed = m_conf.getFMAckSpeed();
|
unsigned int ackSpeed = m_conf.getFMAckSpeed();
|
||||||
unsigned int ackFrequency = m_conf.getFMAckFrequency();
|
unsigned int ackFrequency = m_conf.getFMAckFrequency();
|
||||||
unsigned int ackMinTime = m_conf.getFMAckMinTime();
|
unsigned int ackMinTime = m_conf.getFMAckMinTime();
|
||||||
|
@ -1291,7 +1290,6 @@ bool CMMDVMHost::createModem()
|
||||||
bool cosInvert = m_conf.getFMCOSInvert();
|
bool cosInvert = m_conf.getFMCOSInvert();
|
||||||
unsigned int rfAudioBoost = m_conf.getFMRFAudioBoost();
|
unsigned int rfAudioBoost = m_conf.getFMRFAudioBoost();
|
||||||
float maxDevLevel = m_conf.getFMMaxDevLevel();
|
float maxDevLevel = m_conf.getFMMaxDevLevel();
|
||||||
unsigned int extAudioBoost = m_conf.getFMExtAudioBoost();
|
|
||||||
|
|
||||||
LogInfo("FM Parameters");
|
LogInfo("FM Parameters");
|
||||||
LogInfo(" Callsign: %s", callsign.c_str());
|
LogInfo(" Callsign: %s", callsign.c_str());
|
||||||
|
@ -1305,7 +1303,6 @@ bool CMMDVMHost::createModem()
|
||||||
LogInfo(" Callsign At End: %s", callsignAtEnd ? "yes" : "no");
|
LogInfo(" Callsign At End: %s", callsignAtEnd ? "yes" : "no");
|
||||||
LogInfo(" Callsign At Latch: %s", callsignAtLatch ? "yes" : "no");
|
LogInfo(" Callsign At Latch: %s", callsignAtLatch ? "yes" : "no");
|
||||||
LogInfo(" RF Ack: %s", rfAck.c_str());
|
LogInfo(" RF Ack: %s", rfAck.c_str());
|
||||||
// LogInfo(" Ext. Ack: %s", extAck.c_str());
|
|
||||||
LogInfo(" Ack Speed: %uWPM", ackSpeed);
|
LogInfo(" Ack Speed: %uWPM", ackSpeed);
|
||||||
LogInfo(" Ack Frequency: %uHz", ackFrequency);
|
LogInfo(" Ack Frequency: %uHz", ackFrequency);
|
||||||
LogInfo(" Ack Min Time: %us", ackMinTime);
|
LogInfo(" Ack Min Time: %us", ackMinTime);
|
||||||
|
@ -1322,11 +1319,20 @@ bool CMMDVMHost::createModem()
|
||||||
LogInfo(" COS Invert: %s", cosInvert ? "yes" : "no");
|
LogInfo(" COS Invert: %s", cosInvert ? "yes" : "no");
|
||||||
LogInfo(" RF Audio Boost: x%u", rfAudioBoost);
|
LogInfo(" RF Audio Boost: x%u", rfAudioBoost);
|
||||||
LogInfo(" Max. Deviation Level: %.1f%%", maxDevLevel);
|
LogInfo(" Max. Deviation Level: %.1f%%", maxDevLevel);
|
||||||
// LogInfo(" Ext. Audio Boost: x%u", extAudioBoost);
|
|
||||||
|
|
||||||
m_modem->setFMCallsignParams(callsign, callsignSpeed, callsignFrequency, callsignTime, callsignHoldoff, callsignHighLevel, callsignLowLevel, callsignAtStart, callsignAtEnd, callsignAtLatch);
|
m_modem->setFMCallsignParams(callsign, callsignSpeed, callsignFrequency, callsignTime, callsignHoldoff, callsignHighLevel, callsignLowLevel, callsignAtStart, callsignAtEnd, callsignAtLatch);
|
||||||
m_modem->setFMAckParams(rfAck, ackSpeed, ackFrequency, ackMinTime, ackDelay, ackLevel);
|
m_modem->setFMAckParams(rfAck, ackSpeed, ackFrequency, ackMinTime, ackDelay, ackLevel);
|
||||||
m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime, useCOS, cosInvert, rfAudioBoost, maxDevLevel);
|
m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime, useCOS, cosInvert, rfAudioBoost, maxDevLevel);
|
||||||
|
|
||||||
|
if (m_conf.getFMNetworkEnabled()) {
|
||||||
|
std::string extAck = m_conf.getFMExtAck();
|
||||||
|
unsigned int extAudioBoost = m_conf.getFMExtAudioBoost();
|
||||||
|
|
||||||
|
LogInfo(" Ext. Ack: %s", extAck.c_str());
|
||||||
|
LogInfo(" Ext. Audio Boost: x%u", extAudioBoost);
|
||||||
|
|
||||||
|
m_modem->setFMExtParams(extAck, extAudioBoost);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ret = m_modem->open();
|
bool ret = m_modem->open();
|
||||||
|
@ -1665,6 +1671,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_DSTAR);
|
m_modem->setMode(MODE_DSTAR);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_DSTAR);
|
m_ump->setMode(MODE_DSTAR);
|
||||||
|
@ -1701,6 +1709,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_DMR);
|
m_modem->setMode(MODE_DMR);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_DMR);
|
m_ump->setMode(MODE_DMR);
|
||||||
|
@ -1741,6 +1751,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_YSF);
|
m_modem->setMode(MODE_YSF);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_YSF);
|
m_ump->setMode(MODE_YSF);
|
||||||
|
@ -1777,6 +1789,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_P25);
|
m_modem->setMode(MODE_P25);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_P25);
|
m_ump->setMode(MODE_P25);
|
||||||
|
@ -1813,6 +1827,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(true);
|
m_nxdn->enable(true);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_NXDN);
|
m_modem->setMode(MODE_NXDN);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_NXDN);
|
m_ump->setMode(MODE_NXDN);
|
||||||
|
@ -1849,6 +1865,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(true);
|
m_pocsag->enable(true);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
m_modem->setMode(MODE_POCSAG);
|
m_modem->setMode(MODE_POCSAG);
|
||||||
if (m_ump != NULL)
|
if (m_ump != NULL)
|
||||||
m_ump->setMode(MODE_POCSAG);
|
m_ump->setMode(MODE_POCSAG);
|
||||||
|
@ -1872,6 +1890,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdnNetwork->enable(false);
|
m_nxdnNetwork->enable(false);
|
||||||
if (m_pocsagNetwork != NULL)
|
if (m_pocsagNetwork != NULL)
|
||||||
m_pocsagNetwork->enable(false);
|
m_pocsagNetwork->enable(false);
|
||||||
|
if (m_fmNetwork != NULL)
|
||||||
|
m_fmNetwork->enable(false);
|
||||||
if (m_dstar != NULL)
|
if (m_dstar != NULL)
|
||||||
m_dstar->enable(false);
|
m_dstar->enable(false);
|
||||||
if (m_dmr != NULL)
|
if (m_dmr != NULL)
|
||||||
|
@ -1884,6 +1904,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(true);
|
||||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
m_dmrTXTimer.stop();
|
m_dmrTXTimer.stop();
|
||||||
|
@ -1925,6 +1947,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
m_dmrTXTimer.stop();
|
m_dmrTXTimer.stop();
|
||||||
|
@ -1967,6 +1991,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(false);
|
m_nxdn->enable(false);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(false);
|
m_pocsag->enable(false);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(false);
|
||||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
m_dmrTXTimer.stop();
|
m_dmrTXTimer.stop();
|
||||||
|
@ -2007,6 +2033,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_nxdn->enable(true);
|
m_nxdn->enable(true);
|
||||||
if (m_pocsag != NULL)
|
if (m_pocsag != NULL)
|
||||||
m_pocsag->enable(true);
|
m_pocsag->enable(true);
|
||||||
|
if (m_fm != NULL)
|
||||||
|
m_fm->enable(true);
|
||||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
m_dmrTXTimer.stop();
|
m_dmrTXTimer.stop();
|
||||||
|
|
|
@ -279,6 +279,8 @@
|
||||||
<ClCompile Include="DStarHeader.cpp" />
|
<ClCompile Include="DStarHeader.cpp" />
|
||||||
<ClCompile Include="DStarNetwork.cpp" />
|
<ClCompile Include="DStarNetwork.cpp" />
|
||||||
<ClCompile Include="DStarSlowData.cpp" />
|
<ClCompile Include="DStarSlowData.cpp" />
|
||||||
|
<ClCompile Include="FMControl.cpp" />
|
||||||
|
<ClCompile Include="FMNetwork.cpp" />
|
||||||
<ClCompile Include="Golay2087.cpp" />
|
<ClCompile Include="Golay2087.cpp" />
|
||||||
<ClCompile Include="Golay24128.cpp" />
|
<ClCompile Include="Golay24128.cpp" />
|
||||||
<ClCompile Include="Hamming.cpp" />
|
<ClCompile Include="Hamming.cpp" />
|
||||||
|
|
|
@ -568,5 +568,11 @@
|
||||||
<ClCompile Include="UserDBentry.cpp">
|
<ClCompile Include="UserDBentry.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="FMNetwork.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="FMControl.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
11
Makefile
11
Makefile
|
@ -9,11 +9,12 @@ LDFLAGS = -g
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
11
Makefile.Pi
11
Makefile.Pi
|
@ -9,11 +9,12 @@ LDFLAGS = -g -L/usr/local/lib
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -10,11 +10,12 @@ LDFLAGS = -g -L/usr/local/lib
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,12 @@ LDFLAGS = -g -L/usr/local/lib
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,12 @@ LDFLAGS = -g -L/usr/local/lib
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -10,11 +10,12 @@ LDFLAGS = -g -L/usr/local/lib
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o \
|
||||||
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o \
|
||||||
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o \
|
P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
|
||||||
Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o \
|
||||||
|
YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,11 @@ LDFLAGS = -g
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
||||||
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
|
||||||
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
|
DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
|
NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o \
|
||||||
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o \
|
NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
|
||||||
QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \
|
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
|
||||||
UMP.o UserDB.o UserDBebtry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
TFTSurenoo.o Thread.o Timer.o UDPSocket.o UMP.o UserDB.o UserDBebtry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
70
Modem.cpp
70
Modem.cpp
|
@ -79,6 +79,7 @@ const unsigned char MMDVM_POCSAG_DATA = 0x50U;
|
||||||
const unsigned char MMDVM_FM_PARAMS1 = 0x60U;
|
const unsigned char MMDVM_FM_PARAMS1 = 0x60U;
|
||||||
const unsigned char MMDVM_FM_PARAMS2 = 0x61U;
|
const unsigned char MMDVM_FM_PARAMS2 = 0x61U;
|
||||||
const unsigned char MMDVM_FM_PARAMS3 = 0x62U;
|
const unsigned char MMDVM_FM_PARAMS3 = 0x62U;
|
||||||
|
const unsigned char MMDVM_FM_PARAMS4 = 0x63U;
|
||||||
const unsigned char MMDVM_FM_DATA = 0x65U;
|
const unsigned char MMDVM_FM_DATA = 0x65U;
|
||||||
|
|
||||||
const unsigned char MMDVM_ACK = 0x70U;
|
const unsigned char MMDVM_ACK = 0x70U;
|
||||||
|
@ -184,6 +185,7 @@ m_fmCallsignAtStart(true),
|
||||||
m_fmCallsignAtEnd(true),
|
m_fmCallsignAtEnd(true),
|
||||||
m_fmCallsignAtLatch(true),
|
m_fmCallsignAtLatch(true),
|
||||||
m_fmRfAck("K"),
|
m_fmRfAck("K"),
|
||||||
|
m_fmExtAck("N"),
|
||||||
m_fmAckSpeed(20U),
|
m_fmAckSpeed(20U),
|
||||||
m_fmAckFrequency(1750U),
|
m_fmAckFrequency(1750U),
|
||||||
m_fmAckMinTime(4U),
|
m_fmAckMinTime(4U),
|
||||||
|
@ -199,7 +201,9 @@ m_fmHangTime(5U),
|
||||||
m_fmUseCOS(true),
|
m_fmUseCOS(true),
|
||||||
m_fmCOSInvert(false),
|
m_fmCOSInvert(false),
|
||||||
m_fmRFAudioBoost(1U),
|
m_fmRFAudioBoost(1U),
|
||||||
m_fmMaxDevLevel(90.0F)
|
m_fmExtAudioBoost(1U),
|
||||||
|
m_fmMaxDevLevel(90.0F),
|
||||||
|
m_fmExtEnable(false)
|
||||||
{
|
{
|
||||||
m_buffer = new unsigned char[BUFFER_LENGTH];
|
m_buffer = new unsigned char[BUFFER_LENGTH];
|
||||||
|
|
||||||
|
@ -333,6 +337,16 @@ bool CModem::open()
|
||||||
m_serial = NULL;
|
m_serial = NULL;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_fmExtEnable) {
|
||||||
|
ret = setFMExtParams();
|
||||||
|
if (!ret) {
|
||||||
|
m_serial->close();
|
||||||
|
delete m_serial;
|
||||||
|
m_serial = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_statusTimer.start();
|
m_statusTimer.start();
|
||||||
|
@ -2013,6 +2027,13 @@ void CModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctc
|
||||||
m_fmMaxDevLevel = maxDevLevel;
|
m_fmMaxDevLevel = maxDevLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CModem::setFMExtParams(const std::string& ack, unsigned int audioBoost)
|
||||||
|
{
|
||||||
|
m_fmExtAck = ack;
|
||||||
|
m_fmExtAudioBoost = audioBoost;
|
||||||
|
m_fmExtEnable = true;
|
||||||
|
}
|
||||||
|
|
||||||
bool CModem::setFMCallsignParams()
|
bool CModem::setFMCallsignParams()
|
||||||
{
|
{
|
||||||
assert(m_serial != NULL);
|
assert(m_serial != NULL);
|
||||||
|
@ -2189,6 +2210,53 @@ bool CModem::setFMMiscParams()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CModem::setFMExtParams()
|
||||||
|
{
|
||||||
|
assert(m_serial != NULL);
|
||||||
|
|
||||||
|
unsigned char buffer[80U];
|
||||||
|
unsigned char len = 4U + m_fmExtAck.size();
|
||||||
|
|
||||||
|
buffer[0U] = MMDVM_FRAME_START;
|
||||||
|
buffer[1U] = len;
|
||||||
|
buffer[2U] = MMDVM_FM_PARAMS4;
|
||||||
|
|
||||||
|
buffer[3U] = m_fmExtAudioBoost;
|
||||||
|
|
||||||
|
for (unsigned int i = 0U; i < m_fmExtAck.size(); i++)
|
||||||
|
buffer[4U + i] = m_fmExtAck.at(i);
|
||||||
|
|
||||||
|
// CUtils::dump(1U, "Written", buffer, len);
|
||||||
|
|
||||||
|
int ret = m_serial->write(buffer, len);
|
||||||
|
if (ret != len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned int count = 0U;
|
||||||
|
RESP_TYPE_MMDVM resp;
|
||||||
|
do {
|
||||||
|
CThread::sleep(10U);
|
||||||
|
|
||||||
|
resp = getResponse();
|
||||||
|
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||||
|
count++;
|
||||||
|
if (count >= MAX_RESPONSES) {
|
||||||
|
LogError("The MMDVM is not responding to the SET_FM_PARAMS4 command");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||||
|
|
||||||
|
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||||
|
|
||||||
|
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||||
|
LogError("Received a NAK to the SET_FM_PARAMS4 command from the modem");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void CModem::printDebug()
|
void CModem::printDebug()
|
||||||
{
|
{
|
||||||
if (m_buffer[2U] == MMDVM_DEBUG1) {
|
if (m_buffer[2U] == MMDVM_DEBUG1) {
|
||||||
|
|
5
Modem.h
5
Modem.h
|
@ -48,6 +48,7 @@ public:
|
||||||
virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch);
|
virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch);
|
||||||
virtual void setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel);
|
virtual void setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel);
|
||||||
virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, bool useCOS, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel);
|
virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, bool useCOS, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel);
|
||||||
|
virtual void setFMExtParams(const std::string& ack, unsigned int audioBoost);
|
||||||
|
|
||||||
virtual bool open();
|
virtual bool open();
|
||||||
|
|
||||||
|
@ -202,6 +203,7 @@ private:
|
||||||
bool m_fmCallsignAtEnd;
|
bool m_fmCallsignAtEnd;
|
||||||
bool m_fmCallsignAtLatch;
|
bool m_fmCallsignAtLatch;
|
||||||
std::string m_fmRfAck;
|
std::string m_fmRfAck;
|
||||||
|
std::string m_fmExtAck;
|
||||||
unsigned int m_fmAckSpeed;
|
unsigned int m_fmAckSpeed;
|
||||||
unsigned int m_fmAckFrequency;
|
unsigned int m_fmAckFrequency;
|
||||||
unsigned int m_fmAckMinTime;
|
unsigned int m_fmAckMinTime;
|
||||||
|
@ -217,7 +219,9 @@ private:
|
||||||
bool m_fmUseCOS;
|
bool m_fmUseCOS;
|
||||||
bool m_fmCOSInvert;
|
bool m_fmCOSInvert;
|
||||||
unsigned int m_fmRFAudioBoost;
|
unsigned int m_fmRFAudioBoost;
|
||||||
|
unsigned int m_fmExtAudioBoost;
|
||||||
float m_fmMaxDevLevel;
|
float m_fmMaxDevLevel;
|
||||||
|
bool m_fmExtEnable;
|
||||||
|
|
||||||
bool readVersion();
|
bool readVersion();
|
||||||
bool readStatus();
|
bool readStatus();
|
||||||
|
@ -226,6 +230,7 @@ private:
|
||||||
bool setFMCallsignParams();
|
bool setFMCallsignParams();
|
||||||
bool setFMAckParams();
|
bool setFMAckParams();
|
||||||
bool setFMMiscParams();
|
bool setFMMiscParams();
|
||||||
|
bool setFMExtParams();
|
||||||
|
|
||||||
void printDebug();
|
void printDebug();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue