imager: add proper handling of startup exceptions
This commit is contained in:
parent
1da571bfef
commit
3840b15d7d
|
@ -120,8 +120,13 @@ if __name__ == "__main__":
|
||||||
stepper_thread.start()
|
stepper_thread.start()
|
||||||
|
|
||||||
# Starts the imager control process
|
# Starts the imager control process
|
||||||
logger.info("Starting the imager control process (step 3/4)")
|
logger.info("Starting the imager control process (step 3/6)")
|
||||||
|
try:
|
||||||
imager_thread = planktoscope.imager.ImagerProcess(shutdown_event)
|
imager_thread = planktoscope.imager.ImagerProcess(shutdown_event)
|
||||||
|
except:
|
||||||
|
logger.error("The imager control process could not be started")
|
||||||
|
imager_thread = None
|
||||||
|
else:
|
||||||
imager_thread.start()
|
imager_thread.start()
|
||||||
|
|
||||||
# Starts the segmenter process
|
# Starts the segmenter process
|
||||||
|
@ -148,7 +153,7 @@ if __name__ == "__main__":
|
||||||
if not stepper_thread.is_alive():
|
if not stepper_thread.is_alive():
|
||||||
logger.error("The stepper process died unexpectedly! Oh no!")
|
logger.error("The stepper process died unexpectedly! Oh no!")
|
||||||
break
|
break
|
||||||
if not imager_thread.is_alive():
|
if imager_thread and not imager_thread.is_alive():
|
||||||
logger.error("The imager process died unexpectedly! Oh no!")
|
logger.error("The imager process died unexpectedly! Oh no!")
|
||||||
break
|
break
|
||||||
if not segmenter_thread.is_alive():
|
if not segmenter_thread.is_alive():
|
||||||
|
@ -160,11 +165,13 @@ if __name__ == "__main__":
|
||||||
shutdown_event.set()
|
shutdown_event.set()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
stepper_thread.join()
|
stepper_thread.join()
|
||||||
|
if imager_thread:
|
||||||
imager_thread.join()
|
imager_thread.join()
|
||||||
segmenter_thread.join()
|
segmenter_thread.join()
|
||||||
# Uncomment this for clean shutdown
|
# Uncomment this for clean shutdown
|
||||||
# module_thread.join()
|
# module_thread.join()
|
||||||
stepper_thread.close()
|
stepper_thread.close()
|
||||||
|
if imager_thread:
|
||||||
imager_thread.close()
|
imager_thread.close()
|
||||||
segmenter_thread.close()
|
segmenter_thread.close()
|
||||||
# Uncomment this for clean shutdown
|
# Uncomment this for clean shutdown
|
||||||
|
|
|
@ -93,7 +93,7 @@ class StreamingHandler(http.server.BaseHTTPRequestHandler):
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
with open("/dev/shm/mjpeg/cam.jpg", "rb") as jpeg:
|
with open("/dev/shm/mjpeg/cam.jpg", "rb") as jpeg: # nosec
|
||||||
frame = jpeg.read()
|
frame = jpeg.read()
|
||||||
except FileNotFoundError as e:
|
except FileNotFoundError as e:
|
||||||
logger.error(f"Camera has not been started yet")
|
logger.error(f"Camera has not been started yet")
|
||||||
|
@ -129,7 +129,6 @@ logger.info("planktoscope.imager is loaded")
|
||||||
class ImagerProcess(multiprocessing.Process):
|
class ImagerProcess(multiprocessing.Process):
|
||||||
"""This class contains the main definitions for the imager of the PlanktoScope"""
|
"""This class contains the main definitions for the imager of the PlanktoScope"""
|
||||||
|
|
||||||
@logger.catch
|
|
||||||
def __init__(self, stop_event, iso=100, shutter_speed=1):
|
def __init__(self, stop_event, iso=100, shutter_speed=1):
|
||||||
"""Initialize the Imager class
|
"""Initialize the Imager class
|
||||||
|
|
||||||
|
@ -179,7 +178,14 @@ class ImagerProcess(multiprocessing.Process):
|
||||||
logger.exception(
|
logger.exception(
|
||||||
f"An exception has occured when starting up raspimjpeg: {e}"
|
f"An exception has occured when starting up raspimjpeg: {e}"
|
||||||
)
|
)
|
||||||
exit(1)
|
try:
|
||||||
|
self.__camera.start(true)
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(
|
||||||
|
f"A second exception has occured when starting up raspimjpeg: {e}"
|
||||||
|
)
|
||||||
|
logger.error(f"This error can't be recovered from, terminating now")
|
||||||
|
raise e
|
||||||
|
|
||||||
if self.__camera.sensor_name == "IMX219": # Camera v2.1
|
if self.__camera.sensor_name == "IMX219": # Camera v2.1
|
||||||
self.__resolution = (3280, 2464)
|
self.__resolution = (3280, 2464)
|
||||||
|
@ -653,7 +659,7 @@ class ImagerProcess(multiprocessing.Process):
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.debug(f"Copying the image from the temp file to {filename_path}")
|
logger.debug(f"Copying the image from the temp file to {filename_path}")
|
||||||
shutil.copy("/dev/shm/mjpeg/image.jpg", filename_path)
|
shutil.copy("/dev/shm/mjpeg/image.jpg", filename_path) # nosec
|
||||||
# TODO Try to stop the camera streaming and display instead each captured image
|
# TODO Try to stop the camera streaming and display instead each captured image
|
||||||
# os.rename("/dev/shm/mjpeg/image.jpg", "/dev/shm/mjpeg/cam.jpg")
|
# os.rename("/dev/shm/mjpeg/image.jpg", "/dev/shm/mjpeg/cam.jpg")
|
||||||
logger.debug("Syncing the disk")
|
logger.debug("Syncing the disk")
|
||||||
|
|
Loading…
Reference in a new issue