📄 meter.c
字号:
XtAddInput( fileno(stdin), XtInputReadMask, get_input, NULL); XtRealizeWidget(toplevel); XtMainLoop();}static struct header *ihd, *ohd; /* input and output file headers */static struct feasd *isd_rec, *z_rec; /* record for input and output data */static FILE *isdfile = stdin, /* input and output file stream */ *osdfile = stdout; static int buffer_len; /* no. samps read by get_feasd_rec */void get_input(client_data, fid, id) caddr_t client_data; int *fid; XtInputId *id;{ int truncate(); static int first_time = 1; static long offset; static char *iname = NULL, /* input and output file names */ *oname = NULL; static int num_chan = 1; static int num_segs; /* no. update in buffer_len long samples*/ static int nsamp_in_seg; /* no. samps in an update */ static float time = 0; int i,j; float *values = NULL; Arg args[10]; int n; long num_rec; char string[10]; XmString mystring; if(first_time){ oname = eopen("meter",outfilename,"w",NONE, NONE, &ohd, &osdfile); iname = eopen("meter", "-","r", FT_FEA, FEA_SD, &ihd, &isdfile); num_chan = get_fea_siz("samples", ihd, (short *)NULL,(long **)NULL); write_header( ihd, osdfile ); offset = ftell(osdfile); nsamp_in_seg = TIMEOUT * (*get_genhd_d("record_freq", ihd)); num_segs = 1; buffer_len = num_segs * nsamp_in_seg; if( magic ){ short *zeros, **zeros_ptr; if( num_chan == 1){ isd_rec = allo_feasd_recs( ihd, SHORT, buffer_len, (char*) NULL, NO); z_rec = allo_feasd_recs( ihd, SHORT, 1, (char*) NULL, NO); zeros = (short *) z_rec->data; for(i=0; i<1; i++) zeros[i] = SHRT_MAX; } else{ isd_rec = allo_feasd_recs( ihd, SHORT, buffer_len, (char*) NULL, YES); z_rec = allo_feasd_recs( ihd, SHORT, 1, (char*) NULL, YES); zeros_ptr = (short**) z_rec->ptrs; for(j=0; j<num_chan; j++) for(i=0; i<1; i++) zeros_ptr[i][j] = SHRT_MAX; } } else{ if( num_chan == 1) isd_rec = allo_feasd_recs( ihd, SHORT, buffer_len, (char*) NULL, NO); else isd_rec = allo_feasd_recs( ihd, SHORT, buffer_len, (char*) NULL, YES); } first_time = 0; } if((num_rec = get_feasd_recs( isd_rec, 0L, buffer_len, ihd, isdfile )) == 0){ fclose(osdfile); fclose(isdfile); exit(0); } if(DC_OFFSET == True) (void) do_dc_offset( (short *) isd_rec->data, (short **) isd_rec->ptrs , num_rec, num_chan); if(METER == True || METER_READOUT == True) values = (float *) find_max( (short *) isd_rec->data, (short **) isd_rec->ptrs , num_rec, num_chan); if(time >= INTERVAL && ((METER==True) || METER_READOUT==True)){ for( i = 0; i< num_chan; i++){ if( values[i] >= SHRT_MAX ) fprintf(stderr,"ERROR: clipping occured.\n"); values[i] = 20. * log10( values[i] + 1.01); if(METER == True){ n = 0; XtSetArg( args[n], XtNvalues, values+i); n++; XtSetValues( Bar[i], args, n); } if(METER_READOUT == True){ n = 0; sprintf(string, "%3.0f", values[i]); mystring = XmStringCreateLtoR(string, "chset1"); XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( dbval_label[i], args, n); XmStringFree(mystring); } } time = 0; } else time += TIMEOUT; if( PAUSE == False){ if( RESTART == False && START == True){ /* append */ put_feasd_recs( isd_rec, 0L, buffer_len, ihd, osdfile); } if( RESTART == True){ /* move the file pointer to beginning */ fseek( osdfile, offset, 0); if(0> truncate( oname, offset)){ fprintf(stderr,"ERROR: Can't do ftruncate() for Re-start\n"); exit(1); } put_feasd_recs( isd_rec, 0L, buffer_len, ihd, osdfile); RESTART = False; } }} static void do_dc_offset( array, array2, size_array, chan_size) short *array; short **array2; int size_array; int chan_size;{ static long sum[] = {0,0,0,0}; /* sum1, cnt1, sum2, cnt2 */ static short time_dc_cnt = 0; static int dc_offset[2]; register int i; if(chan_size == 1){ register short *ptr = array; register long *sum_ptr = sum; register int *dc_ptr = dc_offset; if( time_dc_cnt++ == TIME_DC ){ dc_ptr[0] = sum_ptr[0]/sum_ptr[1]; time_dc_cnt = 0; sum_ptr[0] = 0; sum_ptr[1] = 0; } for(i = 0; i< size_array; i++){ sum_ptr[0] += ptr[i]; sum_ptr[1]++; ptr[i] = ptr[i] - dc_ptr[0]; } } else { register short **ptr2 = array2; register long *sum_ptr = sum; register int *dc_ptr = dc_offset; if( time_dc_cnt++ == TIME_DC ){ dc_ptr[0] = sum_ptr[0]/sum_ptr[1]; dc_ptr[1] = sum_ptr[2]/sum_ptr[3]; time_dc_cnt = 0; sum_ptr[0] = 0; sum_ptr[2] = 0; sum_ptr[1] = 0; sum_ptr[3] = 0; } for(i = 0; i< size_array; i++){ sum_ptr[0] += ptr2[i][0]; sum_ptr[2] += ptr2[i][1]; sum_ptr[1]++; sum_ptr[3]++; ptr2[i][0] = ptr2[i][0] - dc_ptr[0]; ptr2[i][1] = ptr2[i][1] - dc_ptr[1]; } }}static float *find_max( array, array2, size_array, chan_size) short *array; short **array2; int size_array; int chan_size;{ register int i; float max[2]; if(chan_size == 1){ register short *ptr; ptr = array; max[0] = -9999; for(i = 0; i< size_array; i+=3){ if( ptr[i] <= 0) if( max[0] < -ptr[i]) max[0] = -ptr[i]; if( ptr[i] > 0) if( max[0] < ptr[i]) max[0] = ptr[i]; } return(max); } else { register short **ptr2; ptr2 = array2; max[0] = max[1] = -9999; for(i = 0; i< size_array; i+=3){ if( ptr2[i][0] <= 0) if( max[0] < -ptr2[i][0]) max[0] = -ptr2[i][0]; if( ptr2[i][0] > 0) if( max[0] < ptr2[i][0]) max[0] = ptr2[i][0]; if( ptr2[i][1] <= 0) if( max[1] < -ptr2[i][1]) max[1] = -ptr2[i][1]; if( ptr2[i][1] > 0) if( max[1] < ptr2[i][1]) max[1] = ptr2[i][1]; } return(max); }}static void start_record(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{ Arg args[10]; int n; XmString mystring; static firsttime = 1; if(firsttime == 1){ START = True; RESTART = False; firsttime = 0; } else RESTART = True; if( RESTART == True) PAUSE = False; if( RESTART == False && START == True) PAUSE = False; mystring = XmStringCreateLtoR(MRestart, "chset1"); n = 0; XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( startB, args, n); XmStringFree(mystring); mystring = XmStringCreateLtoR(MRecording, "chset2"); n = 0; XtSetArg( args[n], XmNfontList, myfontlist2); n++; XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( rc_label, args, n); XmStringFree(mystring); n = 0; mystring = XmStringCreateLtoR(MPause, "chset1"); XtSetArg( args[n], XmNlabelString, mystring ); n++; XtSetValues( pauseB, args, n); XmStringFree(mystring); n = 0; XtSetArg( args[n], XmNsensitive, True); n++; XtSetValues( pauseB, args, n);}static void pause_resume(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{ Arg args[10]; int n; XmString mystring; PAUSE = (PAUSE == True) ? False : True; if( PAUSE == True ){ if(magic) put_feasd_recs( z_rec, 0L, 1, ihd, osdfile); n = 0; mystring = XmStringCreateLtoR(MResume, "chset1"); XtSetArg( args[n], XmNlabelString, mystring ); n++; XtSetValues( pauseB, args, n); XmStringFree(mystring); mystring = XmStringCreateLtoR(MNot_Recording, "chset2"); n = 0; XtSetArg( args[n], XmNfontList, myfontlist2); n++; XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( rc_label, args, n); XmStringFree(mystring); } else{ n = 0; mystring = XmStringCreateLtoR(MPause, "chset1"); XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( pauseB, args, n); XmStringFree(mystring); mystring = XmStringCreateLtoR(MRecording, "chset2"); n = 0; XtSetArg( args[n], XmNfontList, myfontlist2); n++; XtSetArg( args[n], XmNlabelString, mystring); n++; XtSetValues( rc_label, args, n); XmStringFree(mystring); }}static void quit(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{/* if( RESTART == False && START == True){ put_feasd_recs( z_rec, 0L, buffer_len, ihd, osdfile); }*/ XtCloseDisplay(XtDisplay(w)); exit(0);}static void dc_offset_onoff(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{ DC_OFFSET = ((XmToggleButtonCallbackStruct *) call_data)->set; DC_OFFSET = (DC_OFFSET == True)? False: True;}static void meter_onoff(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{ METER = ((XmToggleButtonCallbackStruct *) call_data)->set; METER = (METER == True)? False: True;}static void dc_read_onoff(w, client_data, call_data) Widget w; caddr_t client_data; XmAnyCallbackStruct *call_data;{ METER_READOUT = ((XmToggleButtonCallbackStruct *) call_data)->set; METER_READOUT = (METER_READOUT == True)? False: True;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -