TNC: recognize and ignore non data frames
This commit is contained in:
parent
c0eb892a7c
commit
6cd887f91a
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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){
|
||||
|
|
|
|||
Loading…
Reference in New Issue