|
|
|
@ -70,8 +70,8 @@ uint16_t KissClass::EncodeFrame(struct aprs_frame *aprsframe, struct ax25_frame |
|
|
|
|
digi_cnt = 1; // Start at position 1 as position 0 contains destination (which we already encoded)
|
|
|
|
|
while (aprsframe->number_of_digipeaters-- != 0) { |
|
|
|
|
|
|
|
|
|
while (cnt < 7) { |
|
|
|
|
encoded_call = EncodeCall(aprsframe->digis[digi_cnt]);
|
|
|
|
|
while (cnt < 7) { |
|
|
|
|
ax25frame->complete[position] = *(encoded_call+cnt); |
|
|
|
|
////printf("0x%X ", *(encoded_call+cnt));
|
|
|
|
|
//printf("0x%X ", ax25frame->complete[position]);
|
|
|
|
@ -101,21 +101,88 @@ uint16_t KissClass::EncodeFrame(struct aprs_frame *aprsframe, struct ax25_frame |
|
|
|
|
cnt++; |
|
|
|
|
position++; |
|
|
|
|
} |
|
|
|
|
printf( "\n"); |
|
|
|
|
//printf( "\n");
|
|
|
|
|
|
|
|
|
|
// Store length of AX25 frame
|
|
|
|
|
ax25frame->lenght = position; |
|
|
|
|
|
|
|
|
|
/*cnt=0;
|
|
|
|
|
while (ax25frame->lenght-- != 0) |
|
|
|
|
// Encapsulate AX.25 frame in KISS frame (including escaping FEND codes)
|
|
|
|
|
putchar(FEND); |
|
|
|
|
putchar(CMD_DATA); |
|
|
|
|
cnt=0; |
|
|
|
|
position=ax25frame->lenght; |
|
|
|
|
while (position-- != 0) |
|
|
|
|
{ |
|
|
|
|
printf("0x%X ", ax25frame->complete[cnt]); |
|
|
|
|
// Escape FESC and TFEND
|
|
|
|
|
if (ax25frame->complete[cnt] == FEND) { |
|
|
|
|
putchar(FESC); |
|
|
|
|
putchar(TFEND); |
|
|
|
|
} else if (ax25frame->complete[cnt] == FESC) { |
|
|
|
|
putchar(FESC); |
|
|
|
|
putchar(TFESC); |
|
|
|
|
} else { |
|
|
|
|
putchar(ax25frame->complete[cnt]); |
|
|
|
|
} |
|
|
|
|
cnt++; |
|
|
|
|
} |
|
|
|
|
printf("\n"); |
|
|
|
|
putchar(FEND); |
|
|
|
|
//printf("\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Decodes a KISS frame from the usb serial port |
|
|
|
|
*
|
|
|
|
|
* Input : string starting with FEND and ending with FEND |
|
|
|
|
* Output: ax25frame->decoded_kiss_frame terminated with NULL |
|
|
|
|
* Return: 0 = OK, 1 = ERROR, 2 = EXIT KISS MODE |
|
|
|
|
*/ |
|
|
|
|
uint16_t KissClass::DecodeFrame(uint8_t string[], struct ax25_frame *ax25frame) |
|
|
|
|
{ |
|
|
|
|
uint16_t position =0 ; |
|
|
|
|
uint16_t cnt =0 ; |
|
|
|
|
|
|
|
|
|
// Not a valid frame
|
|
|
|
|
if (string[position] != FEND) |
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
position++; |
|
|
|
|
|
|
|
|
|
// Is data frame: we de-escape the string and put it back in the same string with a NULL at the end as terminator.
|
|
|
|
|
if (string[position] == CMD_DATA) |
|
|
|
|
{ |
|
|
|
|
position++; |
|
|
|
|
while (string[position] != FEND) |
|
|
|
|
{ |
|
|
|
|
// De-escape codes
|
|
|
|
|
if (string[position] == FESC && string[position+1] == TFEND) |
|
|
|
|
{ |
|
|
|
|
string[cnt] = FEND; |
|
|
|
|
position++; |
|
|
|
|
} |
|
|
|
|
else if (string[position] == FESC && string[position+1] == TFESC) |
|
|
|
|
{ |
|
|
|
|
string[cnt] = FESC; |
|
|
|
|
position++; |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
string[cnt] = string[position]; |
|
|
|
|
} |
|
|
|
|
cnt++; |
|
|
|
|
position++; |
|
|
|
|
} |
|
|
|
|
string[cnt] = 0; //Terminate string
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// Is command to exit KISS MODE
|
|
|
|
|
else if (string[position] == CMD_EXIT_KISS) { |
|
|
|
|
return 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If we are here we have a valid AX.25 frame in 'string' which is decapsulated from its KISS frame
|
|
|
|
|
|
|
|
|
|
//fwrite(ax25frame->complete, 1, ax25frame->lenght, stdout);
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -137,11 +204,13 @@ uint8_t * KissClass::EncodeCall(uint8_t string[]) |
|
|
|
|
// extract call
|
|
|
|
|
while( string[position] != 0 || cnt < 6) |
|
|
|
|
{ |
|
|
|
|
call[cnt++] = string[position] << 1; |
|
|
|
|
if ( string[position] == '-') { |
|
|
|
|
position++; |
|
|
|
|
break; |
|
|
|
|
} else { |
|
|
|
|
call[cnt] = string[position] << 1;
|
|
|
|
|
} |
|
|
|
|
cnt++; |
|
|
|
|
position++; |
|
|
|
|
} |
|
|
|
|
// pad with spaces to a length of 6
|
|
|
|
|