Making acarsdec work again. - acarsdec - an ACARS decoder
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit ceb8470d0ef87be8950b8be6dd222a485e6ce7cf
 (DIR) parent 79279b1c9882cd7a42f4dff6e518b085c3607d7b
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sat, 27 Oct 2012 00:46:01 +0200
       
       Making acarsdec work again.
       
       Diffstat:
         acarsdec.h                          |       4 ++--
         getmesg.c                           |      29 +++++++++++++++--------------
         input.c                             |      40 ++++++++++++++++---------------
         main.c                              |      37 +++++++++++++++----------------
       
       4 files changed, 56 insertions(+), 54 deletions(-)
       ---
 (DIR) diff --git a/acarsdec.h b/acarsdec.h
       @@ -18,7 +18,7 @@ extern void resetbits(int ch);
        extern int getbit(short in, unsigned char *outbits, int ch);
        
        extern void init_mesg(void);
       -extern int getmesg(unsigned char r, msg_t * msg, int ch);
       +extern int getmesg(unsigned char r, msg_t *msg, int ch);
        
        extern int init_serv(short port);
        extern int send_mesg(msg_t *msg);
       @@ -29,7 +29,7 @@ enum {
                IN_FILE = 0,
                IN_ALSA = 1,
                IN_STDIN = 2,
       -        
       +
                OUT_NET = 0x01,
                OUT_PRINT = 0x02,
                OUT_PROTO = 0x04,
 (DIR) diff --git a/getmesg.c b/getmesg.c
       @@ -58,7 +58,7 @@ static void update_crc(unsigned short *crc, unsigned char ch)
                }
        }
        
       -static int build_mesg(char *txt, int len, msg_t * msg)
       +static int build_mesg(char *txt, int len, msg_t *msg)
        {
                int i, k;
                char r;
       @@ -66,18 +66,8 @@ static int build_mesg(char *txt, int len, msg_t * msg)
                /* remove special chars */
                for (i = 0; i < len; i++) {
                        r = txt[i];
       -                switch(r) {
       -                case 0x0d:
       -                        r = 176;
       -                        break;
       -                case 0x0a:
       -                        r = 178;
       -                        break;
       -                default:
       -                        if (r < ' ')
       -                                r = 0xa4;
       -                        break;
       -                };
       +                if (r < ' ' && r != 0x0d && r != 0x0a)
       +                        r = ' ';
                        txt[i] = r;
                }
                txt[i] = '\0';
       @@ -127,12 +117,23 @@ void init_mesg(void)
                mstat[0].state = mstat[1].state = HEADL;
        }
        
       -int getmesg(unsigned char r, msg_t * msg, int ch)
       +void
       +print_mstat(struct mstat_s *mstat)
       +{
       +        if(mstat->state > 0) {
       +                fprintf(stderr, "mstat: state = %d; ind = %d; crc = %.4x\n",
       +                                mstat->state, mstat->ind, mstat->crc);
       +        }
       +}
       +
       +int getmesg(unsigned char r, msg_t *msg, int ch)
        {
                struct mstat_s *st;
        
                st = &(mstat[ch]);
        
       +        //print_mstat(st);
       +
                do {
                        switch (st->state) {
                        case HEADL:
 (DIR) diff --git a/input.c b/input.c
       @@ -33,21 +33,21 @@ static int initstdin(void)
        {
                SF_INFO infwav;
        
       -/* open wav input file */
                infwav.format = 0;
                inwav = sf_open_fd(STDIN_FILENO, SFM_READ, &infwav, SF_TRUE);
                if (inwav == NULL) {
                        fprintf(stderr, "could not open stdin\n");
       -                return (0);
       +                return 0;
                }
                if (infwav.samplerate != 48000) {
                        fprintf(stderr,
                                "Bad Input File sample rate: %d. Must be 48000\n",
                                infwav.samplerate);
       -                return (0);
       +                return 0;
                }
       -        nbch=infwav.channels;
       -        return (infwav.channels);
       +        nbch = infwav.channels;
       +
       +        return infwav.channels;
        }
        
        static SNDFILE *inwav;
       @@ -55,21 +55,22 @@ static int initsnd(char *filename)
        {
                SF_INFO infwav;
        
       -/* open wav input file */
       +        /* open wav input file */
                infwav.format = 0;
                inwav = sf_open(filename, SFM_READ, &infwav);
                if (inwav == NULL) {
                        fprintf(stderr, "could not open %s\n", filename);
       -                return (0);
       +                return 0;
                }
                if (infwav.samplerate != 48000) {
                        fprintf(stderr,
                                "Bad Input File sample rate: %d. Must be 48000\n",
                                infwav.samplerate);
       -                return (0);
       +                return 0;
                }
       -        nbch=infwav.channels;
       -        return (infwav.channels);
       +        nbch = infwav.channels;
       +
       +        return infwav.channels;
        }
        
        static snd_pcm_t *capture_handle;
       @@ -117,20 +118,21 @@ static int initalsa(char *filename)
                        return 0;
                }
        
       -        if ((err =
       -             snd_pcm_hw_params_set_rate(capture_handle, hw_params, 48000,
       +        if ((err = snd_pcm_hw_params_set_rate(capture_handle, hw_params, 48000,
                                                0)) < 0) {
                        fprintf(stderr, "cannot set sample rate (%s)\n",
                                snd_strerror(err));
                        return 0;
                }
        
       -        for(nbch=2;nbch>0;nbch--)  {
       -                if (snd_pcm_hw_params_set_channels(capture_handle, hw_params, nbch)==0)        
       +        for(nbch = 2; nbch > 0; nbch--)  {
       +                if (snd_pcm_hw_params_set_channels(capture_handle,
       +                                        hw_params, nbch) == 0) {
                                break;
       +                }
                }
        
       -        if (nbch ==0) {
       +        if (nbch == 0) {
                        fprintf(stderr, "cannot set number of channels\n");
                        return 0;
                }
       @@ -173,20 +175,20 @@ int getsample(short *sample, int nb)
        
                switch(source) {
                case IN_STDIN:
       -                r = sf_read_short(inwav, sample, nb);
       +                r = sf_read_short(inwav, sample, nb / nbch);
                        break;
                case IN_FILE:
       -                r = sf_read_short(inwav, sample, nb);
       +                r = sf_read_short(inwav, sample, nb / nbch);
                        if (r == 0)
                                r = -1;        /* this is the end */
                        break;
                case IN_ALSA:
       -                r = snd_pcm_readi(capture_handle, sample, nb/nbch);
       +                r = snd_pcm_readi(capture_handle, sample, nb / nbch);
                        if (r <= 0)
                                fprintf(stderr,
                                        "cannot read from interface (%s)\n",
                                        snd_strerror(r));
       -                r=r*nbch;
       +                r = r * nbch;
                        break;
                }
                return r;
 (DIR) diff --git a/main.c b/main.c
       @@ -56,9 +56,9 @@ static void usage(void)
                                "input alsapcmdevice (ie: hw:0,0)\n");
                fprintf(stderr, " -t :\t\t\tread from stdin.\n");
                fprintf(stderr, " [-v] :\t\t\tbe verbose.\n");
       -        fprintf(stderr, " [-c] :\t\t\tcolorfull output.\n");
       +        fprintf(stderr, " [-c] :\t\t\tcolorful output.\n");
                fprintf(stderr, " [-p] :\t\t\toutput should be parseable protocol.\n");
       -        fprintf(stderr, " [-e] :\t\t\tdo debug?\n");
       +        fprintf(stderr, " [-e] :\t\t\tturn on debugging\n");
                fprintf(stderr, " [-LR] :\t\tdisable left or right channel "
                                "decoding of stereo signal\n");
                fprintf(stderr, " [-s noport ] :\t\tact as an APRS local server, "
       @@ -70,23 +70,23 @@ static void usage(void)
                exit(1);
        }
        
       -void print_mesg(msg_t * msg, int colored, int messgnumb)
       +void print_mesg(msg_t *msg, int colored, int messgnumb)
        {
                time_t t;
                struct tm *tmp;
                char pos[128];
        
                if (colored) {
       -                printf("ACARS mode: %s%c%s", RED,msg->mode,NONE);
       +                printf("ACARS mode: %s%c%s", RED, msg->mode, NONE);
                        printf(" Aircraft reg: %s%s%s\n", GREEN,msg->addr,NONE);
       -                printf("Message label: %s%s%s", CYAN,msg->label,NONE);
       -                printf(" Block id: %s%d%s", RED,(int) msg->bid,NONE);
       -                printf(" Msg. no: %s%s%s\n", BLUE,msg->no,NONE);
       -                printf("Flight id: %s%s%s\n", MAGENTA,msg->fid,NONE);
       -                printf("Message content:-\n%s%s%s", YELLOW,msg->txt,NONE);
       +                printf("Message label: %s%s%s", CYAN, msg->label, NONE);
       +                printf(" Block id: %s%d%s", RED, (int)msg->bid, NONE);
       +                printf(" Msg. no: %s%s%s\n", BLUE, msg->no, NONE);
       +                printf("Flight id: %s%s%s\n", MAGENTA, msg->fid, NONE);
       +                printf("Message content:-\n%s%s%s", YELLOW, msg->txt, NONE);
                        if (posconv(msg->txt, msg->label, pos)==0) {
                                printf("\n%sAPRS : Addr:%s Fid:%s Lbl:%s pos:%s%s\n",
       -                                RED,msg->addr, msg->fid, msg->label, pos,NONE);
       +                                RED, msg->addr, msg->fid, msg->label, pos, NONE);
                        }
                } else {
                        printf("ACARS mode: %c", msg->mode);
       @@ -114,7 +114,7 @@ void print_mesg(msg_t * msg, int colored, int messgnumb)
                fflush(stdout);
        }
        
       -void print_proto(msg_t * msg)
       +void print_proto(msg_t *msg)
        {
                time_t t;
                struct tm *tmp;
       @@ -129,7 +129,8 @@ void print_proto(msg_t * msg)
                printf("MSGNO: %s\n", msg->no);
                printf("FLIGHTID: %s\n", msg->fid);
                printf("CONTENT: %s\n.\n", msg->txt);
       -            if (posconv(msg->txt, msg->label, pos)==0) {
       +
       +        if (posconv(msg->txt, msg->label, pos)==0) {
                        printf("APRS-ADDR: %s\n", msg->addr);
                        printf("APRS-FID: %s\n", msg->fid);
                        printf("APRS-LABEL: %s\n", msg->label);
       @@ -162,10 +163,10 @@ int main(int argc, char **argv)
                msg_t msg[2];
                int nbit[2] = {0, 0};
                int nrbit[2] = {8, 8};
       -        int nbch=0;
       +        int nbch = 0;
                int esel[2] = {1, 1};
       -        short port=0;
       -        int debug=0;
       +        short port = 0;
       +        int debug = 0;
                int output = 0;
                int i;
                int colored = 0;
       @@ -239,8 +240,6 @@ int main(int argc, char **argv)
                        int ind, len;
        
                        len = getsample(sample, 4096);
       -                if (debug)
       -                        fprintf(stderr, "Got sample: %d\n", len);
                        if (len <= 0)
                                break;
        
       @@ -248,10 +247,10 @@ int main(int argc, char **argv)
                                for (i = 0; i < nbch; i++, ind++) {
                                        if (esel[i]) {
                                                nbit[i] += getbit(sample[ind], &r[i],
       -                                                        0);
       +                                                        (i? 1 : 0));
                                                if (nbit[i] >= nrbit[i]) {
                                                        nrbit[i] = getmesg(r[i],
       -                                                               &msg[i], 0);
       +                                                               &msg[i], (i? 1 : 0));
                                                        nbit[i] = 0;
                                                        if (nrbit[i] == 0) {
                                                                do_output(output,