int conf_out(ui8_t *conf_bits) { int conf_id; int ret = 0; conf_id = bits2val(conf_bits, 4); if (conf_id == 6) { gpx.sonde_id = bits2val(conf_bits+4, 4*6); } return ret; }
void print_frame() { int i; int nib = 0; int frid = -1; manchester1(frame_rawbits, frame_bits); deinterleave(frame_bits+CONF, 7, hamming_conf); deinterleave(frame_bits+DAT1, 13, hamming_dat1); deinterleave(frame_bits+DAT2, 13, hamming_dat2); hamming(hamming_conf, 7, block_conf); hamming(hamming_dat1, 13, block_dat1); hamming(hamming_dat2, 13, block_dat2); if (option_raw == 1) { for (i = 0; i < 7; i++) { nib = bits2val(block_conf+S*i, S); printf("%01X", nib & 0xFF); } printf(" "); for (i = 0; i < 13; i++) { nib = bits2val(block_dat1+S*i, S); printf("%01X", nib & 0xFF); } printf(" "); for (i = 0; i < 13; i++) { nib = bits2val(block_dat2+S*i, S); printf("%01X", nib & 0xFF); } printf("\n"); } else { conf_out(block_conf); frid = dat_out(block_dat1); if (frid == 8) print_gpx(); frid = dat_out(block_dat2); if (frid == 8) print_gpx(); } }
int dat_out(ui8_t *dat_bits) { int i, ret = 0; static int fr_id; // int jahr = 0, monat = 0, tag = 0, std = 0, min = 0; int frnr = 0; int msek = 0; int lat = 0, lon = 0, height = 0; int nib; int dvv; // signed/unsigned 16bit fr_id = bits2val(dat_bits+48, 4); if (fr_id >= 0 && fr_id <= 8) { for (i = 0; i < 13; i++) { nib = bits2val(dat_bits+4*i, 4); dat_str[fr_id][i] = nib2chr(nib); } dat_str[fr_id][13] = '\0'; } if (fr_id == 0) { start = 1; frnr = bits2val(dat_bits+24, 8); gpx.frnr = frnr; } if (fr_id == 1) { // 00..31: ? GPS-Sats in Sicht? msek = bits2val(dat_bits+32, 16); gpx.sek = msek/1000.0; } if (fr_id == 2) { lat = bits2val(dat_bits, 32); gpx.lat = lat/1e7; dvv = (short)bits2val(dat_bits+32, 16); // (short)? zusammen mit dir sollte unsigned sein gpx.horiV = dvv/1e2; } if (fr_id == 3) { lon = bits2val(dat_bits, 32); gpx.lon = lon/1e7; dvv = bits2val(dat_bits+32, 16) & 0xFFFF; // unsigned gpx.dir = dvv/1e2; } if (fr_id == 4) { height = bits2val(dat_bits, 32); gpx.h = height/1e2; dvv = (short)bits2val(dat_bits+32, 16); // signed gpx.vertV = dvv/1e2; } if (fr_id == 5) { } if (fr_id == 6) { } if (fr_id == 7) { } if (fr_id == 8) { gpx.jahr = bits2val(dat_bits, 12); gpx.monat = bits2val(dat_bits+12, 4); gpx.tag = bits2val(dat_bits+16, 5); gpx.std = bits2val(dat_bits+21, 5); gpx.min = bits2val(dat_bits+26, 6); } ret = fr_id; return ret; }
int main(int argc, char **argv) { FILE *fp; char *fpname; int i, j; int bit_count = 0, header_found = 0, bit, len; int counter; ui32_t val; ui32_t dat2; int lat, lat1, lat2, lon, lon1, lon2, alt, alt1, alt2; int latdeg,londeg; double latmin, lonmin; ui32_t t1, t2, ms, min, std, tt, mm, jj; #ifdef CYGWIN _setmode(fileno(stdin), _O_BINARY); // _setmode(_fileno(stdin), _O_BINARY); #endif setbuf(stdout, NULL); fpname = argv[0]; ++argv; while ((*argv) && (!wavloaded)) { if ( (strcmp(*argv, "-h") == 0) || (strcmp(*argv, "--help") == 0) ) { help_out: fprintf(stderr, "%s <-n> [options] audio.wav\n", fpname); fprintf(stderr, " n=1,2\n"); fprintf(stderr, " options:\n"); //fprintf(stderr, " -v, --verbose\n"); fprintf(stderr, " -r, --raw\n"); return 0; } else if ( (strcmp(*argv, "-r") == 0) || (strcmp(*argv, "--raw") == 0) ) { option_raw = 1; } else if (strcmp(*argv, "--res") == 0) { option_res = 1; } else if ( (strcmp(*argv, "-i") == 0) || (strcmp(*argv, "--invert") == 0) ) { option_inv = 1; // nicht noetig } else if ( (strcmp(*argv, "-2") == 0) ) { option2 = 1; } else if ( (strcmp(*argv, "-1") == 0) ) { option1 = 1; } else if (strcmp(*argv, "--ecc") == 0) { option_ecc = 1; } else if ( (strcmp(*argv, "-v") == 0) ) { option_verbose = 1; } else { if ((option1 == 1 && option2 == 1) || (!option_raw && option1 == 0 && option2 == 0)) goto help_out; fp = fopen(*argv, "rb"); if (fp == NULL) { fprintf(stderr, "%s konnte nicht geoeffnet werden\n", *argv); return -1; } wavloaded = 1; } ++argv; } if (!wavloaded) fp = stdin; i = read_wav_header(fp); if (i) { fclose(fp); return -1; } if (option_ecc) { rs_init_BCH64(); } bufpos = 0; bit_count = 0; while (!read_bits_fsk(fp, &bit, &len)) { if (len == 0) { // reset_frame(); /* if (byte_count > FRAME_LEN-20) { print_frame(byte_count); bit_count = 0; byte_count = FRAMESTART; header_found = 0; } */ //inc_bufpos(); //buf[bufpos] = 'x'; continue; // ... } for (i = 0; i < len; i++) { inc_bufpos(); buf[bufpos] = 0x30 + bit; // Ascii if (!header_found) { header_found = compare_subheader(); if (header_found) { bit_count = 0; for (j = 0; j < HEADLEN; j++) { if (header_found % 2 == 1) frame_bits[j] = header0x049DCEbits[j] - 0x30; else frame_bits[j] = header0xFB6230bits[j] - 0x30; } } } else { frame_rawbits[bit_count] = 0x30 + bit; bit_count++; if (bit_count >= RAWBITFRAME_LEN/4-RAWHEADLEN) { // 600-48 frame_rawbits[bit_count] = '\0'; biphi_s(frame_rawbits, frame_bits+HEADLEN); if (option_ecc) { for (block = 0; block < 6; block++) { // prepare block-codeword for (j = 0; j < 46; j++) cw[45-j] = frame_bits[HEADLEN + block*46+j]; for (j = 46; j < 63; j++) cw[j] = 0; errors = rs_decode_bch_gf2t2(cw, err_pos, err_val); // check parity,padding if (errors >= 0) { check_err = 0; for (i = 46; i < 63; i++) { if (cw[i] != 0) check_err = 0x1; } par = 1; for (i = 13; i < 13+16; i++) par ^= cw[i]; if (cw[12] != par) check_err |= 0x100; par = 1; for (i = 30; i < 30+16; i++) par ^= cw[i]; if (cw[29] != par) check_err |= 0x10; if (check_err) errors = -3; } if (errors >= 0) { for (j = 0; j < 46; j++) frame_bits[HEADLEN + block*46+j] = cw[45-j]; } if (errors < 0) block_err[block] = 0xE; else block_err[block] = errors; } } if (!option2 && !option_raw) { if (header_found % 2 == 1) { val = bits2val(frame_bits+HEADLEN, 16); counter = val & 0xFFFF; if (counter % 2 == 0) printf("\n"); //printf("[0x%04X = %d] ", counter, counter); printf("[%d] ", counter); if (counter % 2 == 1) { t2 = bits2val(frame_bits+HEADLEN+5*46 , 8); // LSB t1 = bits2val(frame_bits+HEADLEN+5*46+8, 8); ms = (t1 << 8) | t2; std = bits2val(frame_bits+HEADLEN+5*46+17, 8); min = bits2val(frame_bits+HEADLEN+5*46+25, 8); printf(" "); printf("%02d:%02d:%06.3f ", std, min, (double)ms/1000.0); printf(" "); //printf("\n"); } } if (header_found % 2 == 0) { val = bits2val(frame_bits+HEADLEN, 16); //printf("%04x ", val & 0xFFFF); if ((counter % 2 == 0)) { // (val & 0xFFFF) > 0) {// == 0x8080 //offset=24+16+1; lat1 = bits2val(frame_bits+HEADLEN+17, 16); lat2 = bits2val(frame_bits+HEADLEN+46, 16); lon1 = bits2val(frame_bits+HEADLEN+46+17, 16); lon2 = bits2val(frame_bits+HEADLEN+46+46, 16); alt1 = bits2val(frame_bits+HEADLEN+46+46+17, 16); alt2 = bits2val(frame_bits+HEADLEN+46+46+46, 16); lat = (lat1 << 16) | lat2; lon = (lon1 << 16) | lon2; alt = (alt1 << 16) | alt2; //printf("%08X %08X %08X : ", lat, lon, alt); printf(" "); printf("%.6f %.6f %.2f", (double)lat/1e7, (double)lon/1e7, (double)alt/1e2); printf(" "); jj = bits2val(frame_bits+HEADLEN+5*46+ 8, 8) + 0x0700; mm = bits2val(frame_bits+HEADLEN+5*46+17, 8); tt = bits2val(frame_bits+HEADLEN+5*46+25, 8); printf(" "); printf("%4d-%02d-%02d ", jj, mm, tt); printf(" "); //printf("\n"); } } } else if (option2 && !option_raw) { if (header_found % 2 == 1) { val = bits2val(frame_bits+HEADLEN, 16); counter = val & 0xFFFF; if (counter % 2 == 0) printf("\n"); //printf("[0x%04X = %d] ", counter, counter); printf("[%d] ", counter); if (counter % 2 == 0) { t1 = bits2val(frame_bits+HEADLEN+5*46 , 8); // MSB t2 = bits2val(frame_bits+HEADLEN+5*46+8, 8); ms = (t1 << 8) | t2; std = bits2val(frame_bits+HEADLEN+5*46+17, 8); min = bits2val(frame_bits+HEADLEN+5*46+25, 8); printf(" "); printf("%02d:%02d:%06.3f ", std, min, (double)ms/1000.0); printf(" "); } } if (header_found % 2 == 0) { val = bits2val(frame_bits+HEADLEN, 16); //printf("%04x ", val & 0xFFFF); if ((counter % 2 == 0)) { // (val & 0xFFFF) > 0) {// == 0x2390 //offset=24+16+1; dat2 = bits2val(frame_bits+HEADLEN, 16); printf("%05u (?%02d-%02d-%02d) ", dat2, dat2/1000,(dat2/10)%100, (dat2%10)+10); lat1 = bits2val(frame_bits+HEADLEN+17, 16); lat2 = bits2val(frame_bits+HEADLEN+46, 16); lon1 = bits2val(frame_bits+HEADLEN+46+17, 16); lon2 = bits2val(frame_bits+HEADLEN+46+46, 16); alt1 = bits2val(frame_bits+HEADLEN+46+46+17, 16); alt2 = bits2val(frame_bits+HEADLEN+46+46+46, 8); lat = (lat1 << 16) | lat2; lon = (lon1 << 16) | lon2; alt = (alt1 << 8) | alt2; latdeg = (int)lat / 1e6; latmin = (double)(lat/1e6-latdeg)*100/60.0; londeg = (int)lon / 1e6; lonmin = (double)(lon/1e6-londeg)*100/60.0; //printf("%08X %08X %08X : ", lat, lon, alt); printf(" "); printf("%.6f %.6f %.2f", (double)latdeg+latmin, (double)londeg+lonmin, (double)alt/1e2); printf(" "); } //else { printf("\n"); } } } else { // raw val = bits2val(frame_bits, HEADLEN); printf("%06X ", val & 0xFFFFFF); printf(" "); for (i = 0; i < 6; i++) { val = bits2val(frame_bits+HEADLEN+46*i , 16); printf("%04X ", val & 0xFFFF); val = bits2val(frame_bits+HEADLEN+46*i+17, 16); printf("%04X ", val & 0xFFFF); val = bits2val(frame_bits+HEADLEN+46*i+34, 12); //printf("%03X ", val & 0xFFF); //printf(" "); } printf("\n"); } bit_count = 0; header_found = 0; if (option_ecc && option_verbose) { printf("#"); for (block = 0; block < 6; block++) printf("%X", block_err[block]); printf("# "); } } } } } printf("\n"); fclose(fp); return 0; }