use glam::DMat3;
use crate::integrator::IntegratorType;
use crate::interactions::FlatPlateState;
use crate::EulerSequence;
use astrodyn_gravity::GravityControls;
use astrodyn_interactions::DragConfig;
use astrodyn_dynamics::state::TranslationalStateTyped;
use astrodyn_dynamics::{MassPropertiesTyped, RotationalStateTyped};
use astrodyn_quantities::frame::{RootInertial, SelfRef};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SwitchSense {
OnApproach,
OnDeparture,
}
#[derive(Debug, Clone)]
pub struct FrameSwitchConfig<SourceId = usize> {
pub target_source: SourceId,
pub switch_sense: SwitchSense,
pub switch_distance: f64,
pub active: bool,
}
#[derive(Debug, Clone)]
pub enum SrpModel {
FlatPlate(FlatPlateState<astrodyn_quantities::frame::SelfRef>),
Cannonball {
cx_area: f64,
albedo: f64,
diffuse: f64,
},
}
#[derive(Debug, Clone, Copy)]
pub struct ShadowBody {
pub source_idx: usize,
pub radius: f64,
}
#[derive(Debug, Clone, Copy)]
pub struct GeodeticConfig {
pub source_idx: usize,
pub r_eq: f64,
pub r_pol: f64,
}
#[derive(Debug, Clone, Copy)]
pub struct EarthLightingConfig {
pub earth_radius: f64,
pub moon_radius: f64,
pub sun_radius: f64,
}
#[derive(Debug, Clone, Default)]
pub struct DerivedStateConfig {
pub orbital_elements_source: Option<usize>,
pub euler_sequence: Option<EulerSequence>,
pub lvlh: bool,
pub geodetic: Option<GeodeticConfig>,
pub solar_beta: bool,
pub earth_lighting: Option<EarthLightingConfig>,
}
pub struct VehicleConfig {
pub trans: TranslationalStateTyped<RootInertial>,
pub rot: Option<RotationalStateTyped<SelfRef>>,
pub mass: Option<MassPropertiesTyped<SelfRef>>,
pub integrator: IntegratorType,
pub t_struct_body: DMat3,
pub gravity_controls: GravityControls<usize>,
pub compute_gravity_gradient: bool,
pub drag: Option<DragConfig>,
pub srp: Option<SrpModel>,
pub shadow_body: Option<ShadowBody>,
pub derived: DerivedStateConfig,
pub external_force:
astrodyn_quantities::aliases::Force<astrodyn_quantities::frame::RootInertial>,
pub external_torque: astrodyn_quantities::aliases::Torque<
astrodyn_quantities::frame::BodyFrame<astrodyn_quantities::frame::SelfRef>,
>,
pub integ_source: Option<usize>,
pub frame_switches: Vec<FrameSwitchConfig>,
}
impl Default for VehicleConfig {
fn default() -> Self {
Self {
trans: TranslationalStateTyped::<RootInertial>::default(),
rot: None,
mass: None,
integrator: IntegratorType::default(),
t_struct_body: DMat3::IDENTITY,
gravity_controls: GravityControls::default(),
compute_gravity_gradient: false,
drag: None,
srp: None,
shadow_body: None,
derived: DerivedStateConfig::default(),
external_force: astrodyn_quantities::aliases::Force::<
astrodyn_quantities::frame::RootInertial,
>::zero(),
external_torque: astrodyn_quantities::aliases::Torque::<
astrodyn_quantities::frame::BodyFrame<astrodyn_quantities::frame::SelfRef>,
>::zero(),
integ_source: None,
frame_switches: Vec::new(),
}
}
}