Example #1
0
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);
}
Example #2
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);
}