mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-24 09:35:40 +08:00
Play out large modem serial payloads gradually.
This commit is contained in:
@@ -275,14 +275,22 @@ m_cwCallsign(),
|
|||||||
m_lockFileEnabled(false),
|
m_lockFileEnabled(false),
|
||||||
m_lockFileName(),
|
m_lockFileName(),
|
||||||
m_remoteControl(NULL),
|
m_remoteControl(NULL),
|
||||||
m_fixedMode(false)
|
m_fixedMode(false),
|
||||||
|
m_serialTimer(1000U, 0U, 210U), // 252 bytes at 9600 bps
|
||||||
|
m_serialBuffer(NULL),
|
||||||
|
m_serialStart(0U),
|
||||||
|
m_serialLength(0U)
|
||||||
{
|
{
|
||||||
CUDPSocket::startup();
|
CUDPSocket::startup();
|
||||||
|
|
||||||
|
m_serialBuffer = new unsigned char[5000U];
|
||||||
}
|
}
|
||||||
|
|
||||||
CMMDVMHost::~CMMDVMHost()
|
CMMDVMHost::~CMMDVMHost()
|
||||||
{
|
{
|
||||||
CUDPSocket::shutdown();
|
CUDPSocket::shutdown();
|
||||||
|
|
||||||
|
delete[] m_serialBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMMDVMHost::run()
|
int CMMDVMHost::run()
|
||||||
@@ -1361,6 +1369,24 @@ int CMMDVMHost::run()
|
|||||||
|
|
||||||
m_modem->clock(ms);
|
m_modem->clock(ms);
|
||||||
|
|
||||||
|
m_serialTimer.clock(ms);
|
||||||
|
if (m_serialTimer.isRunning() && m_serialTimer.hasExpired()) {
|
||||||
|
unsigned int length = m_serialLength - m_serialStart;
|
||||||
|
if (length > 252U) {
|
||||||
|
m_modem->writeSerialData(m_serialBuffer + m_serialStart, 252U);
|
||||||
|
|
||||||
|
m_serialStart += 252U;
|
||||||
|
m_serialTimer.start();
|
||||||
|
} else {
|
||||||
|
if (length > 0U)
|
||||||
|
m_modem->writeSerialData(m_serialBuffer + m_serialStart, length);
|
||||||
|
|
||||||
|
m_serialLength = 0U;
|
||||||
|
m_serialStart = 0U;
|
||||||
|
m_serialTimer.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_fixedMode)
|
if (!m_fixedMode)
|
||||||
m_modeTimer.clock(ms);
|
m_modeTimer.clock(ms);
|
||||||
|
|
||||||
@@ -3635,7 +3661,18 @@ void CMMDVMHost::writeSerial(const unsigned char* message, unsigned int length)
|
|||||||
assert(m_modem != NULL);
|
assert(m_modem != NULL);
|
||||||
assert(message != NULL);
|
assert(message != NULL);
|
||||||
|
|
||||||
m_modem->writeSerialData(message, length);
|
if (length <= 252U) {
|
||||||
|
// Simple case of a short message, send it immediately to the modem
|
||||||
|
m_modem->writeSerialData(message, length);
|
||||||
|
} else {
|
||||||
|
::memcpy(m_serialBuffer, message, length);
|
||||||
|
m_serialLength = length;
|
||||||
|
|
||||||
|
m_modem->writeSerialData(m_serialBuffer, 252U);
|
||||||
|
m_serialStart = 252U;
|
||||||
|
|
||||||
|
m_serialTimer.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(USE_AX25)
|
#if defined(USE_AX25)
|
||||||
|
|||||||
@@ -192,6 +192,11 @@ private:
|
|||||||
CRemoteControl* m_remoteControl;
|
CRemoteControl* m_remoteControl;
|
||||||
bool m_fixedMode;
|
bool m_fixedMode;
|
||||||
|
|
||||||
|
CTimer m_serialTimer;
|
||||||
|
unsigned char* m_serialBuffer;
|
||||||
|
unsigned int m_serialStart;
|
||||||
|
unsigned int m_serialLength;
|
||||||
|
|
||||||
void readParams();
|
void readParams();
|
||||||
bool createModem();
|
bool createModem();
|
||||||
#if defined(USE_DSTAR)
|
#if defined(USE_DSTAR)
|
||||||
|
|||||||
Reference in New Issue
Block a user