kopia lustrzana https://github.com/sh123/esp32_loraprs
Add support for up to 7 paths as per ax25 specification
rodzic
056d77caf8
commit
edd697ce00
|
@ -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++));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue