From d526744d0c236c29fbcf3750f98019abb76af07a Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Fri, 5 May 2017 11:34:40 +0200 Subject: [PATCH] Added "csdr tee" and unified how csdr messages start --- csdr.c | 173 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 117 insertions(+), 56 deletions(-) diff --git a/csdr.c b/csdr.c index d893364..78764e5 100755 --- a/csdr.c +++ b/csdr.c @@ -152,6 +152,7 @@ char usage[]= " generic_slicer_f_u8 \n" " plain_interpolate_cc \n" " add_const_cc \n" +" tee [buffers]\n" " ?\n" " =\n" " \n" @@ -175,10 +176,22 @@ int bigbufs = 0; #define TRY_YIELD fflush(stdout);sched_yield() //unsigned yield_counter=0; +char **argv_global; +int argc_global; + +int errhead() +{ + fprintf(stderr, "%s%s%s: ", argv_global[0], ((argc_global>=2)?" ":""), ((argc_global>=2)?argv_global[1]:"")); +} + int badsyntax(char* why) { if(why==0) fprintf(stderr, "%s", usage); - else fprintf(stderr, "csdr: %s\n\n", why); + else + { + errhead(); + fprintf(stderr, "%s\n", why); + } return -1; } @@ -186,8 +199,8 @@ int clipdetect_ff(float* input, int input_size) { for(int i=0;i1.0) { fprintf(stderr, "csdr clipdetect_ff: Signal value above 1.0!\n"); return 1; } + if(input[i]<-1.0) { errhead(); fprintf(stderr, "Signal value below -1.0!\n"); return -1; } + if(input[i]>1.0) { errhead(); fprintf(stderr, "Signal value above 1.0!\n"); return 1; } } return 0; } @@ -220,7 +233,7 @@ int init_fifo(int argc, char *argv[]) { if(!strcmp(argv[2],"--fifo")) { - fprintf(stderr,"csdr: fifo control mode on\n"); + errhead(); fprintf(stderr,"fifo control mode on\n"); int fd = open(argv[3], O_RDONLY); int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); @@ -237,7 +250,8 @@ int init_fifo(int argc, char *argv[]) //This is implemented in ddcd, check there to see how to do it! int fd; if(sscanf(argv[3], "%d",&fd)<=0) return 0; - fprintf(stderr,"csdr: fd control mode on, fd=%d\n", fd); + errhead(); + fprintf(stderr,"fd control mode on, fd=%d\n", fd); int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); return fd; @@ -309,7 +323,7 @@ float *output_buffer; short *buffer_i16; float *temp_f; int the_bufsize = 0; -char **argv_global; + #define UNITROUND_UNIT 4 @@ -324,7 +338,7 @@ int initialize_buffers() { if(!(the_bufsize=getbufsize())) return 0; the_bufsize=unitround(the_bufsize); - if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: buffer size set to %d\n",argv_global[0], argv_global[1], the_bufsize); + if(env_csdr_print_bufsizes) { errhead(); fprintf(stderr,"buffer size set to %d\n", the_bufsize); } input_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); //need the 2× because we might also put complex floats into it output_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); buffer_u8 = (unsigned char*)malloc(the_bufsize*sizeof(unsigned char)); @@ -347,7 +361,7 @@ int sendbufsize(int size) //The first word is a preamble, "csdr". //If the next csdr process detects it, sets the buffer size according to the second word if(!env_csdr_dynamic_bufsize_on) return env_csdr_fixed_bufsize; - if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: next process proposed input buffer size is %d\n",argv_global[0], argv_global[1], size); + if(env_csdr_print_bufsizes) { errhead(); fprintf(stderr,"next process proposed input buffer size is %d\n", size); } int send_first[2]; memcpy((char*)send_first, SETBUF_PREAMBLE, 4*sizeof(char)); send_first[1] = size; @@ -384,6 +398,7 @@ int main(int argc, char *argv[]) { parse_env(); argv_global=argv; + argc_global=argc; if(argc<=1) return badsyntax(0); if(!strcmp(argv[1],"--help")) return badsyntax(0); @@ -466,7 +481,7 @@ int main(int argc, char *argv[]) if(fifo_actual_buffer_rd_pos==fifo_buffer_size) { fifo_actual_buffer_rd_pos = 0; //rewrite same buffer - if(!fifo_overrun_shown) { fifo_overrun_shown=1; fprintf(stderr, "fifo: circular buffer full, dropping samples\n"); } + if(!fifo_overrun_shown) { fifo_overrun_shown=1; errhead(); fprintf(stderr, "circular buffer full, dropping samples\n"); } } } } @@ -486,7 +501,7 @@ int main(int argc, char *argv[]) } } - if(fifo_error&&errno!=11) { fprintf(stderr,"fifo: fifo_error (%d)", errno); return -1; } + if(fifo_error&&errno!=11) { errhead(); fprintf(stderr,"fifo_error (%d)", errno); return -1; } } return -1; @@ -696,7 +711,8 @@ int main(int argc, char *argv[]) if(argc>3) sscanf(argv[3],"%d",&table_size); if(!sendbufsize(initialize_buffers())) return -2; shift_table_data_t table_data=shift_table_init(table_size); - fprintf(stderr,"shift_table_cc: LUT initialized\n"); + errhead(); + fprintf(stderr,"LUT initialized\n"); for(;;) { FEOF_CHECK; @@ -730,7 +746,8 @@ int main(int argc, char *argv[]) for(;;) { shift_addfast_data_t data=shift_addfast_init(rate); - fprintf(stderr,"shift_addfast_cc: reinitialized to %g\n",rate); + errhead(); + fprintf(stderr,"reinitialized to %g\n",rate); int remain, current_size; float* ibufptr; float* obufptr; @@ -780,7 +797,8 @@ int main(int argc, char *argv[]) for(;;) { shift_unroll_data_t data=shift_unroll_init(rate, 1024); - fprintf(stderr,"shift_unroll_cc: reinitialized to %g\n",rate); + errhead(); + fprintf(stderr,"reinitialized to %g\n",rate); int remain, current_size; float* ibufptr; float* obufptr; @@ -856,7 +874,8 @@ int main(int argc, char *argv[]) for(;;) { shift_addition_data_t data=shift_addition_init(rate); - fprintf(stderr,"shift_addition_cc: reinitialized to %g\n",rate); + errhead(); + fprintf(stderr,"reinitialized to %g\n",rate); int remain, current_size; float* ibufptr; float* obufptr; @@ -978,7 +997,7 @@ int main(int argc, char *argv[]) sscanf(argv[2],"%d",&sample_rate); float tau; sscanf(argv[3],"%g",&tau); - fprintf(stderr,"deemphasis_wfm_ff: tau = %g, sample_rate = %d\n",tau,sample_rate); + errhead(); fprintf(stderr,"tau = %g, sample_rate = %d\n",tau,sample_rate); float last_output=0; for(;;) { @@ -1006,7 +1025,7 @@ int main(int argc, char *argv[]) break; } } - if(nan_detect) fprintf(stderr, "detect_nan_f: NaN detected!\n"); + if(nan_detect) { errhead(); fprintf(stderr, "NaN detected!\n"); } fwrite(input_buffer, sizeof(float), the_bufsize, stdout); TRY_YIELD; } @@ -1103,14 +1122,14 @@ int main(int argc, char *argv[]) float *taps; #define NEON_ALIGNMENT (4*4*2) #ifdef NEON_OPTS - fprintf(stderr,"taps_length = %d\n", taps_length); + errhead(); fprintf(stderr,"taps_length = %d\n", taps_length); padded_taps_length = taps_length+(NEON_ALIGNMENT/4)-1 - ((taps_length+(NEON_ALIGNMENT/4)-1)%(NEON_ALIGNMENT/4)); - fprintf(stderr,"padded_taps_length = %d\n", padded_taps_length); + errhead(); fprintf(stderr,"padded_taps_length = %d\n", padded_taps_length); taps = (float*) (float*)malloc((padded_taps_length+NEON_ALIGNMENT)*sizeof(float)); - fprintf(stderr,"taps = %x\n", taps); + errhead(); fprintf(stderr,"taps = %x\n", taps); taps = (float*)((((unsigned)taps)+NEON_ALIGNMENT-1) & ~(NEON_ALIGNMENT-1)); - fprintf(stderr,"taps = %x\n", taps); + errhead(); fprintf(stderr,"NEON aligned taps = %x\n", taps); for(int i=0;i 0); while (env_csdr_fixed_big_bufsize < taps_length*2) env_csdr_fixed_big_bufsize*=2; //temporary fix for buffer size if [transition_bw] is low @@ -1224,7 +1243,7 @@ int main(int argc, char *argv[]) { window=firdes_get_window_from_string(argv[4]); } - else fprintf(stderr,"firdes_lowpass_f: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } int octave=(argc>=6 && !strcmp("--octave",argv[5])); @@ -1263,7 +1282,7 @@ int main(int argc, char *argv[]) { window=firdes_get_window_from_string(argv[5]); } - else fprintf(stderr,"firdes_bandpass_c: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window));} int octave=(argc>=7 && !strcmp("--octave",argv[6])); @@ -1385,9 +1404,9 @@ int main(int argc, char *argv[]) { window=firdes_get_window_from_string(argv[5]); } - else fprintf(stderr,"rational_resampler_ff: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } - if(suboptimal) fprintf(stderr,"note: suboptimal rational resampler chosen.\n"); + if(suboptimal) { errhead(); fprintf(stderr,"note: suboptimal rational resampler chosen.\n"); } if(!initialize_buffers()) return -2; @@ -1440,7 +1459,7 @@ int main(int argc, char *argv[]) { if(!strcmp(argv[4], "--prefilter")) { - fprintf(stderr, "fractional_decimator_ff: using prefilter with default values\n"); + errhead(); fprintf(stderr, "using prefilter with default values\n"); use_prefilter = 1; } else @@ -1449,7 +1468,7 @@ int main(int argc, char *argv[]) if(argc>=6) window = firdes_get_window_from_string(argv[5]); } } - fprintf(stderr,"fractional_decimator_ff: use_prefilter = %d, num_poly_points = %d, transition_bw = %g, window = %s\n", + errhead(); fprintf(stderr,"use_prefilter = %d, num_poly_points = %d, transition_bw = %g, window = %s\n", use_prefilter, num_poly_points, transition_bw, firdes_get_string_from_window(window)); if(!initialize_buffers()) return -2; @@ -1463,12 +1482,12 @@ int main(int argc, char *argv[]) if(use_prefilter) { taps_length = firdes_filter_len(transition_bw); - fprintf(stderr,"fractional_decimator_ff: taps_length = %d\n",taps_length); + errhead(); fprintf(stderr,"taps_length = %d\n",taps_length); taps = (float*)malloc(sizeof(float)*taps_length); firdes_lowpass_f(taps, taps_length, 0.5/(rate-transition_bw), window); //0.6 const to compensate rolloff //for(int=0;i=5)&&!strcmp(argv[4],"--benchmark"); - fprintf(stderr,"fft_benchmark: FFT library used: %s\n",FFT_LIBRARY_USED); + errhead(); fprintf(stderr,"FFT library used: %s\n",FFT_LIBRARY_USED); complexf* input=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_size); @@ -1750,7 +1769,7 @@ int main(int argc, char *argv[]) } //initialize FFT library, and measure time - fprintf(stderr,"fft_benchmark: initializing... "); + errhead(); fprintf(stderr,"initializing... "); struct timespec start_time, end_time; clock_gettime(CLOCK_MONOTONIC_RAW, &start_time); FFT_PLAN_T* plan=make_fft_c2c(fft_size,input,output,1,benchmark); @@ -1762,7 +1781,7 @@ int main(int argc, char *argv[]) for(int i=0;i=6) window=firdes_get_window_from_string(argv[5]); - else fprintf(stderr,"bandpass_fir_fft_cc: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } //calculate the FFT size and the other length parameters int taps_length=firdes_filter_len(transition_bw); //the number of non-zero taps @@ -1795,7 +1814,7 @@ int main(int argc, char *argv[]) if (fft_size-taps_length<200) fft_size<<=1; int input_size = fft_size - taps_length + 1; int overlap_length = taps_length - 1; - fprintf(stderr,"bandpass_fir_fft_cc: (fft_size = %d) = (taps_length = %d) + (input_size = %d) - 1\n(overlap_length = %d) = taps_length - 1\n", fft_size, taps_length, input_size, overlap_length ); + errhead(); fprintf(stderr,"(fft_size = %d) = (taps_length = %d) + (input_size = %d) - 1\n(overlap_length = %d) = taps_length - 1\n", fft_size, taps_length, input_size, overlap_length ); if (fft_size<=2) return badsyntax("FFT size error."); if(!sendbufsize(getbufsize())) return -2; @@ -1824,7 +1843,7 @@ int main(int argc, char *argv[]) for(;;) { //make the filter - fprintf(stderr,"bandpass_fir_fft_cc: filter initialized, low_cut = %g, high_cut = %g\n",low_cut,high_cut); + errhead(); fprintf(stderr,"filter initialized, low_cut = %g, high_cut = %g\n",low_cut,high_cut); firdes_bandpass_c(taps, taps_length, low_cut, high_cut, window); fft_execute(plan_taps); @@ -1890,7 +1909,7 @@ int main(int argc, char *argv[]) sendbufsize(flowcontrol_bufsize); unsigned char* flowcontrol_buffer = (unsigned char*)malloc(sizeof(unsigned char)*flowcontrol_bufsize); int flowcontrol_sleep=floor(1000000./reads_per_second); - fprintf(stderr, "flowcontrol: flowcontrol_bufsize = %d, flowcontrol_sleep = %d\n", flowcontrol_bufsize, flowcontrol_sleep); + errhead(); fprintf(stderr, "flowcontrol_bufsize = %d, flowcontrol_sleep = %d\n", flowcontrol_bufsize, flowcontrol_sleep); for(;;) { FEOF_CHECK; @@ -2163,7 +2182,7 @@ int main(int argc, char *argv[]) for(int i=0;i)"); - fprintf(stderr, "squelch_and_power_cc: initial squelch level is %g\n", squelch_level); + errhead(); fprintf(stderr, "initial squelch level is %g\n", squelch_level); if((argc<=5)||((argc>5)&&(strcmp(argv[4],"--outfifo")))) return badsyntax("need required parameter (--outfifo )"); int fd2 = open(argv[5], O_WRONLY); if(fd2==-1) return badsyntax("error while opening --outfifo"); @@ -2196,7 +2215,7 @@ int main(int argc, char *argv[]) //fprintf(stderr,"S"); fwrite(zerobuf, sizeof(complexf), the_bufsize, stdout); } - if(read_fifo_ctl(fd,"%g\n",&squelch_level)) fprintf(stderr, "squelch_and_power_cc: new squelch level is %g\n", squelch_level); + if(read_fifo_ctl(fd,"%g\n",&squelch_level)) { errhead(); fprintf(stderr, "new squelch level is %g\n", squelch_level); } TRY_YIELD; } } @@ -2223,7 +2242,7 @@ int main(int argc, char *argv[]) window_t window = WINDOW_DEFAULT; if(argc>4) window=firdes_get_window_from_string(argv[4]); - else fprintf(stderr,"fastddc_fwd_cc: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } fastddc_t ddc; if(fastddc_init(&ddc, transition_bw, decimation, 0)) { badsyntax("error in fastddc_init()"); return 1; } @@ -2240,7 +2259,7 @@ int main(int argc, char *argv[]) for(int i=0;i5+plusarg) window=firdes_get_window_from_string(argv[5+plusarg]); - else fprintf(stderr,"fastddc_apply_cc: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } for(;;) { @@ -2304,7 +2323,7 @@ int main(int argc, char *argv[]) //make the filter float filter_half_bw = 0.5/decimation; - fprintf(stderr, "fastddc_inv_cc: preparing a bandpass filter of [%g, %g] cutoff rates. Real transition bandwidth is: %g\n", (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, 4.0/ddc.taps_length); + errhead(); fprintf(stderr, "preparing a bandpass filter of [%g, %g] cutoff rates. Real transition bandwidth is: %g\n", (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, 4.0/ddc.taps_length); firdes_bandpass_c(taps, ddc.taps_length, (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, window); fft_execute(plan_taps); fft_swap_sides(taps_fft,ddc.fft_size); @@ -2312,7 +2331,7 @@ int main(int argc, char *argv[]) //make FFT plan complexf* inv_input = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size); complexf* inv_output = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size); - fprintf(stderr,"fastddc_inv_cc: benchmarking FFT..."); + errhead(); fprintf(stderr,"benchmarking FFT..."); FFT_PLAN_T* plan_inverse = make_fft_c2c(ddc.fft_inv_size, inv_input, inv_output, 0, 1); //inverse, do benchmark fprintf(stderr," done\n"); @@ -2481,7 +2500,7 @@ int main(int argc, char *argv[]) else fread(input_buffer, sizeof(float), the_bufsize, stdin); //should happen only on the first run serial_line_decoder_f_u8(&serial,input_buffer, (unsigned char*)output_buffer, the_bufsize); //printf("now in | "); - if(serial.input_used==0) { fprintf(stderr, "%s: error: serial_line_decoder_f_u8() got stuck.\n", argv[1]); return -3; } + if(serial.input_used==0) { errhead(); fprintf(stderr, "error: serial_line_decoder_f_u8() got stuck.\n"); return -3; } //printf("now out %d | ", serial.output_size); fwrite(output_buffer, sizeof(unsigned char), serial.output_size, stdout); TRY_YIELD; @@ -2508,7 +2527,7 @@ int main(int argc, char *argv[]) if(argc>5) sscanf(argv[5],"%f",&ko); if(argc>6) sscanf(argv[6],"%f",&kd); pll_cc_init_pi_controller(&pll, bandwidth, ko, kd, damping_factor); - fprintf(stderr, "bw=%f damping=%f ko=%f kd=%f alpha=%f beta=%f\n", bandwidth, damping_factor, ko, kd, pll.alpha, pll.beta); + errhead(); fprintf(stderr, "bw=%f damping=%f ko=%f kd=%f alpha=%f beta=%f\n", bandwidth, damping_factor, ko, kd, pll.alpha, pll.beta); // pll.filter_taps_a[0], pll.filter_taps_a[1], pll.filter_taps_a[2], pll.filter_taps_b[0], pll.filter_taps_b[1], pll.filter_taps_b[2]); } else return badsyntax("invalid pll_type. Valid values are:\n\t1: PLL_P_CONTROLLER\n\t2: PLL_PI_CONTROLLER"); @@ -2781,7 +2800,7 @@ int main(int argc, char *argv[]) sscanf(argv[4],"%f",&gain); int decision_directed = !!(argc>5 && (!strcmp(argv[5], "--dd") || !strcmp(argv[5], "--decision_directed"))); - if(decision_directed) fprintf(stderr, "csdr bpsk_costas_loop_cc: decision directed mode\n"); + if(decision_directed) { errhead(); fprintf(stderr, "decision directed mode\n"); } bpsk_costas_loop_state_t state; init_bpsk_costas_loop_cc(&state, decision_directed, damping_factor, loop_bandwidth, gain); @@ -2845,7 +2864,7 @@ int main(int argc, char *argv[]) { window=firdes_get_window_from_string(argv[4]); } - else fprintf(stderr,"firdes_resonator_c: window = %s\n",firdes_get_string_from_window(window)); + else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); } int octave=(argc>=6 && !strcmp("--octave",argv[5])); @@ -2950,7 +2969,7 @@ int main(int argc, char *argv[]) float signal_amplitude_per_noise = pow(10,snr_db/20); float a_signal=signal_amplitude_per_noise/(signal_amplitude_per_noise+1.0); float a_noise=1.0/(signal_amplitude_per_noise+1.0); - fprintf(stderr, "csdr awgn_cc: a_signal = %f, a_noise = %f\n", a_signal, a_noise); + errhead(); fprintf(stderr, "a_signal = %f, a_noise = %f\n", a_signal, a_noise); if(!initialize_buffers()) return -2; sendbufsize(the_bufsize); complexf* awgn_buffer = (complexf*)malloc(sizeof(complexf)*the_bufsize); @@ -2982,7 +3001,7 @@ int main(int argc, char *argv[]) float power_signal = total_logpower_cf((complexf*)input_buffer, the_bufsize); float power_noise = total_logpower_cf(awgn_buffer, the_bufsize); //fprintf(stderr, "csdr awgn_cc: after gain_ff, power_signal = %f dB, power_noise = %f dB\n", power_signal, power_noise); - fprintf(stderr, "csdr awgn_cc: SNR = %f dB\n", power_signal - power_noise); + errhead(); fprintf(stderr, "SNR = %f dB\n", power_signal - power_noise); } add_ff(input_buffer, (float*)awgn_buffer, (float*)output_buffer, the_bufsize*2); FWRITE_C; @@ -3040,7 +3059,7 @@ int main(int argc, char *argv[]) FREAD_R; //doesn't count, reads 4 bytes per sample anyway float nv = normalized_timing_variance_u32_f((unsigned*)input_buffer, temp_buffer, the_bufsize, samples_per_symbol, initial_sample_offset, debug_print); fwrite(&nv, sizeof(float), 1, stdout); - fprintf(stderr, "csdr normalized_timing_variance_u32_f: normalized variance = %f\n", nv); + errhead(); fprintf(stderr, "normalized variance = %f\n", nv); TRY_YIELD; } } @@ -3173,6 +3192,48 @@ int main(int argc, char *argv[]) return 0; } + if(!strcmp(argv[1], "tee")) // [buffers] + { + if(argc<=2) return badsyntax("required parameter is missing."); + FILE* teefile = fopen(argv[2],"w"); + if(!teefile) return badsyntax(" cannot be opened!"); + errhead(); fprintf(stderr, "file opened: %s\n", argv[2]); + int num_buffers=100; + if(argc>3) sscanf(argv[3], "%d", &num_buffers); + if(num_buffers<=0) return badsyntax("num_buffers should be > 0"); + SET_NONBLOCK(fileno(teefile)); + if(!sendbufsize(initialize_buffers())) return -2; + unsigned char* async_tee_buffers = malloc(sizeof(unsigned char)*the_bufsize*num_buffers); + int current_buffer_read_cntr = 0; + int current_buffer_write_cntr = 0; + int current_byte_write_cntr = 0; + for(;;) + { + FEOF_CHECK; + fread(async_tee_buffers+(the_bufsize*current_buffer_read_cntr), sizeof(unsigned char), the_bufsize, stdin); + fwrite(async_tee_buffers+(the_bufsize*current_buffer_read_cntr++), sizeof(unsigned char), the_bufsize, stdout); + if(current_buffer_read_cntr>=num_buffers) current_buffer_read_cntr = 0; + if(current_buffer_read_cntr==current_buffer_write_cntr) { errhead(); fprintf(stderr, "circular buffer overflow (read pointer gone past write pointer)\n"); } + //errhead(); fprintf(stderr, "new fwrites\n"); + while(current_buffer_write_cntr!=current_buffer_read_cntr) + { + int result = fwrite(async_tee_buffers+(the_bufsize*current_buffer_write_cntr)+current_byte_write_cntr, sizeof(unsigned char), the_bufsize-current_byte_write_cntr, teefile); + if(!result) { errhead(); fprintf(stderr, "\t fwrite tee zero, next turn\n"); break; } + current_byte_write_cntr += result; + //errhead(); fprintf(stderr, "\tfwrite tee, current_byte_write_cntr = %d, current_buffer_write_cntr = %d, current_buffer_read_cntr = %d\n", + // current_byte_write_cntr, current_buffer_write_cntr, current_buffer_read_cntr); + if(current_byte_write_cntr >= the_bufsize) + { + current_byte_write_cntr = 0; + current_buffer_write_cntr++; + if(current_buffer_write_cntr>=num_buffers) current_buffer_write_cntr = 0; + } + } + TRY_YIELD; + } + return 0; + } + if(!strcmp(argv[1],"shift_addition_fc")) { bigbufs=1; @@ -3195,7 +3256,7 @@ int main(int argc, char *argv[]) for(;;) { shift_addition_data_t data=shift_addition_init(rate); - fprintf(stderr,"shift_addition_fc: reinitialized to %g\n",rate); + errhead(); fprintf(stderr,"reinitialized to %g\n",rate); int remain, current_size; float* ibufptr; float* obufptr; @@ -3261,7 +3322,7 @@ int main(int argc, char *argv[]) float* input=(float*)fft_malloc(sizeof(float)*fft_in_size); float* windowed=(float*)fft_malloc(sizeof(float)*fft_in_size); complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_out_size); - if(benchmark) fprintf(stderr,"fft_cc: benchmarking..."); + if(benchmark) { errhead(); fprintf(stderr,"benchmarking..."); } FFT_PLAN_T* plan=make_fft_r2c(fft_in_size, windowed, output, benchmark); if(benchmark) fprintf(stderr," done\n"); //if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size); // TODO