Flush stdout only

pull/563/head
Steven Honson 2021-08-18 00:19:33 +10:00
rodzic 864538f9ff
commit 9ce8f6ba5a
1 zmienionych plików z 33 dodań i 37 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
C test driver for fsk_demod in fsk.c. Reads in a stream of 32 bit cpu endian C test driver for fsk_demod in fsk.c. Reads in a stream of 32 bit cpu endian
floats and writes out the detected bits floats and writes out the detected bits
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -76,7 +76,7 @@ int main(int argc,char *argv[]){
int nsym = FSK_DEFAULT_NSYM; int nsym = FSK_DEFAULT_NSYM;
int mask = 0; int mask = 0;
int tx_tone_separation = 100; int tx_tone_separation = 100;
int o = 0; int o = 0;
int opt_idx = 0; int opt_idx = 0;
while( o != -1 ){ while( o != -1 ){
@ -94,9 +94,9 @@ int main(int argc,char *argv[]){
{"mask", required_argument, 0, 'm'}, {"mask", required_argument, 0, 'm'},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
o = getopt_long(argc,argv,"fhlp:cdt::sb:u:m",long_opts,&opt_idx); o = getopt_long(argc,argv,"fhlp:cdt::sb:u:m",long_opts,&opt_idx);
switch(o){ switch(o){
case 'c': case 'c':
complex_input = 2; complex_input = 2;
@ -152,12 +152,12 @@ int main(int argc,char *argv[]){
} }
} }
int dx = optind; int dx = optind;
if( (argc - dx) < 5){ if( (argc - dx) < 5){
fprintf(stderr, "Too few arguments\n"); fprintf(stderr, "Too few arguments\n");
goto helpmsg; goto helpmsg;
} }
if( (argc - dx) > 5) { if( (argc - dx) > 5) {
fprintf(stderr, "Too many arguments\n"); fprintf(stderr, "Too many arguments\n");
helpmsg: helpmsg:
@ -180,24 +180,24 @@ int main(int argc,char *argv[]){
fprintf(stderr," --mask TxFreqSpace Use \"mask\" freq estimator (default is \"peak\" estimator)\n"); fprintf(stderr," --mask TxFreqSpace Use \"mask\" freq estimator (default is \"peak\" estimator)\n");
exit(1); exit(1);
} }
/* Extract parameters */ /* Extract parameters */
M = atoi(argv[dx]); M = atoi(argv[dx]);
Fs = atoi(argv[dx + 1]); Fs = atoi(argv[dx + 1]);
Rs = atoi(argv[dx + 2]); Rs = atoi(argv[dx + 2]);
if( (M!=2) && (M!=4) ){ if( (M!=2) && (M!=4) ){
fprintf(stderr,"Mode %d is not valid. Mode must be 2 or 4.\n",M); fprintf(stderr,"Mode %d is not valid. Mode must be 2 or 4.\n",M);
goto helpmsg; goto helpmsg;
} }
/* Open files */ /* Open files */
if(strcmp(argv[dx + 3],"-")==0){ if(strcmp(argv[dx + 3],"-")==0){
fin = stdin; fin = stdin;
}else{ }else{
fin = fopen(argv[dx + 3],"r"); fin = fopen(argv[dx + 3],"r");
} }
if(strcmp(argv[dx + 4],"-")==0){ if(strcmp(argv[dx + 4],"-")==0){
fout = stdout; fout = stdout;
}else{ }else{
@ -222,22 +222,22 @@ int main(int argc,char *argv[]){
fsk_set_freq_est_limits(fsk,fsk_lower,fsk_upper); fsk_set_freq_est_limits(fsk,fsk_lower,fsk_upper);
fsk_set_freq_est_alg(fsk, mask); fsk_set_freq_est_alg(fsk, mask);
if(fin==NULL || fout==NULL || fsk==NULL){ if(fin==NULL || fout==NULL || fsk==NULL){
fprintf(stderr,"Couldn't open files\n"); fprintf(stderr,"Couldn't open files\n");
exit(1); exit(1);
} }
/* set up testframe mode */ /* set up testframe mode */
int testframecnt, bitcnt, biterr, testframe_detected; int testframecnt, bitcnt, biterr, testframe_detected;
uint8_t *bitbuf_tx = NULL, *bitbuf_rx = NULL; uint8_t *bitbuf_tx = NULL, *bitbuf_rx = NULL;
if (testframe_mode) { if (testframe_mode) {
bitbuf_tx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_tx != NULL); bitbuf_tx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_tx != NULL);
bitbuf_rx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_rx != NULL); bitbuf_rx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_rx != NULL);
/* Generate known tx frame from known seed */ /* Generate known tx frame from known seed */
srand(158324); srand(158324);
for(i=0; i<TEST_FRAME_SIZE; i++){ for(i=0; i<TEST_FRAME_SIZE; i++){
bitbuf_tx[i] = rand()&0x1; bitbuf_tx[i] = rand()&0x1;
@ -248,13 +248,13 @@ int main(int argc,char *argv[]){
bitcnt = 0; bitcnt = 0;
biterr = 0; biterr = 0;
} }
if(enable_stats){ if(enable_stats){
loop_time = ((float)fsk_nin(fsk))/((float)Fs); loop_time = ((float)fsk_nin(fsk))/((float)Fs);
stats_loop = (int)(1/(stats_rate*loop_time)); stats_loop = (int)(1/(stats_rate*loop_time));
stats_ctr = 0; stats_ctr = 0;
} }
/* allocate buffers for processing */ /* allocate buffers for processing */
if(soft_dec_mode){ if(soft_dec_mode){
sdbuf = (float*)malloc(sizeof(float)*fsk->Nbits); assert(sdbuf != NULL); sdbuf = (float*)malloc(sizeof(float)*fsk->Nbits); assert(sdbuf != NULL);
@ -265,13 +265,13 @@ int main(int argc,char *argv[]){
modbuf = (COMP*)malloc(sizeof(COMP)*(fsk->N+fsk->Ts*2)); modbuf = (COMP*)malloc(sizeof(COMP)*(fsk->N+fsk->Ts*2));
/* set up signal handler so we can terminate gracefully */ /* set up signal handler so we can terminate gracefully */
if (signal(SIGTERM, sig_handler) == SIG_ERR) { if (signal(SIGTERM, sig_handler) == SIG_ERR) {
printf("\ncan't catch SIGTERM\n"); printf("\ncan't catch SIGTERM\n");
} }
/* Demodulate! */ /* Demodulate! */
while( fread(rawbuf,bytes_per_sample*complex_input,fsk_nin(fsk),fin) == fsk_nin(fsk) ){ while( fread(rawbuf,bytes_per_sample*complex_input,fsk_nin(fsk),fin) == fsk_nin(fsk) ){
/* convert input to a buffer of floats. Note scaling isn't really necessary for FSK */ /* convert input to a buffer of floats. Note scaling isn't really necessary for FSK */
@ -297,7 +297,7 @@ int main(int argc,char *argv[]){
modbuf[i].real = ((float)rawbuf[2*i])/FDMDV_SCALE; modbuf[i].real = ((float)rawbuf[2*i])/FDMDV_SCALE;
modbuf[i].imag = ((float)rawbuf[2*i+1]/FDMDV_SCALE); modbuf[i].imag = ((float)rawbuf[2*i+1]/FDMDV_SCALE);
} }
} }
} }
if(soft_dec_mode){ if(soft_dec_mode){
@ -305,7 +305,7 @@ int main(int argc,char *argv[]){
}else{ }else{
fsk_demod(fsk,bitbuf,modbuf); fsk_demod(fsk,bitbuf,modbuf);
} }
testframe_detected = 0; testframe_detected = 0;
if (testframe_mode) { if (testframe_mode) {
/* attempt to find a testframe and update stats */ /* attempt to find a testframe and update stats */
@ -332,7 +332,7 @@ int main(int argc,char *argv[]){
errs++; errs++;
} }
} }
if (errs < 0.1*TEST_FRAME_SIZE) { if (errs < 0.1*TEST_FRAME_SIZE) {
/* OK, we have a valid test frame sync, so lets count errors */ /* OK, we have a valid test frame sync, so lets count errors */
testframe_detected = 1; testframe_detected = 1;
@ -346,7 +346,7 @@ int main(int argc,char *argv[]){
} }
} }
} /* if (testframe_mode) ... */ } /* if (testframe_mode) ... */
if (enable_stats) { if (enable_stats) {
if ((stats_ctr < 0) || testframe_detected) { if ((stats_ctr < 0) || testframe_detected) {
fsk_get_demod_stats(fsk,&stats); fsk_get_demod_stats(fsk,&stats);
@ -369,11 +369,11 @@ int main(int argc,char *argv[]){
if(fsk->mode == 4){ if(fsk->mode == 4){
fprintf(stderr,", \"f3_est\":%.1f, \"f4_est\":%.1f",f_est[2],f_est[3]); fprintf(stderr,", \"f3_est\":%.1f, \"f4_est\":%.1f",f_est[2],f_est[3]);
} }
if (testframe_mode == 0) { if (testframe_mode == 0) {
/* Print the eye diagram */ /* Print the eye diagram */
fprintf(stderr,",\t\"eye_diagram\":["); fprintf(stderr,",\t\"eye_diagram\":[");
for(i=0;i<stats.neyetr;i++){ for(i=0;i<stats.neyetr;i++){
fprintf(stderr,"["); fprintf(stderr,"[");
for(j=0;j<stats.neyesamp;j++){ for(j=0;j<stats.neyesamp;j++){
@ -384,7 +384,7 @@ int main(int argc,char *argv[]){
if(i<stats.neyetr-1) fprintf(stderr,","); if(i<stats.neyetr-1) fprintf(stderr,",");
} }
fprintf(stderr,"],"); fprintf(stderr,"],");
/* Print a sample of the FFT from the freq estimator */ /* Print a sample of the FFT from the freq estimator */
fprintf(stderr,"\"samp_fft\":["); fprintf(stderr,"\"samp_fft\":[");
Ndft = fsk->Ndft/2; Ndft = fsk->Ndft/2;
@ -394,12 +394,12 @@ int main(int argc,char *argv[]){
} }
fprintf(stderr,"]"); fprintf(stderr,"]");
} }
if (testframe_mode) { if (testframe_mode) {
fprintf(stderr,", \"frames\":%d, \"bits\":%d, \"errs\":%d",testframecnt,bitcnt,biterr); fprintf(stderr,", \"frames\":%d, \"bits\":%d, \"errs\":%d",testframecnt,bitcnt,biterr);
} }
fprintf(stderr,"}\n"); fprintf(stderr,"}\n");
if (stats_ctr < 0) { if (stats_ctr < 0) {
stats_ctr = stats_loop; stats_ctr = stats_loop;
@ -416,30 +416,26 @@ int main(int argc,char *argv[]){
fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout); fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout);
} }
if(fin == stdin || fout == stdin){ if (fout == stdout) fflush(stdout);
fflush(fin);
fflush(fout);
}
} /* while(fread ...... */ } /* while(fread ...... */
if (testframe_mode) { if (testframe_mode) {
free(bitbuf_tx); free(bitbuf_tx);
free(bitbuf_rx); free(bitbuf_rx);
} }
if(soft_dec_mode){ if(soft_dec_mode){
free(sdbuf); free(sdbuf);
}else{ }else{
free(bitbuf); free(bitbuf);
} }
free(rawbuf); free(rawbuf);
free(modbuf); free(modbuf);
fclose(fin); fclose(fin);
fclose(fout); fclose(fout);
fsk_destroy(fsk); fsk_destroy(fsk);
return 0; return 0;
} }