From 0989a505587a5fc8ae76f13d0874916f08270d99 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Fri, 6 Nov 2020 15:34:34 +0000 Subject: [PATCH] Added stage tests and tidied up rescue --- openflexure_microscope/rescue/auto.py | 40 +++++++---------- .../rescue/check_picamera.py | 7 ++- .../rescue/check_sangaboard.py | 44 +++++++++++++++++++ .../rescue/error_sources.py | 14 ++---- 4 files changed, 69 insertions(+), 36 deletions(-) create mode 100644 openflexure_microscope/rescue/check_sangaboard.py diff --git a/openflexure_microscope/rescue/auto.py b/openflexure_microscope/rescue/auto.py index b092a366..8fcce894 100644 --- a/openflexure_microscope/rescue/auto.py +++ b/openflexure_microscope/rescue/auto.py @@ -1,12 +1,15 @@ import logging import os +import sys + +from .error_sources import bcolors from openflexure_microscope.paths import ( FALLBACK_OPENFLEXURE_VAR_PATH, PREFERRED_OPENFLEXURE_VAR_PATH, ) -from . import check_capture_reload, check_settings, check_picamera +from . import check_capture_reload, check_settings, check_picamera, check_sangaboard # Paths for suggestions LOGS_PATHS = [ @@ -26,38 +29,26 @@ DATA_PATHS = [ os.path.join(FALLBACK_OPENFLEXURE_VAR_PATH, "data"), ] +# Look for debug flag logger = logging.getLogger() -logger.setLevel(logging.DEBUG) -logging.debug("Testing debug logger. One two one two.") +if "-d" in sys.argv or "--debug" in sys.argv: + logger.setLevel(logging.DEBUG) + logging.debug("Testing debug logger. One two one two.") +else: + logger.setLevel(logging.INFO) - - - -error_keys = { - "config_settings_import_error": "The configuration submodule could not be imported properly. This is usually because the default config or settings files are badly broken somehow. See further errors for details", - "default_config_empty": "The default configuration file is empty, and could not be automatically populated.", - "default_settings_empty": "The default settings file is empty, and could not be automatically populated.", - "default_config_error": f"The default configuration file could not be parsed. To fix, consider backing up and deleting your configuration files from {CONFIG_PATHS} to reset the configuration.", - "default_settings_error": f"The default settings file could not be parsed. To fix, consider backing up and deleting your configuration files from {SETTINGS_PATHS} to reset the configuration.", - "capture_rebuild_timeout": f"Capture database rebuilding took a long time. This may not cause catastrophic errors, but rather will cause the server to hang for a while. To fix, consider moving your captures from {DATA_PATHS} to another location.", - "picamera_import_error": "Picamera module could not be imported. Check physical connections to the camera as it may be damaged.", -} - if __name__ == "__main__": spoof = False error_sources = [] - if spoof: - error_sources = list(error_keys.keys()) - error_sources.extend(check_settings.main()) error_sources.extend(check_picamera.main()) - # error_sources.extend(check_capture_reload.main()) + error_sources.extend(check_capture_reload.main()) + error_sources.extend(check_sangaboard.main()) if not error_sources: - print() print(bcolors.OKGREEN + "No errors found!" + bcolors.ENDC) print( @@ -66,7 +57,6 @@ if __name__ == "__main__": print(f"You can check through the server logs at {LOGS_PATHS}") else: - for err_code in error_sources: - logging.error(err_code) - if error_keys.get(err_code): - print(bcolors.FAIL + error_keys.get(err_code) + bcolors.ENDC) + print() + for err in error_sources: + print(err.message) diff --git a/openflexure_microscope/rescue/check_picamera.py b/openflexure_microscope/rescue/check_picamera.py index e31ed26d..bd9582f2 100644 --- a/openflexure_microscope/rescue/check_picamera.py +++ b/openflexure_microscope/rescue/check_picamera.py @@ -1,5 +1,10 @@ import logging +from .error_sources import ErrorSource, WarningSource + +picamera_import_error = ErrorSource( + "Picamera module could not be imported. Check physical connections to the camera as it may be damaged." +) def main(): error_sources = [] @@ -11,6 +16,6 @@ def main(): # TODO: Parse exception object for a few different issues, and append different error sources # E.g. pi with camera already in use, disconnected, unsupported OS, etc logging.error(e) - error_sources.append("picamera_import_error") + error_sources.append(picamera_import_error) return error_sources diff --git a/openflexure_microscope/rescue/check_sangaboard.py b/openflexure_microscope/rescue/check_sangaboard.py new file mode 100644 index 00000000..76821686 --- /dev/null +++ b/openflexure_microscope/rescue/check_sangaboard.py @@ -0,0 +1,44 @@ +from .error_sources import ErrorSource, WarningSource + +from openflexure_microscope.config import user_configuration + + +def main(): + error_sources = [] + + try: + from sangaboard import Sangaboard + except Exception as e: # pylint: disable=W0703 + error_sources.append(ErrorSource( + "Sangaboard module could not be imported." + )) + else: + configuration = user_configuration.load() + stage_type = configuration["stage"].get("type") + stage_port = configuration["stage"].get("port") + + error_sources.append(WarningSource( + "Stage serial port is not specified in configuration. Application will scan ports for a Sangaboard." + )) + + + # If any Sangaboard-based stage is configured for use + if stage_type in ("SangaBoard", "SangaStage", "SangaDeltaStage"): + # Try connecting on the specified port + try: + _ = Sangaboard(stage_port) + except FileNotFoundError as e: # pylint: disable=W0703 + if stage_port: + error_sources.append(ErrorSource( + f"No {stage_type} device was found on the configured port {stage_port}." + )) + else: + error_sources.append(ErrorSource( + f"No {stage_type} device was found during port scanning." + )) + else: + error_sources.append(ErrorSource( + f"Invalid stage type {stage_type} specified in configuration file." + )) + + return error_sources diff --git a/openflexure_microscope/rescue/error_sources.py b/openflexure_microscope/rescue/error_sources.py index 9ed6f476..13cda56f 100644 --- a/openflexure_microscope/rescue/error_sources.py +++ b/openflexure_microscope/rescue/error_sources.py @@ -18,19 +18,13 @@ class Source: return self._message -class WarningSource: - def __init__(self, message): - self.message = message - +class WarningSource(Source): @property def message(self): - print(bcolors.WARNING + self._message + bcolors.ENDC) + return bcolors.WARNING + self._message + bcolors.ENDC -class ErrorSource: - def __init__(self, message): - self.message = message - +class ErrorSource(Source): @property def message(self): - print(bcolors.FAIL + self._message + bcolors.ENDC) \ No newline at end of file + return bcolors.FAIL + self._message + bcolors.ENDC \ No newline at end of file