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:
leonarski_f committed 2025-07-07 11:36:04 +02:00
1 parent 7c03965302
commit 6fb53e9bbd
3 files changed
+73 -6

No files matched your search

+56 -3
View File
@@ -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