DAQ: change exposure and gain based of off zoom. Interpolates gain and exposure if zoom value is not in redis.
This commit is contained in:
1 parent
7c03965302
commit
6fb53e9bbd
3 files changed
+73
-6
No files matched your search
@@ -108,8 +108,7 @@ class LoopCenteringZoomModelElem(BaseModel):
|
||||
|
||||
|
||||
class LoopCenteringZoomModel(BaseModel):
|
||||
z: List[LoopCenteringZoomModelElem]
|
||||
|
||||
z: List[LoopCenteringZoomModelElem]
|
||||
|
||||
# zoom gain exp (X06DA)
|
||||
# 1 50 0.05
|
||||
@@ -124,7 +123,7 @@ def def_loop_centering_zoom() -> LoopCenteringZoomModel:
|
||||
return LoopCenteringZoomModel(
|
||||
z=[
|
||||
LoopCenteringZoomModelElem(
|
||||
zoom_value=280, sam_cam_gain=50.0, sam_cam_exp=0.10
|
||||
zoom_value=280, sam_cam_gain=100.0, sam_cam_exp=0.05
|
||||
)
|
||||
]
|
||||
)
|
||||
@@ -152,6 +151,60 @@ class SampleCameraSettings(BaseModel):
|
||||
gain: float
|
||||
exposure: float
|
||||
|
||||
|
||||
class ZoomModel(BaseModel):
|
||||
z:dict[float, SampleCameraSettings]
|
||||
|
||||
def get_camera_settings(self, zoom_value: float) -> SampleCameraSettings | tuple[float, float]:
|
||||
if not self.z:
|
||||
raise ValueError("No zoom data available")
|
||||
|
||||
if zoom_value in self.z:
|
||||
elem = self.z[zoom_value]
|
||||
return SampleCameraSettings(gain=elem.gain, exposure=elem.exposure)
|
||||
|
||||
sorted_zooms = sorted(self.z.keys())
|
||||
|
||||
if zoom_value <= sorted_zooms[0]:
|
||||
elem = self.z[sorted_zooms[0]]
|
||||
return SampleCameraSettings(gain=elem.gain, exposure=elem.exposure)
|
||||
|
||||
if zoom_value >= sorted_zooms[-1]:
|
||||
elem = self.z[sorted_zooms[-1]]
|
||||
return SampleCameraSettings(gain=elem.gain, exposure=elem.exposure)
|
||||
|
||||
for i in range(len(sorted_zooms) - 1):
|
||||
if sorted_zooms[i] <= zoom_value <= sorted_zooms[i + 1]:
|
||||
lower_zoom = sorted_zooms[i]
|
||||
upper_zoom = sorted_zooms[i + 1]
|
||||
|
||||
lower_elem = self.z[lower_zoom]
|
||||
upper_elem = self.z[upper_zoom]
|
||||
|
||||
t = (zoom_value - lower_zoom) / (upper_zoom - lower_zoom)
|
||||
|
||||
interpolated_gain = lower_elem.gain + t * (upper_elem.gain - lower_elem.gain)
|
||||
interpolated_exp = lower_elem.exposure + t * (upper_elem.exposure - lower_elem.exposure)
|
||||
|
||||
return SampleCameraSettings(gain=interpolated_gain, exposure=interpolated_exp)
|
||||
|
||||
closest = min(self.z.keys(), key=lambda x: abs(x - zoom_value))
|
||||
elem = self.z[closest]
|
||||
return SampleCameraSettings(gain=elem.gain, exposure=elem.exposure)
|
||||
|
||||
def def_zoom() -> ZoomModel:
|
||||
return ZoomModel(
|
||||
z={
|
||||
1: SampleCameraSettings(gain=50.0, exposure=0.05),
|
||||
280: SampleCameraSettings(gain=100.0, exposure=0.05),
|
||||
500: SampleCameraSettings(gain=100.0, exposure=0.05),
|
||||
700: SampleCameraSettings(gain=150.0, exposure=0.05),
|
||||
800: SampleCameraSettings(gain=100.0, exposure=0.10),
|
||||
1000: SampleCameraSettings(gain=200.0, exposure=0.10)
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class AutofocusSettings(BaseModel):
|
||||
center_x_pxl: float
|
||||
center_y_pxl: float
|
||||
|
||||
Reference in new issue
Block a user