/* * DspRisProxy.cpp * */ #include "DspRisProxy.h" #include "dsp_ris_internals_.h" #include "rtlog.h" #include #define LOGID "RIS" #ifdef __MINGW32__ #define RIS_PROXY_BRIDGE_SECTION #else #define RIS_PROXY_BRIDGE_SECTION __attribute__((section(".dsp_ris_proxy_bridge"))) #endif struct dsp_ris_proxy_t { int grant; int enable; int map_enable; }; static dsp_ris_proxy_t dsp_ris_proxy; struct dsp_ris_proxy_bridge_t { uint32_t marker_begin; uint32_t marker_end; }; dsp_ris_proxy_bridge_t dsp_ris_proxy_bridge__ RIS_PROXY_BRIDGE_SECTION; void DspRisProxy::risMasterGrant(bool grant) { if (dsp_ris_proxy.grant) { if (!grant) { dsp_ris_proxy.enable=0; } else dsp_ris_proxy.enable=1; } else { if (grant) { DspRisInstall(); rtlog_const_message(LOGID, rtlog_breaking_news|rtlog_report, "RIS GRANT: ENABLE"); dsp_ris_proxy.grant=1; dsp_ris_proxy.enable=1; } } } void DspRisProxy::risProcessEnvironment(unsigned int timetag, const iddtypes::inu_data_t* inu) { if (!dsp_ris_proxy.enable) return; if (!inu) return; DspRisProcessEnvironment(timetag, inu); } #include "dspExt.h" #include void DspRisProxy::risPostprocessNci(DspLrpHeaderOutput::Header* hdrptr, float* sum, float* guard, float* daz, float* del) { //if (!dsp_ris_proxy.enable) // return; if (hdrptr->ge.mode.operation_mode==iddtypes::agr_master_mode) { if (dsp_ris_tgt_db.agr.enable) { const float RB_LEN=74.948125f; int N_RBIN=(hdrptr->results.nci_results.n_rbin); int r_len=(dsp_ris_tgt_db.agr.rb_len>0 ? dsp_ris_tgt_db.agr.rb_len : 50)/2; float max_rng=N_RBIN*RB_LEN; N_RBIN=N_RBIN & (~1U); // make even float el=-hdrptr->ge.general_settings.antenna.position.navel_rad; bool lock=false; float rng=0; if ((hdrptr->ge.function_settings.pe_settings.stt_rb_start>0) && (hdrptr->ge.function_settings.pe_settings.stt_rb_stop>hdrptr->ge.function_settings.pe_settings.stt_rb_start)) { r_len=(hdrptr->ge.function_settings.pe_settings.stt_rb_stop-hdrptr->ge.function_settings.pe_settings.stt_rb_start)/2; rng=(hdrptr->ge.function_settings.pe_settings.stt_rb_start+r_len)*RB_LEN; if ((rngRB_LEN)) { lock=true; } } else if (el>deg_to_rad(0.2)) { float sel=sinf(el); float altitude=hdrptr->ge.general_settings.navigation.geo_pos.altitude_m; rng=altitude/sel; float min_rng=dsp_ris_tgt_db.agr.enable>1 ? 10 : altitude; if ((rngmin_rng)) lock=true; //if ((rngaltitude)) // lock=true; } if (lock) { int r_start=dsp_ris_tgt_db.agr.rb_start ? dsp_ris_tgt_db.agr.rb_start : rng/RB_LEN; //int r_len=(dsp_ris_tgt_db.agr.rb_len>0 ? dsp_ris_tgt_db.agr.rb_len : 50)/2; r_start-=r_len; int r_stop=r_start+r_len; r_start=r_start & (~1U); // make even r_stop=r_stop & (~1U); // make even int i=0; float* __restrict S_NCI=sum; float* __restrict G_NCI=guard; float* __restrict DAZ_NCI=daz; float* __restrict DEL_NCI=del; { int t_begin=r_start=N_RBIN) r_stop=N_RBIN; float d_lvl=(r_stop-r_start); float level=dsp_ris_tgt_db.agr.level ? dsp_ris_tgt_db.agr.level : 100; if (level>32000) level=32000; if (level<1) level=1; float level_start=level; float l_inc=(level*2)/d_lvl; float l_max=1/level; level=-level; std::_nassert(r_stop % 2 ==0); std::_nassert(((unsigned int)S_NCI % 4)==0); std::_nassert(((unsigned int)G_NCI % 4)==0); std::_nassert(((unsigned int)DAZ_NCI % 4)==0); std::_nassert(((unsigned int)DEL_NCI % 4)==0); for(;iheader.header); return true; } bool DspRisProxy::risPostprocessSignal(const DspLrpHeaderOutput::Header* hdrptr, DspRawSweepData* sc) { if (!dsp_ris_proxy.enable) return false; return DspRisPostprocessSignal(hdrptr, sc); } bool DspRisProxy::risPostprocessDetection(const DspLrpHeaderOutput::Header* hdrptr, idddsp::dsp_detections_t* det, idddsp::dsp_stt_data_t* stt) { if (!dsp_ris_proxy.enable) return false; DspRisTargetsLookup(hdrptr, *det, stt, true); return true; } static void ris_go() { DspRisProxy::risMasterGrant(true); } static void ris_stop() { dsp_ris_proxy.enable=0; } #include "mex.h" int dsp_ris_proxy_autostart_; void DspRisProxy::risInitialize() { static unsigned int ris_proxy_initialized; if (!ris_proxy_initialized) //WARNING: not thread safe { ris_proxy_initialized=1; mex_add_simple_command("ris_go", ris_go); mex_add_simple_command("ris_stop", ris_stop); } #ifdef __MINGW32__ if (dsp_ris_proxy_autostart_) ris_go(); #endif }