1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/*
* Traditional astrology for rust
* ==============================
*
* Rust library by Stéphane (s.bressani@bluewin.ch)
*
* Using swissephem c library by Astrodienst AG
* by Dieter Koch and Alois Treindl (https://www.astro.com/ftp/swisseph/)
*
* The source code is released under an CC License, which allows it to be used
* also on commercial projects. This software uses the swiss ephemeris which is
* licensed GPL.
*
* Therefore, if you want to use astro_compute_swisseph in your commercial
* projects, you must adhere to the GPL license or buy a Swiss Ephemeris
* commercial license.
*/
use crate::raw;
use crate::sweconst::Bodies;
use std::ffi::{CStr, CString};
/*
* 3. The functions swe_calc_ut() and swe_calc()
*
* Before calling one of these functions or any other Swiss Ephemeris function,
* it is strongly recommended to call the function swe_set_ephe_path(). Even if
* you don’t want to set an ephemeris path and use the Moshier ephemeris, it is
* nevertheless recommended to call swe_set_ephe_path(NULL), because this
* function makes important initializations. If you don’t do that, the Swiss
* Ephemeris may work but the results may be not 100% consistent.
*/
/*
* xx
*
* Ecliptic position Equatorial position (SEFLG_EQUATORIAL)
* Longitude right ascension
* Latitude declination
* Distance in AU distance in AU
* Speed in longitude (deg/day) speed in right ascension (deg/day)
* Speed in latitude (deg/day) speed in declination (deg/day)
* Speed in distance (AU/day) speed in distance (AU/day)
*/
#[derive(Debug)]
pub struct CalcUtResult {
pub longitude: f64,
pub latitude: f64,
pub distance_au: f64,
pub speed_longitude: f64,
pub speed_latitude: f64,
pub speed_distance_au: f64,
pub status: i32,
pub serr: String,
}
pub fn calc_ut(tjd_ut: f64, ipl: Bodies, iflag: i32) -> CalcUtResult {
let mut xx: [f64; 6] = [0.0; 6];
let mut serr = [0; 255];
let result = unsafe {
let p_xx = xx.as_mut_ptr();
let p_serr = serr.as_mut_ptr();
let status = raw::swe_calc_ut(tjd_ut, ipl as i32, iflag, p_xx, p_serr);
let s_serr = CString::from(CStr::from_ptr(p_serr))
.to_str()
.unwrap()
.to_string();
CalcUtResult {
longitude: xx[0],
latitude: xx[1],
distance_au: xx[2],
speed_longitude: xx[3],
speed_latitude: xx[4],
speed_distance_au: xx[5],
serr: s_serr,
status: status,
}
};
result
}