Example #1
0
unsigned lbalance_target(struct lbalance *lb)
{
	if (!lb->target_uptodate) {
		lb->target = calculate_target(lb);
		lb->target_uptodate = true;
	}
	return lb->target;
}
Example #2
0
void
board_set_level (int level)
{
	board *b = CUR_BOARD;
	if (level == b->level)
		return;

	PROTECT_BEGIN;
	b->level = level;
	invalidate_dd_scores (b);
	calculate_target(b);
	show_board(b, REDRAW_CONTRACT | REDRAW_BOARD_LIST);
	PROTECT_END;
}
int calculate_sweeps (mvmt_t* mvmt, sweeps_data_t* sweeps_data, int i_start, int i_stop) {
  int i;
  int i_peak_fall = 0, i_peak_rise = 0;

  for (i = i_start; i < i_stop; i++) {
    if ( sweeps_data->rise[i] > sweeps_data->rise[i_peak_rise])
      i_peak_rise = i;
    if ( sweeps_data->fall[i] > sweeps_data->fall[i_peak_fall])
      i_peak_fall = i;
  }

  if (i_peak_fall == 0 || i_peak_rise == 0 || i_peak_fall == i_stop || i_peak_rise == i_stop)
    return 0;

  if (!calculate_target (mvmt, sweeps_data, i_peak_rise, i_peak_fall) )
    return 0;

  return 1;
}
//
//void track_target(double *harm_locked, double *fharm_locked,
//                  mvmt_t *mvmt, mvmt_t *mvmt_locked, double *spds,
//                  int v_avg_n, int *v_avg_fill,int per) {
//  double _harm_locked = *harm_locked;
//  int _fharm_locked = *fharm_locked;
//  int _v_avg_fill = *v_avg_fill;
//
//  memcpy(mvmt,mvmt_locked,sizeof(mvmt_t));
//  mvmt = mvmt_locked;
//
//  //додумываем скорость
//  if(v_avg_n > 0) {
//    mvmt_set_spd(mvmt,avg_spd(v_avg,_v_avg_fill));
//    avg_spd_add(mvmt->sspeed, v_avg, v_avg_n);
//    _v_avg_fill += (_v_avg_fill < v_avg_n);
//    *v_avg_fill = _v_avg_fill;
//  }
//
//  //додумываем расстояние
//  if(do_recalc_dist) {
//    _fharm_locked = recalc_dist(harm_locked,mvmt.sspeed,per);
//    *fharm_locked = _fharm_locked;
//    _harm_locked = round_dist(fharm_locked);
//    *harm_locked = _harm_locked;
//  }
//}
int write_to_rrw_points(rrw_point_t* rrw_point, sweeps_data_t* sweeps_data, int sweep_size, int win_min, int win_max, threshold_t* threshold,
                        int cycle_per, double *v_avg) {
  static int lock = 0;
  int i_peak_rise, i_peak_fall;
  mvmt_t mvmt;
  static int v_avg_fill = 0;
  double harm_expected;

  if (sweeps_data->rise == NULL || sweeps_data->fall == NULL || rrw_point == NULL)
    return 0;

  //очищаем точки целей
  clr_rrw_points(rrw_point,win_min,win_max);

  //поиск глобального максимума
  find_maxs(sweeps_data,win_min,win_max,threshold,&i_peak_rise,&i_peak_fall);

  //Обнаружение цели:
  if (i_peak_rise < 0 || i_peak_fall < 0) { //цель потеряна?
    //ведение цели
    if ((count_fail_detect < MAX_COUNT_FAIL_DETECT) && do_restore && lock) {
      //наращиваем счётчик додумываний (допустимых потерь захвата)
      count_fail_detect++;

      //восстанавливаем движение цели по последнему состоянию захвата
      mvmt = mvmt_locked;

      //додумываем скорость
      if((v_avg_n > 0) && (v_avg_fill > 0)) {
        mvmt_set_spd(&mvmt,avg_spd(v_avg,v_avg_fill));
        avg_spd_add(mvmt.sspeed, v_avg, v_avg_n);
        v_avg_fill += (v_avg_fill<v_avg_n);
      }

      //додумываем расстояние
      if(do_recalc_dist) {
        fharm_locked = recalc_dist(harm_locked,mvmt.sspeed,cycle_per);
        harm_locked = round_dist(fharm_locked);
      }
      //заполняем додуманную точку цели
      rrw_point[harm_locked] = rrw_point_locked;
      rrw_point[harm_locked].speed = mvmt.speed;
      rrw_point[harm_locked].status_direct = mvmt.mv_to_radar ? RRW_STATUS_DIRECT_TO_RADAR : RRW_STATUS_DIRECT_FROM_RADAR;

    } else { //потеря захвата

      //очищаем массив скоростей для усреднения
      if(v_avg_n>0) {
        clr_avg_spds(v_avg,v_avg_n);
        v_avg_fill = 0;
      }

      //очищаем параметры цели при последнем захвате
      memset(&mvmt_locked, 0, sizeof(mvmt_t));
      memset(&rrw_point_locked, 0, sizeof(rrw_point_t));
      fharm_locked = harm_locked = 0;
      count_fail_detect = 0;

      //теряем захват
      if(lock)
        target_lost(&lock);

      return 0;
    }
  } else { //цель в захвате

    calculate_target (&mvmt, sweeps_data, i_peak_rise, i_peak_fall);

//    harm_expected = (mvmt.peak_estim_rise + mvmt.peak_estim_fall)/2.0;

    fharm_locked = (mvmt.peak_estim_rise + mvmt.peak_estim_fall)/2.0;
    harm_locked = round_dist(fharm_locked);

    if(v_avg_n>0) {
      //добавляем скорость в массив для усреднения
      avg_spd_add(mvmt.sspeed,v_avg,v_avg_n);
      v_avg_fill += (v_avg_fill<v_avg_n);

      //вычисляем текущую скорость как среднее и оцениваем
      mvmt_set_spd(&mvmt,avg_spd(v_avg,v_avg_fill));
    }

    //сохраняем параметры движения последнего захвата
    mvmt_locked = mvmt;

    //заполняем точку цели
    rrw_point[harm_locked].status_target = RRW_STATUS_TARGET_DETECT;
    rrw_point[harm_locked].status_direct = mvmt.mv_to_radar ? RRW_STATUS_DIRECT_TO_RADAR : RRW_STATUS_DIRECT_FROM_RADAR;
    rrw_point[harm_locked].speed = mvmt.speed;
    rrw_point[harm_locked].status_speed = get_speed_status (mvmt.speed);
    rrw_point[harm_locked].power = sweeps_data->rise[i_peak_rise];

    //сохраняем додуманную точку цели
    rrw_point_locked = rrw_point[harm_locked];

    //обнуляем счётчик додумываний (допустимых потерь захвата)
    count_fail_detect = 0;

    if(!lock)
      target_locked(&lock);
  }

  return 1;
}
void lpf_work(void)
{
	calculate_target();
	calculate_current();
	calculate_final();
}