use ffi::{mask, set_device};
use skyangle::*;
use std::{error::Error, fmt};
#[cfg(feature = "analytic")]
pub mod analytic;
pub mod atmosphere;
pub mod calibrations;
pub mod centroiding;
pub mod cu;
pub mod error;
pub mod fwhm;
pub mod gmt;
pub mod imaging;
pub mod lmmse;
pub mod pssn;
pub mod raytracing;
pub mod segment_piston_sensor;
pub mod source;
pub mod wavefrontsensor;
#[doc(inline)]
pub use atmosphere::{Atmosphere, AtmosphereError, RayTracing};
#[doc(inline)]
pub use calibrations::Calibration;
#[doc(inline)]
pub use centroiding::Centroiding;
#[doc(inline)]
pub use cu::Cu;
#[doc(inline)]
pub use error::CrseoError;
#[doc(inline)]
pub use fwhm::Fwhm;
#[doc(inline)]
pub use gmt::{Gmt, GmtError};
#[doc(inline)]
pub use imaging::Imaging;
#[doc(inline)]
pub use lmmse::LinearMinimumMeanSquareError;
#[doc(inline)]
pub use segment_piston_sensor::SegmentPistonSensor;
#[doc(inline)]
pub use pssn::{PSSn, PSSnEstimates};
#[doc(inline)]
pub use source::{Propagation, Source};
#[doc(inline)]
pub use wavefrontsensor::{
Diffractive, Frame, Geometric, Pyramid, SegmentWiseSensor, SegmentWiseSensorBuilder,
ShackHartmann, Stroke, SH24, SH48,
};
pub type GeometricShackHartmann = ShackHartmann<wavefrontsensor::Geometric>;
pub mod prelude {
pub use super::{
Atmosphere, Builder, Calibration, Diffractive, FromBuilder, Geometric, Gmt,
LinearMinimumMeanSquareError, PSSn, ShackHartmann, Source, WavefrontSensor,
WavefrontSensorBuilder, SH24, SH48,
};
}
pub mod builders;
pub mod utilities;
#[macro_export]
macro_rules! ceo {
($element:ident) => {
$crate::Builder::build(<$crate::$element as $crate::FromBuilder>::builder()).unwrap()
};
($element:ident<$gen:ident>) => {
$crate::Builder::build(<$crate::$element<$crate::$gen> as $crate::FromBuilder>::builder()).unwrap()
};
($element:ident, $($arg:ident = [$($val:expr),*]),*) => {
$crate::Builder::build(<$crate::$element as $crate::FromBuilder>::builder()$(.$arg($($val),*))*).unwrap()
};
($element:ident<$gen:ident>, $($arg:ident = [$($val:expr),*]),*) => {
$crate::Builder::build(<$crate::$element<$crate::$gen> as $crate::FromBuilder>::builder()$(.$arg($($val),*))*).unwrap()
};
($element:ident:$model:ident) => {
$crate::Builder::build(<$crate::$element<$crate::$model> as $crate::FromBuilder>::builder()).unwrap()
};
($element:ident:$model:ident, $($arg:ident = [$($val:expr),*]),*) => {
$crate::Builder::build(<$crate::$element<$crate::$model> as $crate::FromBuilder>::builder()$(.$arg($($val),*))*).unwrap()
};
}
#[macro_export]
macro_rules! gmt {
() => {
$crate::Builder::build(<$crate::Gmt as $crate::FromBuilder>::builder()).unwrap()
};
($($arg:ident = [$($val:expr),*]),*) => {
$crate::Builder::build(<$crate::Gmt as $crate::FromBuilder>::builder()$(.$arg($($val),*))*).unwrap()
};
}
#[macro_export]
macro_rules! source {
() => {
$crate::Builder::build(<$crate::Source as $crate::FromBuilder>::builder()).unwrap()
};
($($arg:ident = [$($val:expr),*]),*) => {
$crate::Builder::build(<$crate::Source as $crate::FromBuilder>::builder()$(.$arg($($val),*))*).unwrap()
};
}
#[derive(Debug)]
pub struct CeoError<T>(T);
impl<T: std::fmt::Debug> Error for CeoError<T> {}
impl<T: std::fmt::Debug> fmt::Display for CeoError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "CEO {:?} builder has failed!", self.0)
}
}
pub type Result<T> = std::result::Result<T, CrseoError>;
pub trait Builder: Default {
type Component: FromBuilder;
fn new() -> Self {
Default::default()
}
fn build(self) -> Result<Self::Component>;
}
pub trait FromBuilder {
type ComponentBuilder: Builder;
fn builder() -> Self::ComponentBuilder {
Self::ComponentBuilder::new()
}
}
pub trait WavefrontSensorBuilder {
fn guide_stars(&self, template: Option<builders::SourceBuilder>) -> builders::SourceBuilder {
template.unwrap_or_default()
}
fn detector_noise_specs(self, _noise_specs: imaging::NoiseDataSheet) -> Self
where
Self: Sized,
{
self
}
fn decouple(
&self,
_gmt_builder: builders::GmtBuilder,
_src: &mut crate::Source,
_threshold: f64,
) -> Result<Vec<i32>> {
Ok(Vec::new())
}
}
pub trait WavefrontSensor: Propagation + Send {
fn calibrate(&mut self, src: &mut Source, threshold: f64);
fn reset(&mut self);
fn process(&mut self);
fn readout(&mut self);
fn data(&mut self) -> Vec<f64>;
fn frame(&self) -> Option<Vec<f32>>;
fn n_frame(&self) -> usize;
fn valid_lenslet_from(&mut self, wfs: &mut dyn WavefrontSensor);
fn valid_lenslet(&mut self) -> &mut mask;
fn n_valid_lenslet(&mut self) -> Vec<usize>;
fn left_multiply(&self, calibration: &wavefrontsensor::Calibration) -> Option<Vec<f32>>;
}
impl<'a, T: WavefrontSensor + ?Sized> WavefrontSensor for &'a mut Box<T> {
fn calibrate(&mut self, src: &mut Source, threshold: f64) {
(**self).calibrate(src, threshold);
}
fn reset(&mut self) {
(**self).reset();
}
fn process(&mut self) {
(**self).process();
}
fn readout(&mut self) {
(**self).readout();
}
fn data(&mut self) -> Vec<f64> {
(**self).data()
}
fn frame(&self) -> Option<Vec<f32>> {
(**self).frame()
}
fn n_frame(&self) -> usize {
(**self).n_frame()
}
fn valid_lenslet_from(&mut self, wfs: &mut dyn WavefrontSensor) {
(**self).valid_lenslet_from(wfs)
}
fn valid_lenslet(&mut self) -> &mut mask {
(**self).valid_lenslet()
}
fn n_valid_lenslet(&mut self) -> Vec<usize> {
(**self).n_valid_lenslet()
}
fn left_multiply(&self, calibration: &wavefrontsensor::Calibration) -> Option<Vec<f32>> {
(**self).left_multiply(calibration)
}
}
impl<'a, T: WavefrontSensor + ?Sized> Propagation for &'a mut Box<T> {
fn propagate(&mut self, src: &mut Source) {
(**self).propagate(src);
}
fn time_propagate(&mut self, secs: f64, src: &mut Source) {
(**self).time_propagate(secs, src);
}
}
pub fn set_gpu(id: i32) {
unsafe {
set_device(id);
}
}
use cu::Single;
#[derive(Clone, Debug)]
pub struct Mask {
_c_: mask,
}
impl Mask {
pub fn new() -> Self {
Mask {
_c_: Default::default(),
}
}
pub fn build(&mut self, n_el: usize) -> &mut Self {
unsafe { self._c_.setup(n_el as i32) }
self
}
pub fn filter(&mut self, f: &mut Cu<Single>) -> &mut Self {
unsafe {
self._c_.alter(f.as_mut_ptr());
self._c_.set_index();
}
self
}
pub fn nnz(&self) -> usize {
self._c_.nnz as usize
}
pub fn as_mut_prt(&mut self) -> *mut mask {
&mut self._c_
}
pub fn as_raw_mut_ptr(&mut self) -> &mut mask {
&mut self._c_
}
pub fn as_mut(&mut self) -> &mut mask {
&mut self._c_
}
}
impl Default for Mask {
fn default() -> Self {
Self::new()
}
}