crseo 2.5.3

Cuda Engined Optics Rust Interface
Documentation
use serde::{Deserialize, Serialize};

use crate::{imaging::LensletArray, wavefrontsensor::SegmentWiseSensorBuilder, Builder};

use super::GeomShack;

#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct GeomShackBuilder {
    lenslet_array: LensletArray,
    pub(super) n_gs: i32,
}
impl Default for GeomShackBuilder {
    fn default() -> Self {
        Self {
            lenslet_array: LensletArray::default(),
            n_gs: 1,
        }
    }
}
impl GeomShackBuilder {
    pub fn lenslet(mut self, n_side_lenslet: usize, n_px_lenslet: usize) -> Self {
        self.lenslet_array = LensletArray {
            n_side_lenslet,
            n_px_lenslet,
            d: 25.5 / n_side_lenslet as f64,
        };
        self
    }
    pub fn size(mut self, n: usize) -> Self {
        self.n_gs = n as i32;
        self
    }
}

impl SegmentWiseSensorBuilder for GeomShackBuilder {
    fn pupil_sampling(&self) -> usize {
        let LensletArray {
            n_side_lenslet,
            n_px_lenslet,
            ..
        } = self.lenslet_array;
        n_side_lenslet * n_px_lenslet + 1
    }
}

impl Builder for GeomShackBuilder {
    type Component = GeomShack;

    fn build(self) -> crate::Result<Self::Component> {
        let mut wfs = GeomShack {
            _c_: ffi::geometricShackHartmann::default(),
            lenslet_array: self.lenslet_array,
            n_gs: self.n_gs as usize,
        };
        let LensletArray {
            n_side_lenslet, d, ..
        } = self.lenslet_array;
        unsafe {
            wfs._c_.setup(n_side_lenslet as i32, d as f32, self.n_gs);
        };

        Ok(wfs)
    }
}