static int add_devices() { FILE *fp; char file[PATH_MAX], name[128], path[PATH_MAX], line[PATH_MAX]; driver_t *driver; device_t *device; if (getcfg(cfg_file, "device_cfg_file", name, GETCFG_STR) != 0) { syslog(LOG_INFO, "can't get device cfg file info"); return -1; } if (getrpath(path, sizeof(path)) == -1) snprintf(path, sizeof(path), "."); snprintf(file, sizeof(file), "%s/%s", path, name); if ((fp = fopen(file, "r")) == NULL) return -1; device_cfg_t cfg; int n; while (fgets(line, sizeof(line), fp) != NULL) { if (line[0] == '#' || line[0] == '/' || strlen(line) == 1) continue; n = sscanf(line, "%d;%d;%[^;];%d;%[^;];%[^;];%d;%[^;];" "%d;%[^;];%d;%[^;];%[^;];%d;%d;", &cfg.type, &cfg.id, cfg.ip, &cfg.port, cfg.user, cfg.pwd, &cfg.channel_num, cfg.rec, &cfg.storage_device_type, cfg.storage_ip, &cfg.storage_port, cfg.storage_user, cfg.storage_pwd, &cfg.storage_disk, &cfg.baud_rate); if (n != 15) continue; driver = rmd_devmgr_get_driver(cfg.type); if (driver == NULL) continue; device = add_device(&cfg, driver); if (device == NULL) continue; add_channels(&cfg, driver, device); } fclose(fp); return 0; }
void decimate_data(FILE *input, FILE *output) /*includefile*/ { char string[80]; float *fblock,min,max,realtime,fsaved[2]; unsigned short *sblock; unsigned char *cblock; int nsaved=0,ns,nsblk,opened=0,nout; nsblk=nchans*nifs*naddt; fblock=(float *) malloc(nsblk*sizeof(float)); sblock=(unsigned short *) malloc(nsblk*sizeof(unsigned short)); cblock=(unsigned char *) malloc(nsblk*sizeof(unsigned short)); realtime=min=0.0; max=(float) pow(2.0,(double)obits) -1.0; /* main decimation loop */ while ((ns=read_block(input,nbits,fblock,nsblk))>0) { add_channels(fblock,ns,naddc); add_samples(fblock,nifs,nchans/naddc,naddt); if (!opened) { /* open up logfile */ open_log("decimate.monitor"); opened=1; } nout=ns/naddt/naddc; switch (obits) { case 32: fwrite(fblock,sizeof(float),nout,output); break; case 16: float2short(fblock,nout,min,max,sblock); fwrite(sblock,sizeof(unsigned short),nout,output); break; case 8: float2char(fblock,nout,min,max,cblock); fwrite(cblock,sizeof(unsigned char),nout,output); break; case 4: if (nout==1) { /* must have at least two samples for four-bit packing save this one */ fsaved[nsaved]=fblock[0]; nsaved++; if (nsaved==2) { /* we have 2 saved! write out */ float2four(fsaved,nsaved,min,max,cblock); fwrite(cblock,sizeof(unsigned char),1,output); nsaved=0; } } else { /* normal case */ float2four(fblock,nout,min,max,cblock); fwrite(cblock,sizeof(unsigned char),nout/2,output); } break; case 2: float2two(fblock,nout,min,max,cblock); fwrite(cblock,sizeof(unsigned char),nout/4,output); break; } realtime+=(float) tsamp * (float) ns/(float) nchans/(float) nifs; sprintf(string,"time:%.1fs",realtime); update_log(string); } update_log("finished"); close_log(); }
static int _impl_setup(rh_aout_api_itf self) { extern AAssetManager * __rh_hack_get_android_asset_manager(); static const SLEngineOption options[] = { { SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE }, { SL_ENGINEOPTION_LOSSOFCONTROL, SL_BOOLEAN_FALSE }, }; struct sles_api_instance * instance = (struct sles_api_instance *)self; instance->asset_manager = __rh_hack_get_android_asset_manager(); if(!instance->asset_manager) goto bad; if (SL_RESULT_SUCCESS != slCreateEngine(&instance->engineObject, sizeof(options) / sizeof(options[0]), options, 0, NULL, NULL)) goto bad; if (SL_RESULT_SUCCESS != (*instance->engineObject)->Realize(instance->engineObject, SL_BOOLEAN_FALSE )) goto bad; if (SL_RESULT_SUCCESS != (*instance->engineObject)->GetInterface(instance->engineObject, SL_IID_ENGINE, &instance->engineItf)) goto bad; if (SL_RESULT_SUCCESS != (*instance->engineItf)->CreateOutputMix(instance->engineItf, &instance->outputMix, 0, NULL, NULL)) goto bad; if (SL_RESULT_SUCCESS != (*instance->outputMix)->Realize(instance->outputMix, SL_BOOLEAN_FALSE )) goto bad; if( pipe( &instance->cmd_pipe.read ) != 0 ) goto bad; if(fcntl( instance->cmd_pipe.read, F_SETFL, O_NONBLOCK) != 0) goto bad; if(bucket_create(&instance->aout_itf_bucket) != 0) goto bad; if(add_channels(self, 3) != 0) goto bad; { pthread_t thread; if(pthread_create(&thread, NULL, &api_main_loop, (void*)self) != 0) goto bad; instance->thread = thread; } pthread_detach( instance->thread ); good: return 0; bad: if( instance->outputMix ) (*instance->outputMix)->Destroy(instance->outputMix); if( instance->engineObject ) (*instance->engineObject)->Destroy(instance->engineObject); if(instance->aout_itf_bucket) { close_all_channels(self); bucket_free(instance->aout_itf_bucket); } if(instance->cmd_pipe.write) close(instance->cmd_pipe.write); if(instance->cmd_pipe.read) close(instance->cmd_pipe.read); return -1; }
static int _play(rh_aout_api_itf self, rh_asmp_itf asmp_itf, int loop_flag) { struct sles_api_instance * api_instance = (struct sles_api_instance *)self; int len; rh_aout_itf * array; int e = 0; for(;;) { int found = 0; if( bucket_lock( api_instance->aout_itf_bucket, (void***)&array, &len ) == 0 ) { int i; // is this sample already assigned to a channel? try to find its channel. for(i=0; i<len; i++) { rh_asmp_itf audio_sample; rh_aout_itf audio_channel = array[i]; if( (*audio_channel)->get_sample(audio_channel, &audio_sample) == 0 ) { if( audio_sample == asmp_itf ) { found = 1; if(loop_flag) e = (*audio_channel)->loop(audio_channel); else e = (*audio_channel)->play(audio_channel); break; } } } if(!found) { // sample not yet assigned to a channel, find and empty one and assign it. for(i=0; i<len; i++) { rh_asmp_itf audio_sample; rh_aout_itf audio_channel = array[i]; if( (*audio_channel)->get_sample(audio_channel, &audio_sample) == 0 ) { if( audio_sample == NULL ) { found = 1; (*audio_channel)->set_sample(audio_channel, asmp_itf); (*audio_channel)->open( audio_channel, (*asmp_itf)->channels(asmp_itf), (*asmp_itf)->samplerate(asmp_itf), (*asmp_itf)->samplesize(asmp_itf) ); if(loop_flag) e = (*audio_channel)->loop(audio_channel); else e = (*audio_channel)->play(audio_channel); break; } } } } bucket_unlock( api_instance->aout_itf_bucket ); } if(!found) { // no empty channels available, create a new channel and try again. if((e = add_channels(self, 1)) != 0) break; } else break; } return e; }
main(int argc, char **argv) { float tsec,fmhz,peak=1.0,sum,sumsq,sigma,sig2,mean,meansq,chi2,diff; float *pcopy,n; int hh,mm,i,j,row,dummy,mbins=64,obins,first=1,idx,nprof=1,display=0,rc2=0,flux=0; unsigned long *indx; char line[240], hash, gry[10], message[80]; strcpy(gry," ,:o*@$#"); input=stdin; if (argc > 1) { print_version(argv[0],argv[1]); if (help_required(argv[1])) { profile_help(); exit(0); } i=1; while (i<argc) { if (file_exists(argv[i])) { input=open_file(argv[i],"r"); } else if (strings_equal(argv[i],"-frequency")) { display=1; } else if (strings_equal(argv[i],"-chi2")) { rc2=1; } else if (strings_equal(argv[i],"-sum")) { flux=1; } else if (strings_equal(argv[i],"-p")) { peak=atof(argv[++i]); } else { sprintf(message,"command-line argument %s not recognized...",argv[i]); error_message(message); } i++; } } fgets(line,sizeof(line),input); sscanf(line,"%c %lf %lf %lf %ld %lf %lf %d",&hash, &mjdobs,&tstart,&period,&np,&fch1,&refdm,&nbins); if (nbins > 0) { while (!feof(input)) { profile=(float *) malloc(sizeof(float)*nbins); for (i=0; i<nbins; i++) { fscanf(input,"%d %f",&dummy,&profile[i]); } if (rc2 || flux) { pcopy=(float *) malloc(sizeof(float)*nbins); for (i=0;i<nbins;i++) pcopy[i]=profile[i]; indx=(unsigned long *) malloc(sizeof(unsigned long)*nbins); indexx((unsigned long)nbins,pcopy,indx); if (flux) { n=sum=sumsq=0.0; for (i=0;i<40;i++) { sum+=profile[i]; sumsq+=profile[i]*profile[i]; n+=1.0; } mean=sum/n; meansq=sumsq/n; sigma=sqrt(meansq-mean*mean)/sqrt(n-1.0); n=sum=sumsq=0.0; for (i=43;i<52;i++) { sum+=profile[i]; sumsq+=profile[i]*profile[i]; n+=1.0; } printf("%f %f\n",sum/n,sigma); exit(0); } n=sum=sumsq=0.0; for (i=0;i<nbins/2;i++) { j=indx[i]; sum+=profile[j]; sumsq+=profile[j]*profile[j]; n+=1.0; } mean=sum/n; meansq=sumsq/n; sigma=sqrt(meansq-mean*mean); sig2=sigma*sigma; sumsq=0.0; for (i=0;i<nbins;i++) { diff=profile[i]-mean; sumsq+=diff*diff; } //chi2=sumsq/sig2/(float)(nbins-1); chi2=sumsq/(float)(nbins-1); printf("%f %f\n",period,chi2); exit(0); } if (nbins>mbins) { add_channels(profile,nbins,nbins/mbins); nbins=mbins; } pmin=vmin(profile,nbins); pmax=vmax(profile,nbins)*peak; prng=pmax-pmin; for (i=0; i<nbins; i++) profile[i]=19.0*(profile[i]-pmin)/prng+1.0; for (row=20; row>=1; row--) { for (i=0; i<nbins; i++) { if (profile[i]>=(float) row) printf("#"); else printf(" "); } printf("\n"); } free(profile); nbins=0; fgets(line,sizeof(line),input); fgets(line,sizeof(line),input); sscanf(line,"%c %lf %lf %lf %ld %lf %lf %d",&hash, &mjdobs,&tstart,&period,&np,&fch1,&refdm,&nbins); if (nbins<=0) break; } } else { while (!feof(input)) { sscanf(line,"#START %d %f %f",&nbins,&tsec,&fmhz); if (nbins <=0) break; profile=(float *) malloc(sizeof(float)*nbins); for (i=0; i<nbins; i++) fscanf(input,"%d %f",&dummy,&profile[i]); fgets(line,sizeof(line),input); fgets(line,sizeof(line),input); if (nbins>mbins) { obins=nbins; add_channels(profile,nbins,nbins/mbins); nbins=mbins; } if (first) { pmin=vmin(profile,nbins); pmax=vmax(profile,nbins)*peak; prng=pmax-pmin; /*first=0;*/ } if (display) { printf("|%04d|%11.6f|",nprof,fmhz); } else { hh=(int) tsec/3600.0; tsec-=(float) hh*3600.0; mm=(int) tsec/60.0; tsec-=(float) mm*60.0; printf("|%04d|%02d:%02d:%02d|",nprof,hh,mm,(int)tsec); } for (i=0; i<nbins; i++) { idx=(int) (9.0*(profile[i]-pmin)/prng); if (idx<0) idx=0; if (idx>9) idx=9; putchar(gry[idx]); } puts("|"); free(profile); fgets(line,sizeof(line),input); nbins=0; nprof++; } } }