crseo/wavefrontsensor/
sh24.rs1use std::{
2 mem::take,
3 ops::{Deref, DerefMut},
4};
5
6use super::{Model, ShackHartmann};
7use crate::{
8 builders::SourceBuilder, wavefrontsensor::ShackHartmannBuilder, Builder, FromBuilder, Result,
9 WavefrontSensorBuilder,
10};
11
12#[derive(Debug, Clone)]
25pub struct SH24<T: Model>(ShackHartmannBuilder<T>);
26
27impl<T: Model> Deref for SH24<T> {
28 type Target = ShackHartmannBuilder<T>;
29
30 fn deref(&self) -> &Self::Target {
31 &self.0
32 }
33}
34impl<T: Model> DerefMut for SH24<T> {
35 fn deref_mut(&mut self) -> &mut Self::Target {
36 &mut self.0
37 }
38}
39
40impl<T: Model> Default for SH24<T> {
41 fn default() -> Self {
42 SH24(
43 ShackHartmannBuilder::new()
44 .n_sensor(1)
45 .lenslet_array(24, 32, 25.5 / 24.0)
46 .detector(12, Some(60), 2, None),
47 )
48 }
49}
50impl<T: Model> SH24<T> {}
51impl<M, T> WavefrontSensorBuilder for T
52where
53 M: Model,
54 T: Deref<Target = ShackHartmannBuilder<M>>,
55{
56 fn guide_stars(&self, template: Option<SourceBuilder>) -> SourceBuilder {
57 self.deref().guide_stars(template)
58 }
59 }
65impl<M, T> Builder for T
66where
67 M: Model,
68 T: DerefMut<Target = ShackHartmannBuilder<M>> + Default,
69{
70 type Component = ShackHartmann<M>;
71 fn build(mut self) -> Result<ShackHartmann<M>> {
72 take(self.deref_mut()).build()
73 }
74}
75
76pub struct ShackHartmann24x24<T: Model>(ShackHartmann<T>);
77impl<T: Model> Deref for ShackHartmann24x24<T> {
78 type Target = ShackHartmann<T>;
79
80 fn deref(&self) -> &Self::Target {
81 &self.0
82 }
83}
84impl<T: Model> DerefMut for ShackHartmann24x24<T> {
85 fn deref_mut(&mut self) -> &mut Self::Target {
86 &mut self.0
87 }
88}
89
90impl<M, T> FromBuilder for T
91where
92 M: Model,
93 T: DerefMut<Target = ShackHartmann<M>>,
94{
95 type ComponentBuilder = ShackHartmannBuilder<M>;
96}