From edd697ce005c16b1e409a4879162adf051d6be33 Mon Sep 17 00:00:00 2001 From: sh123 Date: Fri, 12 Jun 2020 18:52:04 +0300 Subject: [PATCH] Add support for up to 7 paths as per ax25 specification --- ax25_payload.cpp | 46 +++++++++++++++++++++++++++------------------- ax25_payload.h | 5 +++-- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/ax25_payload.cpp b/ax25_payload.cpp index 7b3d6f0..5c9ab61 100644 --- a/ax25_payload.cpp +++ b/ax25_payload.cpp @@ -10,14 +10,13 @@ Payload::Payload(byte *rxPayload, int payloadLength) String Payload::ToText(const String &customComment) { String txt = srcCall_ + String(">") + dstCall_; - - if (rptFirst_.length() > 0) { - txt += String(",") + rptFirst_; - } - if (rptSecond_.length() > 0) { - txt += String(",") + rptSecond_; - } + for (int i = 0; i < rptCallsCount_; i++) { + if (rptCalls_[i].length() > 0) { + txt += String(",") + rptCalls_[i]; + } + } + txt += String(":") + body_; if (body_.startsWith("=")) { @@ -30,31 +29,40 @@ String Payload::ToText(const String &customComment) bool Payload::parsePayload(byte *rxPayload, int payloadLength) { byte *rxPtr = rxPayload; + byte *rxEnd = rxPayload + payloadLength; + // destination address dstCall_ = decodeCall(rxPtr); rxPtr += CallsignSize; if (rxPtr >= rxPayload + payloadLength) return false; + // source address srcCall_ = decodeCall(rxPtr); rxPtr += CallsignSize; - if (rxPtr >= rxPayload + payloadLength) return false; - - if ((rxPayload[2 * CallsignSize - 1] & 1) == 0) { - rptFirst_ = decodeCall(rxPtr); - rxPtr += CallsignSize; - if (rxPtr >= rxPayload + payloadLength) return false; + if (rxPtr >= rxEnd) return false; - if ((rxPayload[3 * CallsignSize - 1] & 1) == 0) { - rptSecond_ = decodeCall(rxPtr); + rptCallsCount_ = 0; + + // digipeater addresses + for (int i = 0; i < RptMaxCount; i++) { + if ((rxPayload[(i + 2) * CallsignSize - 1] & 1) == 0) { + rptCalls_[i] = decodeCall(rxPtr); + rptCallsCount_++; 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++) != AX25Pid::NoLayer3) return false; - - while (rxPtr < rxPayload + payloadLength) { + + // information field + while (rxPtr < rxEnd) { body_ += String((char)*(rxPtr++)); } diff --git a/ax25_payload.h b/ax25_payload.h index 58047ee..a66ac13 100644 --- a/ax25_payload.h +++ b/ax25_payload.h @@ -24,12 +24,13 @@ private: NoLayer3 = 0xf0 }; - const int MaxPayloadSize = 16; const int CallsignSize = 7; + const int RptMaxCount = 7; private: String srcCall_, dstCall_; - String rptFirst_, rptSecond_; + String rptCalls_[7]; + int rptCallsCount_; String body_; };