Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
0
/* 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);
	}
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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);
}