TNC: recognize and ignore non data frames

This commit is contained in:
Łukasz Nidecki 2021-08-21 22:35:52 +02:00
parent c0eb892a7c
commit 6cd887f91a
3 changed files with 152 additions and 132 deletions

View File

@ -107,11 +107,19 @@ String decapsulateKISS(const String& frame) {
return ax25Frame;
}
String decode_kiss(const String& kissFormattedFrame) {
/**
*
* @param inputKISSTNCFrame
* @param dataFrame
* @return Decapsulated TNC2KISS APRS data frame, or raw command data frame
*/
String decode_kiss(const String &inputKISSTNCFrame, bool &dataFrame) {
String TNC2Frame = "";
if (validateKISSFrame(kissFormattedFrame)){
String ax25Frame = decapsulateKISS(kissFormattedFrame);
if (validateKISSFrame(inputKISSTNCFrame)) {
dataFrame = inputKISSTNCFrame.charAt(1) == CMD_DATA;
if (dataFrame){
String ax25Frame = decapsulateKISS(inputKISSTNCFrame);
bool isLast = false;
String dst_addr = decode_address_ax25(ax25Frame.substring(0, 7), isLast, false);
String src_addr = decode_address_ax25(ax25Frame.substring(7, 14), isLast, false);
@ -124,6 +132,10 @@ String decode_kiss(const String& kissFormattedFrame) {
}
TNC2Frame += ':';
TNC2Frame += ax25Frame.substring(digi_info_index + 2);
} else {
// command frame, currently ignored
TNC2Frame += inputKISSTNCFrame;
}
}
return TNC2Frame;
@ -193,6 +205,11 @@ String decode_address_ax25(const String &ax25Address, bool &isLast, bool isRelay
return TNCAddress;
}
bool validateTNC2Frame(const String &tnc2FormattedFrame) { return (tnc2FormattedFrame.indexOf(':') != -1) && (tnc2FormattedFrame.indexOf('>') != -1); }
bool validateTNC2Frame(const String &tnc2FormattedFrame) {
return (tnc2FormattedFrame.indexOf(':') != -1) && (tnc2FormattedFrame.indexOf('>') != -1);
}
bool validateKISSFrame(const String &kissFormattedFrame) { return kissFormattedFrame.charAt(0) == (char)FEND && kissFormattedFrame.charAt(kissFormattedFrame.length() - 1) == (char)FEND; }
bool validateKISSFrame(const String &kissFormattedFrame) {
return kissFormattedFrame.charAt(0) == (char) FEND &&
kissFormattedFrame.charAt(kissFormattedFrame.length() - 1) == (char) FEND;
}

View File

@ -8,6 +8,6 @@
#define IS_LAST_ADDRESS_POSITION_MASK 0b1
String encode_kiss(const String& tnc2FormattedFrame);
String decode_kiss(const String& kissFormattedFrame);
String decode_kiss(const String &inputKISSTNCFrame, bool &dataFrame);
String encapsulateKISS(const String &ax25Frame, uint8_t TNCCmd);

View File

@ -33,8 +33,10 @@ void handleKISSData(char character, int bufferIndex) {
}
inTNCData->concat(character);
if (character == (char) FEND && inTNCData->length() > 3) {
const String &TNC2DataFrame = decode_kiss(*inTNCData);
bool isDataFrame = false;
const String &TNC2DataFrame = decode_kiss(*inTNCData, isDataFrame);
if (isDataFrame) {
#ifdef LOCAL_KISS_ECHO
Serial.print(inTNCData);
#ifdef ENABLE_BLUETOOTH
@ -56,6 +58,7 @@ void handleKISSData(char character, int bufferIndex) {
if (xQueueSend(tncToSendQueue, &buffer, (1000 / portTICK_PERIOD_MS)) != pdPASS) {
delete buffer;
}
}
inTNCData->clear();
}
if (inTNCData->length() > 255){