int main(int argc, char **argv) { int fd, fd_out, opt; int opt_verbose = 0; while ((opt = getopt(argc, argv, "v")) != -1) { switch (opt) { case 'v': opt_verbose = 1; break; default: exit(2); } } if (argc <= optind+1) { fprintf(stderr, "Usage: %s [-v] <infile> <outfile>\n", argv[0]); exit(2); } fd = open(argv[optind], O_RDONLY); if (fd < 0) { perror("open infile"); exit(1); } fd_out = creat(argv[optind+1], 0660); if (fd_out < 0) { perror("open outfile"); exit(1); } while (1) { int rc; float fl[BUF_SIZE]; uint8_t bits[2*BUF_SIZE]; rc = read(fd, fl, sizeof(*fl) * BUF_SIZE); if (rc < 0) { perror("read"); exit(1); } else if (rc == 0) { break; } rc /= sizeof(*fl); int i; for (i = 0; i < rc; ++i) { int sym = process_sym_fl(fl[i]); sym_int2bits(sym, bits + i*2); //printf("%2d %1u %1u %f\n", rc, bits[0], bits[1], fl); if (opt_verbose) { printf("%1u%1u", bits[2*i + 0], bits[2*i + 1]); } } rc = write(fd_out, bits, rc * 2); if (rc < 0) { perror("write"); exit(1); } else if (rc == 0) break; } exit(0); }
int main(int argc, char **argv) { int fd; struct tetra_rx_state *trs; struct tetra_mac_state *tms; char *tmphost; int opt; int accept_float=0; int do_afc=0; float filter=0; float filter_val=0.0001; float filter_goal=0; int ccounter=0; char tmpstr2[64]; while ((opt = getopt(argc, argv, "ihf:F:a")) != -1) { switch (opt) { case 'i': accept_float = 1; break; case 'a': do_afc=1; break; case 'f': filter_val=atof(optarg); break; case 'F': filter_goal=atof(optarg); break; case 'h': show_help(argv[0]); exit(0); default: fprintf(stderr,"Bad option '%c'\n",opt); exit(2); } } if (argc <= optind) { show_help(argv[0]); exit(2); } fd = open(argv[optind], O_RDONLY); if (fd < 0) { perror("open"); exit(2); } /* sq5bpf */ memset((void *)&tetra_hack_db,0,sizeof(tetra_hack_db)); tetra_hack_live_idx=0; tetra_hack_live_lastseen=0; tetra_hack_live_socket=0; if (getenv("TETRA_HACK_PORT")) { tetra_hack_rxid=atoi(getenv("TETRA_HACK_RXID")); } else { tetra_hack_rxid=0; } if (getenv("TETRA_HACK_PORT")) { tetra_hack_live_socket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); tetra_hack_socklen=sizeof(struct sockaddr_in); tetra_hack_live_sockaddr.sin_family = AF_INET; tetra_hack_live_sockaddr.sin_port = htons(atoi(getenv("TETRA_HACK_PORT"))); tmphost=getenv("TETRA_HACK_IP"); if (!tmphost) { tmphost="127.0.0.1"; } //inet_aton("127.0.0.1", & tetra_hack_live_sockaddr.sin_addr); inet_aton(tmphost, & tetra_hack_live_sockaddr.sin_addr); if (tetra_hack_live_socket<1) tetra_hack_live_socket=0; } tetra_gsmtap_init("localhost", 0); tms = talloc_zero(tetra_tall_ctx, struct tetra_mac_state); tetra_mac_state_init(tms); trs = talloc_zero(tetra_tall_ctx, struct tetra_rx_state); trs->burst_cb_priv = tms; #define BUFLEN 64 #define MAXVAL 5.0 while (1) { uint8_t buf[BUFLEN]; int len; int i; if (accept_float) { int rc; int rc2; float fl[BUFLEN]; rc = read(fd, &fl, sizeof(fl)); if (rc < 0) { perror("read"); exit(1); } else if (rc == 0) break; rc2=rc/sizeof(float); for(i=0;i<rc2;i++) { if ((fl[i]>-MAXVAL)&&(fl[i]<MAXVAL)) filter=filter*(1.0-filter_val)+(fl[i]-filter_goal)*filter_val; if (do_afc) { rc = process_sym_fl(fl[i]-filter); } else { rc = process_sym_fl(fl[i]); } sym_int2bits(rc, &buf[2*i],&buf[2*i+1]); } len=rc2*2; } else { len = read(fd, buf, sizeof(buf)); if (len < 0) { perror("read"); exit(1); } else if (len == 0) { printf("EOF"); break; } } tetra_burst_sync_in(trs, buf, len); if (accept_float) { ccounter++; if (ccounter>50) { fprintf(stderr,"\n### AFC: %f\n",filter); sprintf(tmpstr2,"TETMON_begin FUNC:AFCVAL AFC:%i RX:%i TETMON_end",(int) (filter*100.0),tetra_hack_rxid); sendto(tetra_hack_live_socket, (char *)&tmpstr2, strlen((char *)&tmpstr2)+1, 0, (struct sockaddr *)&tetra_hack_live_sockaddr, tetra_hack_socklen); ccounter=0; } } } talloc_free(trs); talloc_free(tms); exit(0); }