static long do_search(struct old_xfer_req *req, double target, struct nrts_chn *chn, long left, long rite, char *buffer) { long test; struct span *span; static char *fid = "do_search"; span = get_span(req, left, chn, buffer); if (target >= span->beg && target <= span->end) { return left; } span = get_span(req, rite, chn, buffer); if (target >= span->beg && target <= span->end) { return rite; } while (rite - left > 1) { test = left + ((rite - left)/2); span = get_span(req, test, chn, buffer); if (target >= span->beg && target <= span->end) { return test; } if (target > span->end) { left = test; } else { rite = test; } } return rite; }
long search(struct old_xfer_req *req, struct nrts_chn *chn, double target, long ldef, long rdef, char *buffer) { struct span *span, dl; long oldest, yngest; static char *fid = "search"; oldest = chn->hdr.oldest; yngest = chn->hdr.yngest; util_log(3, "`%s' search for time %s", chn->name, util_dttostr(target, 0)); util_log(3, "`%s' oldest = %ld, youngest = %ld", chn->name, oldest, yngest); /* First, insure the desired time falls inside the disk buffer */ span = get_span(req, oldest, chn, buffer); dl.beg = span->beg; span = get_span(req, yngest, chn, buffer); dl.end = span->end; sprintf(buffer, "`%s' spans %s ", chn->name, util_dttostr(dl.beg, 0)); util_log(3, "%s to %s", buffer, util_dttostr(dl.end, 0)); if (target < dl.beg) { util_log(3, "`%s' target too old, return %d", chn->name, ldef); return ldef; } if (target > dl.end) { util_log(3, "`%s' target too young, return %d", chn->name, rdef); return rdef; } /* It must be available, so search for it */ /* First case, no wraparound at end of disk buffer */ if (oldest < yngest) { util_log(3, "`%s' no disk loop wrap around"); util_log(3, "`%s' search from oldest (%ld) to youngest (%ld)", chn->name, oldest, yngest ); return do_search(req, target, chn, oldest, yngest, buffer); } /* Second case, data wrap around end of disk buffer */ span = get_span(req, (long) 0, chn, buffer); span->beg -= chn->sint; /* will allow for one sample slop */ if (target > span->beg && target <= dl.end) { util_log(3, "`%s' target is in later half of disk buffer", chn->name); util_log(3, "`%s' search from 0 to youngest (%ld)", chn->name, yngest ); return do_search(req, target, chn, 0, yngest, buffer); } else { span = get_span(req, (long) chn->hdr.nrec - 1, chn, buffer); if (target > dl.beg && target <= span->end) { util_log(3, "`%s' search from oldest (%ld) to eof (%ld)", chn->name, oldest, chn->hdr.nrec - 1 ); return do_search(req,target,chn,oldest,chn->hdr.nrec - 1,buffer); } else { util_log(1, "HELP! I don't know what to do!"); util_log(1, "target = %s", util_dttostr(target, 0)); util_log(1, "dl beg = %s", util_dttostr(dl.beg, 0)); util_log(1, "dl end = %s", util_dttostr(dl.end, 0)); util_log(1, "end of dl file time = %s", util_dttostr(span->end, 0)); ack(0); die(1); } } util_log(1, "%s: FATAL PROGRAM LOGIC ERROR!", fid); util_log(1, "%s: target = %s", fid, util_dttostr(target, 0)); util_log(1, "%s: dl beg = %s", fid, util_dttostr(dl.beg, 0)); util_log(1, "%s: dl end = %s", fid, util_dttostr(dl.end, 0)); }
ada::data_t fill_data(std::string const& bada_path, std::string const& aircraft_kind ) { ada::data_t ac_settings; create_proxy_fn_t create_proxy_fn = reinterpret_cast<create_proxy_fn_t> (lib_loader().get_symbol(BADA_DLL,"create_proxy")); if (create_proxy_fn) { auto proxy = create_proxy_fn(bada_path); //auto proxy = bada::create_proxy(bada_path); auto syn_data = proxy->get_synonim_data(aircraft_kind) ; if(!syn_data) syn_data = proxy->get_synonim_data("A319") ; auto air_data = proxy->get_aircraft_data(syn_data->getSynonim()) ; auto air_global_data = proxy->get_global_data() ; ac_settings.base_model = syn_data->getSynonim(); ac_settings.manufacturer = syn_data->getManufacturer(); ac_settings.model_name = syn_data->getModelName(); ac_settings.S = air_data->get_S(); ac_settings.span = air_data->get_span(); ac_settings.length = air_data->get_length(); ac_settings.engine = air_data->getEngineType(); ac_settings.turbulence = air_data->getWakeCategory(); ac_settings.cd_0_cruise = air_data->get_Cd0_cr(); ac_settings.cd_2_cruise = air_data->get_Cd2_cr(); ac_settings.cd_0_approach = air_data->get_Cd0_ap(); ac_settings.cd_2_approach = air_data->get_Cd2_ap(); ac_settings.cd_0_landing = air_data->get_Cd0_ld(); ac_settings.cd_0_landing_gear = air_data->get_Cd0_ldg(); ac_settings.cd_2_landing = air_data->get_Cd2_ld(); ac_settings.cf_1 = air_data->get_Cf_1(); ac_settings.cf_2 = air_data->get_Cf_2() * cg::kt2mps(); ac_settings.cf_3 = air_data->get_Cf_3() / 60.; ac_settings.cf_4 = air_data->get_Cf_4() * cg::feet2meter(); ac_settings.cf_cruise = air_data->get_Cfr(); switch(ac_settings.engine) { case bada::jet: ac_settings.cf_1 /= (60. * 1000.); break; case bada::turboprop: ac_settings.cf_1 /= (60. * 1000. * cg::kt2mps()); break; case bada::piston: ac_settings.cf_1 /= 60.; break; } ac_settings.nominal_ba_to_ld = 15.; // TODO: make difference to military objects ac_settings.nominal_ba = 35.; ac_settings.max_ba_to_ld = 25.; ac_settings.max_ba_hold = 35.; ac_settings.max_ba = 45.; ac_settings.max_operating_height = air_data->get_hmo() * cg::feet2meter(); ac_settings.max_height = air_data->get_hmax() * cg::feet2meter(); ac_settings.temperature_gradient = air_data->get_Gt() * cg::feet2meter(); ac_settings.mass_gradient = air_data->get_Gw() * cg::feet2meter(); ac_settings.max_mass = air_data->get_m_max() * 1000; ac_settings.min_mass = air_data->get_m_min() * 1000; ac_settings.max_payload_mass = air_data->get_m_pyld() * 1000; ac_settings.ref_mass = air_data->get_m_ref() * 1000; if (ac_settings.engine == bada::jet ||ac_settings.engine == bada::piston) ac_settings.ct_1 = air_data->get_Ctc_1(); else // turboprop ac_settings.ct_1 = air_data->get_Ctc_1() * cg::kt2mps(); ac_settings.ct_2 = air_data->get_Ctc_2() * cg::feet2meter(); if (ac_settings.engine == bada::jet) ac_settings.ct_3 = air_data->get_Ctc_3() / cg::sqr(cg::feet2meter()); else if (ac_settings.engine == bada::turboprop) ac_settings.ct_3 = air_data->get_Ctc_3(); else // piston ac_settings.ct_3 = air_data->get_Ctc_3() * cg::kt2mps(); ac_settings.ct_4 = air_data->get_Ctc_4(); ac_settings.ct_5 = air_data->get_Ctc_5(); ac_settings.ct_descent_low = air_data->get_Ct_des_low(); ac_settings.descent_height_level = air_data->get_Hp_des() * cg::feet2meter(); ac_settings.ct_descent_high = air_data->get_Ct_des_high(); ac_settings.ct_descent_approach = air_data->get_Ct_des_app(); ac_settings.ct_descent_landing = air_data->get_Ct_des_ld(); ac_settings.V_1[fms::climb_stage] = air_data->getDataCLS().getStandardCAS().first * cg::kt2mps(); ac_settings.V_1[fms::cruise_stage] = air_data->getDataCRS().getStandardCAS().first * cg::kt2mps(); ac_settings.V_1[fms::descent_stage] = air_data->getDataDS().getStandardCAS().first * cg::kt2mps(); ac_settings.V_2[fms::climb_stage] = air_data->getDataCLS().getStandardCAS().second * cg::kt2mps(); ac_settings.V_2[fms::cruise_stage] = air_data->getDataCRS().getStandardCAS().second * cg::kt2mps(); ac_settings.V_2[fms::descent_stage] = air_data->getDataDS().getStandardCAS().second * cg::kt2mps(); ac_settings.M[fms::climb_stage] = air_data->getDataCLS().getMach(); ac_settings.M[fms::cruise_stage] = air_data->getDataCRS().getMach(); ac_settings.M[fms::descent_stage] = air_data->getDataDS().getMach(); // jet ac_settings.v_d_cl[0] = 5 * cg::kt2mps(); ac_settings.v_d_cl[1] = 10 * cg::kt2mps(); ac_settings.v_d_cl[2] = 30 * cg::kt2mps(); ac_settings.v_d_cl[3] = 60 * cg::kt2mps(); ac_settings.v_d_cl[4] = 80 * cg::kt2mps(); // turboprop/piston ac_settings.v_d_cl[5] = 20 * cg::kt2mps(); ac_settings.v_d_cl[6] = 30 * cg::kt2mps(); ac_settings.v_d_cl[7] = 35 * cg::kt2mps(); // jet/turboprop ac_settings.v_d_des[0] = 5 * cg::kt2mps(); ac_settings.v_d_des[1] = 10 * cg::kt2mps(); ac_settings.v_d_des[2] = 20 * cg::kt2mps(); ac_settings.v_d_des[3] = 50 * cg::kt2mps(); // piston ac_settings.v_d_des[4] = 5 * cg::kt2mps(); ac_settings.v_d_des[5] = 10 * cg::kt2mps(); ac_settings.v_d_des[6] = 20 * cg::kt2mps(); ac_settings.v_stall_to = air_data->get_Vstall_to() * cg::kt2mps(); ac_settings.v_stall_ic = air_data->get_Vstall_ic() * cg::kt2mps(); ac_settings.v_stall_cr = air_data->get_Vstall_cr() * cg::kt2mps(); ac_settings.v_stall_ap = air_data->get_Vstall_ap() * cg::kt2mps(); ac_settings.v_stall_ld = air_data->get_Vstall_ld() * cg::kt2mps(); ac_settings.v_rw_backtrack = 35 * cg::kt2mps(); ac_settings.v_taxi = 15 * cg::kt2mps(); ac_settings.v_apron = 10 * cg::kt2mps(); ac_settings.v_gate = 5 * cg::kt2mps(); ac_settings.c_v_min = air_global_data->getCVmin(0).second; ac_settings.c_v_min_to = 1.2; ac_settings.h_descent = air_data->get_Hp_des() * cg::feet2meter(); ac_settings.h_max_to = 400 * cg::feet2meter(); ac_settings.h_max_ic = 2000 * cg::feet2meter(); ac_settings.h_max_ap = 8000 * cg::feet2meter(); ac_settings.h_max_ld = 3000 * cg::feet2meter(); ac_settings.takeoff_length = 0.75 * air_data->get_TOL(); ac_settings.landing_length = air_data->get_LDL(); ac_settings.max_cas = air_data->get_Vmo() * cg::kt2mps(); ac_settings.max_mach = air_data->get_Mmo(); } return ac_settings; }