acarsdec

an ACARS decoder
git clone git://r-36.net/acarsdec
Log | Files | Refs | README

commit ceb8470d0ef87be8950b8be6dd222a485e6ce7cf
parent 79279b1c9882cd7a42f4dff6e518b085c3607d7b
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(-)

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, 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: 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; 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,