Пример #1
0
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;
}
Пример #2
0
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));
}
Пример #3
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;
    }