/* Set a signal action ===================================================== */ int sigaction(int signal_Number,struct sigaction* sigaction_Info, struct sigaction* sigaction_InfoOld) { /* Make sure we're init'd */ if (!downhill_Signal_Init()) { return -1; } /* Set the signal */ if (IS_SIGNAL(signal_Number)) { if (sigaction_InfoOld != NULL) { sigaction_InfoOld->sa_handler = downhill_Signal_Info[signal_Number]. signal_Handler; sigaction_InfoOld->sa_mask = downhill_Signal_Info[signal_Number]. signal_Mask; sigaction_InfoOld->sa_flags = downhill_Signal_Info[signal_Number]. signal_Flags; } if (sigaction_Info != NULL) { downhill_Signal_Info[signal_Number]. signal_Handler = sigaction_Info->sa_handler; downhill_Signal_Info[signal_Number]. signal_Count = 0; downhill_Signal_Info[signal_Number]. signal_Extra = 0; downhill_Signal_Info[signal_Number]. signal_Mask = sigaction_Info->sa_mask; downhill_Signal_Info[signal_Number]. signal_Flags = sigaction_Info->sa_flags; } } else { errno = EINVAL; return -1; } return 0; }
/* Set the action of a signal ============================================== */ sighandler_t signal(int signal_Number, sighandler_t signal_Handler) { sighandler_t signal_HandlerOld; /* Make sure we're init'd */ if (!IS_SIGNAL(signal_Number) || !downhill_Signal_Init() ) { return SIG_ERR; } signal_HandlerOld = downhill_Signal_Info[signal_Number].signal_Handler; downhill_Signal_Info[signal_Number].signal_Handler = signal_Handler; downhill_Signal_Info[signal_Number].signal_Count = 0; downhill_Signal_Info[signal_Number].signal_Extra = 0; downhill_Signal_Info[signal_Number].signal_Mask = 0; downhill_Signal_Info[signal_Number].signal_Flags = 0; return signal_HandlerOld; }
/* Handle a signal ========================================================= */ void raise(int signal_Number) { if (!IS_SIGNAL(signal_Number)) { errno = EINVAL; return; } /* Check to see if we're masking this signal */ if (sigismember(&downhill_Sigset_Mask,signal_Number)) { downhill_Signal_Info[signal_Number].signal_Count++; } else { /* Do a signal's action */ if (downhill_Signal_Info[signal_Number].signal_Handler == SIG_DFL) { switch (signal_Number) { SIGNAL_DEFAULT_EXIT exit(3); default: break; } } else if ( (downhill_Signal_Info[signal_Number].signal_Handler == SIG_IGN) ) {/* IGNORE */} else { void (*signal_HandlerOld)(int); /* Do we reset the handler? */ signal_HandlerOld = downhill_Signal_Info[signal_Number].signal_Handler; if (downhill_Signal_Info[signal_Number].signal_Flags& SA_RESETHAND) { downhill_Signal_Info[signal_Number]. signal_Handler = SIG_DFL; } /* Do the action */ if ((signal_Number == SIGCHLD) && (downhill_Signal_Info[signal_Number].signal_Flags& SA_NOCLDSTOP)) { /* Ignore SIGCHLD */ } else { sigset_t sigset_MaskOriginal = downhill_Sigset_Mask; sigset_t sigset_MaskNew = downhill_Signal_Info[ signal_Number].signal_Mask; /* Set the new signal mask */ sigaddset(&sigset_MaskNew,signal_Number); sigprocmask(SIG_BLOCK,&sigset_MaskNew,NULL); /* Execute the handler */ signal_HandlerOld(signal_Number); /* Restore the signal mask */ sigprocmask(SIG_SETMASK,&sigset_MaskOriginal, NULL); } } PulseEvent(IGotASignal); } }
void print_to_matlab() { int i; FILE *f = fopen("output.m", "w"); if (!f) { perror("fopen"); exit(-1); } fprintf(f, "fd=["); for (i=0;i<nof_bands;i++) { fprintf(f, "%g, ", channels[i].fd); } fprintf(f, "];\n"); fprintf(f, "rssi=["); for (i=0;i<nof_bands;i++) { fprintf(f, "%g, ", rssi[i]); } fprintf(f, "];\n"); fprintf(f, "rssi_d=["); for (i=0;i<nof_bands/RSSI_DECIM;i++) { fprintf(f, "%g, ", rssi_d[i]); } fprintf(f, "];\n"); /* fprintf(f, "cfo=["); for (i=0;i<nof_bands;i++) { if (IS_SIGNAL(i)) { fprintf(f, "%g, ", cfo[i]); } else { fprintf(f, "NaN, "); } } fprintf(f, "];\n"); */ fprintf(f, "p2a=["); for (i=0;i<nof_bands;i++) { if (IS_SIGNAL(i)) { fprintf(f, "%g, ", p2a[i]); } else { fprintf(f, "0, "); } } fprintf(f, "];\n"); fprintf(f, "clf;\n\n"); fprintf(f, "subplot(1,2,1)\n"); fprintf(f, "plot(fd, 10*log10(rssi)+30)\n"); fprintf(f, "grid on; xlabel('f [Mhz]'); ylabel('RSSI [dBm]');\n"); fprintf(f, "title('RSSI Estimation')\n"); fprintf(f, "subplot(1,2,2)\n"); fprintf(f, "plot(fd, p2a)\n"); fprintf(f, "grid on; xlabel('f [Mhz]'); ylabel('Peak-to-Avg [dB]');\n"); fprintf(f, "title('PSS Correlation')\n"); /* fprintf(f, "subplot(1,3,3)\n"); fprintf(f, "plot(fd, cfo)\n"); fprintf(f, "grid on; xlabel('f [Mhz]'); ylabel(''); axis([min(fd) max(fd) -0.5 0.5]);\n"); fprintf(f, "title('CFO Estimation')\n"); */ fprintf(f, "drawnow;\n"); fclose(f); }
int main(int argc, char **argv) { int frame_cnt, valid_frames; int freq; int cell_id; sync_t sfind, strack; float max_peak_to_avg; float sfo; int find_idx, track_idx, last_found; enum sync_state state; int n; filesink_t fs; if (argc < 3) { usage(argv[0]); exit(-1); } parse_args(argc,argv); if (base_init(FLEN)) { fprintf(stderr, "Error initializing memory\n"); exit(-1); } if (sync_init(&sfind, FLEN)) { fprintf(stderr, "Error initiating PSS/SSS\n"); exit(-1); } sync_pss_det_peak_to_avg(&sfind); if (sync_init(&strack, track_len)) { fprintf(stderr, "Error initiating PSS/SSS\n"); exit(-1); } sync_pss_det_peak_to_avg(&strack); nof_bands = lte_band_get_fd_band(band, channels, earfcn_start, earfcn_end, MAX_EARFCN); printf("RSSI scan: %d freqs in band %d, RSSI threshold %.2f dBm\n", nof_bands, band, rssi_threshold); n = rssi_scan(); if (n == -1) { exit(-1); } printf("\nDone. Starting PSS search on %d channels\n", n); usleep(500000); INFO("Setting sampling frequency %.2f MHz\n", (float) SAMP_FREQ/MHZ); cuhd_set_rx_srate(uhd, SAMP_FREQ); cuhd_set_rx_gain(uhd, uhd_gain); print_to_matlab(); filesink_init(&fs, "test.dat", COMPLEX_FLOAT_BIN); freq=0; state = INIT; find_idx = 0; max_peak_to_avg = 0; last_found = 0; frame_cnt = 0; while(freq<nof_bands) { /* scan only bands above rssi_threshold */ if (!IS_SIGNAL(freq)) { INFO("[%3d/%d]: Skipping EARFCN %d %.2f MHz RSSI %.2f dB\n", freq, nof_bands, channels[freq].id, channels[freq].fd,10*log10f(rssi[freq]) + 30); freq++; } else { if (state == TRACK || state == FIND) { cuhd_recv(uhd, &input_buffer[FLEN], FLEN, 1); } switch(state) { case INIT: DEBUG("Stopping receiver...\n",0); cuhd_stop_rx_stream(uhd); /* set freq */ cuhd_set_rx_freq(uhd, (double) channels[freq].fd * MHZ); cuhd_rx_wait_lo_locked(uhd); DEBUG("Set freq to %.3f MHz\n", (double) channels[freq].fd); DEBUG("Starting receiver...\n",0); cuhd_start_rx_stream(uhd); /* init variables */ frame_cnt = 0; max_peak_to_avg = -99; cell_id = -1; /* receive first frame */ cuhd_recv(uhd, input_buffer, FLEN, 1); /* set find_threshold and go to FIND state */ sync_set_threshold(&sfind, find_threshold); sync_force_N_id_2(&sfind, -1); state = FIND; break; case FIND: /* find peak in all frame */ find_idx = sync_run(&sfind, &input_buffer[FLEN]); DEBUG("[%3d/%d]: PAR=%.2f\n", freq, nof_bands, sync_get_peak_to_avg(&sfind)); if (find_idx != -1) { /* if found peak, go to track and set lower threshold */ frame_cnt = -1; last_found = 0; sync_set_threshold(&strack, track_threshold); sync_force_N_id_2(&strack, sync_get_N_id_2(&sfind)); state = TRACK; INFO("[%3d/%d]: EARFCN %d Freq. %.2f MHz PSS found PAR %.2f dB\n", freq, nof_bands, channels[freq].id, channels[freq].fd, 10*log10f(sync_get_peak_to_avg(&sfind))); } else { if (frame_cnt >= nof_frames_find) { state = INIT; printf("[%3d/%d]: EARFCN %d Freq. %.2f MHz No PSS found\r", freq, nof_bands, channels[freq].id, channels[freq].fd, frame_cnt - last_found); if (VERBOSE_ISINFO()) { printf("\n"); } freq++; } } break; case TRACK: INFO("Tracking PSS find_idx %d offset %d\n", find_idx, find_idx + track_len); filesink_write(&fs, &input_buffer[FLEN+find_idx+track_len], track_len); track_idx = sync_run(&strack, &input_buffer[FLEN + find_idx - track_len]); p2a_v[frame_cnt] = sync_get_peak_to_avg(&strack); /* save cell id for the best peak-to-avg */ if (p2a_v[frame_cnt] > max_peak_to_avg) { max_peak_to_avg = p2a_v[frame_cnt]; cell_id = sync_get_cell_id(&strack); } if (track_idx != -1) { cfo_v[frame_cnt] = sync_get_cfo(&strack); last_found = frame_cnt; find_idx += track_idx - track_len; idx_v[frame_cnt] = find_idx; } else { idx_v[frame_cnt] = -1; cfo_v[frame_cnt] = 0.0; } /* if we missed to many PSS it is not a cell, next freq */ if (frame_cnt - last_found > max_track_lost) { INFO("\n[%3d/%d]: EARFCN %d Freq. %.2f MHz %d frames lost\n", freq, nof_bands, channels[freq].id, channels[freq].fd, frame_cnt - last_found); state = INIT; freq++; } else if (frame_cnt >= nof_frames_track) { state = DONE; } break; case DONE: cfo[freq] = mean_valid(idx_v, cfo_v, frame_cnt); p2a[freq] = mean_valid(idx_v, p2a_v, frame_cnt); valid_frames = preprocess_idx(idx_v, idx_valid, t, frame_cnt); sfo = sfo_estimate_period(idx_valid, t, valid_frames, FLEN_PERIOD); printf("\n[%3d/%d]: FOUND EARFCN %d Freq. %.2f MHz. " "PAR %2.2f dB, CFO=%+.2f KHz, SFO=%+2.3f KHz, CELL_ID=%3d\n", freq, nof_bands, channels[freq].id, channels[freq].fd, 10*log10f(p2a[freq]), cfo[freq] * 15, sfo / 1000, cell_id); state = INIT; freq++; break; } if (state == TRACK || (state == FIND && frame_cnt)) { memcpy(input_buffer, &input_buffer[FLEN], FLEN * sizeof(cf_t)); } frame_cnt++; } } print_to_matlab(); sync_free(&sfind); base_free(); printf("\n\nDone\n"); exit(0); }