use arika::epoch::Epoch;
use arika::frame::{Body, Vec3};
use nalgebra::Vector4;
use crate::SpacecraftState;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct MagneticFieldBody(Vec3<Body>);
impl MagneticFieldBody {
pub fn new(v: Vec3<Body>) -> Self {
Self(v)
}
pub fn inner(&self) -> &Vec3<Body> {
&self.0
}
pub fn into_inner(self) -> Vec3<Body> {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct AngularVelocityBody(Vec3<Body>);
impl AngularVelocityBody {
pub fn new(v: Vec3<Body>) -> Self {
Self(v)
}
pub fn inner(&self) -> &Vec3<Body> {
&self.0
}
pub fn into_inner(self) -> Vec3<Body> {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct AttitudeBodyToInertial(Vector4<f64>);
impl AttitudeBodyToInertial {
pub fn new(v: Vector4<f64>) -> Self {
Self(v)
}
pub fn inner(&self) -> &Vector4<f64> {
&self.0
}
pub fn into_inner(self) -> Vector4<f64> {
self.0
}
}
#[derive(Debug, Clone, Default)]
pub struct Sensors {
pub magnetometers: Vec<MagneticFieldBody>,
pub gyroscopes: Vec<AngularVelocityBody>,
pub star_trackers: Vec<AttitudeBodyToInertial>,
pub sun_sensors: Vec<SunSensorOutput>,
}
impl Sensors {
pub fn empty() -> Self {
Self::default()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SunDirectionBody(Vec3<Body>);
impl SunDirectionBody {
pub fn new(v: Vec3<Body>) -> Self {
Self(v)
}
pub fn inner(&self) -> &Vec3<Body> {
&self.0
}
pub fn into_inner(self) -> Vec3<Body> {
self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum SunSensorOutput {
Fine {
direction: Option<SunDirectionBody>,
illumination: f64,
},
Coarse(f64),
}
#[derive(Debug, Clone)]
pub struct RwTelemetry {
pub momentum: Vec<f64>,
pub speeds: Vec<f64>,
pub realized_torques: Option<Vec<f64>>,
}
#[derive(Debug, Clone, Default)]
pub struct ActuatorTelemetry {
pub rw: Option<RwTelemetry>,
}
#[derive(Debug, Clone)]
pub struct TickInput<'a> {
pub t: f64,
pub epoch: Option<&'a Epoch>,
pub sensors: &'a Sensors,
pub actuators: &'a ActuatorTelemetry,
pub spacecraft: &'a SpacecraftState,
}