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;
}
Esempio n. 2
0
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;
    }
}