mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-23 00:35:53 +08:00
Add mutex protection to the AX.25 network ring buffer.
This commit is contained in:
@@ -33,6 +33,7 @@ extern CMQTTConnection* m_mqtt;
|
|||||||
|
|
||||||
CAX25Network::CAX25Network(bool debug) :
|
CAX25Network::CAX25Network(bool debug) :
|
||||||
m_buffer(1000U, "AX.25 buffer"),
|
m_buffer(1000U, "AX.25 buffer"),
|
||||||
|
m_mutex(),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false)
|
m_enabled(false)
|
||||||
{
|
{
|
||||||
@@ -58,9 +59,6 @@ bool CAX25Network::write(const unsigned char* data, unsigned int length)
|
|||||||
if (!m_enabled)
|
if (!m_enabled)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (m_debug)
|
|
||||||
CUtils::dump(1U, "AX.25 Network Data Sent", data, length);
|
|
||||||
|
|
||||||
unsigned char txData[500U];
|
unsigned char txData[500U];
|
||||||
unsigned int txLength = 0U;
|
unsigned int txLength = 0U;
|
||||||
|
|
||||||
@@ -88,7 +86,7 @@ bool CAX25Network::write(const unsigned char* data, unsigned int length)
|
|||||||
txData[txLength++] = AX25_FEND;
|
txData[txLength++] = AX25_FEND;
|
||||||
|
|
||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "AX.25 Network KISS Data Sent", txData, txLength);
|
CUtils::dump(1U, "AX.25 network KISS packet sent", txData, txLength);
|
||||||
|
|
||||||
m_mqtt->publish("ax25-out", txData, txLength);
|
m_mqtt->publish("ax25-out", txData, txLength);
|
||||||
|
|
||||||
@@ -105,11 +103,16 @@ unsigned int CAX25Network::read(unsigned char* data, unsigned int length)
|
|||||||
|
|
||||||
unsigned char rxData[500U];
|
unsigned char rxData[500U];
|
||||||
unsigned int rxLength = 0U;
|
unsigned int rxLength = 0U;
|
||||||
|
|
||||||
|
m_mutex.lock();
|
||||||
|
|
||||||
m_buffer.getData((unsigned char*)&rxLength, sizeof(unsigned int));
|
m_buffer.getData((unsigned char*)&rxLength, sizeof(unsigned int));
|
||||||
m_buffer.getData(rxData, rxLength);
|
m_buffer.getData(rxData, rxLength);
|
||||||
|
|
||||||
|
m_mutex.unlock();
|
||||||
|
|
||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "AX.25 Network KISS Data Received", rxData, rxLength);
|
CUtils::dump(1U, "AX.25 network KISS packet received", rxData, rxLength);
|
||||||
|
|
||||||
if (rxData[0U] != AX25_FEND) {
|
if (rxData[0U] != AX25_FEND) {
|
||||||
LogWarning("Missing FEND at start of a KISS frame - 0x%02X", rxData[0U]);
|
LogWarning("Missing FEND at start of a KISS frame - 0x%02X", rxData[0U]);
|
||||||
@@ -145,9 +148,6 @@ unsigned int CAX25Network::read(unsigned char* data, unsigned int length)
|
|||||||
if (!complete)
|
if (!complete)
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
if (m_debug)
|
|
||||||
CUtils::dump(1U, "AX.25 Network Data Received", data, length);
|
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,8 +156,12 @@ void CAX25Network::setData(const unsigned char* data, unsigned int length)
|
|||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
assert(length > 0U);
|
assert(length > 0U);
|
||||||
|
|
||||||
|
m_mutex.lock();
|
||||||
|
|
||||||
m_buffer.addData((unsigned char*)&length, sizeof(unsigned int));
|
m_buffer.addData((unsigned char*)&length, sizeof(unsigned int));
|
||||||
m_buffer.addData(data, length);
|
m_buffer.addData(data, length);
|
||||||
|
|
||||||
|
m_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAX25Network::reset()
|
void CAX25Network::reset()
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#if defined(USE_AX25)
|
#if defined(USE_AX25)
|
||||||
|
|
||||||
#include "RingBuffer.h"
|
#include "RingBuffer.h"
|
||||||
|
#include "Mutex.h"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -49,6 +50,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CRingBuffer<unsigned char> m_buffer;
|
CRingBuffer<unsigned char> m_buffer;
|
||||||
|
CMutex m_mutex;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user