|
|
|
@ -33,51 +33,31 @@ String decapsulateKISS(const String &frame); |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
String encode_kiss(const String &tnc2FormattedFrame)
|
|
|
|
|
{ |
|
|
|
|
String encode_kiss(const String &tnc2FormattedFrame) { |
|
|
|
|
String ax25Frame = ""; |
|
|
|
|
char control_id = 0x03; |
|
|
|
|
|
|
|
|
|
if (validateTNC2Frame(tnc2FormattedFrame)) { |
|
|
|
|
String address = ""; |
|
|
|
|
bool dst_addres_written = false; |
|
|
|
|
for (int p = 0; p <= tnc2FormattedFrame.indexOf(':'); p++)
|
|
|
|
|
{ |
|
|
|
|
for (int p = 0; p <= tnc2FormattedFrame.indexOf(':'); p++) { |
|
|
|
|
char currentChar = tnc2FormattedFrame.charAt(p); |
|
|
|
|
if (currentChar == ':' || currentChar == '>' || currentChar == ',')
|
|
|
|
|
{ |
|
|
|
|
if (!dst_addres_written && (currentChar == ',' || currentChar == ':'))
|
|
|
|
|
{ |
|
|
|
|
if (currentChar == ':' || currentChar == '>' || currentChar == ',') { |
|
|
|
|
if (!dst_addres_written && (currentChar == ',' || currentChar == ':')) { |
|
|
|
|
// ax25 frame DST SRC
|
|
|
|
|
// tnc2 frame SRC DST
|
|
|
|
|
ax25Frame = encode_address_ax25(address) + ax25Frame; |
|
|
|
|
dst_addres_written = true; |
|
|
|
|
} |
|
|
|
|
else
|
|
|
|
|
{ |
|
|
|
|
} else { |
|
|
|
|
ax25Frame += encode_address_ax25(address); |
|
|
|
|
} |
|
|
|
|
address = ""; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
} else { |
|
|
|
|
address += currentChar; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//Parse APRS CONTROL ID
|
|
|
|
|
if (tnc2FormattedFrame.lastIndexOf("SABM") > 1) { control_id = 0x2f; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("DISC") > 1) { control_id = 0x43; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("DM") > 1) { control_id = 0x0f; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("UA") > 1) { control_id = 0x63; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("FRMR") > 1) { control_id = 0x87; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("XID") > 1) { control_id = 0xaf; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("TEST") > 1) { control_id = 0xe3; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("RR") > 1) { control_id = 0x01; } |
|
|
|
|
else if (tnc2FormattedFrame.lastIndexOf("II") > 1) { control_id = 0xf0; } |
|
|
|
|
else { control_id = 0x03; } |
|
|
|
|
//END
|
|
|
|
|
auto lastAddressChar = (uint8_t) ax25Frame.charAt(ax25Frame.length() - 1); |
|
|
|
|
ax25Frame.setCharAt(ax25Frame.length() - 1, (char) (lastAddressChar | IS_LAST_ADDRESS_POSITION_MASK)); |
|
|
|
|
ax25Frame += (char) control_id; |
|
|
|
|
ax25Frame += (char) APRS_CONTROL_FIELD; |
|
|
|
|
ax25Frame += (char) APRS_INFORMATION_FIELD; |
|
|
|
|
ax25Frame += tnc2FormattedFrame.substring(tnc2FormattedFrame.indexOf(':') + 1); |
|
|
|
|
} |
|
|
|
@ -86,6 +66,15 @@ String encode_kiss(const String &tnc2FormattedFrame) |
|
|
|
|
return kissFrame; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//HACK for working Packet mode
|
|
|
|
|
String encode_kiss_pkt(const String &tnc2FormattedFrame)
|
|
|
|
|
{ |
|
|
|
|
String TNC2Frame = ""; |
|
|
|
|
String ax25Frame = encapsulateKISS(tnc2FormattedFrame, CMD_DATA); |
|
|
|
|
TNC2Frame += ax25Frame; |
|
|
|
|
return TNC2Frame; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String encapsulateKISS(const String &ax25Frame, uint8_t TNCCmd)
|
|
|
|
|
{ |
|
|
|
|
String kissFrame = ""; |
|
|
|
@ -149,20 +138,7 @@ String decapsulateKISS(const String &frame) |
|
|
|
|
*/ |
|
|
|
|
String decode_kiss(const String &inputKISSTNCFrame, bool &dataFrame) { |
|
|
|
|
String TNC2Frame = ""; |
|
|
|
|
String control_f = ""; |
|
|
|
|
//UI-FRAMES
|
|
|
|
|
bool ui_sabm = false; |
|
|
|
|
bool ui_disc = false; |
|
|
|
|
bool ui_dm = false; |
|
|
|
|
bool ui_ua = false;
|
|
|
|
|
bool ui_frmr = false; |
|
|
|
|
bool ui_xid = false;
|
|
|
|
|
bool ui_test = false; |
|
|
|
|
//S-FRAMES
|
|
|
|
|
bool us_rr = false; |
|
|
|
|
//I-Frame
|
|
|
|
|
bool ui_i = false; |
|
|
|
|
//END FRAMES
|
|
|
|
|
|
|
|
|
|
if (validateKISSFrame(inputKISSTNCFrame)) { |
|
|
|
|
dataFrame = inputKISSTNCFrame.charAt(1) == CMD_DATA; |
|
|
|
|
if (dataFrame){ |
|
|
|
@ -177,43 +153,24 @@ String decode_kiss(const String &inputKISSTNCFrame, bool &dataFrame) { |
|
|
|
|
TNC2Frame += ',' + digi_addr; |
|
|
|
|
digi_info_index += 7; |
|
|
|
|
} |
|
|
|
|
//parse for conrol frame
|
|
|
|
|
for (int i = 16; i < inputKISSTNCFrame.length() - 1; ++i)
|
|
|
|
|
{ |
|
|
|
|
ui_sabm = inputKISSTNCFrame.charAt(i) == U_SABM; |
|
|
|
|
ui_disc = inputKISSTNCFrame.charAt(i) == U_DISC; |
|
|
|
|
ui_dm = inputKISSTNCFrame.charAt(i) == U_DM; |
|
|
|
|
ui_ua = inputKISSTNCFrame.charAt(i) == U_UA; |
|
|
|
|
ui_frmr = inputKISSTNCFrame.charAt(i) == U_FRMR; |
|
|
|
|
ui_xid = inputKISSTNCFrame.charAt(i) == U_XID; |
|
|
|
|
ui_test = inputKISSTNCFrame.charAt(i) == U_TEST; |
|
|
|
|
//S-Frame TEST
|
|
|
|
|
us_rr = inputKISSTNCFrame.charAt(i) == S_RR; |
|
|
|
|
//I-Frame TEST
|
|
|
|
|
ui_i = inputKISSTNCFrame.charAt(i) == I_I; |
|
|
|
|
} |
|
|
|
|
if (ui_sabm) { control_f = "<SABM>"; } |
|
|
|
|
else if (ui_disc) { control_f = "<DISC>"; } |
|
|
|
|
else if (ui_dm) { control_f = "<DM>"; } |
|
|
|
|
else if (ui_ua) { control_f = "<UA>"; } |
|
|
|
|
else if (ui_frmr) { control_f = "<FRMR>"; } |
|
|
|
|
else if (ui_xid) { control_f = "<XID>"; } |
|
|
|
|
else if (ui_test) { control_f = "<TEST>"; } |
|
|
|
|
else if (us_rr) { control_f = "<RR>"; } |
|
|
|
|
else if (ui_i) { control_f = "<II>"; } |
|
|
|
|
else { control_f = ' '; } |
|
|
|
|
//control frames
|
|
|
|
|
TNC2Frame += ':'; |
|
|
|
|
TNC2Frame += control_f; |
|
|
|
|
//END
|
|
|
|
|
TNC2Frame += ax25Frame.substring(digi_info_index + 2); |
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ |
|
|
|
|
} else { |
|
|
|
|
// command frame, currently ignored
|
|
|
|
|
TNC2Frame += inputKISSTNCFrame; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return TNC2Frame; |
|
|
|
|
} |
|
|
|
|
//HACK for PACKEt MODE
|
|
|
|
|
String decode_kiss_pkt(const String &inputKISSTNCFrame, bool &dataFrame) { |
|
|
|
|
String TNC2Frame = ""; |
|
|
|
|
dataFrame = inputKISSTNCFrame.charAt(1) == CMD_DATA; |
|
|
|
|
if (dataFrame){ |
|
|
|
|
String ax25Frame = decapsulateKISS(inputKISSTNCFrame); |
|
|
|
|
TNC2Frame += ax25Frame; |
|
|
|
|
} |
|
|
|
|
return TNC2Frame; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|