use erfa_sys::{ERFA_GRS80, ERFA_WGS72, ERFA_WGS84};
use super::ErfaError;
use crate::{
constants::{MWA_HEIGHT_M, MWA_LAT_RAD, MWA_LONG_RAD},
XyzGeocentric,
};
#[derive(Clone, Copy, Debug, Default)]
pub struct LatLngHeight {
pub longitude_rad: f64,
pub latitude_rad: f64,
pub height_metres: f64,
}
pub enum Ellipsoid {
WGS84 = ERFA_WGS84 as isize,
GRS80 = ERFA_GRS80 as isize,
WGS72 = ERFA_WGS72 as isize,
}
impl LatLngHeight {
pub fn new_mwa() -> LatLngHeight {
Self {
longitude_rad: MWA_LONG_RAD,
latitude_rad: MWA_LAT_RAD,
height_metres: MWA_HEIGHT_M,
}
}
pub fn to_geocentric(self, ellipsoid: Ellipsoid) -> Result<XyzGeocentric, ErfaError> {
let mut geocentric_vector: [f64; 3] = [0.0; 3];
let status = unsafe {
erfa_sys::eraGd2gc(
ellipsoid as i32, self.longitude_rad, self.latitude_rad, self.height_metres, geocentric_vector.as_mut_ptr(), )
};
if status != 0 {
return Err(ErfaError {
source_file: file!(),
source_line: line!(),
status,
function: "eraGd2gc",
});
}
Ok(XyzGeocentric {
x: geocentric_vector[0],
y: geocentric_vector[1],
z: geocentric_vector[2],
})
}
pub fn to_geocentric_wgs84(self) -> Result<XyzGeocentric, ErfaError> {
self.to_geocentric(Ellipsoid::WGS84)
}
}