int main(int argc, char **argv) { int i, j; long int procid; char outstring1[100]; FILE *in, *image1, *image2, *image3, *image4, *out; struct parsed_options options; umask(000); cmd_init_parsed_options(&options); cmd_parse_options(&options, argc, argv); /* read location for the config file if given */ sprintf(config_filename,"%s",options.conffile); read_input_file(); nice(10); sprintf(instring,"%s/process_rt_data_running",tmp_dir); out = fopen(instring, "r"); if (out != NULL) { fprintf(stderr, "\nrprocess_rt_data found a lock file ... "); fscanf(out, "%lu", &procid); fprintf(stderr, "\n PID: %lu", procid); fclose(out); sprintf(outstring1,"/proc/%lu/cmdline",procid); out = fopen(outstring1, "r"); if (out != NULL) { fscanf(out, "%s", outstring1); sprintf(instring,"process_real_time_data"); //if( strncmp(outstring1,"/home/radio",11)==0 ) if (strstr(outstring1, instring) != NULL) { fprintf(stderr, "\n Process Exists. Exiting ...\n\n"); fclose(out); exit(0); } fclose(out); } sprintf(instring,"%s/process_rt_data_running",tmp_dir); remove(instring); fprintf(stderr, "\n Process Does Not Exist. Lock File Removed\n"); } sprintf(instring,"%s/process_rt_data_running",tmp_dir); out = fopen(instring, "w"); if (out != NULL) { fprintf(out, "%lu", (long unsigned int) getpid()); fclose(out); } else { fprintf(stderr, "Couldn't write lock file %s?!", instring); exit(-1); } /* initialize the images */ for (i = 0; i < 512; i++) for (j = 0; j < 920; j++) { im1o[i][j] = 20.; im2o[i][j] = 20.; im3o[i][j] = 20.; im4o[i][j] = 20.; } /* initialize the fftw3 plans */ plan_forward1 = fftw_plan_r2r_1d(1024, fft_samples1, out1, FFTW_R2HC, FFTW_MEASURE); plan_forward2 = fftw_plan_r2r_1d(1024, fft_samples2, out2, FFTW_R2HC, FFTW_MEASURE); plan_forward3 = fftw_plan_r2r_1d(1024, fft_samples3, out3, FFTW_R2HC, FFTW_MEASURE); plan_forward4 = fftw_plan_r2r_1d(1024, fft_samples4, out4, FFTW_R2HC, FFTW_MEASURE); while (1) { /* read in the new data */ read_new_samples(); /* fft the new data */ fft_new_samples(); sprintf(instring,"%s/hf2_display_running",tmp_dir); in = fopen(instring, "r"); if (in != NULL) { write_data = 1; fclose(in); } else write_data = 0; sprintf(instring,"%s/levels.grayscale",tmp_dir); in = fopen(instring, "r"); if (in != NULL) { fscanf(in, "%d %d", &gray_min, &gray_max); fclose(in); } else { gray_min = 0; gray_max = 60.; } if (old_gray_min != gray_min || old_gray_max != gray_max) rescale_images(); if (write_data) { sprintf(instring,"%s/test.data",tmp_dir); out = fopen(instring, "w"); } else { printf("hf2_display not running?\n"); } for (i = 0; i < 512; i++) { x[i] = i * df; memcpy(*(im1+i),&im1[i][1],919); memcpy(*(im2+i),&im2[i][1],919); memcpy(*(im3+i),&im3[i][1],919); memcpy(*(im4+i),&im4[i][1],919); memcpy((im1o+i),&im1o[i][1],919*sizeof(float)); memcpy((im2o+i),&im2o[i][1],919*sizeof(float)); memcpy((im3o+i),&im3o[i][1],919*sizeof(float)); memcpy((im4o+i),&im4o[i][1],919*sizeof(float)); r1 = out1[i]; r2 = out2[i]; r3 = out3[i]; r4 = out4[i]; im1o[512 - i][919] = r1; im2o[512 - i][919] = r2; im3o[512 - i][919] = r3; im4o[512 - i][919] = r4; v1 = a + r1 * b + 0.5; v2 = a + r2 * b + 0.5; v3 = a + r3 * b + 0.5; v4 = a + r4 * b + 0.5; if (v1 < 0) v1 = 0; if (v2 < 0) v2 = 0; if (v3 < 0) v3 = 0; if (v4 < 0) v4 = 0; if (v1 > 255) v1 = 255; if (v2 > 255) v2 = 255; if (v3 > 255) v3 = 255; if (v4 > 255) v4 = 255; im1[512 - i][919] = 255 - (unsigned char) v1; im2[512 - i][919] = 255 - (unsigned char) v2; im3[512 - i][919] = 255 - (unsigned char) v3; im4[512 - i][919] = 255 - (unsigned char) v4; if (write_data) fprintf(out, "%.0f %.2f %.2f %.2f\n", x[i], r1, r2, r3); } if (write_data) { fclose(out); sprintf(instring,"%s/test.image1",tmp_dir); image1 = fopen(instring, "w"); fprintf(image1, "P5\n920 512\n255\n"); fwrite(im1, sizeof(im1), 1, image1); fclose(image1); sprintf(instring,"%s/test.image2",tmp_dir); image2 = fopen(instring, "w"); fprintf(image2, "P5\n920 512\n255\n"); fwrite(im2, sizeof(im2), 1, image2); fclose(image2); sprintf(instring,"%s/test.image3",tmp_dir); image3 = fopen(instring, "w"); fprintf(image3, "P5\n920 512\n255\n"); fwrite(im3, sizeof(im3), 1, image3); fclose(image3); sprintf(instring,"%s/test.image4",tmp_dir); image4 = fopen(instring, "w"); fprintf(image4, "P5\n920 512\n255\n"); fwrite(im4, sizeof(im4), 1, image4); fclose(image4); } usleep(1e4); } return (0); }
int main(int argc, char *argv[]) { comedi_cmd c,*cmd=&c; struct header_info header; long int t_samples, t_bytes, t_sleep; long int ret; int dt_usec, usec_elapsed; // struct timeval start,end; struct parsed_options options; unsigned short *samples; //, *junk; struct timeval now,then; long long unsigned int exec = 0; time_t t; umask(000); signal(SIGINT,do_depart); if (geteuid() != 0) { fprintf(stderr,"Must be setuid root to renice self.\n"); exit(0); } cmd_init_parsed_options(&options); cmd_parse_options(&options, argc, argv); t_samples = options.n_chan * options.samples; t_bytes = t_samples * 2; t_sleep = (long int) DMA_OVERSCAN_MULT*(1e6/options.freq)*options.samples; printf("freq = %f, tsamp = %li, tby = %li, tsleep = %li.\n",options.freq,t_samples,t_bytes,t_sleep); /* Test for failful options */ if (options.freq <= 1/(options.cadence + 0.00005)) { fprintf(stderr,"Acquisition frequency is faster than sampling frequency! FAIL!\n"); exit(ACQERR_BADINPUT); } if (options.samples > 16777216) { fprintf(stderr,"acq_d can't take more than 2^24 samples per set! Try acq_c.\n"); exit(ACQERR_BADINPUT); } ret = nice(-20); fprintf(stderr,"I've been niced to %li.\n",ret); if (ret != -20) printf(" WARNING!! Data collection could not set nice=-20. Data loss is probable at high speed."); dt_usec = options.cadence * 1e6; gettimeofday(&then, NULL); /* open the device */ dev = comedi_open(options.devfile); if (!dev) { comedi_perror(options.devfile); exit(ACQERR_BADDEV); } // printf("%li samples in %i-byte buffer.\n\n",t_samples,comedi_get_buffer_size(dev,options.subdevice)); prepare_cmd_lib(dev,options,cmd); printf("Testing command..."); ret = comedi_command_test(dev, cmd); if (ret < 0) { comedi_perror("comedi_command_test"); if(errno == EIO){ fprintf(stderr,"Ummm... this subdevice doesn't support commands\n"); } exit(ACQERR_BADCMD); } printf("%s...",cmdtest_messages[ret]); ret = comedi_command_test(dev, cmd); printf("%s...",cmdtest_messages[ret]); ret = comedi_command_test(dev, cmd); printf("%s...\n",cmdtest_messages[ret]); if (ret < 0) { fprintf(stderr,"Bad command, and unable to fix.\n"); dump_cmd(stderr, cmd); exit(ACQERR_BADCMD); } dump_cmd(stdout,cmd); comedi_close(dev); //fprintf(stderr,"%i scan -- %i chan -- %li samples -- %li bytes\n",options.samples,options.n_chan,t_samples,t_bytes); /* Print data file header */ // sprintf(dataheader, "[system]\n" // "whoami = \"%s\"") samples = (unsigned short*) malloc(t_bytes); // junk = (unsigned short*) malloc(t_bytes); if ((samples == NULL)) { // | (junk == NULL)) { fprintf(stderr,"Error allocating sample memory!\n"); exit(ACQERR_BADMEM); } printf("Starting acquisition...\n"); /*Open the serial port*/ /*serial = (FILE*)fopen("/dev/ttyS0","w");*/ /* Do what we're here to do */ while (running) { if (exec == options.sets) { break; } exec++; serial_toggle(); /* open the device */ dev = comedi_open(options.devfile); if (!dev) { comedi_perror(options.devfile); exit(ACQERR_BADDEV); } gettimeofday(&now, NULL); usec_elapsed = (now.tv_sec - then.tv_sec) * 1e6 + (now.tv_usec - then.tv_usec); while (usec_elapsed < dt_usec) { usleep(USLEEP_GRAN); gettimeofday(&now, NULL); usec_elapsed = (now.tv_sec - then.tv_sec) * 1e6 + (now.tv_usec - then.tv_usec); } /* start the command */ ret = comedi_command(dev, cmd); if (ret < 0) { comedi_perror("comedi_command"); exit(ACQERR_BADCMD); } then = now; /* * Insert enough waiting to get through most of the sampling */ /*serial_toggle();*/ usleep(t_sleep); /* * Wait until the buffer has our data. */ int exsleeps = 0; do { usleep(USLEEP_GRAN); comedi_poll(dev,options.subdevice); ret = comedi_get_buffer_contents(dev,options.subdevice); exsleeps++; } while(ret < t_bytes); // printf("Waited %ius for additional data.\n",exsleeps); /* * Get teh dataz. */ ret = read(comedi_fileno(dev), samples, t_bytes); if (ret < t_bytes) { fprintf(stderr,"Read mismatch! Got %li of %li bytes (%li/%li samples).\n",ret,t_bytes,ret/2,t_samples); } header.num_read = ret/2; // collect & discard overscan /* ret = comedi_get_buffer_contents(dev,options.subdevice); if (realloc(junk,ret) == NULL) { fprintf(stderr,"Error in oversample realloc?\n"); exit(ACQERR_BADMEM); } if (ret > 0) { ret = read(comedi_fileno(dev),junk,ret); }*/ comedi_close(dev); // Prepare header t = time(NULL); sprintf(header.site_id,"%s",site_str); header.start_time = t; header.start_timeval = now; header.num_channels=options.n_chan; header.channel_flags=0x0F; header.num_samples=options.samples; header.sample_frequency=options.freq; header.time_between_acquisitions=options.cadence; header.byte_packing=0; header.code_version=current_code_version; // Save latest to monitor file if (strcmp(options.monfile,"") != 0) { out = open(options.monfile,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); ret = errno; if (out > 0) { ret = write(out,&header,sizeof(header)); ret = write(out,samples,2*header.num_read); close(out); } else { fprintf(stderr,"Unable to open monitor file %s: %s.\n",options.monfile,strerror(ret)); exit(ACQERR_BADOUT); } } if (options.cadence >= 1.0 && options.verbose) printf("\tSaved latest to: %s\n",options.monfile); // Append to output file if (strcmp(options.outfile,"") != 0) { out = open(options.outfile,O_WRONLY|O_APPEND|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); ret = errno; if (out > 0) { ret = write(out,samples,2*header.num_read); close(out); if (options.cadence >= 1.0 && options.verbose) printf("\tAppended to: %s\n",options.outfile); } else { fprintf(stderr,"Unable to open output file %s: %s.\n",options.outfile,strerror(ret)); exit(ACQERR_BADOUT); } } } if (dev != NULL) comedi_close(dev); if (out != 0) close(out); printf("\nEnd.\n"); exit(0); }