boolean MicroAPRS::decode_posit(char *packet, char **pcall, char *ptype, char **pposit, long *plon, long *plat, char **pcomment, char **pmsgTo, char **pmsg, char *pmsgID) { char *callsignBegin = packet+5; *callsignBegin++ = 0; char *callsignEnd = strchr(callsignBegin, ']'); if (callsignEnd == NULL || callsignEnd-callsignBegin > 16) return false; *callsignEnd = 0; char *call = callsignBegin; char *destination = callsignEnd+8; char *payload_begin = strchr(destination, ':')+1; if (payload_begin == NULL) return false; *payload_begin++ = 0; // Type is !, =, @, /, ', `. // We only decode positions. char type = *payload_begin; payload_begin++; *pcall = call; *ptype = type; char *posit = payload_begin; { if (type == '/' || type == '@') { // no compression, but starts with time // advanced past type and fall through to pretend '/' and '@' are just '!' // advance past "195537h" or '052139z' posit += 6; // call N5CV packet type / 3721.40N/12204.64W posit++; posit[19] = 0; type = '!'; } if (type == '`' || type == '\'') { // MIC-E compression char *positEnd = posit+8; if (posit[12] == '}'){ positEnd = posit+13; } char *comment = positEnd++; //*positEnd++ = 0; *pcomment = comment; if (! decode_mic_e(destination, posit, plat, plon)) return false; } else if (type == ':') { //Message char *msgToEnd = strchr(payload_begin, ':'); *msgToEnd++ = 0; char *msgTo = payload_begin; char *msgEnd = strchr(msgToEnd, '{'); char *msg = msgToEnd++; *msgEnd++ = 0; char msgID = *msgEnd++; *pmsgTo = msgTo; *pmsg = msg; *pmsgID = msgID; } else if (type == '!' || type == '=') { // No compression or base91 compression // call KC6SSM-5 packet type ! 3754.15NI12216.92W& // call N6MON-9 packet type ! 3741.84N/12202.85W // call KC6SSM-9 packet type ! 3739.29N/12205.34W> // either !/ or !\ and 12 more characters // or ![0-9] and 17 more characters // if there is a space that terminates it // otherwise terminate at 18 chars or eol, whichever is first // terminated by space or EOL (length "3741.84N/12202.85W") char sym1 = *posit; char sym2 = ' '; char *positEnd = strchr(posit, ' '); char *comment = positEnd+1; //*positEnd++ = 0; *pcomment = comment; if (sym1 == '/' || sym1 == '\\') { // Base91 Compressed posit[13] = 0; decode91(posit, plat, plon, &sym2); } else if (posit[1] >= '0' && posit[1] <= '9') { posit[18] = 0; decode_latlon(posit, plat, plon, &sym2); } else { return false; } } else if (type == '>' ) { // Check for status type // Everything after > is a comment // e.g. >SVTrackR v1.0 5.24V S:9 B:0.51 U:21.32 Seq:70 char *comment = posit; *pcomment = comment; } else { return false; } } *pposit = posit; return true; }
void conversor(char opt1, char opt2, char *a_entrada, char *a_saida){ switch (opt1) { // Ajuda. case 'h': printf("%s", help); break; // Codificar. case '1': case 'e': switch (opt2) { // Base 62. case '2': encode62(a_entrada, a_saida); printf("\nCodificado com Sucesso!\n\n"); break; // Base 64. case '4': encode64(a_entrada, a_saida); printf("\nCodificado com Sucesso!\n\n"); break; // Base 85. case '5': encode85(a_entrada, a_saida); printf("\nCodificado com Sucesso!\n\n"); break; // Base 91. case '1': encode91(a_entrada, a_saida); printf("\nCodificado com Sucesso!\n\n"); break; default: printf("%s", err[1]); break; } break; // Decodificar. case '2': case 'd': switch (opt2) { // Base 62. case '2': decode62(a_entrada, a_saida); printf("\nDecodificado com sucesso!\n\n"); break; // Base 64. case '4': decode64(a_entrada, a_saida); printf("\nDecodificado com sucesso!\n\n"); break; // Base 85. case '5': decode85(a_entrada, a_saida); printf("\nDecodificado com sucesso!\n\n"); break; // Base 91. case '1': decode91(a_entrada, a_saida); printf("\nDecodificado com sucesso!\n\n"); break; default: printf("%s", err[1]); break; } break; default: printf("%s", err[0]); break; } }