/* input gw10 raw message ------------------------------------------------------ * input next gw10 raw message from stream * args : raw_t *raw IO receiver raw data control struct * unsigned char data I stream data (1 byte) * return : status (-1: error message, 0: no message, 1: input observation data, * 2: input ephemeris, 3: input sbas message, * 9: input ion/utc parameter) * * notes : to specify input options, set raw->opt to the following option * strings separated by spaces. * * -EPHALL : input all ephemerides * *-----------------------------------------------------------------------------*/ extern int input_gw10(raw_t *raw, unsigned char data) { int stat; trace(5,"input_gw10: data=%02x\n",data); raw->buff[raw->nbyte++]=data; /* synchronize frame */ if (raw->buff[0]!=GW10SYNC) { raw->nbyte=0; return 0; } if (raw->nbyte>=2&&!(raw->len=msglen(raw->buff[1]))) { raw->nbyte=0; return 0; } if (raw->nbyte<2||raw->nbyte<raw->len) return 0; if (!chksum(raw->buff,raw->len)) { tracet(2,"gw10 message checksum error msg=%d\n",raw->buff[1]); raw->buff[0]=0; raw->nbyte=0; return -1; } /* decode gw10 raw message */ stat=decode_gw10(raw); raw->buff[0]=0; raw->nbyte=0; return stat; }
static void decompress(uint8_t *p, uint16_t m) { uint8_t d; uint16_t l; /* Walk the table skipping messages */ if (m == 0) return; while(--m) { p = msglen(p, &l); p += l - 1; } p = msglen(p, &l); /* A 1 byte message means its 0 text chars long */ while(--l) { d = getb(p++); if (d < 3) return; if (d < 0x5E) print_char(d + 0x1d); else decompress(worddict - 1, d - 0x5d); } }