unsigned lbalance_target(struct lbalance *lb) { if (!lb->target_uptodate) { lb->target = calculate_target(lb); lb->target_uptodate = true; } return lb->target; }
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(); }