#![allow(non_snake_case)]
#![allow(dead_code)]
use std::os::raw::c_char;
unsafe extern "C" {
pub fn SatStateInit(apAddr: i64) -> i32;
pub fn SatStateGetInfo(infoStr: *const c_char);
pub fn SatStateLoadFile(inputFile: *const c_char, xf_Task: i32) -> i32;
pub fn SatStateSaveFile(outFile: *const c_char, saveMode: i32, saveForm: i32, xf_Task: i32) -> i32;
pub fn SatStateRemoveSat(satKey: i64) -> i32;
pub fn SatStateRemoveSatAll(satKey: i64) -> i32;
pub fn SatStateRemoveAllSats() -> i32;
pub fn SatStateReset();
pub fn SatStateGetCount() -> i32;
pub fn SatStateGetLoaded(order: i32, satKeys: *mut i64);
pub fn SatStateNumToKey(satNum: i32) -> i64;
pub fn SatStateGetSatDataAll(
satKey: i64,
satNum: *mut i32,
satName: *const c_char,
eltType: *mut i32,
revNum: *mut i32,
epochDs50UTC: *mut f64,
bField: *mut f64,
elsetNum: *mut i32,
incli: *mut f64,
node: *mut f64,
eccen: *mut f64,
omega: *mut f64,
mnAnomaly: *mut f64,
mnMotion: *mut f64,
period: *mut f64,
perigeeHt: *mut f64,
apogeeHt: *mut f64,
perigee: *mut f64,
apogee: *mut f64,
a: *mut f64,
) -> i32;
pub fn SatStateGetSatDataField(satKey: i64, xf_Sat: i32, retVal: *const c_char) -> i32;
pub fn SatStateInitSat(satKey: i64) -> i32;
pub fn SatStateMse(
satKey: i64,
mse: f64,
ds50UTC: *mut f64,
revNum: *mut i32,
pos: *mut [f64; 3],
vel: *mut [f64; 3],
llh: *mut [f64; 3],
) -> i32;
pub fn SatStateDs50UTC(
satKey: i64,
ds50UTC: f64,
mse: *mut f64,
revNum: *mut i32,
pos: *mut [f64; 3],
vel: *mut [f64; 3],
llh: *mut [f64; 3],
) -> i32;
pub fn SatStateGetPropOut(satKey: i64, index: i32, destArr: *mut [f64; 128]) -> i32;
pub fn SatStateEphCom(
primSatKey: i64,
secSatKey: i64,
ds50UTC: f64,
uvwFlag: i32,
xa_Delta: *mut [f64; 100],
) -> i32;
pub fn SatStateEphCom_OS(
priPosVel: *const [f64; 6],
secPosVel: *const [f64; 6],
ds50UTC: f64,
uvwFlag: i32,
xa_Delta: *mut [f64; 100],
);
pub fn SatStateHasCovMtx(satKey: i64) -> i32;
pub fn SatStateGetCovUVW(satKey: i64, ds50UTC: f64, covUVW: *mut [[f64; 6]; 6]) -> i32;
pub fn SatStateGenEphFile(
satKey: i64,
startDs50UTC: f64,
stopDs50UTC: f64,
stepSizeSecs: f64,
ephFileName: *const c_char,
ephFileType: i32,
) -> i32;
pub fn GetNodalCrossingPriorToTime(satKey: i64, ds50TAI: f64) -> f64;
pub fn GetGobsParams(satKey: i64, ds50UTC: f64, xa_gobs: *mut [f64; 32], errCode: *mut i32);
pub fn GobsCom(
primSatKey: i64,
secSatKey: i64,
ds50UTC: f64,
xa_gobs_lim: *const [f64; 16],
xa_gobs_delta: *mut [f64; 32],
) -> i32;
pub fn GobsComArr(
xa_gobs_prim: *const [f64; 32],
xa_gobs_sec: *const [f64; 32],
xa_gobs_lim: *const [f64; 16],
xa_gobs_delta: *mut [f64; 16],
);
}
pub static XF_SATFIELD_EPOCHUTC: i32 = 1;
pub static XF_SATFIELD_MNANOM: i32 = 2;
pub static XF_SATFIELD_NODE: i32 = 3;
pub static XF_SATFIELD_OMEGA: i32 = 4;
pub static XF_SATFIELD_PERIOD: i32 = 5;
pub static XF_SATFIELD_ECCEN: i32 = 6;
pub static XF_SATFIELD_INCLI: i32 = 7;
pub static XF_SATFIELD_MNMOTION: i32 = 8;
pub static XF_SATFIELD_BFIELD: i32 = 9;
pub static XF_SATFIELD_PERIGEEHT: i32 = 10;
pub static XF_SATFIELD_APOGEEHT: i32 = 11;
pub static XF_SATFIELD_PERIGEE: i32 = 12;
pub static XF_SATFIELD_APOGEE: i32 = 13;
pub static XF_SATFIELD_A: i32 = 14;
pub static XF_SATFIELD_NDOT: i32 = 15;
pub static XF_SATFIELD_SATCAT: i32 = 16;
pub static XF_SATFIELD_HTM3: i32 = 17;
pub static XF_SATFIELD_CMOFFSET: i32 = 18;
pub static XF_SATFIELD_N2DOT: i32 = 19;
pub static XF_SATFIELD_NODEDOT: i32 = 20;
pub static XF_SATFIELD_ERRORTIME: i32 = 21;
pub static XF_SATFIELD_MU: i32 = 22;
pub static XA_DELTA_POS: usize = 0;
pub static XA_DELTA_TIME: usize = 1;
pub static XA_DELTA_PRADIAL: usize = 2;
pub static XA_DELTA_PINTRCK: usize = 3;
pub static XA_DELTA_PCRSSTRCK: usize = 4;
pub static XA_DELTA_VEL: usize = 5;
pub static XA_DELTA_VRADIAL: usize = 6;
pub static XA_DELTA_VINTRCK: usize = 7;
pub static XA_DELTA_VCRSSTRCK: usize = 8;
pub static XA_DELTA_BETA: usize = 9;
pub static XA_DELTA_HEIGHT: usize = 10;
pub static XA_DELTA_ANGMOM: usize = 11;
pub static XA_DELTA_MHLNBS_UVW: i32 = 12;
pub static XA_DELTA_MHLNBS_HTB: i32 = 13;
pub static XA_DELTA_SIZE: usize = 100;
pub static XF_SAT_NUM: i32 = 1;
pub static XF_SAT_NAME: i32 = 2;
pub static XF_SAT_ELTTYPE: i32 = 3;
pub static XF_SAT_EPHTYPE: i32 = 3;
pub static XF_SAT_REVNUM: i32 = 4;
pub static XF_SAT_EPOCH: i32 = 5;
pub static XF_SAT_BFIELD: i32 = 6;
pub static XF_SAT_ELSETNUM: i32 = 7;
pub static XF_SAT_INCLI: i32 = 8;
pub static XF_SAT_NODE: i32 = 9;
pub static XF_SAT_ECCEN: i32 = 10;
pub static XF_SAT_OMEGA: i32 = 11;
pub static XF_SAT_MNANOM: i32 = 12;
pub static XF_SAT_MNMOTN: i32 = 13;
pub static XF_SAT_PERIOD: i32 = 14;
pub static XF_SAT_PERIGEEHT: i32 = 15;
pub static XF_SAT_APOGEEHT: i32 = 16;
pub static XF_SAT_PERIGEE: i32 = 17;
pub static XF_SAT_APOGEE: i32 = 18;
pub static XF_SAT_A: i32 = 19;
pub static XF_TASK_CTRLONLY: i32 = 1;
pub static XF_TASK_SATONLY: i32 = 2;
pub static XF_TASK_BOTH: i32 = 3;
pub static EPHFILETYPE_ITC: i32 = 1;
pub static EPHFILETYPE_ITC_WOCOV: i32 = 2;
pub static XA_GOBS_SATNUM: i32 = 0;
pub static XA_GOBS_LONE: i32 = 1;
pub static XA_GOBS_DRIFT: i32 = 2;
pub static XA_GOBS_RELENERGY: i32 = 3;
pub static XA_GOBS_WX: i32 = 4;
pub static XA_GOBS_WY: i32 = 5;
pub static XA_GOBS_WZ: i32 = 6;
pub static XA_GOBS_ABARX: i32 = 7;
pub static XA_GOBS_ABARY: i32 = 8;
pub static XA_GOBS_ABARZ: i32 = 9;
pub static XA_GOBS_AGOM: i32 = 10;
pub static XA_GOBS_TROUGH: i32 = 11;
pub static XA_GOBS_SIZE: i32 = 32;
pub static XA_GOBS_LIM_TROUGH: i32 = 0;
pub static XA_GOBS_LIM_PCP: i32 = 1;
pub static XA_GOBS_LIM_PCS: i32 = 2;
pub static XA_GOBS_LIM_ACTIVEP: i32 = 3;
pub static XA_GOBS_LIM_ACTIVES: i32 = 4;
pub static XA_GOBS_LIM_LONGMIN: i32 = 5;
pub static XA_GOBS_LIM_LONGMAX: i32 = 6;
pub static XA_GOBS_LIM_AGOMMIN: i32 = 7;
pub static XA_GOBS_LIM_AGOMMAX: i32 = 8;
pub static XA_GOBS_LIM_SIZE: i32 = 16;
pub static XA_GOBS_DELTA_PRIMESAT: i32 = 0;
pub static XA_GOBS_DELTA_SECONDARYSAT: i32 = 1;
pub static XA_GOBS_DELTA_ASTAT: i32 = 2;
pub static XA_GOBS_DELTA_DOP: i32 = 3;
pub static XA_GOBS_DELTA_DABAR: i32 = 4;
pub static XA_GOBS_DELTA_DRELENERGY: i32 = 5;
pub static XA_GOBS_DELTA_LONGP: i32 = 6;
pub static XA_GOBS_DELTA_LONGMIN: i32 = 7;
pub static XA_GOBS_DELTA_LONGMAX: i32 = 8;
pub static XA_GOBS_DELTA_TROUGH: i32 = 9;
pub static XA_GOBS_DELTA_PLANE: i32 = 10;
pub static XA_GOBS_DELTA_SHAPE: i32 = 11;
pub static XA_GOBS_DELTA_ENERGY: i32 = 12;
pub static XA_GOBS_DELTA_LONG: i32 = 13;
pub static XA_GOBS_DELTA_AGOM: i32 = 14;
pub static XA_GOBS_DELTA_SIZE: i32 = 16;
pub fn get_relative_array(
target_posvel: &[f64; 6],
chase_posvel: &[f64; 6],
utc_ds50: f64,
frame: i32,
) -> [f64; XA_DELTA_SIZE] {
let mut xa_delta: [f64; XA_DELTA_SIZE] = [0.0; XA_DELTA_SIZE];
unsafe {
SatStateEphCom_OS(target_posvel, chase_posvel, utc_ds50, frame, &mut xa_delta);
}
xa_delta
}
pub fn get_prior_nodal_crossing(sat_key: i64, tai_ds50: f64) -> f64 {
unsafe { GetNodalCrossingPriorToTime(sat_key, tai_ds50) }
}
#[cfg(test)]
mod tests {
use approx::assert_abs_diff_eq;
use super::*;
use crate::test_lock::TEST_LOCK;
const TARGET_TEME_X: f64 = 42164.0;
const TARGET_TEME_Y: f64 = 0.0;
const TARGET_TEME_Z: f64 = 0.0;
const TARGET_TEME_VX: f64 = 0.0;
const TARGET_TEME_VY: f64 = 3.0746;
const TARGET_TEME_VZ: f64 = 0.0;
const CHASE_TEME_X: f64 = 42160.0;
const CHASE_TEME_Y: f64 = 1.0;
const CHASE_TEME_Z: f64 = 1.0;
const CHASE_TEME_VX: f64 = 0.0;
const CHASE_TEME_VY: f64 = 3.0746;
const CHASE_TEME_VZ: f64 = 0.0;
#[test]
fn test_get_relative_state() {
let _lock = TEST_LOCK.lock().unwrap();
let target_posvel = [
TARGET_TEME_X,
TARGET_TEME_Y,
TARGET_TEME_Z,
TARGET_TEME_VX,
TARGET_TEME_VY,
TARGET_TEME_VZ,
];
let chase_posvel = [
CHASE_TEME_X,
CHASE_TEME_Y,
CHASE_TEME_Z,
CHASE_TEME_VX,
CHASE_TEME_VY,
CHASE_TEME_VZ,
];
let utc_ds50 = 25567.0; let delta = get_relative_array(&target_posvel, &chase_posvel, utc_ds50, 1);
assert_abs_diff_eq!(delta[XA_DELTA_PRADIAL], -4.0, epsilon = 1e-4);
assert_abs_diff_eq!(delta[XA_DELTA_PINTRCK], 1.0, epsilon = 1e-4);
assert_abs_diff_eq!(delta[XA_DELTA_PCRSSTRCK], 1.0, epsilon = 1e-4);
assert_abs_diff_eq!(delta[XA_DELTA_VRADIAL], 0.0, epsilon = 1e-4);
assert_abs_diff_eq!(delta[XA_DELTA_VINTRCK], 0.0, epsilon = 1e-4);
assert_abs_diff_eq!(delta[XA_DELTA_VCRSSTRCK], 0.0, epsilon = 1e-4);
}
}