Merge branch 'M17_AX25_FM' of https://github.com/g4klx/MMDVMHost into M17_AX25_FM
This commit is contained in:
commit
0448a315e9
12
Conf.cpp
12
Conf.cpp
|
@ -139,7 +139,7 @@ m_dstarBlackList(),
|
||||||
m_dstarWhiteList(),
|
m_dstarWhiteList(),
|
||||||
m_dstarAckReply(true),
|
m_dstarAckReply(true),
|
||||||
m_dstarAckTime(750U),
|
m_dstarAckTime(750U),
|
||||||
m_dstarAckMessage(false),
|
m_dstarAckMessage(DSTAR_ACK_BER),
|
||||||
m_dstarErrorReply(true),
|
m_dstarErrorReply(true),
|
||||||
m_dstarRemoteGateway(false),
|
m_dstarRemoteGateway(false),
|
||||||
m_dstarModeHang(10U),
|
m_dstarModeHang(10U),
|
||||||
|
@ -644,9 +644,11 @@ bool CConf::read()
|
||||||
m_dstarAckReply = ::atoi(value) == 1;
|
m_dstarAckReply = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "AckTime") == 0)
|
else if (::strcmp(key, "AckTime") == 0)
|
||||||
m_dstarAckTime = (unsigned int)::atoi(value);
|
m_dstarAckTime = (unsigned int)::atoi(value);
|
||||||
else if (::strcmp(key, "AckMessage") == 0)
|
else if (::strcmp(key, "AckMessage") == 0) {
|
||||||
m_dstarAckMessage = ::atoi(value) == 1;
|
m_dstarAckMessage = (DSTAR_ACK_MESSAGE)::atoi(value);
|
||||||
else if (::strcmp(key, "ErrorReply") == 0)
|
if (m_dstarAckMessage != DSTAR_ACK_BER && m_dstarAckMessage != DSTAR_ACK_RSSI && m_dstarAckMessage != DSTAR_ACK_SMETER)
|
||||||
|
m_dstarAckMessage = DSTAR_ACK_BER;
|
||||||
|
} else if (::strcmp(key, "ErrorReply") == 0)
|
||||||
m_dstarErrorReply = ::atoi(value) == 1;
|
m_dstarErrorReply = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "RemoteGateway") == 0)
|
else if (::strcmp(key, "RemoteGateway") == 0)
|
||||||
m_dstarRemoteGateway = ::atoi(value) == 1;
|
m_dstarRemoteGateway = ::atoi(value) == 1;
|
||||||
|
@ -1504,7 +1506,7 @@ unsigned int CConf::getDStarAckTime() const
|
||||||
return m_dstarAckTime;
|
return m_dstarAckTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CConf::getDStarAckMessage() const
|
DSTAR_ACK_MESSAGE CConf::getDStarAckMessage() const
|
||||||
{
|
{
|
||||||
return m_dstarAckMessage;
|
return m_dstarAckMessage;
|
||||||
}
|
}
|
||||||
|
|
4
Conf.h
4
Conf.h
|
@ -120,7 +120,7 @@ public:
|
||||||
std::vector<std::string> getDStarWhiteList() const;
|
std::vector<std::string> getDStarWhiteList() const;
|
||||||
bool getDStarAckReply() const;
|
bool getDStarAckReply() const;
|
||||||
unsigned int getDStarAckTime() const;
|
unsigned int getDStarAckTime() const;
|
||||||
bool getDStarAckMessage() const;
|
DSTAR_ACK_MESSAGE getDStarAckMessage() const;
|
||||||
bool getDStarErrorReply() const;
|
bool getDStarErrorReply() const;
|
||||||
bool getDStarRemoteGateway() const;
|
bool getDStarRemoteGateway() const;
|
||||||
unsigned int getDStarModeHang() const;
|
unsigned int getDStarModeHang() const;
|
||||||
|
@ -452,7 +452,7 @@ private:
|
||||||
std::vector<std::string> m_dstarWhiteList;
|
std::vector<std::string> m_dstarWhiteList;
|
||||||
bool m_dstarAckReply;
|
bool m_dstarAckReply;
|
||||||
unsigned int m_dstarAckTime;
|
unsigned int m_dstarAckTime;
|
||||||
bool m_dstarAckMessage;
|
DSTAR_ACK_MESSAGE m_dstarAckMessage;
|
||||||
bool m_dstarErrorReply;
|
bool m_dstarErrorReply;
|
||||||
bool m_dstarRemoteGateway;
|
bool m_dstarRemoteGateway;
|
||||||
unsigned int m_dstarModeHang;
|
unsigned int m_dstarModeHang;
|
||||||
|
|
106
DStarControl.cpp
106
DStarControl.cpp
|
@ -15,6 +15,7 @@
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Sync.h"
|
#include "Sync.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
#include "SMeter.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -37,7 +38,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my)
|
||||||
|
|
||||||
// #define DUMP_DSTAR
|
// #define DUMP_DSTAR
|
||||||
|
|
||||||
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, bool ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
|
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
|
||||||
m_callsign(NULL),
|
m_callsign(NULL),
|
||||||
m_gateway(NULL),
|
m_gateway(NULL),
|
||||||
m_selfOnly(selfOnly),
|
m_selfOnly(selfOnly),
|
||||||
|
@ -139,9 +140,9 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
|
||||||
unsigned char n,
|
unsigned char n,
|
||||||
bool blank_dtmf,
|
bool blank_dtmf,
|
||||||
unsigned char* voice_sync_data,
|
unsigned char* voice_sync_data,
|
||||||
unsigned int* voice_sync_data_len,
|
unsigned int& voice_sync_data_len,
|
||||||
bool* next_frame_is_fast_data,
|
bool& next_frame_is_fast_data,
|
||||||
unsigned int* skip_dtmf_blanking_frames
|
unsigned int& skip_dtmf_blanking_frames
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned int errors = 0U;
|
unsigned int errors = 0U;
|
||||||
|
@ -151,37 +152,40 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
|
||||||
|
|
||||||
if (n == 0U) {
|
if (n == 0U) {
|
||||||
::memcpy(voice_sync_data, data, DSTAR_MODEM_DATA_LEN);
|
::memcpy(voice_sync_data, data, DSTAR_MODEM_DATA_LEN);
|
||||||
*voice_sync_data_len = len;
|
voice_sync_data_len = len;
|
||||||
} else if ((n % 2U != 0U) &&
|
} else if ((n % 2U != 0U) &&
|
||||||
((mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA01) ||
|
((mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA01) ||
|
||||||
(mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA16))) {
|
(mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA16))) {
|
||||||
*next_frame_is_fast_data = true;
|
next_frame_is_fast_data = true;
|
||||||
if (blank_dtmf)
|
if (blank_dtmf)
|
||||||
*skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
|
skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
|
||||||
if (n == 1U)
|
if (n == 1U)
|
||||||
LogDebug("D-Star, %s fastdata sequence no. 0", log_prefix);
|
LogDebug("D-Star, %s fastdata sequence no. 0", log_prefix);
|
||||||
LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n);
|
LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n);
|
||||||
} else if (*next_frame_is_fast_data == true) {
|
} else if (next_frame_is_fast_data) {
|
||||||
*next_frame_is_fast_data = false;
|
next_frame_is_fast_data = false;
|
||||||
if (blank_dtmf)
|
if (blank_dtmf)
|
||||||
*skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
|
skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
|
||||||
LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n);
|
LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n);
|
||||||
} else {
|
} else {
|
||||||
bool voice_sync_data_is_null_ambe_data = false;
|
bool voice_sync_data_is_null_ambe_data = false;
|
||||||
bool data_is_null_ambe_data = false;
|
bool data_is_null_ambe_data = false;
|
||||||
|
|
||||||
if ((n == 1U) && (::memcmp(voice_sync_data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0))
|
if ((n == 1U) && (::memcmp(voice_sync_data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0))
|
||||||
voice_sync_data_is_null_ambe_data = true;
|
voice_sync_data_is_null_ambe_data = true;
|
||||||
|
|
||||||
if (::memcmp(data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0)
|
if (::memcmp(data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0)
|
||||||
data_is_null_ambe_data = true;
|
data_is_null_ambe_data = true;
|
||||||
|
|
||||||
if ((n == 1U) && !voice_sync_data_is_null_ambe_data)
|
if ((n == 1U) && !voice_sync_data_is_null_ambe_data)
|
||||||
voice_sync_errors += m_fec.regenerateDStar(voice_sync_data + offset);
|
voice_sync_errors += m_fec.regenerateDStar(voice_sync_data + offset);
|
||||||
|
|
||||||
if (!data_is_null_ambe_data)
|
if (!data_is_null_ambe_data)
|
||||||
errors += m_fec.regenerateDStar(data + offset);
|
errors += m_fec.regenerateDStar(data + offset);
|
||||||
|
|
||||||
if (blank_dtmf && (*skip_dtmf_blanking_frames > 0U)) {
|
if (blank_dtmf && skip_dtmf_blanking_frames > 0U) {
|
||||||
(*skip_dtmf_blanking_frames)--;
|
skip_dtmf_blanking_frames--;
|
||||||
} else if (blank_dtmf && (*skip_dtmf_blanking_frames == 0U)) {
|
} else if (blank_dtmf && skip_dtmf_blanking_frames == 0U) {
|
||||||
if ((n == 1U) && !voice_sync_data_is_null_ambe_data)
|
if ((n == 1U) && !voice_sync_data_is_null_ambe_data)
|
||||||
blankDTMF(voice_sync_data + offset);
|
blankDTMF(voice_sync_data + offset);
|
||||||
if (!data_is_null_ambe_data)
|
if (!data_is_null_ambe_data)
|
||||||
|
@ -190,17 +194,16 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
|
||||||
|
|
||||||
if (n == 1U) {
|
if (n == 1U) {
|
||||||
if (voice_sync_data_is_null_ambe_data)
|
if (voice_sync_data_is_null_ambe_data)
|
||||||
LogDebug("D-Star, %s nullaudio sequence no. 0", log_prefix);
|
LogDebug("D-Star, %s nullaudio sequence no. 0", log_prefix);
|
||||||
else
|
else
|
||||||
LogDebug("D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)", log_prefix, voice_sync_errors,
|
LogDebug("D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)", log_prefix, voice_sync_errors, float(voice_sync_errors) / 0.48F);
|
||||||
float(voice_sync_errors) / 0.48F);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_is_null_ambe_data)
|
if (data_is_null_ambe_data)
|
||||||
LogDebug("D-Star, %s nullaudio sequence no. %2u", log_prefix, n);
|
LogDebug("D-Star, %s nullaudio sequence no. %2u", log_prefix, n);
|
||||||
else
|
else
|
||||||
LogDebug("D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)", log_prefix, n, errors,
|
LogDebug("D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)", log_prefix, n, errors, float(errors) / 0.48F);
|
||||||
float(errors) / 0.48F);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return voice_sync_errors + errors;
|
return voice_sync_errors + errors;
|
||||||
}
|
}
|
||||||
|
@ -455,8 +458,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
||||||
|
|
||||||
unsigned int errors = 0U;
|
unsigned int errors = 0U;
|
||||||
if (!m_rfHeader.isDataPacket()) {
|
if (!m_rfHeader.isDataPacket()) {
|
||||||
errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen,
|
errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames);
|
||||||
&m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames);
|
|
||||||
m_display->writeDStarBER(float(errors) / 0.48F);
|
m_display->writeDStarBER(float(errors) / 0.48F);
|
||||||
m_rfErrs += errors;
|
m_rfErrs += errors;
|
||||||
}
|
}
|
||||||
|
@ -588,8 +590,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
||||||
|
|
||||||
unsigned int errors = 0U;
|
unsigned int errors = 0U;
|
||||||
if (!m_rfHeader.isDataPacket()) {
|
if (!m_rfHeader.isDataPacket()) {
|
||||||
errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen,
|
errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames);
|
||||||
&m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames);
|
|
||||||
m_rfErrs += errors;
|
m_rfErrs += errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -789,8 +790,7 @@ void CDStarControl::writeNetwork()
|
||||||
|
|
||||||
unsigned int errors = 0U;
|
unsigned int errors = 0U;
|
||||||
if (!m_netHeader.isDataPacket())
|
if (!m_netHeader.isDataPacket())
|
||||||
errors = maybeFixupVoiceFrame(data, length, 2U, "Net", n, true, m_netVoiceSyncData, &m_netVoiceSyncDataLen,
|
errors = maybeFixupVoiceFrame(data, length, 2U, "Net", n, true, m_netVoiceSyncData, m_netVoiceSyncDataLen, m_netNextFrameIsFastData, m_netSkipDTMFBlankingFrames);
|
||||||
&m_netNextFrameIsFastData, &m_netSkipDTMFBlankingFrames);
|
|
||||||
|
|
||||||
// Insert silence and reject if in the past
|
// Insert silence and reject if in the past
|
||||||
bool ret = insertSilence(data + 1U, n);
|
bool ret = insertSilence(data + 1U, n);
|
||||||
|
@ -1182,18 +1182,33 @@ void CDStarControl::sendAck()
|
||||||
m_network->getStatus(status, reflector);
|
m_network->getStatus(status, reflector);
|
||||||
|
|
||||||
char text[40U];
|
char text[40U];
|
||||||
if (m_ackMessage && m_rssi != 0) {
|
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||||
::sprintf(text, "%-8.8s -%udBm ", reflector, m_aveRSSI / m_rssiCount);
|
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||||
else
|
::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
||||||
|
} else {
|
||||||
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
||||||
}
|
}
|
||||||
else {
|
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
|
||||||
|
unsigned int signal, plus;
|
||||||
|
char signalText[10U];
|
||||||
|
CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus);
|
||||||
|
if (plus != 0U)
|
||||||
|
::sprintf(signalText, "S%u+%02u", signal, plus);
|
||||||
|
else
|
||||||
|
::sprintf(signalText, "S%u", signal);
|
||||||
|
|
||||||
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||||
|
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||||
|
else
|
||||||
|
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||||
|
} else {
|
||||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||||
else
|
else
|
||||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_slowData.setText(text);
|
m_slowData.setText(text);
|
||||||
|
|
||||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||||
|
@ -1232,18 +1247,33 @@ void CDStarControl::sendError()
|
||||||
m_network->getStatus(status, reflector);
|
m_network->getStatus(status, reflector);
|
||||||
|
|
||||||
char text[40U];
|
char text[40U];
|
||||||
if (m_ackMessage && m_rssi != 0) {
|
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||||
::sprintf(text, "%-8.8s -%udBm ", reflector, m_aveRSSI / m_rssiCount);
|
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||||
else
|
::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
||||||
|
} else {
|
||||||
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
|
||||||
}
|
}
|
||||||
else {
|
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
|
||||||
|
unsigned int signal, plus;
|
||||||
|
char signalText[10U];
|
||||||
|
CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus);
|
||||||
|
if (plus != 0U)
|
||||||
|
::sprintf(signalText, "S%u+%02u", signal, plus);
|
||||||
|
else
|
||||||
|
::sprintf(signalText, "S%u", signal);
|
||||||
|
|
||||||
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||||
|
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||||
|
else
|
||||||
|
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||||
|
} else {
|
||||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||||
else
|
else
|
||||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_slowData.setText(text);
|
m_slowData.setText(text);
|
||||||
|
|
||||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
class CDStarControl {
|
class CDStarControl {
|
||||||
public:
|
public:
|
||||||
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, bool ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
|
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
|
||||||
~CDStarControl();
|
~CDStarControl();
|
||||||
|
|
||||||
bool writeModem(unsigned char* data, unsigned int len);
|
bool writeModem(unsigned char* data, unsigned int len);
|
||||||
|
@ -55,7 +55,7 @@ private:
|
||||||
unsigned char* m_gateway;
|
unsigned char* m_gateway;
|
||||||
bool m_selfOnly;
|
bool m_selfOnly;
|
||||||
bool m_ackReply;
|
bool m_ackReply;
|
||||||
bool m_ackMessage;
|
DSTAR_ACK_MESSAGE m_ackMessage;
|
||||||
bool m_errorReply;
|
bool m_errorReply;
|
||||||
bool m_remoteGateway;
|
bool m_remoteGateway;
|
||||||
std::vector<std::string> m_blackList;
|
std::vector<std::string> m_blackList;
|
||||||
|
@ -107,7 +107,6 @@ private:
|
||||||
unsigned int m_rfSkipDTMFBlankingFrames;
|
unsigned int m_rfSkipDTMFBlankingFrames;
|
||||||
unsigned int m_netSkipDTMFBlankingFrames;
|
unsigned int m_netSkipDTMFBlankingFrames;
|
||||||
|
|
||||||
|
|
||||||
unsigned int maybeFixupVoiceFrame(
|
unsigned int maybeFixupVoiceFrame(
|
||||||
unsigned char* data,
|
unsigned char* data,
|
||||||
unsigned int len,
|
unsigned int len,
|
||||||
|
@ -116,9 +115,9 @@ private:
|
||||||
unsigned char n,
|
unsigned char n,
|
||||||
bool blank_dtmf,
|
bool blank_dtmf,
|
||||||
unsigned char* voice_sync_data,
|
unsigned char* voice_sync_data,
|
||||||
unsigned int* voice_sync_data_len,
|
unsigned int& voice_sync_data_len,
|
||||||
bool* next_frame_is_fast_data,
|
bool& next_frame_is_fast_data,
|
||||||
unsigned int* skip_dtmf_blanking_frames
|
unsigned int& skip_dtmf_blanking_frames
|
||||||
);
|
);
|
||||||
|
|
||||||
void writeNetwork();
|
void writeNetwork();
|
||||||
|
|
|
@ -87,4 +87,10 @@ enum DMR_OVCM_TYPES {
|
||||||
DMR_OVCM_FORCE_OFF
|
DMR_OVCM_FORCE_OFF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DSTAR_ACK_MESSAGE {
|
||||||
|
DSTAR_ACK_BER,
|
||||||
|
DSTAR_ACK_RSSI,
|
||||||
|
DSTAR_ACK_SMETER
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -341,9 +341,11 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
|
||||||
LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
|
LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||||
writeEndRF();
|
writeEndRF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int CM17Control::readModem(unsigned char* data)
|
unsigned int CM17Control::readModem(unsigned char* data)
|
||||||
|
|
|
@ -50,8 +50,8 @@ const unsigned int M17_PAYLOAD_LENGTH_BITS = 128U;
|
||||||
const unsigned int M17_PAYLOAD_LENGTH_BYTES = M17_PAYLOAD_LENGTH_BITS / 8U;
|
const unsigned int M17_PAYLOAD_LENGTH_BYTES = M17_PAYLOAD_LENGTH_BITS / 8U;
|
||||||
|
|
||||||
const unsigned char M17_NULL_NONCE[] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};
|
const unsigned char M17_NULL_NONCE[] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};
|
||||||
const unsigned int M17_NONCE_LENGTH_BITS = 112U;
|
const unsigned int M17_META_LENGTH_BITS = 112U;
|
||||||
const unsigned int M17_NONCE_LENGTH_BYTES = M17_NONCE_LENGTH_BITS / 8U;
|
const unsigned int M17_META_LENGTH_BYTES = M17_META_LENGTH_BITS / 8U;
|
||||||
|
|
||||||
const unsigned int M17_FN_LENGTH_BITS = 16U;
|
const unsigned int M17_FN_LENGTH_BITS = 16U;
|
||||||
const unsigned int M17_FN_LENGTH_BYTES = M17_FN_LENGTH_BITS / 8U;
|
const unsigned int M17_FN_LENGTH_BYTES = M17_FN_LENGTH_BITS / 8U;
|
||||||
|
|
16
M17LSF.cpp
16
M17LSF.cpp
|
@ -144,9 +144,23 @@ void CM17LSF::setCAN(unsigned char can)
|
||||||
m_lsf[12U] |= (can >> 1) & 0x07U;
|
m_lsf[12U] |= (can >> 1) & 0x07U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CM17LSF::getMeta(unsigned char* data) const
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
::memcpy(data, m_lsf + 14U, M17_META_LENGTH_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CM17LSF::setMeta(const unsigned char* data)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
::memcpy(m_lsf + 14U, data, M17_META_LENGTH_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
void CM17LSF::reset()
|
void CM17LSF::reset()
|
||||||
{
|
{
|
||||||
::memset(m_lsf, 0x00U, 30U);
|
::memset(m_lsf, 0x00U, M17_LSF_LENGTH_BYTES);
|
||||||
|
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
}
|
}
|
||||||
|
|
3
M17LSF.h
3
M17LSF.h
|
@ -50,6 +50,9 @@ public:
|
||||||
unsigned char getCAN() const;
|
unsigned char getCAN() const;
|
||||||
void setCAN(unsigned char can);
|
void setCAN(unsigned char can);
|
||||||
|
|
||||||
|
void getMeta(unsigned char* data) const;
|
||||||
|
void setMeta(const unsigned char* data);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
|
|
||||||
|
|
|
@ -488,7 +488,7 @@ int CMMDVMHost::run()
|
||||||
std::vector<std::string> whiteList = m_conf.getDStarWhiteList();
|
std::vector<std::string> whiteList = m_conf.getDStarWhiteList();
|
||||||
bool ackReply = m_conf.getDStarAckReply();
|
bool ackReply = m_conf.getDStarAckReply();
|
||||||
unsigned int ackTime = m_conf.getDStarAckTime();
|
unsigned int ackTime = m_conf.getDStarAckTime();
|
||||||
bool ackMessage = m_conf.getDStarAckMessage();
|
DSTAR_ACK_MESSAGE ackMessage = m_conf.getDStarAckMessage();
|
||||||
bool errorReply = m_conf.getDStarErrorReply();
|
bool errorReply = m_conf.getDStarErrorReply();
|
||||||
bool remoteGateway = m_conf.getDStarRemoteGateway();
|
bool remoteGateway = m_conf.getDStarRemoteGateway();
|
||||||
m_dstarRFModeHang = m_conf.getDStarModeHang();
|
m_dstarRFModeHang = m_conf.getDStarModeHang();
|
||||||
|
@ -497,7 +497,7 @@ int CMMDVMHost::run()
|
||||||
LogInfo(" Module: %s", module.c_str());
|
LogInfo(" Module: %s", module.c_str());
|
||||||
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
|
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
|
||||||
LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no");
|
LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no");
|
||||||
LogInfo(" Ack message: %s", ackMessage ? "RSSI" : "BER");
|
LogInfo(" Ack message: %s", ackMessage == DSTAR_ACK_RSSI? "RSSI" : (ackMessage == DSTAR_ACK_SMETER ? "SMETER" : "BER"));
|
||||||
LogInfo(" Ack Time: %ums", ackTime);
|
LogInfo(" Ack Time: %ums", ackTime);
|
||||||
LogInfo(" Error Reply: %s", errorReply ? "yes" : "no");
|
LogInfo(" Error Reply: %s", errorReply ? "yes" : "no");
|
||||||
LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no");
|
LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no");
|
||||||
|
@ -2192,6 +2192,10 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_m17Network->enable(true);
|
m_m17Network->enable(true);
|
||||||
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_ax25Network != NULL)
|
||||||
|
m_ax25Network->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)
|
||||||
|
@ -2206,6 +2210,10 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_m17->enable(true);
|
m_m17->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);
|
||||||
|
if (m_ax25 != NULL)
|
||||||
|
m_ax25->enable(false);
|
||||||
m_modem->setMode(MODE_M17);
|
m_modem->setMode(MODE_M17);
|
||||||
m_mode = MODE_M17;
|
m_mode = MODE_M17;
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
|
|
|
@ -247,6 +247,7 @@
|
||||||
<ClInclude Include="Modem.h" />
|
<ClInclude Include="Modem.h" />
|
||||||
<ClInclude Include="SerialPort.h" />
|
<ClInclude Include="SerialPort.h" />
|
||||||
<ClInclude Include="SHA256.h" />
|
<ClInclude Include="SHA256.h" />
|
||||||
|
<ClInclude Include="SMeter.h" />
|
||||||
<ClInclude Include="StopWatch.h" />
|
<ClInclude Include="StopWatch.h" />
|
||||||
<ClInclude Include="Sync.h" />
|
<ClInclude Include="Sync.h" />
|
||||||
<ClInclude Include="TFTSurenoo.h" />
|
<ClInclude Include="TFTSurenoo.h" />
|
||||||
|
@ -352,6 +353,7 @@
|
||||||
<ClCompile Include="Modem.cpp" />
|
<ClCompile Include="Modem.cpp" />
|
||||||
<ClCompile Include="SerialPort.cpp" />
|
<ClCompile Include="SerialPort.cpp" />
|
||||||
<ClCompile Include="SHA256.cpp" />
|
<ClCompile Include="SHA256.cpp" />
|
||||||
|
<ClCompile Include="SMeter.cpp" />
|
||||||
<ClCompile Include="StopWatch.cpp" />
|
<ClCompile Include="StopWatch.cpp" />
|
||||||
<ClCompile Include="Sync.cpp" />
|
<ClCompile Include="Sync.cpp" />
|
||||||
<ClCompile Include="TFTSurenoo.cpp" />
|
<ClCompile Include="TFTSurenoo.cpp" />
|
||||||
|
|
|
@ -347,6 +347,9 @@
|
||||||
<ClInclude Include="ModemPort.h">
|
<ClInclude Include="ModemPort.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="SMeter.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="BPTC19696.cpp">
|
<ClCompile Include="BPTC19696.cpp">
|
||||||
|
@ -652,5 +655,8 @@
|
||||||
<ClCompile Include="ModemPort.cpp">
|
<ClCompile Include="ModemPort.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="SMeter.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
4
Makefile
4
Makefile
|
@ -14,8 +14,8 @@ OBJECTS = \
|
||||||
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
||||||
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
|
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.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 P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \
|
NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \
|
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o \
|
||||||
UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ OBJECTS = \
|
||||||
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
||||||
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
|
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.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 P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \
|
NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \
|
||||||
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \
|
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o \
|
||||||
UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ OBJECTS = \
|
||||||
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
||||||
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
|
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.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 P25Trellis.o P25Utils.o PseudoTTYController.o \
|
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \
|
||||||
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \
|
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \
|
||||||
Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \
|
TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \
|
||||||
YSFPayload.o
|
YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,9 @@ OBJECTS = \
|
||||||
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
||||||
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
|
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.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 P25Trellis.o P25Utils.o PseudoTTYController.o \
|
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \
|
||||||
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \
|
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \
|
||||||
Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \
|
TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \
|
||||||
YSFPayload.o
|
YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,8 @@ OBJECTS = \
|
||||||
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \
|
||||||
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
|
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
|
||||||
NXDNUDCH.o OLED.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \
|
NXDNUDCH.o OLED.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \
|
||||||
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \
|
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \
|
||||||
Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \
|
TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ YSFNetwork.o YSFPayload.o
|
||||||
YSFPayload.o
|
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ OBJECTS = \
|
||||||
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \
|
||||||
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
|
NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.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 P25Trellis.o P25Utils.o PseudoTTYController.o \
|
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \
|
||||||
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \
|
POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \
|
||||||
Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \
|
TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \
|
||||||
YSFPayload.o
|
YSFNetwork.o YSFPayload.o
|
||||||
|
|
||||||
all: MMDVMHost RemoteCommand
|
all: MMDVMHost RemoteCommand
|
||||||
|
|
||||||
|
|
37
SMeter.cpp
Normal file
37
SMeter.cpp
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2021 by Jonathan Naylor G4KLX
|
||||||
|
* Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA
|
||||||
|
*
|
||||||
|
* 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 "SMeter.h"
|
||||||
|
|
||||||
|
const unsigned int RSSI_S1 = 141U;
|
||||||
|
const unsigned int RSSI_S9 = 93U;
|
||||||
|
|
||||||
|
void CSMeter::getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus)
|
||||||
|
{
|
||||||
|
if (rssi > RSSI_S1) {
|
||||||
|
signal = 0U;
|
||||||
|
plus = rssi - RSSI_S1;
|
||||||
|
} else if (rssi > RSSI_S9 && rssi <= RSSI_S1) {
|
||||||
|
signal = ((RSSI_S1 - rssi) / 6U) + 1U;
|
||||||
|
plus = (RSSI_S1 - rssi) % 6U;
|
||||||
|
} else {
|
||||||
|
signal = 9U;
|
||||||
|
plus = RSSI_S9 - rssi;
|
||||||
|
}
|
||||||
|
}
|
29
SMeter.h
Normal file
29
SMeter.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2021 by Jonathan Naylor G4KLX
|
||||||
|
* Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(SMETER_H)
|
||||||
|
#define SMETER_H
|
||||||
|
|
||||||
|
class CSMeter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
14
Utils.cpp
14
Utils.cpp
|
@ -156,3 +156,17 @@ unsigned int CUtils::countBits(unsigned int v)
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CUtils::removeChar(unsigned char * haystack, char needdle)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
unsigned int j = 0;
|
||||||
|
|
||||||
|
while (haystack[i] != '\0') {
|
||||||
|
if (haystack[i] != needdle)
|
||||||
|
haystack[j++] = haystack[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
haystack[j] = '\0';
|
||||||
|
}
|
||||||
|
|
2
Utils.h
2
Utils.h
|
@ -32,6 +32,8 @@ public:
|
||||||
|
|
||||||
static unsigned int countBits(unsigned int v);
|
static unsigned int countBits(unsigned int v);
|
||||||
|
|
||||||
|
static void removeChar(unsigned char * haystack, char needdle);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue