openflexure-microscope-server/hardware-specific-tests/picamera2/test_exposure_time_drift.py
Julian Stirling 0933ece63a Apply suggestions from code review of branch jpeg-capture-in-stacking
Co-authored-by: Beth Probert <beth_probert@outlook.com>
2025-06-25 15:39:36 +01:00

75 lines
2.6 KiB
Python

"""
Check exposure times do not drift.
This can get very tedious. Recommend running pytest with -s option
to monitor progress.
"""
import logging
import time
from fastapi.testclient import TestClient
from labthings_fastapi.server import ThingServer
from labthings_fastapi.client import ThingClient
from openflexure_microscope_server.things.camera.picamera import StreamingPiCamera2
logging.basicConfig(level=logging.DEBUG)
def _test_exposure_time_drift(desired_time):
"""
Capture 10 full resolution images and check that the exposure time remains constant
This confirms that automatic exposure time adjustment is fully turned off
"""
cam = StreamingPiCamera2()
server = ThingServer()
server.add_thing(cam, "/camera/")
with TestClient(server.app) as test_client:
client = ThingClient.from_url("/camera/", client=test_client)
exposure_tol = cam.persistent_control_tolerances["ExposureTime"]
client.exposure_time = desired_time
print(f"Setting desired time of {desired_time}")
time.sleep(0.5)
pre_capture_et = client.exposure_time
print(f"Pre-capture the time is set to {pre_capture_et}")
# Check exp is set correctly within known tolerance
assert abs(pre_capture_et - desired_time) < exposure_tol
for i in range(10):
client.capture_jpeg(resolution="full")
if i == 0:
# Exposure can update on first capture, due to frame rate restrictions
first_et = client.exposure_time
assert abs(first_et - pre_capture_et) < exposure_tol
else:
frame_et = client.exposure_time
print(f"Frame {i} captured with exposure time {frame_et}")
# Check no further drift in value
assert first_et == frame_et
# Set the exposure time to the value it already is. To check it doesn't shift
print(f"Setting exposure time to {frame_et} to check it doesn't change")
client.exposure_time = frame_et
time.sleep(0.5)
# Check before and after capture
assert client.exposure_time == frame_et
client.capture_jpeg(resolution="full")
assert client.exposure_time == frame_et
print("Exposure time didn't change!!")
print(f"End of test for exposure target {desired_time}")
def test_exposure_time_drift():
"""
Performs the exposure time test for a range of exposure time values.
"""
for desired_time in [100, 1000, 10000]:
_test_exposure_time_drift(desired_time)
if __name__ == "__main__":
test_exposure_time_drift()