Add support for up to 7 paths as per ax25 specification

pull/6/head
sh123 2020-06-12 18:52:04 +03:00
rodzic 056d77caf8
commit edd697ce00
2 zmienionych plików z 30 dodań i 21 usunięć

Wyświetl plik

@ -11,11 +11,10 @@ String Payload::ToText(const String &customComment)
{ {
String txt = srcCall_ + String(">") + dstCall_; String txt = srcCall_ + String(">") + dstCall_;
if (rptFirst_.length() > 0) { for (int i = 0; i < rptCallsCount_; i++) {
txt += String(",") + rptFirst_; if (rptCalls_[i].length() > 0) {
txt += String(",") + rptCalls_[i];
} }
if (rptSecond_.length() > 0) {
txt += String(",") + rptSecond_;
} }
txt += String(":") + body_; txt += String(":") + body_;
@ -30,31 +29,40 @@ String Payload::ToText(const String &customComment)
bool Payload::parsePayload(byte *rxPayload, int payloadLength) bool Payload::parsePayload(byte *rxPayload, int payloadLength)
{ {
byte *rxPtr = rxPayload; byte *rxPtr = rxPayload;
byte *rxEnd = rxPayload + payloadLength;
// destination address
dstCall_ = decodeCall(rxPtr); dstCall_ = decodeCall(rxPtr);
rxPtr += CallsignSize; rxPtr += CallsignSize;
if (rxPtr >= rxPayload + payloadLength) return false; if (rxPtr >= rxPayload + payloadLength) return false;
// source address
srcCall_ = decodeCall(rxPtr); srcCall_ = decodeCall(rxPtr);
rxPtr += CallsignSize; rxPtr += CallsignSize;
if (rxPtr >= rxPayload + payloadLength) return false; if (rxPtr >= rxEnd) return false;
if ((rxPayload[2 * CallsignSize - 1] & 1) == 0) { rptCallsCount_ = 0;
rptFirst_ = decodeCall(rxPtr);
rxPtr += CallsignSize;
if (rxPtr >= rxPayload + payloadLength) return false;
if ((rxPayload[3 * CallsignSize - 1] & 1) == 0) { // digipeater addresses
rptSecond_ = decodeCall(rxPtr); for (int i = 0; i < RptMaxCount; i++) {
if ((rxPayload[(i + 2) * CallsignSize - 1] & 1) == 0) {
rptCalls_[i] = decodeCall(rxPtr);
rptCallsCount_++;
rxPtr += CallsignSize; rxPtr += CallsignSize;
if (rxPtr >= rxEnd) return false;
}
else {
break;
} }
} }
if ((rxPtr + 1) >= rxPayload + payloadLength) return false;
// control + protocol id
if ((rxPtr + 2) >= rxEnd) return false;
if (*(rxPtr++) != AX25Ctrl::UI) return false; if (*(rxPtr++) != AX25Ctrl::UI) return false;
if (*(rxPtr++) != AX25Pid::NoLayer3) return false; if (*(rxPtr++) != AX25Pid::NoLayer3) return false;
while (rxPtr < rxPayload + payloadLength) { // information field
while (rxPtr < rxEnd) {
body_ += String((char)*(rxPtr++)); body_ += String((char)*(rxPtr++));
} }

Wyświetl plik

@ -24,12 +24,13 @@ private:
NoLayer3 = 0xf0 NoLayer3 = 0xf0
}; };
const int MaxPayloadSize = 16;
const int CallsignSize = 7; const int CallsignSize = 7;
const int RptMaxCount = 7;
private: private:
String srcCall_, dstCall_; String srcCall_, dstCall_;
String rptFirst_, rptSecond_; String rptCalls_[7];
int rptCallsCount_;
String body_; String body_;
}; };