Add KISS receive.
This commit is contained in:
parent
38f59236ae
commit
27c9ad43ec
100
AX25Network.cpp
100
AX25Network.cpp
|
@ -37,11 +37,9 @@ const unsigned char AX25_TFESC = 0xDDU;
|
||||||
CAX25Network::CAX25Network(const std::string& port, unsigned int speed, bool debug) :
|
CAX25Network::CAX25Network(const std::string& port, unsigned int speed, bool debug) :
|
||||||
m_serial(port, SERIAL_SPEED(speed), false), // XXX
|
m_serial(port, SERIAL_SPEED(speed), false), // XXX
|
||||||
m_txData(NULL),
|
m_txData(NULL),
|
||||||
m_txLength(0U),
|
|
||||||
m_txOffset(0U),
|
|
||||||
m_rxData(NULL),
|
m_rxData(NULL),
|
||||||
m_rxLength(0U),
|
m_rxLength(0U),
|
||||||
m_rxComplete(false),
|
m_rxLastChar(0U),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false)
|
m_enabled(false)
|
||||||
{
|
{
|
||||||
|
@ -69,36 +67,103 @@ bool CAX25Network::write(const unsigned char* data, unsigned int length)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
||||||
m_txLength = 0U;
|
if (!m_enabled)
|
||||||
m_txOffset = 0U;
|
return true;
|
||||||
|
|
||||||
m_txData[m_txLength++] = AX25_FEND;
|
unsigned int txLength = 0U;
|
||||||
m_txData[m_txLength++] = AX25_KISS_DATA;
|
|
||||||
|
m_txData[txLength++] = AX25_FEND;
|
||||||
|
m_txData[txLength++] = AX25_KISS_DATA;
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < length; i++) {
|
for (unsigned int i = 0U; i < length; i++) {
|
||||||
unsigned char c = data[i];
|
unsigned char c = data[i];
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case AX25_FEND:
|
case AX25_FEND:
|
||||||
m_txData[m_txLength++] = AX25_FESC;
|
m_txData[txLength++] = AX25_FESC;
|
||||||
m_txData[m_txLength++] = AX25_TFEND;
|
m_txData[txLength++] = AX25_TFEND;
|
||||||
break;
|
break;
|
||||||
case AX25_FESC:
|
case AX25_FESC:
|
||||||
m_txData[m_txLength++] = AX25_FESC;
|
m_txData[txLength++] = AX25_FESC;
|
||||||
m_txData[m_txLength++] = AX25_TFESC;
|
m_txData[txLength++] = AX25_TFESC;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m_txData[m_txLength++] = c;
|
m_txData[txLength++] = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_txData[m_txLength++] = AX25_FEND;
|
m_txData[txLength++] = AX25_FEND;
|
||||||
|
|
||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "AX25 Network Data Sent", m_txData, m_txLength);
|
CUtils::dump(1U, "AX25 Network Data Sent", m_txData, txLength);
|
||||||
|
|
||||||
return m_serial.write(m_txData, m_txLength);
|
return m_serial.write(m_txData, txLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CAX25Network::read(unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
bool complete = false;
|
||||||
|
|
||||||
|
unsigned char c;
|
||||||
|
while (m_serial.read(&c, 1U) > 0U) {
|
||||||
|
if (m_rxLength == 0U && c == AX25_FEND)
|
||||||
|
m_rxData[m_rxLength++] = c;
|
||||||
|
else if (m_rxLength > 0U)
|
||||||
|
m_rxData[m_rxLength++] = c;
|
||||||
|
|
||||||
|
if (m_rxLength > 1U && c == AX25_FEND) {
|
||||||
|
complete = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_enabled)
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
if (!complete)
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
if (m_rxLength == 0U)
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
if (m_rxData[1U] != AX25_KISS_DATA) {
|
||||||
|
m_rxLength = 0U;
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
complete = false;
|
||||||
|
|
||||||
|
unsigned int dataLen = 0U;
|
||||||
|
for (unsigned int i = 2U; i < m_rxLength; i++) {
|
||||||
|
unsigned char c = m_rxData[i];
|
||||||
|
|
||||||
|
if (c == AX25_FEND) {
|
||||||
|
complete = true;
|
||||||
|
break;
|
||||||
|
} else if (c == AX25_TFEND && m_rxLastChar == AX25_FESC) {
|
||||||
|
data[dataLen++] = AX25_FEND;
|
||||||
|
} else if (c == AX25_TFESC && m_rxLastChar == AX25_FESC) {
|
||||||
|
data[dataLen++] = AX25_FESC;
|
||||||
|
} else if (c != AX25_FESC) {
|
||||||
|
data[dataLen++] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_rxLastChar = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!complete)
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
CUtils::dump(1U, "AX25 Network Data Received", m_rxData, m_rxLength);
|
||||||
|
|
||||||
|
m_rxLength = 0U;
|
||||||
|
m_rxLastChar = 0U;
|
||||||
|
|
||||||
|
return dataLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAX25Network::reset()
|
void CAX25Network::reset()
|
||||||
|
@ -115,4 +180,9 @@ void CAX25Network::close()
|
||||||
void CAX25Network::enable(bool enabled)
|
void CAX25Network::enable(bool enabled)
|
||||||
{
|
{
|
||||||
m_enabled = enabled;
|
m_enabled = enabled;
|
||||||
|
|
||||||
|
if (enabled && !m_enabled) {
|
||||||
|
m_rxLastChar = 0U;
|
||||||
|
m_rxLength = 0U;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,11 +44,9 @@ public:
|
||||||
private:
|
private:
|
||||||
CSerialController m_serial;
|
CSerialController m_serial;
|
||||||
unsigned char* m_txData;
|
unsigned char* m_txData;
|
||||||
unsigned int m_txLength;
|
|
||||||
unsigned int m_txOffset;
|
|
||||||
unsigned char* m_rxData;
|
unsigned char* m_rxData;
|
||||||
unsigned int m_rxLength;
|
unsigned int m_rxLength;
|
||||||
bool m_rxComplete;
|
unsigned char m_rxLastChar;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue