From cd0da558c3a4395813f1db07bbd704e26df841f2 Mon Sep 17 00:00:00 2001 From: Benjamin Zeiss Date: Fri, 25 Feb 2022 21:03:36 +0100 Subject: [PATCH] Initial version of the Control Board UI (#687) Initial version of the Control Board UI (#687) --- easyinstall.sh | 221 +++++++++++++- python/.pylintrc | 2 +- python/ctrlboard/README.md | 56 ++++ python/ctrlboard/__init__.py | 0 python/ctrlboard/requirements.txt | 11 + .../resources/DejaVu Fonts License.txt | 97 ++++++ .../resources/DejaVuSansMono-Bold.ttf | Bin 0 -> 331992 bytes .../ctrlboard/resources/splash_start_32.bmp | Bin 0 -> 574 bytes .../ctrlboard/resources/splash_start_64.bmp | Bin 0 -> 1086 bytes .../service-infra/rascsi-ctrlboard.service | 14 + python/ctrlboard/src/__init__.py | 0 python/ctrlboard/src/config.py | 35 +++ .../src/ctrlboard_event_handler/__init__.py | 0 .../ctrlboard_menu_update_event_handler.py | 275 ++++++++++++++++++ .../ctrlboard_print_event_handler.py | 15 + .../rascsi_profile_cycler.py | 24 ++ .../rascsi_shutdown_cycler.py | 31 ++ python/ctrlboard/src/ctrlboard_hw/__init__.py | 0 .../src/ctrlboard_hw/ctrlboard_hw.py | 227 +++++++++++++++ .../ctrlboard_hw/ctrlboard_hw_constants.py | 24 ++ python/ctrlboard/src/ctrlboard_hw/encoder.py | 66 +++++ .../src/ctrlboard_hw/hardware_button.py | 17 ++ .../src/ctrlboard_hw/pca9554multiplexer.py | 64 ++++ .../ctrlboard/src/ctrlboard_menu_builder.py | 185 ++++++++++++ python/ctrlboard/src/main.py | 188 ++++++++++++ python/ctrlboard/src/menu/__init__.py | 0 .../ctrlboard/src/menu/blank_screensaver.py | 26 ++ python/ctrlboard/src/menu/cycler.py | 82 ++++++ python/ctrlboard/src/menu/menu.py | 30 ++ python/ctrlboard/src/menu/menu_builder.py | 14 + python/ctrlboard/src/menu/menu_controller.py | 145 +++++++++ python/ctrlboard/src/menu/menu_renderer.py | 254 ++++++++++++++++ .../menu/menu_renderer_adafruit_ssd1306.py | 34 +++ .../src/menu/menu_renderer_config.py | 39 +++ .../src/menu/menu_renderer_luma_oled.py | 34 +++ python/ctrlboard/src/menu/screensaver.py | 33 +++ python/ctrlboard/src/menu/timer.py | 24 ++ python/ctrlboard/src/menu/transition.py | 65 +++++ python/ctrlboard/src/observable.py | 21 ++ python/ctrlboard/src/observer.py | 10 + .../ctrlboard/src/rascsi_menu_controller.py | 32 ++ python/ctrlboard/start.sh | 128 ++++++++ 42 files changed, 2518 insertions(+), 5 deletions(-) create mode 100644 python/ctrlboard/README.md create mode 100644 python/ctrlboard/__init__.py create mode 100644 python/ctrlboard/requirements.txt create mode 100644 python/ctrlboard/resources/DejaVu Fonts License.txt create mode 100644 python/ctrlboard/resources/DejaVuSansMono-Bold.ttf create mode 100644 python/ctrlboard/resources/splash_start_32.bmp create mode 100644 python/ctrlboard/resources/splash_start_64.bmp create mode 100644 python/ctrlboard/service-infra/rascsi-ctrlboard.service create mode 100644 python/ctrlboard/src/__init__.py create mode 100644 python/ctrlboard/src/config.py create mode 100644 python/ctrlboard/src/ctrlboard_event_handler/__init__.py create mode 100644 python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_menu_update_event_handler.py create mode 100644 python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_print_event_handler.py create mode 100644 python/ctrlboard/src/ctrlboard_event_handler/rascsi_profile_cycler.py create mode 100644 python/ctrlboard/src/ctrlboard_event_handler/rascsi_shutdown_cycler.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/__init__.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw_constants.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/encoder.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/hardware_button.py create mode 100644 python/ctrlboard/src/ctrlboard_hw/pca9554multiplexer.py create mode 100644 python/ctrlboard/src/ctrlboard_menu_builder.py create mode 100644 python/ctrlboard/src/main.py create mode 100644 python/ctrlboard/src/menu/__init__.py create mode 100644 python/ctrlboard/src/menu/blank_screensaver.py create mode 100644 python/ctrlboard/src/menu/cycler.py create mode 100644 python/ctrlboard/src/menu/menu.py create mode 100644 python/ctrlboard/src/menu/menu_builder.py create mode 100644 python/ctrlboard/src/menu/menu_controller.py create mode 100644 python/ctrlboard/src/menu/menu_renderer.py create mode 100644 python/ctrlboard/src/menu/menu_renderer_adafruit_ssd1306.py create mode 100644 python/ctrlboard/src/menu/menu_renderer_config.py create mode 100644 python/ctrlboard/src/menu/menu_renderer_luma_oled.py create mode 100644 python/ctrlboard/src/menu/screensaver.py create mode 100644 python/ctrlboard/src/menu/timer.py create mode 100644 python/ctrlboard/src/menu/transition.py create mode 100644 python/ctrlboard/src/observable.py create mode 100644 python/ctrlboard/src/observer.py create mode 100644 python/ctrlboard/src/rascsi_menu_controller.py create mode 100755 python/ctrlboard/start.sh diff --git a/easyinstall.sh b/easyinstall.sh index 6bfa87ca..70a9d430 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -52,6 +52,7 @@ VIRTUAL_DRIVER_PATH="$HOME/images" CFG_PATH="$HOME/.config/rascsi" WEB_INSTALL_PATH="$BASE/python/web" OLED_INSTALL_PATH="$BASE/python/oled" +CTRLBOARD_INSTALL_PATH="$BASE/python/ctrlboard" PYTHON_COMMON_PATH="$BASE/python/common" SYSTEMD_PATH="/etc/systemd/system" HFS_FORMAT=/usr/bin/hformat @@ -314,6 +315,17 @@ function stopRaScsiScreen() { fi } +# Stops the rascsi-ctrlboard service if it is running +function stopRaScsiCtrlBoard() { + if [[ -f "$SYSTEMD_PATH/rascsi-ctrlboard.service" ]]; then + SERVICE_RASCSI_CTRLBOARD_RUNNING=0 + sudo systemctl is-active --quiet rascsi-ctrlboard.service >/dev/null 2>&1 || SERVICE_RASCSI_CTRLBOARD_RUNNING=$? + if [[ SERVICE_RASCSI_CTRLBOARD_RUNNING -eq 0 ]]; then + sudo systemctl stop rascsi-ctrlboard.service + fi + fi +} + # disables and removes the old monitor_rascsi service function disableOldRaScsiMonitorService() { if [ -f "$SYSTEMD_PATH/monitor_rascsi.service" ]; then @@ -332,6 +344,40 @@ function disableOldRaScsiMonitorService() { fi } +# disables the rascsi-oled service +function disableRaScsiOledService() { + if [ -f "$SYSTEMD_PATH/rascsi-oled.service" ]; then + SERVICE_RASCSI_OLED_RUNNING=0 + sudo systemctl is-active --quiet rascsi-oled.service >/dev/null 2>&1 || SERVICE_RASCSI_OLED_RUNNING=$? + if [[ $SERVICE_RASCSI_OLED_RUNNING -eq 0 ]]; then + sudo systemctl stop rascsi-oled.service + fi + + SERVICE_RASCSI_OLED_ENABLED=0 + sudo systemctl is-enabled --quiet rascsi-oled.service >/dev/null 2>&1 || SERVICE_RASCSI_OLED_ENABLED=$? + if [[ $SERVICE_RASCSI_OLED_ENABLED -eq 0 ]]; then + sudo systemctl disable rascsi-oled.service + fi + fi +} + +# disables the rascsi-ctrlboard service +function disableRaScsiCtrlBoardService() { + if [ -f "$SYSTEMD_PATH/rascsi-ctrlboard.service" ]; then + SERVICE_RASCSI_CTRLBOARD_RUNNING=0 + sudo systemctl is-active --quiet rascsi-ctrlboard.service >/dev/null 2>&1 || SERVICE_RASCSI_CTRLBOARD_RUNNING=$? + if [[ $SERVICE_RASCSI_CTRLBOARD_RUNNING -eq 0 ]]; then + sudo systemctl stop rascsi-ctrlboard.service + fi + + SERVICE_RASCSI_CTRLBOARD_ENABLED=0 + sudo systemctl is-enabled --quiet rascsi-ctrlboard.service >/dev/null 2>&1 || SERVICE_RASCSI_CTRLBOARD_ENABLED=$? + if [[ $SERVICE_RASCSI_CTRLBOARD_ENABLED -eq 0 ]]; then + sudo systemctl disable rascsi-ctrlboard.service + fi + fi +} + # Stops the macproxy service if it is running function stopMacproxy() { if [ -f "$SYSTEMD_PATH/macproxy.service" ]; then @@ -339,7 +385,7 @@ function stopMacproxy() { fi } -# Starts the rascsi-oled service if installed +# Checks whether the rascsi-oled service is installed function isRaScsiScreenInstalled() { SERVICE_RASCSI_OLED_ENABLED=0 if [[ -f "$SYSTEMD_PATH/rascsi-oled.service" ]]; then @@ -353,7 +399,19 @@ function isRaScsiScreenInstalled() { echo $SERVICE_RASCSI_OLED_ENABLED } -# Starts the rascsi-oled service if installed +# Checks whether the rascsi-ctrlboard service is installed +function isRaScsiCtrlBoardInstalled() { + SERVICE_RASCSI_CTRLBOARD_ENABLED=0 + if [[ -f "$SYSTEMD_PATH/rascsi-ctrlboard.service" ]]; then + sudo systemctl is-enabled --quiet rascsi-ctrlboard.service >/dev/null 2>&1 || SERVICE_RASCSI_CTRLBOARD_ENABLED=$? + else + SERVICE_RASCSI_CTRLBOARD_ENABLED=1 + fi + + echo $SERVICE_RASCSI_CTRLBOARD_ENABLED +} + +# Checks whether the rascsi-oled service is running function isRaScsiScreenRunning() { SERVICE_RASCSI_OLED_RUNNING=0 if [[ -f "$SYSTEMD_PATH/rascsi-oled.service" ]]; then @@ -367,6 +425,19 @@ function isRaScsiScreenRunning() { echo $SERVICE_RASCSI_OLED_RUNNING } +# Checks whether the rascsi-oled service is running +function isRaScsiCtrlBoardRunning() { + SERVICE_RASCSI_CTRLBOARD_RUNNING=0 + if [[ -f "$SYSTEMD_PATH/rascsi-ctrlboard.service" ]]; then + sudo systemctl is-active --quiet rascsi-ctrlboard.service >/dev/null 2>&1 || SERVICE_RASCSI_CTRLBOARD_RUNNING=$? + else + SERVICE_RASCSI_CTRLBOARD_RUNNING=1 + fi + + echo $SERVICE_RASCSI_CTRLBOARD_RUNNING +} + + # Starts the rascsi-oled service if installed function startRaScsiScreen() { if [[ $(isRaScsiScreenInstalled) -eq 0 ]] && [[ $(isRaScsiScreenRunning) -ne 1 ]]; then @@ -375,6 +446,14 @@ function startRaScsiScreen() { fi } +# Starts the rascsi-ctrlboard service if installed +function startRaScsiCtrlBoard() { + if [[ $(isRaScsiCtrlBoardInstalled) -eq 0 ]] && [[ $(isRaScsiCtrlBoardRunning) -ne 1 ]]; then + sudo systemctl start rascsi-ctrlboard.service + showRaScsiCtrlBoardStatus + fi +} + # Starts the macproxy service if installed function startMacproxy() { if [ -f "$SYSTEMD_PATH/macproxy.service" ]; then @@ -398,6 +477,11 @@ function showRaScsiScreenStatus() { systemctl status rascsi-oled | tee } +# Shows status for the rascsi-ctrlboard service +function showRaScsiCtrlBoardStatus() { + systemctl status rascsi-ctrlboard | tee +} + # Shows status for the macproxy service function showMacproxyStatus() { systemctl status macproxy | tee @@ -828,6 +912,7 @@ function installRaScsiScreen() { fi stopRaScsiScreen + disableRaScsiCtrlBoardService updateRaScsiGit sudo apt-get update && sudo apt-get install libjpeg-dev libpng-dev libopenjp2-7-dev i2c-tools raspi-config -y >+Fk`=)HNDIy{Q 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�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%0D`P|=8@u+UQ%=z7R+43L4Zl8#;T;K1r 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≤GWXA<}4NfYWI^m11sQ58*e$_lfk}0Xc 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

_(y_@sc** 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 literal 0 HcmV?d00001 diff --git a/python/ctrlboard/resources/splash_start_32.bmp b/python/ctrlboard/resources/splash_start_32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5c7549ed3caea5432f1aec041655e862106ec5bd GIT binary patch literal 574 zcmZ?rwPRuc13Mt80mKbJtN_G}KnMdu+zbpL3{nch|A7ERtwIB#XaG%m6`FMDevm;( zpdN{hjoARS6bZ05AaQ_9iuwBwK9;dbOFkg+L9)M3PR4w*vanHFTAG6449S_34b{vy z8#5aK`3xX_vjH2B{~5?ne*ogQ8}I@7#vu6w!x{4YeFi}N#>OE1K)&R}IR+Nyn+<{H u*B?Gm0W@F2z`%U70W;VK1`Lu7l7>b|e0c^wp#4<#9~)Yj{v{MYgyaFr54c1C literal 0 HcmV?d00001 diff --git a/python/ctrlboard/resources/splash_start_64.bmp b/python/ctrlboard/resources/splash_start_64.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4448f28d249507d59f65b35b713bab70e5bee6e3 GIT binary patch literal 1086 zcmZ?rwPRrb13Mt80mKbJ>;S}!KnMdu+zbpL%mfqw;r~DYqE?}SP&9xhy$Ve_bfnAg z2L&V&s7GRBV>SQ-9SN{EAaQ_9iuwBwK9;dbOFkg+L9)M3PR4w*vanHFTAG6449S_3 z4b{vy8#5aK`3xX_vjH2B{~5?ne*ogQ8}I@7#vu6w!x{4YeFi}N#>OE1K)&R}IR+Ny zn+<{H*B?Gm0W@F2z`%U70W;VK1`Lu7l7>b|e0c^wp#4<#9~)Yj{vGM*k5c~w0R2?A AbpQYW literal 0 HcmV?d00001 diff --git a/python/ctrlboard/service-infra/rascsi-ctrlboard.service b/python/ctrlboard/service-infra/rascsi-ctrlboard.service new file mode 100644 index 00000000..509bd29a --- /dev/null +++ b/python/ctrlboard/service-infra/rascsi-ctrlboard.service @@ -0,0 +1,14 @@ +[Unit] +Description=RaSCSI Control Board service +After=network.target rascsi.service + +[Service] +Type=simple +Restart=always +RestartSec=2s +ExecStart=/home/pi/RASCSI/python/ctrlboard/start.sh +ExecStop=/bin/pkill --signal 2 -f "python3 src/main.py" +SyslogIdentifier=RASCSICTRLB + +[Install] +WantedBy=multi-user.target diff --git a/python/ctrlboard/src/__init__.py b/python/ctrlboard/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/ctrlboard/src/config.py b/python/ctrlboard/src/config.py new file mode 100644 index 00000000..02f61df2 --- /dev/null +++ b/python/ctrlboard/src/config.py @@ -0,0 +1,35 @@ +""" +Module for central RaSCSI control board configuration parameters +""" +from ctrlboard_hw.ctrlboard_hw_constants import CtrlBoardHardwareConstants + + +# pylint: disable=too-few-public-methods +class CtrlboardConfig: + """Class for central RaSCSI control board configuration parameters""" + ROTATION = 0 + WIDTH = 128 + HEIGHT = 64 + LINES = 8 + TOKEN = "" + BORDER = 5 + TRANSITIONS = 1 + DISPLAY_I2C_ADDRESS = CtrlBoardHardwareConstants.DISPLAY_I2C_ADDRESS + PCA9554_I2C_ADDRESS = CtrlBoardHardwareConstants.PCA9554_I2C_ADDRESS + MENU_REFRESH_INTERVAL = 6 + LOG_LEVEL = 30 # Warning + + RASCSI_HOST = "localhost" + RASCSI_PORT = "6868" + + def __str__(self): + result = "rotation: " + str(self.ROTATION) + "\n" + result += "width: " + str(self.WIDTH) + "\n" + result += "height: " + str(self.HEIGHT) + "\n" + result += "lines: " + str(self.LINES) + "\n" + result += "border: " + str(self.BORDER) + "\n" + result += "rascsi host: " + str(self.RASCSI_HOST) + "\n" + result += "rascsi port: " + str(self.RASCSI_PORT) + "\n" + result += "transitions: " + str(self.TRANSITIONS) + "\n" + + return result diff --git a/python/ctrlboard/src/ctrlboard_event_handler/__init__.py b/python/ctrlboard/src/ctrlboard_event_handler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_menu_update_event_handler.py b/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_menu_update_event_handler.py new file mode 100644 index 00000000..4cb04736 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_menu_update_event_handler.py @@ -0,0 +1,275 @@ +"""Module for interfacing between the menu controller and the RaSCSI Control Board hardware""" +import logging +from typing import Optional + +from ctrlboard_event_handler.rascsi_profile_cycler import RascsiProfileCycler +from ctrlboard_event_handler.rascsi_shutdown_cycler import RascsiShutdownCycler +from ctrlboard_menu_builder import CtrlBoardMenuBuilder +from ctrlboard_hw.ctrlboard_hw_constants import CtrlBoardHardwareConstants +from ctrlboard_hw.hardware_button import HardwareButton +from ctrlboard_hw.encoder import Encoder +from observer import Observer +from rascsi.file_cmds import FileCmds +from rascsi.ractl_cmds import RaCtlCmds +from rascsi.socket_cmds import SocketCmds +from rascsi_menu_controller import RascsiMenuController + + +# pylint: disable=too-many-instance-attributes +class CtrlBoardMenuUpdateEventHandler(Observer): + """Class interfacing the menu controller the RaSCSI Control Board hardware.""" + + def __init__(self, menu_controller: RascsiMenuController, sock_cmd: SocketCmds, + ractl_cmd: RaCtlCmds): + self.message = None + self._menu_controller = menu_controller + self._menu_renderer_config = self._menu_controller.get_menu_renderer().get_config() + self.sock_cmd = sock_cmd + self.ractl_cmd = ractl_cmd + self.context_stack = [] + self.rascsi_profile_cycler: Optional[RascsiProfileCycler] = None + self.rascsi_shutdown_cycler: Optional[RascsiShutdownCycler] = None + + def update(self, updated_object): + if isinstance(updated_object, HardwareButton): + if updated_object.name == CtrlBoardHardwareConstants.ROTARY_BUTTON: + menu = self._menu_controller.get_active_menu() + info_object = menu.get_current_info_object() + + self.route_rotary_button_handler(info_object) + + self._menu_controller.get_menu_renderer().render() + else: # button pressed + if updated_object.name == "Bt1": + self.handle_button1() + elif updated_object.name == "Bt2": + self.handle_button2() + if isinstance(updated_object, Encoder): + active_menu = self._menu_controller.get_active_menu() + if updated_object.direction == 1: + if active_menu.item_selection + 1 < len(active_menu.entries): + self._menu_controller.get_active_menu().item_selection += 1 + if updated_object.direction == -1: + if active_menu.item_selection - 1 >= 0: + active_menu.item_selection -= 1 + else: + active_menu.item_selection = 0 + self._menu_controller.get_menu_renderer().render() + + def update_events(self): + """Method handling non-blocking event handling for the cycle buttons.""" + if self.rascsi_profile_cycler is not None: + result = self.rascsi_profile_cycler.update() + if result is not None: + self.rascsi_profile_cycler = None + self.context_stack = [] + self._menu_controller.segue(result) + if self.rascsi_shutdown_cycler is not None: + self.rascsi_shutdown_cycler.empty_messages = False + result = self.rascsi_shutdown_cycler.update() + if result == "return": + self.rascsi_shutdown_cycler = None + + def handle_button1(self): + """Method for handling the first cycle button (cycle profiles)""" + if self.rascsi_profile_cycler is None: + self.rascsi_profile_cycler = RascsiProfileCycler(self._menu_controller, self.sock_cmd, + self.ractl_cmd, return_entry=True) + else: + self.rascsi_profile_cycler.cycle() + + def handle_button2(self): + """Method for handling the second cycle button (cycle shutdown)""" + if self.rascsi_shutdown_cycler is None: + self.rascsi_shutdown_cycler = RascsiShutdownCycler(self._menu_controller, self.sock_cmd, + self.ractl_cmd) + else: + self.rascsi_shutdown_cycler.cycle() + + def route_rotary_button_handler(self, info_object): + """Method for handling the rotary button press for the menu navigation""" + if info_object is None: + return + + context = info_object["context"] + action = info_object["action"] + handler_function_name = "handle_" + context + "_" + action + try: + handler_function = getattr(self, handler_function_name) + if handler_function is not None: + handler_function(info_object) + except AttributeError: + log = logging.getLogger(__name__) + log.error("Handler function [%s] not found or returned an error. Skipping.", + str(handler_function_name)) + + # noinspection PyUnusedLocal + # pylint: disable=unused-argument + def handle_scsi_id_menu_openactionmenu(self, info_object): + """Method handles the rotary button press with the scsi list to open the action menu.""" + context_object = self._menu_controller.get_active_menu().get_current_info_object() + self.context_stack.append(context_object) + self._menu_controller.segue(CtrlBoardMenuBuilder.ACTION_MENU, context_object=context_object, + transition_attributes=self._menu_renderer_config. + transition_attributes_left) + + # noinspection PyUnusedLocal + # pylint: disable=unused-argument + def handle_action_menu_return(self, info_object): + """Method handles the rotary button press to return from the + action menu to the scsi list.""" + self.context_stack.pop() + self._menu_controller.segue(CtrlBoardMenuBuilder.SCSI_ID_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + # noinspection PyUnusedLocal + # pylint: disable=unused-argument + def handle_action_menu_slot_attachinsert(self, info_object): + """Method handles the rotary button press on attach in the action menu.""" + context_object = self._menu_controller.get_active_menu().context_object + self.context_stack.append(context_object) + self._menu_controller.segue(CtrlBoardMenuBuilder.IMAGES_MENU, context_object=context_object, + transition_attributes=self._menu_renderer_config. + transition_attributes_left) + + # noinspection PyUnusedLocal + def handle_action_menu_slot_detacheject(self, info_object): + """Method handles the rotary button press on detach in the action menu.""" + context_object = self._menu_controller.get_active_menu().context_object + self.detach_eject_scsi_id() + self.context_stack = [] + self._menu_controller.segue(CtrlBoardMenuBuilder.SCSI_ID_MENU, + context_object=context_object, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + # noinspection PyUnusedLocal + def handle_action_menu_slot_info(self, info_object): + """Method handles the rotary button press on 'Info' in the action menu.""" + context_object = self._menu_controller.get_active_menu().context_object + self.context_stack.append(context_object) + self._menu_controller.segue(CtrlBoardMenuBuilder.DEVICEINFO_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_left, + context_object=context_object) + + # noinspection PyUnusedLocal + def handle_device_info_menu_return(self, info_object): + """Method handles the rotary button press on 'Return' in the info menu.""" + self.context_stack.pop() + context_object = self._menu_controller.get_active_menu().context_object + self._menu_controller.segue(CtrlBoardMenuBuilder.ACTION_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_right, + context_object=context_object) + + # noinspection PyUnusedLocal + def handle_action_menu_loadprofile(self, info_object): + """Method handles the rotary button press on 'Load Profile' in the action menu.""" + context_object = self._menu_controller.get_active_menu().context_object + self.context_stack.append(context_object) + self._menu_controller.segue(CtrlBoardMenuBuilder.PROFILES_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_left) + + # noinspection PyUnusedLocal + def handle_profiles_menu_loadprofile(self, info_object): + """Method handles the rotary button press in the profile selection menu + for selecting a profile to load.""" + if info_object is not None and "name" in info_object: + file_cmd = FileCmds(sock_cmd=self.sock_cmd, ractl=self.ractl_cmd) + result = file_cmd.read_config(file_name=info_object["name"]) + if result["status"] is True: + self._menu_controller.show_message("Profile loaded!") + else: + self._menu_controller.show_message("Loading failed!") + + self.context_stack = [] + self._menu_controller.segue(CtrlBoardMenuBuilder.SCSI_ID_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + # noinspection PyUnusedLocal + def handle_action_menu_shutdown(self, info_object): + """Method handles the rotary button press on 'Shutdown' in the action menu.""" + self.ractl_cmd.shutdown_pi("system") + self._menu_controller.show_message("Shutting down!", 150) + self._menu_controller.segue(CtrlBoardMenuBuilder.SCSI_ID_MENU, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + # noinspection PyUnusedLocal + def handle_images_menu_return(self, info_object): + """Method handles the rotary button press on 'Return' in the image selection menu + (through attach/insert).""" + context_object = self.context_stack.pop() + self._menu_controller.segue(CtrlBoardMenuBuilder.ACTION_MENU, + context_object=context_object, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + def handle_images_menu_image_attachinsert(self, info_object): + """Method handles the rotary button press on an image in the image selection menu + (through attach/insert)""" + context_object = self._menu_controller.get_active_menu().context_object + self.attach_insert_scsi_id(info_object) + self.context_stack = [] + self._menu_controller.segue(CtrlBoardMenuBuilder.SCSI_ID_MENU, + context_object=context_object, + transition_attributes=self._menu_renderer_config. + transition_attributes_right) + + def attach_insert_scsi_id(self, info_object): + """Helper method to attach/insert an image on a scsi id given through the menu context""" + image_name = info_object["name"] + device_type = info_object["device_type"] + context_object = self._menu_controller.get_active_menu().context_object + scsi_id = context_object["scsi_id"] + params = {"file": image_name} + result = self.ractl_cmd.attach_device(scsi_id=scsi_id, + device_type=device_type, + params=params) + + if result["status"] is False: + self._menu_controller.show_message("Attach failed!") + else: + self.show_id_action_message(scsi_id, "attached") + + def detach_eject_scsi_id(self): + """Helper method to detach/eject an image on a scsi id given through the menu context""" + context_object = self._menu_controller.get_active_menu().context_object + scsi_id = context_object["scsi_id"] + device_info = self.ractl_cmd.list_devices(scsi_id) + + if not device_info["device_list"]: + return + + device_type = device_info["device_list"][0]["device_type"] + image = device_info["device_list"][0]["image"] + if device_type in ("SAHD", "SCHD", "SCBR", "SCDP", "SCLP", "SCHS"): + result = self.ractl_cmd.detach_by_id(scsi_id) + if result["status"] is True: + self.show_id_action_message(scsi_id, "detached") + else: + self._menu_controller.show_message("Detach failed!") + elif device_type in ("SCRM", "SCMO", "SCCD"): + if image: + result = self.ractl_cmd.eject_by_id(scsi_id) + if result["status"] is True: + self.show_id_action_message(scsi_id, "ejected") + else: + self._menu_controller.show_message("Eject failed!") + else: + result = self.ractl_cmd.detach_by_id(scsi_id) + if result["status"] is True: + self.show_id_action_message(scsi_id, "detached") + else: + self._menu_controller.show_message("Detach failed!") + else: + log = logging.getLogger(__name__) + log.info("Device type '%s' currently unsupported for detach/eject!", str(device_type)) + + def show_id_action_message(self, scsi_id, action: str): + """Helper method for displaying an action message in the case of an exception.""" + self._menu_controller.show_message("ID " + str(scsi_id) + " " + action + "!") diff --git a/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_print_event_handler.py b/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_print_event_handler.py new file mode 100644 index 00000000..5992d383 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_event_handler/ctrlboard_print_event_handler.py @@ -0,0 +1,15 @@ +"""Module for test printing events when buttons from the RaSCSI Control Board are pressed""" +import observer +from ctrlboard_hw.hardware_button import HardwareButton +from ctrlboard_hw.encoder import Encoder + + +# pylint: disable=too-few-public-methods +class CtrlBoardPrintEventHandler(observer.Observer): + """Class implements a basic event handler that prints button presses from the RaSCSI + Control Board hardware.""" + def update(self, updated_object): + if isinstance(updated_object, HardwareButton): + print(updated_object.name + " has been pressed!") + if isinstance(updated_object, Encoder): + print(updated_object.pos) diff --git a/python/ctrlboard/src/ctrlboard_event_handler/rascsi_profile_cycler.py b/python/ctrlboard/src/ctrlboard_event_handler/rascsi_profile_cycler.py new file mode 100644 index 00000000..581e99d5 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_event_handler/rascsi_profile_cycler.py @@ -0,0 +1,24 @@ +"""Module providing the profile cycler class for the RaSCSI Control Board UI""" +from ctrlboard_menu_builder import CtrlBoardMenuBuilder +from menu.cycler import Cycler + + +class RascsiProfileCycler(Cycler): + """Class implementing the profile cycler for the RaSCSI Control Baord UI""" + + def populate_cycle_entries(self): + cycle_entries = self.file_cmd.list_config_files() + + return cycle_entries + + def perform_selected_entry_action(self, selected_entry): + result = self.file_cmd.read_config(selected_entry) + self._menu_controller.show_timed_mini_message("") + if result["status"] is True: + return CtrlBoardMenuBuilder.SCSI_ID_MENU + + self._menu_controller.show_message("Failed!") + return CtrlBoardMenuBuilder.SCSI_ID_MENU + + def perform_return_action(self): + return CtrlBoardMenuBuilder.SCSI_ID_MENU diff --git a/python/ctrlboard/src/ctrlboard_event_handler/rascsi_shutdown_cycler.py b/python/ctrlboard/src/ctrlboard_event_handler/rascsi_shutdown_cycler.py new file mode 100644 index 00000000..3cd90b27 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_event_handler/rascsi_shutdown_cycler.py @@ -0,0 +1,31 @@ +"""Module providing the shutdown cycler for the RaSCSI Control Board UI """ +from menu.cycler import Cycler + + +class RascsiShutdownCycler(Cycler): + """Class implementing the shutdown cycler for the RaSCSI Control Board UI""" + + def __init__(self, menu_controller, sock_cmd, ractl_cmd): + super().__init__(menu_controller, sock_cmd, ractl_cmd, return_entry=True, + empty_messages=False) + self.executed_once = False + + def populate_cycle_entries(self): + cycle_entries = ["Shutdown"] + + return cycle_entries + + def perform_selected_entry_action(self, selected_entry): + if self.executed_once is False: + self.executed_once = True + self._menu_controller.show_timed_message("Shutting down...") + self.ractl_cmd.shutdown_pi("system") + return "shutdown" + + return None + + def perform_return_action(self): + self._menu_controller.show_timed_mini_message("") + self._menu_controller.show_timed_message("") + + return "return" diff --git a/python/ctrlboard/src/ctrlboard_hw/__init__.py b/python/ctrlboard/src/ctrlboard_hw/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw.py b/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw.py new file mode 100644 index 00000000..6600d7f0 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw.py @@ -0,0 +1,227 @@ +"""Module providing the interface to the RaSCSI Control Board hardware""" +# noinspection PyUnresolvedReferences +import logging +import RPi.GPIO as GPIO +import numpy +import smbus + +from ctrlboard_hw import pca9554multiplexer +from ctrlboard_hw.hardware_button import HardwareButton +from ctrlboard_hw.ctrlboard_hw_constants import CtrlBoardHardwareConstants +from ctrlboard_hw.encoder import Encoder +from ctrlboard_hw.pca9554multiplexer import PCA9554Multiplexer +from observable import Observable + + +# pylint: disable=too-many-instance-attributes +class CtrlBoardHardware(Observable): + """Class implements the RaSCSI Control Board hardware and provides an interface to it.""" + def __init__(self, display_i2c_address, pca9554_i2c_address): + self.display_i2c_address = display_i2c_address + self.pca9554_i2c_address = pca9554_i2c_address + self.rascsi_controlboard_detected = self.detect_rascsi_controlboard() + log = logging.getLogger(__name__) + log.info("RaSCSI Control Board detected: %s", str(self.rascsi_controlboard_detected)) + self.display_detected = self.detect_display() + log.info("Display detected: %s", str(self.display_detected)) + + if self.rascsi_controlboard_detected is False: + return + + self.pos = 0 + self.pca_driver = pca9554multiplexer.PCA9554Multiplexer(self.pca9554_i2c_address) + + # setup pca9554 + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_ENC_A, + PCA9554Multiplexer.PIN_ENABLED_AS_INPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_ENC_B, + PCA9554Multiplexer.PIN_ENABLED_AS_INPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_BUTTON_1, + PCA9554Multiplexer.PIN_ENABLED_AS_INPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_BUTTON_2, + PCA9554Multiplexer.PIN_ENABLED_AS_INPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_BUTTON_ROTARY, + PCA9554Multiplexer.PIN_ENABLED_AS_INPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_LED_1, + PCA9554Multiplexer.PIN_ENABLED_AS_OUTPUT) + self.pca_driver.write_configuration_register_port(CtrlBoardHardwareConstants. + PCA9554_PIN_LED_2, + PCA9554Multiplexer.PIN_ENABLED_AS_OUTPUT) + self.input_register_buffer = numpy.uint32(0) + + # pylint: disable=no-member + GPIO.setmode(GPIO.BCM) + GPIO.setup(CtrlBoardHardwareConstants.PI_PIN_INTERRUPT, GPIO.IN) + GPIO.add_event_detect(CtrlBoardHardwareConstants.PI_PIN_INTERRUPT, GPIO.FALLING, + callback=self.button_pressed_callback) + + # configure button of the rotary encoder + self.rotary_button = HardwareButton(self.pca_driver, + CtrlBoardHardwareConstants.PCA9554_PIN_BUTTON_ROTARY) + self.rotary_button.state = True + self.rotary_button.name = CtrlBoardHardwareConstants.ROTARY_BUTTON + + # configure button 1 + self.button1 = HardwareButton(self.pca_driver, + CtrlBoardHardwareConstants.PCA9554_PIN_BUTTON_1) + self.button1.state = True + self.button1.name = CtrlBoardHardwareConstants.BUTTON_1 + + # configure button 2 + self.button2 = HardwareButton(self.pca_driver, + CtrlBoardHardwareConstants.PCA9554_PIN_BUTTON_2) + self.button2.state = True + self.button2.name = CtrlBoardHardwareConstants.BUTTON_2 + + # configure rotary encoder pin a + self.rotary_a = HardwareButton(self.pca_driver, + CtrlBoardHardwareConstants.PCA9554_PIN_ENC_A) + self.rotary_a.state = True + self.rotary_a.directionalTransition = False + self.rotary_a.name = CtrlBoardHardwareConstants.ROTARY_A + + # configure rotary encoder pin b + self.rotary_b = HardwareButton(self.pca_driver, + CtrlBoardHardwareConstants.PCA9554_PIN_ENC_B) + self.rotary_b.state = True + self.rotary_b.directionalTransition = False + self.rotary_b.name = CtrlBoardHardwareConstants.ROTARY_B + + # configure encoder object + self.rotary = Encoder(self.rotary_a, self.rotary_b) + self.rotary.pos_prev = 0 + self.rotary.name = CtrlBoardHardwareConstants.ROTARY + + # noinspection PyUnusedLocal + # pylint: disable=unused-argument + def button_pressed_callback(self, channel): + """Method is called when a button is pressed and reads the corresponding input register.""" + input_register = self.pca_driver.read_input_register() + self.input_register_buffer <<= 8 + self.input_register_buffer |= input_register + + def check_button_press(self, button): + """Checks whether the button state has changed.""" + if button.state_interrupt is True: + return + + value = button.state_interrupt + + if value != button.state and value is False: + button.state = False + self.notify(button) + button.state = True + button.state_interrupt = True + + def check_rotary_encoder(self, rotary): + """Checks whether the rotary state has changed.""" + rotary.update() + if self.rotary.pos_prev != self.rotary.pos: + self.notify(rotary) + self.rotary.pos_prev = self.rotary.pos + + # noinspection PyMethodMayBeStatic + @staticmethod + def button_value(input_register_buffer, bit): + """Method reads the button value from a specific bit in the input register.""" + tmp = input_register_buffer + bitmask = 1 << bit + tmp &= bitmask + tmp >>= bit + return tmp + + # noinspection PyMethodMayBeStatic + @staticmethod + def button_value_shifted_list(input_register_buffer, bit): + """Helper method for dealing with multiple buffered input registers""" + input_register_buffer_length = int(len(format(input_register_buffer, 'b'))/8) + shiftval = (input_register_buffer_length-1)*8 + tmp = input_register_buffer >> shiftval + bitmask = 1 << bit + tmp &= bitmask + tmp >>= bit + return tmp + + def process_events(self): + """Non-blocking event processor for hardware events (button presses etc.)""" + input_register_buffer_length = int(len(format(self.input_register_buffer, 'b'))/8) + if input_register_buffer_length <= 1: + return + + input_register_buffer = self.input_register_buffer + self.input_register_buffer = 0 + + for i in range(0, input_register_buffer_length): + shiftval = (input_register_buffer_length-1-i)*8 + input_register = (input_register_buffer >> shiftval) & 0b11111111 + + rot_a = self.button_value(input_register, 0) + rot_b = self.button_value(input_register, 1) + button_rotary = self.button_value(input_register, 5) + button_1 = self.button_value(input_register, 2) + button_2 = self.button_value(input_register, 3) + + if button_1 == 0: + self.button1.state_interrupt = bool(button_1) + + if button_2 == 0: + self.button2.state_interrupt = bool(button_2) + + if button_rotary == 0: + self.rotary_button.state_interrupt = bool(button_rotary) + + if rot_a == 0: + self.rotary.enc_a.state_interrupt = bool(rot_a) + + if rot_b == 0: + self.rotary.enc_b.state_interrupt = bool(rot_b) + + self.check_button_press(self.rotary_button) + self.check_button_press(self.button1) + self.check_button_press(self.button2) + self.check_rotary_encoder(self.rotary) + + self.rotary.state = 0b11 + self.input_register_buffer = 0 + + @staticmethod + def detect_i2c_devices(_bus): + """Method finds addresses on the i2c bus""" + detected_i2c_addresses = [] + + for _address in range(128): + if 2 < _address < 120: + try: + _bus.read_byte(_address) + address = '%02x' % _address + detected_i2c_addresses.append(int(address, base=16)) + except IOError: # simply skip unsuccessful i2c probes + pass + + return detected_i2c_addresses + + def detect_rascsi_controlboard(self): + """Detects whether the RaSCSI Control Board is attached by checking whether + the expected i2c addresses are detected.""" + # pylint: disable=c-extension-no-member + i2c_addresses = self.detect_i2c_devices(smbus.SMBus(1)) + return bool((int(self.display_i2c_address) in i2c_addresses and + (int(self.pca9554_i2c_address) in i2c_addresses))) + + def detect_display(self): + """Detects whether an i2c display is connected to the RaSCSI hat.""" + # pylint: disable=c-extension-no-member + i2c_addresses = self.detect_i2c_devices(smbus.SMBus(1)) + return bool(int(self.display_i2c_address) in i2c_addresses) + + @staticmethod + def cleanup(): + """Resets pin and interrupt settings on the pins.""" + # pylint: disable=no-member + GPIO.cleanup() diff --git a/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw_constants.py b/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw_constants.py new file mode 100644 index 00000000..d1c4606e --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_hw/ctrlboard_hw_constants.py @@ -0,0 +1,24 @@ +"""Module containing the RaSCSI Control Board hardware constants""" + + +# pylint: disable=too-few-public-methods +class CtrlBoardHardwareConstants: + """Class containing the RaSCSI Control Board hardware constants""" + DISPLAY_I2C_ADDRESS = 0x3c + PCA9554_I2C_ADDRESS = 0x3f + PCA9554_PIN_ENC_A = 0 + PCA9554_PIN_ENC_B = 1 + PCA9554_PIN_BUTTON_1 = 2 + PCA9554_PIN_BUTTON_2 = 3 + PCA9554_PIN_BUTTON_ROTARY = 5 + PCA9554_PIN_LED_1 = 6 + PCA9554_PIN_LED_2 = 7 + + PI_PIN_INTERRUPT = 9 # BCM + + BUTTON_1 = "Bt1" + BUTTON_2 = "Bt2" + ROTARY_A = "RotA" + ROTARY_B = "RotB" + ROTARY_BUTTON = "RotBtn" + ROTARY = "Rot" diff --git a/python/ctrlboard/src/ctrlboard_hw/encoder.py b/python/ctrlboard/src/ctrlboard_hw/encoder.py new file mode 100644 index 00000000..0af34d7a --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_hw/encoder.py @@ -0,0 +1,66 @@ +"""Module containing an implementation for reading the rotary encoder directions through +the i2c multiplexer + interrupt""" +from ctrlboard_hw.hardware_button import HardwareButton + + +class Encoder: + """Class implementing a detection mechanism to detect the rotary encoder directions + through the i2c multiplexer + interrupt""" + def __init__(self, enc_a: HardwareButton, enc_b: HardwareButton): + self.enc_a = enc_a + self.enc_b = enc_b + self.pos = 0 + self.state = 0b0011 + self.direction = 0 + + def update(self): + """Updates the internal attributes wrt. to the encoder position and direction.""" + self.update2() + + def update2(self): + """Primary method for detecting the direction""" + value_enc_a = self.enc_a.state_interrupt + value_enc_b = self.enc_b.state_interrupt + + self.direction = 0 + state = self.state & 0b0011 + + if value_enc_a: + state |= 0b0100 + if value_enc_b: + state |= 0b1000 + + if state == 0b1011: + self.pos += 1 + self.direction = 1 + + if state == 0b0111: + self.pos -= 1 + self.direction = -1 + + self.state = state >> 2 + + self.enc_a.state_interrupt = True + self.enc_b.state_interrupt = True + + def update1(self): + """Secondary, less well working method to detect the direction""" + if self.enc_a.state_interrupt is True and self.enc_b.state_interrupt is True: + return + + if self.enc_a.state_interrupt is False and self.enc_b.state_interrupt is False: + self.enc_a.state_interrupt = True + self.enc_b.state_interrupt = True + return + + self.direction = 0 + + if self.enc_a.state_interrupt is False: + self.pos += 1 + self.direction = 1 + elif self.enc_a.state_interrupt is True: + self.pos -= 1 + self.direction = -1 + + self.enc_a.state_interrupt = True + self.enc_b.state_interrupt = True diff --git a/python/ctrlboard/src/ctrlboard_hw/hardware_button.py b/python/ctrlboard/src/ctrlboard_hw/hardware_button.py new file mode 100644 index 00000000..43268f68 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_hw/hardware_button.py @@ -0,0 +1,17 @@ +"""Module containing an abstraction for the hardware button through the i2c multiplexer""" + + +# pylint: disable=too-few-public-methods +class HardwareButton: + """Class implementing a hardware button interface that uses the i2c multiplexer""" + + def __init__(self, pca_driver, pin): + self.pca_driver = pca_driver + self.pin = pin + self.state = True + self.state_interrupt = True + self.name = "n/a" + + def read(self): + """Reads the configured port of the i2c multiplexer""" + return self.pca_driver.read_input_register_port(self.pin) diff --git a/python/ctrlboard/src/ctrlboard_hw/pca9554multiplexer.py b/python/ctrlboard/src/ctrlboard_hw/pca9554multiplexer.py new file mode 100644 index 00000000..bf25fad6 --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_hw/pca9554multiplexer.py @@ -0,0 +1,64 @@ +""" +Module for interfacting with the pca9554 multiplexer +""" +# pylint: disable=c-extension-no-member +import logging +import smbus + + +class PCA9554Multiplexer: + """Class interfacing with the pca9554 multiplexer""" + + PIN_ENABLED_AS_OUTPUT = 0 + PIN_ENABLED_AS_INPUT = 1 + + def __init__(self, i2c_address): + """Constructor for the pc9554 multiplexer interface class""" + self.i2c_address = i2c_address + + try: + self.i2c_bus = smbus.SMBus(1) + if self.read_input_register() is None: + logging.error("PCA9554 initialization test on specified i2c address %s failed", + self.i2c_address) + self.i2c_bus = None + except IOError: + logging.error("Could not open the i2c bus.") + self.i2c_bus = None + + def write_configuration_register_port(self, port_bit, bit_value): + """Reconfigures the configuration register. Updates the specified + port bit with bit_value. Returns true if successful, false otherwise.""" + try: + if (0 <= port_bit <= 8) and (0 <= bit_value <= 1): + configuration_register = self.i2c_bus.read_byte_data(self.i2c_address, 3) + if bit_value: + updated_configuration_register = configuration_register | (1 << port_bit) + else: + updated_configuration_register = configuration_register & (0xFF - + (1 << port_bit)) + self.i2c_bus.write_byte_data(self.i2c_address, 3, updated_configuration_register) + return True + + return False + except IOError: + return False + + def read_input_register(self): + """Reads the complete 8 bit input port register from pca9554""" + try: + return self.i2c_bus.read_byte_data(self.i2c_address, 0) + except IOError: + return None + + def read_input_register_port(self, port_bit): + """Reads the input port register and returns the logic level of one specific port in the + argument""" + try: + if 0 <= port_bit <= 8: + input_register = self.i2c_bus.read_byte_data(self.i2c_address, 0) + return (input_register >> port_bit) & 1 + + return None + except IOError: + return None diff --git a/python/ctrlboard/src/ctrlboard_menu_builder.py b/python/ctrlboard/src/ctrlboard_menu_builder.py new file mode 100644 index 00000000..160eb2bd --- /dev/null +++ b/python/ctrlboard/src/ctrlboard_menu_builder.py @@ -0,0 +1,185 @@ +"""Module for building the control board UI specific menus""" +import logging + +from menu.menu import Menu +from menu.menu_builder import MenuBuilder +from rascsi.file_cmds import FileCmds +from rascsi.ractl_cmds import RaCtlCmds + + +class CtrlBoardMenuBuilder(MenuBuilder): + """Class fgor building the control board UI specific menus""" + SCSI_ID_MENU = "scsi_id_menu" + ACTION_MENU = "action_menu" + IMAGES_MENU = "images_menu" + PROFILES_MENU = "profiles_menu" + DEVICEINFO_MENU = "device_info_menu" + + ACTION_OPENACTIONMENU = "openactionmenu" + ACTION_RETURN = "return" + ACTION_SLOT_ATTACHINSERT = "slot_attachinsert" + ACTION_SLOT_DETACHEJECT = "slot_detacheject" + ACTION_SLOT_INFO = "slot_info" + ACTION_SHUTDOWN = "shutdown" + ACTION_LOADPROFILE = "loadprofile" + ACTION_IMAGE_ATTACHINSERT = "image_attachinsert" + + def __init__(self, ractl_cmd: RaCtlCmds): + super().__init__() + self._rascsi_client = ractl_cmd + self.file_cmd = FileCmds(sock_cmd=ractl_cmd.sock_cmd, ractl=ractl_cmd, + token=ractl_cmd.token, locale=ractl_cmd.locale) + + def build(self, name: str, context_object=None) -> Menu: + if name == CtrlBoardMenuBuilder.SCSI_ID_MENU: + return self.create_scsi_id_list_menu(context_object) + if name == CtrlBoardMenuBuilder.ACTION_MENU: + return self.create_action_menu(context_object) + if name == CtrlBoardMenuBuilder.IMAGES_MENU: + return self.create_images_menu(context_object) + if name == CtrlBoardMenuBuilder.PROFILES_MENU: + return self.create_profiles_menu(context_object) + if name == CtrlBoardMenuBuilder.DEVICEINFO_MENU: + return self.create_device_info_menu(context_object) + + log = logging.getLogger(__name__) + log.warning("Provided menu name [%s] cannot be built!", name) + + return self.create_scsi_id_list_menu(context_object) + + # pylint: disable=unused-argument + def create_scsi_id_list_menu(self, context_object=None): + """Method creates the menu displaying the 7 scsi slots""" + devices = self._rascsi_client.list_devices() + reserved_ids = self._rascsi_client.get_reserved_ids() + + devices_by_id = {} + for device in devices["device_list"]: + devices_by_id[int(device["id"])] = device + + menu = Menu(CtrlBoardMenuBuilder.SCSI_ID_MENU) + + if reserved_ids["status"] is False: + menu.add_entry("No scsi ids reserved") + + for scsi_id in range(0, 8): + device = None + if devices_by_id.get(scsi_id) is not None: + device = devices_by_id[scsi_id] + file = "-" + device_type = "" + + if str(scsi_id) in reserved_ids["ids"]: + file = "[Reserved]" + elif device is not None: + file = str(device["file"]) + device_type = str(device["device_type"]) + + menu_str = str(scsi_id) + ":" + + if device_type == "SCDP": + menu_str += "Daynaport" + elif device_type == "SCBR": + menu_str += "X68000 Host Bridge" + elif device_type == "SCLP": + menu_str += "SCSI Printer" + elif device_type == "SCHS": + menu_str += "Host Services" + else: + if file == "": + menu_str += "(empty)" + else: + menu_str += file + if device_type != "": + menu_str += " [" + device_type + "]" + + menu.add_entry(menu_str, {"context": self.SCSI_ID_MENU, + "action": self.ACTION_OPENACTIONMENU, + "scsi_id": scsi_id}) + + return menu + + # noinspection PyMethodMayBeStatic + def create_action_menu(self, context_object=None): + """Method creates the action submenu with action that can be performed on a scsi slot""" + menu = Menu(CtrlBoardMenuBuilder.ACTION_MENU) + menu.add_entry("Return", {"context": self.ACTION_MENU, + "action": self.ACTION_RETURN}) + menu.add_entry("Attach/Insert", {"context": self.ACTION_MENU, + "action": self.ACTION_SLOT_ATTACHINSERT}) + menu.add_entry("Detach/Eject", {"context": self.ACTION_MENU, + "action": self.ACTION_SLOT_DETACHEJECT}) + menu.add_entry("Info", {"context": self.ACTION_MENU, + "action": self.ACTION_SLOT_INFO}) + menu.add_entry("Load Profile", {"context": self.ACTION_MENU, + "action": self.ACTION_LOADPROFILE}) + menu.add_entry("Shutdown", {"context": self.ACTION_MENU, + "action": self.ACTION_SHUTDOWN}) + return menu + + def create_images_menu(self, context_object=None): + """Creates a sub menu showing all the available images""" + menu = Menu(CtrlBoardMenuBuilder.IMAGES_MENU) + images_info = self.file_cmd.list_images() + menu.add_entry("Return", {"context": self.IMAGES_MENU, "action": self.ACTION_RETURN}) + images = images_info["files"] + sorted_images = sorted(images, key=lambda d: d['name']) + for image in sorted_images: + image_str = image["name"] + " [" + image["detected_type"] + "]" + image_context = {"context": self.IMAGES_MENU, "name": str(image["name"]), + "device_type": str(image["detected_type"]), + "action": self.ACTION_IMAGE_ATTACHINSERT} + menu.add_entry(image_str, image_context) + return menu + + def create_profiles_menu(self, context_object=None): + """Creates a sub menu showing all the available profiles""" + menu = Menu(CtrlBoardMenuBuilder.PROFILES_MENU) + menu.add_entry("Return", {"context": self.IMAGES_MENU, "action": self.ACTION_RETURN}) + config_files = self.file_cmd.list_config_files() + for config_file in config_files: + menu.add_entry(str(config_file), + {"context": self.PROFILES_MENU, "name": str(config_file), + "action": self.ACTION_LOADPROFILE}) + + return menu + + def create_device_info_menu(self, context_object=None): + """Create a menu displaying information of an image in a scsi slot""" + menu = Menu(CtrlBoardMenuBuilder.DEVICEINFO_MENU) + menu.add_entry("Return", {"context": self.DEVICEINFO_MENU, "action": self.ACTION_RETURN}) + + device_info = self._rascsi_client.list_devices(context_object["scsi_id"]) + + if not device_info["device_list"]: + return menu + + scsi_id = context_object["scsi_id"] + file = device_info["device_list"][0]["file"] + status = device_info["device_list"][0]["status"] + if not status: + status = "Read/Write" + lun = device_info["device_list"][0]["unit"] + device_type = device_info["device_list"][0]["device_type"] + if "parameters" in device_info["device_list"][0]: + parameters = device_info["device_list"][0]["parameters"] + else: + parameters = "{}" + + menu.add_entry("ID : " + str(scsi_id)) + menu.add_entry("LUN : " + str(lun)) + menu.add_entry("File : " + str(file)) + menu.add_entry("Type : " + str(device_type)) + menu.add_entry("R/RW : " + str(status)) + menu.add_entry("Prms : " + str(parameters)) + menu.add_entry("Vndr : " + str(device_info["device_list"][0]["vendor"])) + menu.add_entry("Prdct: " + str(device_info["device_list"][0]["product"])) + menu.add_entry("Rvisn: " + str(device_info["device_list"][0]["revision"])) + menu.add_entry("Blksz: " + str(device_info["device_list"][0]["block_size"])) + menu.add_entry("Imgsz: " + str(device_info["device_list"][0]["size"])) + + return menu + + def get_rascsi_client(self): + """Returns an instance of the rascsi client""" + return self._rascsi_client diff --git a/python/ctrlboard/src/main.py b/python/ctrlboard/src/main.py new file mode 100644 index 00000000..403a7923 --- /dev/null +++ b/python/ctrlboard/src/main.py @@ -0,0 +1,188 @@ +"""Module is the entry point for the RaSCSI Control Board UI""" +import argparse +import sys +import logging + +from config import CtrlboardConfig +from ctrlboard_hw.ctrlboard_hw import CtrlBoardHardware +from ctrlboard_hw.ctrlboard_hw_constants import CtrlBoardHardwareConstants +from ctrlboard_event_handler.ctrlboard_menu_update_event_handler \ + import CtrlBoardMenuUpdateEventHandler +from ctrlboard_menu_builder import CtrlBoardMenuBuilder +from menu.menu_renderer_config import MenuRendererConfig +from menu.menu_renderer_luma_oled import MenuRendererLumaOled +from rascsi.exceptions import (EmptySocketChunkException, + InvalidProtobufResponse, + FailedSocketConnectionException) +from rascsi.ractl_cmds import RaCtlCmds +from rascsi.socket_cmds import SocketCmds + +from rascsi_menu_controller import RascsiMenuController + + +def parse_config(): + """Parses the command line parameters and configured the RaSCSI Control Board UI accordingly""" + config = CtrlboardConfig() + cmdline_args_parser = argparse.ArgumentParser(description='RaSCSI ctrlboard service') + cmdline_args_parser.add_argument( + "--rotation", + type=int, + choices=[0, 90, 180, 270], + default=180, + action="store", + help="The rotation of the screen buffer in degrees. Default: 180", + ) + cmdline_args_parser.add_argument( + "--height", + type=int, + choices=[64], + default=64, + action="store", + help="The pixel height of the screen buffer. Default: 64", + ) + cmdline_args_parser.add_argument( + "--rascsi-host", + type=str, + default="localhost", + action="store", + help="RaSCSI host. Default: localhost", + ) + cmdline_args_parser.add_argument( + "--rascsi-port", + type=int, + default=6868, + action="store", + help="RaSCSI port. Default: 6868", + ) + cmdline_args_parser.add_argument( + "--password", + type=str, + default="", + action="store", + help="Token password string for authenticating with RaSCSI", + ) + cmdline_args_parser.add_argument( + "--loglevel", + type=int, + choices=[0, 10, 30, 40, 50], + default=logging.WARN, + action="store", + help="Loglevel. Valid values: 0 (notset), 10 (debug), 30 (warning), " + "40 (error), 50 (critical). Default: Warning", + ) + cmdline_args_parser.add_argument( + "--transitions", + type=int, + choices=[0, 1], + default=1, + action="store", + help="Transition animations. Valid values: 0 (disabled), 1 (enabled). Default: 1", + ) + args = cmdline_args_parser.parse_args() + config.ROTATION = args.rotation + + if args.height == 64: + config.HEIGHT = 64 + config.LINES = 8 + elif args.height == 32: + config.HEIGHT = 32 + config.LINES = 4 + config.TOKEN = args.password + config.WIDTH = 128 + config.BORDER = 5 + config.RASCSI_HOST = args.rascsi_host + config.RASCSI_PORT = args.rascsi_port + config.LOG_LEVEL = args.loglevel + config.TRANSITIONS = bool(args.transitions) + + return config + + +def check_rascsi_connection(ractl_cmd): + """Checks whether a RaSCSI connection exists by polling the RaSCSI server info. + Returns true if connection works, false if connection fails.""" + try: + info = ractl_cmd.get_reserved_ids() + return bool(info["status"] is True) + except FailedSocketConnectionException: + log = logging.getLogger(__name__) + log.error("Could not establish connection. Stopping service") + exit(1) + + +def main(): + """Main function for the RaSCSI Control Board UI""" + config = parse_config() + + log_format = "%(asctime)s:%(name)s:%(levelname)s - %(message)s" + logging.basicConfig(stream=sys.stdout, + format=log_format, + level=config.LOG_LEVEL) + log = logging.getLogger(__name__) + log.debug("RaSCSI ctrlboard service started.") + + ctrlboard_hw = CtrlBoardHardware(display_i2c_address=config.DISPLAY_I2C_ADDRESS, + pca9554_i2c_address=config.PCA9554_I2C_ADDRESS) + + # for now, we require the complete rascsi ctrlboard hardware. + # Oled only will be supported as well at some later point in time. + if ctrlboard_hw.rascsi_controlboard_detected is False: + log.error("Ctrlboard hardware not detected. Stopping service") + exit(1) + + sock_cmd = None + ractl_cmd = None + try: + sock_cmd = SocketCmds(host=config.RASCSI_HOST, port=config.RASCSI_PORT) + ractl_cmd = RaCtlCmds(sock_cmd=sock_cmd, token=config.TOKEN) + except EmptySocketChunkException: + log.error("Retrieved empty data from RaSCSI. Stopping service") + exit(1) + except InvalidProtobufResponse: + log.error("Retrieved unexpected data from RaSCSI. Stopping service") + exit(1) + + if check_rascsi_connection(ractl_cmd) is False: + log.error("Communication with RaSCSI failed. Please check if password token must be set " + "and whether is set correctly.") + exit(1) + + menu_renderer_config = MenuRendererConfig() + + if config.TRANSITIONS is False: + menu_renderer_config.transition = None + + menu_renderer_config.i2c_address = CtrlBoardHardwareConstants.DISPLAY_I2C_ADDRESS + menu_renderer_config.rotation = config.ROTATION + + menu_builder = CtrlBoardMenuBuilder(ractl_cmd) + menu_controller = RascsiMenuController(config.MENU_REFRESH_INTERVAL, menu_builder=menu_builder, + menu_renderer=MenuRendererLumaOled(menu_renderer_config), + menu_renderer_config=menu_renderer_config) + + menu_controller.add(CtrlBoardMenuBuilder.SCSI_ID_MENU) + menu_controller.add(CtrlBoardMenuBuilder.ACTION_MENU) + + menu_controller.show_splash_screen(f"resources/splash_start_64.bmp") + + menu_update_event_handler = CtrlBoardMenuUpdateEventHandler(menu_controller, + sock_cmd=sock_cmd, + ractl_cmd=ractl_cmd) + ctrlboard_hw.attach(menu_update_event_handler) + menu_controller.set_active_menu(CtrlBoardMenuBuilder.SCSI_ID_MENU) + + while True: + # pylint: disable=broad-except + try: + ctrlboard_hw.process_events() + menu_update_event_handler.update_events() + menu_controller.update() + except KeyboardInterrupt: + ctrlboard_hw.cleanup() + break + except Exception as ex: + print(ex) + + +if __name__ == '__main__': + main() diff --git a/python/ctrlboard/src/menu/__init__.py b/python/ctrlboard/src/menu/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/ctrlboard/src/menu/blank_screensaver.py b/python/ctrlboard/src/menu/blank_screensaver.py new file mode 100644 index 00000000..3f253f18 --- /dev/null +++ b/python/ctrlboard/src/menu/blank_screensaver.py @@ -0,0 +1,26 @@ +"""Module implementing a blank screensaver""" +from menu.screensaver import ScreenSaver + + +class BlankScreenSaver(ScreenSaver): + """Class implementing a blank screen safer that simply blanks the screen after a + configured activation delay""" + def __init__(self, activation_delay, menu_renderer): + super().__init__(activation_delay, menu_renderer) + self._initial_draw_call = None + + def draw_screensaver(self): + if self._initial_draw_call is True: + self.menu_renderer.blank_screen() + else: + self._initial_draw_call = False + + def check_timer(self): + already_enabled = False + if self.enabled is True: + already_enabled = True + + super().check_timer() + + if self.enabled is True and already_enabled is False: # new switch to screensaver + self._initial_draw_call = True diff --git a/python/ctrlboard/src/menu/cycler.py b/python/ctrlboard/src/menu/cycler.py new file mode 100644 index 00000000..f1744227 --- /dev/null +++ b/python/ctrlboard/src/menu/cycler.py @@ -0,0 +1,82 @@ +"""Module that implements a button cycling functionality""" +from abc import abstractmethod +from menu.timer import Timer +from rascsi.file_cmds import FileCmds + + +class Cycler: + """Class implementing button cycling functionality. Message is shown at the center of + the screen where repeated button presses cycle through the available selection + possibilities. Inactivity (cycle_timeout) actives cycle entry last shown on the screen.""" + def __init__(self, menu_controller, sock_cmd, ractl_cmd, + cycle_timeout=3, return_string="Return ->", + return_entry=True, empty_messages=True): + self._cycle_profile_timer_flag = Timer(activation_delay=cycle_timeout) + self._menu_controller = menu_controller + self.sock_cmd = sock_cmd + self.ractl_cmd = ractl_cmd + self.file_cmd = FileCmds(sock_cmd=self.sock_cmd, ractl=self.ractl_cmd) + self.cycle_entries = self.populate_cycle_entries() + self.return_string = return_string + self.return_entry = return_entry + self.empty_messages = empty_messages + if self.return_entry is True: + self.cycle_entries.insert(0, self.return_string) + self.selected_config_file_index = 0 + self.message = str(self.cycle_entries[self.selected_config_file_index]) + self.update() + + @abstractmethod + def populate_cycle_entries(self): + """Returns a list of entries to cycle""" + + @abstractmethod + def perform_selected_entry_action(self, selected_entry): + """Performs an action on the selected cycle menu entry""" + + @abstractmethod + def perform_return_action(self): + """Perform the return action, i.e., when no selection is chosen""" + + def update(self): + """ Returns True if object has completed its task and can be deleted """ + + if self._cycle_profile_timer_flag is None: + return None + + self._cycle_profile_timer_flag.check_timer() + if self.message is not None: + self._menu_controller.show_timed_mini_message(self.message) + self._menu_controller.get_menu_renderer().render() + + if self._cycle_profile_timer_flag.enabled is False: # timer is running + return None + + selected_cycle_entry = str(self.cycle_entries[self.selected_config_file_index]) + + if self.return_entry is True: + if selected_cycle_entry != self.return_string: + if self.empty_messages is True: + self._menu_controller.show_timed_mini_message("") + self._menu_controller.show_timed_message("") + return self.perform_selected_entry_action(selected_cycle_entry) + + self._menu_controller.show_timed_mini_message("") + self._menu_controller.show_timed_message("") + return self.perform_return_action() + + return self.perform_selected_entry_action(selected_cycle_entry) + + def cycle(self): + """Cycles between entries in the cycle menu""" + if self._cycle_profile_timer_flag is None: + return + + self.selected_config_file_index += 1 + + if self.selected_config_file_index > len(self.cycle_entries) - 1: + self.selected_config_file_index = 0 + + self.message = str(self.cycle_entries[self.selected_config_file_index]) + + self._cycle_profile_timer_flag.reset_timer() diff --git a/python/ctrlboard/src/menu/menu.py b/python/ctrlboard/src/menu/menu.py new file mode 100644 index 00000000..17bbdafb --- /dev/null +++ b/python/ctrlboard/src/menu/menu.py @@ -0,0 +1,30 @@ +"""Module for creating a menu""" +from typing import List + + +class Menu: + """Class implement the Menu class""" + def __init__(self, name: str): + self.entries: List = [] + self.item_selection = 0 + self.name = name + self.context_object = None + + def add_entry(self, text, data_object=None): + """Adds an entry to a menu""" + entry = {"text": text, "data_object": data_object} + self.entries.append(entry) + + def get_current_text(self): + """Returns the text content of the currently selected text in the menu.""" + return self.entries[self.item_selection]['text'] + + def get_current_info_object(self): + """Returns the data object to the currently selected menu item""" + return self.entries[self.item_selection]['data_object'] + + def __repr__(self): + print("entries: " + str(self.entries)) + print("item_selection: " + str(self.item_selection)) + print("name: " + self.name) + print("context object: " + str(self.context_object)) diff --git a/python/ctrlboard/src/menu/menu_builder.py b/python/ctrlboard/src/menu/menu_builder.py new file mode 100644 index 00000000..6bf680e4 --- /dev/null +++ b/python/ctrlboard/src/menu/menu_builder.py @@ -0,0 +1,14 @@ +"""Module for creating menus""" +from abc import ABC, abstractmethod +from menu.menu import Menu + + +# pylint: disable=too-few-public-methods +class MenuBuilder(ABC): + """Base class for menu builders""" + def __init__(self): + pass + + @abstractmethod + def build(self, name: str, context_object=None) -> Menu: + """builds a menu and gives it a name and a context object""" diff --git a/python/ctrlboard/src/menu/menu_controller.py b/python/ctrlboard/src/menu/menu_controller.py new file mode 100644 index 00000000..6fe03c15 --- /dev/null +++ b/python/ctrlboard/src/menu/menu_controller.py @@ -0,0 +1,145 @@ +"""Module providing the menu controller.""" +import time +import importlib +from typing import Dict, Optional +from PIL import Image + +from menu.menu import Menu +from menu.menu_builder import MenuBuilder +from menu.menu_renderer_config import MenuRendererConfig +from menu.menu_renderer_luma_oled import MenuRendererLumaOled +from menu.transition import Transition + + +class MenuController: + """Class providing the menu controller. The menu controller is a central class + that controls the menu and its associated rendering to a screen.""" + + def __init__(self, menu_builder: MenuBuilder, menu_renderer=None, menu_renderer_config=None): + self._menus: Dict[str, Menu] = {} + self._active_menu: Optional[Menu] = None + self._menu_renderer = menu_renderer + self._menu_builder: MenuBuilder = menu_builder + self._menu_renderer_config: Optional[MenuRendererConfig] + if menu_renderer_config is None: + self._menu_renderer_config = MenuRendererConfig() + else: + self._menu_renderer_config = menu_renderer_config + + if menu_renderer is None: # default to LumaOled renderer if nothing else is stated + self._menu_renderer = MenuRendererLumaOled(self._menu_renderer_config) + else: + self._menu_renderer = menu_renderer + self._transition: Optional[Transition] = None + if self._menu_renderer_config.transition is None: + self._transition = None + return + try: + module = importlib.import_module("menu.transition") + try: + transition_class = getattr(module, self._menu_renderer_config.transition) + if transition_class is not None: + self._transition = transition_class(self._menu_renderer.disp) + except AttributeError: + pass + except ImportError: + print("transition module does not exist. Falling back to default.") + self._transition = None + + def add(self, name: str, context_object=None): + """Adds a menu to the menu collection internal to the controller by name. + The associated class menu builder builds the menu by name.""" + self._menus[name] = self._menu_builder.build(name) + if context_object is not None: + self._menus[name].context_object = context_object + + def set_active_menu(self, name: str, display_on_device=True): + """Activates a menu from the controller internal menu collection by name.""" + self._active_menu = self._menus[name] + self._menu_renderer.set_menu(self._active_menu) + self._menu_renderer.render(display_on_device) + + def refresh(self, name: str, context_object=None): + """Refreshes a menu by name (by calling the menu builder again to rebuild the menu).""" + item_selection = None + if self._menus.get(name) is not None: + item_selection = self._menus[name].item_selection + self._menus[name] = self._menu_builder.build(name, context_object) + + if context_object is not None: + self._menus[name].context_object = context_object + + if item_selection is not None: + self._menus[name].item_selection = item_selection + + def get_menu(self, name: str): + """Returns the controller internal menu collection""" + return self._menus[name] + + def get_active_menu(self): + """Returns the currently activated menu""" + return self._active_menu + + def get_menu_renderer_config(self): + """Returns the menu renderer configuration""" + return self._menu_renderer_config + + def get_menu_renderer(self): + """Returns the menu renderer for this menu controller""" + return self._menu_renderer + + def segue(self, name, context_object=None, transition_attributes=None): + """Transitions one menu into the other with all associated actions such + as transition animations.""" + self.get_active_menu().context_object = None + self.refresh(name, context_object) + + if self._transition is not None and transition_attributes is not None: + source_image = self._menu_renderer.image.copy() + transition_menu = self.get_menu(name) + self._menu_renderer.set_menu(transition_menu) + target_image = self._menu_renderer.render(display_on_device=False) + transition_attributes["transition_speed"] = self._menu_renderer_config.transition_speed + self._transition.perform(source_image, target_image, transition_attributes) + + self.set_active_menu(name) + + def show_message(self, message: str, sleep=1): + """Displays a blocking message on the screen that stays for sleep seconds""" + self.get_menu_renderer().message = message + self.get_menu_renderer().render() + time.sleep(sleep) + self.get_menu_renderer().message = "" + + def show_timed_message(self, message: str): + """Shows a message on the screen. The timed message is non-blocking for the main loop and + simply redraws the message on screen if necessary.""" + self.get_menu_renderer().message = message + self.get_menu_renderer().render() + + def show_mini_message(self, message: str, sleep=1): + """The mini message is a message on the screen that only coveres the center portion + of the screen, i.e., the remaining content is still visible on the screen while the mini + message is shown in the middle. This version is blocking and stays for sleep seconds.""" + self.get_menu_renderer().mini_message = message + self.get_menu_renderer().render() + time.sleep(sleep) + self.get_menu_renderer().mini_message = "" + + def show_timed_mini_message(self, message: str): + """The mini message is a message on the screen that only coveres the center portion of + the screen, i.e., the remaining content is still visible on the screen while the mini + message is shown in the middle. This version is non-blocking for the main loop and + simply redraws the mini message on screen if necessary.""" + self.get_menu_renderer().mini_message = message + self.get_menu_renderer().render() + + def show_splash_screen(self, filename, sleep=2): + """Shows a splash screen for a given number of seconds.""" + image = Image.open(filename).convert("1") + self.get_menu_renderer().update_display_image(image) + time.sleep(sleep) + + def update(self): + """Updates the menu / draws the screen if necessary.""" + self._menu_renderer.update() diff --git a/python/ctrlboard/src/menu/menu_renderer.py b/python/ctrlboard/src/menu/menu_renderer.py new file mode 100644 index 00000000..8f7c17bf --- /dev/null +++ b/python/ctrlboard/src/menu/menu_renderer.py @@ -0,0 +1,254 @@ +"""Module provides the abstract menu renderer class""" +import time +import math +import itertools + +from abc import ABC, abstractmethod +from pydoc import locate + +from typing import Optional +from PIL import Image +from PIL import ImageDraw +from PIL import ImageFont +from menu.menu import Menu +from menu.menu_renderer_config import MenuRendererConfig +from menu.screensaver import ScreenSaver + + +class MenuRenderer(ABC): + """The abstract menu renderer class provides the base for concrete menu + renderer classes that implement functionality based on conrete hardware or available APIs.""" + def __init__(self, config: MenuRendererConfig): + self.message = "" + self.mini_message = "" + self._menu = None + self._config = config + self.disp = self.display_init() + + self.image = Image.new('1', (self.disp.width, self.disp.height)) + self.draw = ImageDraw.Draw(self.image) + self.font = ImageFont.truetype(config.font_path, size=config.font_size) + # just a sample text to work with the font height + _, self.font_height = self.font.getsize("ABCabc") + self.cursor_position = 0 + self.frame_start_row = 0 + self.render_timestamp = None + # effectively a small state machine that deals with the scrolling + self._perform_scrolling_stage = 0 + self._x_scrolling = 0 + self._current_line_horizontal_overlap = None + self._stage_timestamp: Optional[int] = None + + screensaver = locate(self._config.screensaver) + # noinspection PyCallingNonCallable + self.screensaver: ScreenSaver = screensaver(self._config.screensaver_delay, self) + + @abstractmethod + def display_init(self): + """Method initializes the displays for usage.""" + + @abstractmethod + def display_clear(self): + """Methods clears the screen. Possible hardware clear call if necessary.""" + + @abstractmethod + def blank_screen(self): + """Method blanks the screen. Based on drawing a blank rectangle.""" + + @abstractmethod + def update_display_image(self, image): + """Method displays an image using PIL.""" + + @abstractmethod + def update_display(self): + """Method updates the display.""" + + def set_config(self, config: MenuRendererConfig): + """Configures the menu renderer with a generic menu renderer configuration.""" + self._config = config + + def get_config(self): + """Returns the menu renderer configuration.""" + return self._config + + def set_menu(self, menu: Menu): + """Method sets the menu that the menu renderer should draw.""" + self._menu = menu + + def rows_per_screen(self): + """Calculates the number of rows per screen based on the configured font size.""" + rows = self.disp.height / self.font_height + return math.floor(rows) + + def draw_row(self, row_number: int, text: str, selected: bool): + """Draws a single row of the menu.""" + x_pos = 0 + y_pos = row_number*self.font_height + if selected: + selection_extension = 0 + if row_number < self.rows_per_screen(): + selection_extension = self._config.row_selection_pixel_extension + self.draw.rectangle((x_pos, y_pos, self.disp.width, + y_pos+self._config.font_size+selection_extension), + outline=0, fill=255) + + # in stage 1, we initialize scrolling for the currently selected line + if self._perform_scrolling_stage == 1: + self.setup_horizontal_scrolling(text) + self._perform_scrolling_stage = 2 # don't repeat once the scrolling has started + + # in stage 2, we know the details and can thus perform the scrolling to the left + if self._perform_scrolling_stage == 2: + if self._current_line_horizontal_overlap+self._x_scrolling > 0: + self._x_scrolling -= 1 + if self._current_line_horizontal_overlap+self._x_scrolling == 0: + self._stage_timestamp = int(time.time()) + self._perform_scrolling_stage = 3 + + # in stage 3, we wait for a little when we have scrolled to the end of the text + if self._perform_scrolling_stage == 3: + current_time = int(time.time()) + time_diff = current_time - self._stage_timestamp + if time_diff >= int(self._config.scroll_line_end_delay): + self._stage_timestamp = None + self._perform_scrolling_stage = 4 + + # in stage 4, we scroll back to the right + if self._perform_scrolling_stage == 4: + if self._current_line_horizontal_overlap+self._x_scrolling >= 0: + self._x_scrolling += 1 + + if (self._current_line_horizontal_overlap + + self._x_scrolling) == self._current_line_horizontal_overlap: + self._stage_timestamp = int(time.time()) + self._perform_scrolling_stage = 5 + + # in stage 5, we wait again for a little while before we start again + if self._perform_scrolling_stage == 5: + current_time = int(time.time()) + time_diff = current_time - self._stage_timestamp + if time_diff >= int(self._config.scroll_line_end_delay): + self._stage_timestamp = None + self._perform_scrolling_stage = 2 + + self.draw.text((x_pos+self._x_scrolling, y_pos), text, font=self.font, + spacing=0, stroke_fill=0, fill=0) + else: + self.draw.text((x_pos, y_pos), text, font=self.font, spacing=0, stroke_fill=0, fill=255) + + def draw_fullsceen_message(self, text: str): + """Draws a fullscreen message, i.e., a full-screen message.""" + font_width, font_height = self.font.getsize(text) + centered_width = (self.disp.width - font_width) / 2 + centered_height = (self.disp.height - font_height) / 2 + + self.draw.rectangle((0, 0, self.disp.width, self.disp.height), outline=0, fill=255) + self.draw.text((centered_width, centered_height), text, align="center", font=self.font, + stroke_fill=0, fill=0, textsize=20) + + def draw_mini_message(self, text: str): + """Draws a fullscreen message, i.e., a message covering only the center portion of + the screen. The remaining areas stay visible.""" + font_width, _ = self.font.getsize(text) + centered_width = (self.disp.width - font_width) / 2 + centered_height = (self.disp.height - self.font_height) / 2 + + self.draw.rectangle((0, centered_height-4, self.disp.width, + centered_height+self.font_height+4), outline=0, fill=255) + self.draw.text((centered_width, centered_height), text, align="center", font=self.font, + stroke_fill=0, fill=0, textsize=20) + + def draw_menu(self): + """Method draws the menu set to the class instance.""" + if self._menu.item_selection >= self.frame_start_row + self.rows_per_screen(): + if self._config.scroll_behavior == "page": + self.frame_start_row = self.frame_start_row + (round(self.rows_per_screen()/2)) + 1 + if self.frame_start_row > len(self._menu.entries) - self.rows_per_screen(): + self.frame_start_row = len(self._menu.entries) - self.rows_per_screen() + else: # extend as default behavior + self.frame_start_row = self._menu.item_selection + 1 - self.rows_per_screen() + + if self._menu.item_selection < self.frame_start_row: + if self._config.scroll_behavior == "page": + self.frame_start_row = self.frame_start_row - (round(self.rows_per_screen()/2)) - 1 + if self.frame_start_row < 0: + self.frame_start_row = 0 + else: # extend as default behavior + self.frame_start_row = self._menu.item_selection + + self.draw_menu_frame(self.frame_start_row, self.frame_start_row+self.rows_per_screen()) + + def draw_menu_frame(self, frame_start_row: int, frame_end_row: int): + """Draws row frame_start_row to frame_end_row of the class instance menu, i.e., it + draws a given frame of the complete menu that fits the screen.""" + self.draw.rectangle((0, 0, self.disp.width, self.disp.height), outline=0, fill=0) + row_on_screen = 0 + row_in_menuitems = frame_start_row + for menu_entry in itertools.islice(self._menu.entries, frame_start_row, frame_end_row): + if row_in_menuitems == self._menu.item_selection: + self.draw_row(row_on_screen, menu_entry["text"], True) + else: + self.draw_row(row_on_screen, menu_entry["text"], False) + row_in_menuitems += 1 + row_on_screen += 1 + if row_on_screen >= self.rows_per_screen(): + break + + def render(self, display_on_device=True): + """Method renders the menu.""" + if display_on_device is True: + self.screensaver.reset_timer() + self._perform_scrolling_stage = 0 + self._current_line_horizontal_overlap = None + self._x_scrolling = 0 + + if self._menu is None: + self.draw_fullsceen_message("No menu set!") + self.disp.image(self.image) + + if display_on_device is True: + self.disp.show() + return None + + self.display_clear() + + if self.message != "": + self.draw_fullsceen_message(self.message) + elif self.mini_message != "": + self.draw_mini_message(self.mini_message) + else: + self.draw_menu() + + if display_on_device is True: + self.update_display_image(self.image) + self.update_display() + + self.render_timestamp = int(time.time()) + + return self.image + + def setup_horizontal_scrolling(self, text): + """Configure horizontal scrolling based on the configured screen dimensions.""" + font_width, _ = self.font.getsize(text) + self._current_line_horizontal_overlap = font_width - self.disp.width + + def update(self): + """Method updates the menu drawing within the main loop in a non-blocking manner. + Also updates the current entry scrolling if activated.""" + if self._config.scroll_line is False: + return + + self.screensaver.check_timer() + + if self.screensaver.enabled is True: + self.screensaver.draw() + return + + current_time = int(time.time()) + time_diff = current_time - self.render_timestamp + + if time_diff >= self._config.scroll_delay: + if self._perform_scrolling_stage == 0: + self._perform_scrolling_stage = 1 + self.draw_menu() + self.update_display_image(self.image) diff --git a/python/ctrlboard/src/menu/menu_renderer_adafruit_ssd1306.py b/python/ctrlboard/src/menu/menu_renderer_adafruit_ssd1306.py new file mode 100644 index 00000000..d5d4c2c8 --- /dev/null +++ b/python/ctrlboard/src/menu/menu_renderer_adafruit_ssd1306.py @@ -0,0 +1,34 @@ +"""Module providing the Adafruit SSD1306 menu renderer class""" +# pylint: disable=import-error +from board import SCL, SDA +import busio +import adafruit_ssd1306 +from menu.menu_renderer import MenuRenderer + + +class MenuRendererAdafruitSSD1306(MenuRenderer): + """Class implementing a menu renderer using the Adafruit SSD1306 library""" + + def display_init(self): + i2c = busio.I2C(SCL, SDA) + self.disp = adafruit_ssd1306.SSD1306_I2C(self._config.width, self._config.height, i2c, + addr=self._config.i2c_address) + self.disp.rotation = self._config.get_mapped_rotation() + self.disp.fill(0) + self.disp.show() + + return self.disp + + def update_display_image(self, image): + self.disp.image(self.image) + self.disp.show() + + def update_display(self): + self.disp.show() + + def display_clear(self): + self.disp.fill(0) + + def blank_screen(self): + self.disp.fill(0) + self.disp.show() diff --git a/python/ctrlboard/src/menu/menu_renderer_config.py b/python/ctrlboard/src/menu/menu_renderer_config.py new file mode 100644 index 00000000..0d12e72c --- /dev/null +++ b/python/ctrlboard/src/menu/menu_renderer_config.py @@ -0,0 +1,39 @@ +"""Module for configuring menu renderer instances""" + + +# pylint: disable=too-many-instance-attributes, too-few-public-methods +class MenuRendererConfig: + """Class for configuring menu renderer instances. Provides configuration options + such as width, height, i2c address, font, transitions, etc.""" + _rotation_mapper = { + 0: 0, + 90: 1, + 180: 2, + 270: 3 + } + + def __init__(self): + self.width = 128 + self.height = 64 + self.i2c_address = 0x3c + self.i2c_port = 1 + self.display_type = "ssd1306" # luma-oled supported devices, "sh1106", "ssd1306", ... + self.font_path = 'resources/DejaVuSansMono-Bold.ttf' + self.font_size = 12 + self.row_selection_pixel_extension = 2 + self.scroll_behavior = "page" # "extend" or "page" + self.transition = "PushTransition" # "PushTransition" or "None + self.transition_attributes_left = {"direction": "push_left"} + self.transition_attributes_right = {"direction": "push_right"} + self.transition_speed = 10 + self.scroll_line = True + self.scroll_delay = 3 + self.scroll_line_end_delay = 2 + self.screensaver = "menu.blank_screensaver.BlankScreenSaver" + self.screensaver_delay = 25 + self.rotation = 0 # 0, 180 + + def get_mapped_rotation(self): + """Converts human-readable rotation value to the one expected + by the luma and adafruit libraries""" + return self._rotation_mapper[self.rotation] diff --git a/python/ctrlboard/src/menu/menu_renderer_luma_oled.py b/python/ctrlboard/src/menu/menu_renderer_luma_oled.py new file mode 100644 index 00000000..e6c30b53 --- /dev/null +++ b/python/ctrlboard/src/menu/menu_renderer_luma_oled.py @@ -0,0 +1,34 @@ +"""Module providing the luma oled menu renderer class""" +from luma.core.interface.serial import i2c +from menu.menu_renderer import MenuRenderer + + +class MenuRendererLumaOled(MenuRenderer): + """Class implementing the luma oled menu renderer""" + def display_init(self): + serial = i2c(port=self._config.i2c_port, address=self._config.i2c_address) + import luma.oled.device + device = getattr(luma.oled.device, self._config.display_type) + + self.disp = device(serial_interface=serial, width=self._config.width, + height=self._config.height, + rotate=self._config.get_mapped_rotation()) + + self.disp.clear() + self.disp.show() + + return self.disp + + def update_display_image(self, image): + self.disp.display(image) + + def update_display(self): + self.disp.display(self.image) + + def display_clear(self): + pass + + def blank_screen(self): + self.disp.clear() + self.draw.rectangle((0, 0, self.disp.width, self.disp.height), outline=0, fill=0) + self.disp.show() diff --git a/python/ctrlboard/src/menu/screensaver.py b/python/ctrlboard/src/menu/screensaver.py new file mode 100644 index 00000000..f291f753 --- /dev/null +++ b/python/ctrlboard/src/menu/screensaver.py @@ -0,0 +1,33 @@ +"""Module providing the menu screensaver class""" +from abc import abstractmethod +from menu.timer import Timer + + +class ScreenSaver: + """Class implementing the menu screensaver""" + + def __init__(self, activation_delay, menu_renderer): + self.enabled = False + self.menu_renderer = menu_renderer + self.screensaver_activation_delay = activation_delay + self.timer_flag = Timer(self.screensaver_activation_delay) + + def draw(self): + """Draws the screen saver in a non-blocking way if enabled.""" + if self.enabled is True: + self.draw_screensaver() + + @abstractmethod + def draw_screensaver(self): + """Draws the screen saver. Must be implemented in subclasses.""" + + def check_timer(self): + """Checks if the screen saver should be enabled given the configured + activation delay.""" + self.timer_flag.check_timer() + self.enabled = self.timer_flag.enabled + + def reset_timer(self): + """Resets the screen saver timer if an activitiy happend.""" + self.timer_flag.reset_timer() + self.enabled = self.timer_flag.enabled diff --git a/python/ctrlboard/src/menu/timer.py b/python/ctrlboard/src/menu/timer.py new file mode 100644 index 00000000..3d41cc6b --- /dev/null +++ b/python/ctrlboard/src/menu/timer.py @@ -0,0 +1,24 @@ +"""Module providing a timer class""" +import time + + +class Timer: + """Class implementing a timer class. Takes an activation delay and + sets a flag if the activation delay exprires.""" + def __init__(self, activation_delay): + self.start_timestamp = int(time.time()) + self.activation_delay = activation_delay + self.enabled = False + + def check_timer(self): + """Checks the timer whether it has reached the activation delay.""" + current_timestamp = int(time.time()) + timestamp_diff = current_timestamp - self.start_timestamp + + if timestamp_diff >= self.activation_delay: + self.enabled = True + + def reset_timer(self): + """Resets the timer and starts from the beginning.""" + self.start_timestamp = int(time.time()) + self.enabled = False diff --git a/python/ctrlboard/src/menu/transition.py b/python/ctrlboard/src/menu/transition.py new file mode 100644 index 00000000..a61df0a5 --- /dev/null +++ b/python/ctrlboard/src/menu/transition.py @@ -0,0 +1,65 @@ +"""Module providing implementations for menu transitions.""" +from abc import abstractmethod +from PIL import Image + + +# pylint: disable=too-few-public-methods +class Transition: + """Class provides the interface for menu transitions. Must be subclassed.""" + + def __init__(self, disp): + self.disp = disp + + @abstractmethod + def perform(self, start_image: Image, end_image: Image, transition_attributes=None) -> None: + """Signature for an abstract transition. Must be implemented in subclasses.""" + + +class PushTransition(Transition): + """Class implementing a push left/right transition.""" + PUSH_LEFT_TRANSITION = "push_left" + PUSH_RIGHT_TRANSITION = "push_right" + + def __init__(self, disp): + super().__init__(disp) + self.transition_attributes = None + + def perform(self, start_image: Image, end_image: Image, transition_attributes=None): + """Performs a push transition to the left or right depending on the + transition attribute 'direction'.""" + direction = {} + self.transition_attributes = transition_attributes + if transition_attributes is not None and transition_attributes != {}: + direction = transition_attributes["direction"] + + transition_image = Image.new('1', (self.disp.width, self.disp.height)) + + if direction == PushTransition.PUSH_LEFT_TRANSITION: + self.perform_push_left(end_image, start_image, transition_image) + elif direction == PushTransition.PUSH_RIGHT_TRANSITION: + self.perform_push_right(end_image, start_image, transition_image) + else: + self.disp.image(end_image) + self.disp.show() + + def perform_push_left(self, end_image, start_image, transition_image): + """Implements a push left transition. Is called by perform depending on the transition + attribute 'direction'.""" + for x_pos in range(0, 128, self.transition_attributes["transition_speed"]): + left_region = start_image.crop((x_pos, 0, 128, 64)) + right_region = end_image.crop((0, 0, x_pos, 64)) + transition_image.paste(left_region, (0, 0, 128 - x_pos, 64)) + transition_image.paste(right_region, (128 - x_pos, 0, 128, 64)) + self.disp.display(transition_image) + self.disp.display(end_image) + + def perform_push_right(self, end_image, start_image, transition_image): + """Implements a push right transition. Is called by perform depending on the transition + attribute 'direction'.""" + for x_pos in range(0, 128, self.transition_attributes["transition_speed"]): + left_region = start_image.crop((0, 0, 128-x_pos, 64)) + right_region = end_image.crop((128-x_pos, 0, 128, 64)) + transition_image.paste(left_region, (x_pos, 0, 128, 64)) + transition_image.paste(right_region, (0, 0, x_pos, 64)) + self.disp.display(transition_image) + self.disp.display(end_image) diff --git a/python/ctrlboard/src/observable.py b/python/ctrlboard/src/observable.py new file mode 100644 index 00000000..946dd1c5 --- /dev/null +++ b/python/ctrlboard/src/observable.py @@ -0,0 +1,21 @@ +"""Module for Observable part of the Observer pattern functionality""" +from typing import List +from observer import Observer + + +class Observable: + """Class implementing the Observable pattern""" + _observers: List[Observer] = [] + + def attach(self, observer: Observer): + """Attaches an observer to an obserable object""" + self._observers.append(observer) + + def detach(self, observer: Observer): + """detaches an observer from an observable object""" + self._observers.remove(observer) + + def notify(self, updated_object): + """Notifies all observers with a given object parameter""" + for observer in self._observers: + observer.update(updated_object) diff --git a/python/ctrlboard/src/observer.py b/python/ctrlboard/src/observer.py new file mode 100644 index 00000000..0fda4830 --- /dev/null +++ b/python/ctrlboard/src/observer.py @@ -0,0 +1,10 @@ +"""Module implementing the Observer part of the Observer pattern""" +from abc import ABC, abstractmethod + + +# pylint: disable=too-few-public-methods +class Observer(ABC): + """Class implementing an abserver""" + @abstractmethod + def update(self, updated_object) -> None: + """Abstract method for updating an observer. Needs to be implemented by subclasses.""" diff --git a/python/ctrlboard/src/rascsi_menu_controller.py b/python/ctrlboard/src/rascsi_menu_controller.py new file mode 100644 index 00000000..9b0a538d --- /dev/null +++ b/python/ctrlboard/src/rascsi_menu_controller.py @@ -0,0 +1,32 @@ +"""Module implementing the RaSCSI Control Board UI specific menu controller""" +from ctrlboard_menu_builder import CtrlBoardMenuBuilder +from menu.menu_builder import MenuBuilder +from menu.menu_controller import MenuController +from menu.menu_renderer import MenuRenderer +from menu.timer import Timer + + +class RascsiMenuController(MenuController): + """Class implementing a RaSCSI Control Board UI specific menu controller""" + + def __init__(self, refresh_interval, menu_builder: MenuBuilder, + menu_renderer=None, menu_renderer_config=None): + super().__init__(menu_builder, menu_renderer, menu_renderer_config) + self._refresh_interval = refresh_interval + self._menu_renderer: MenuRenderer = menu_renderer + self._scsi_list_refresh_timer_flag = Timer(self._refresh_interval) + + def segue(self, name, context_object=None, transition_attributes=None): + super().segue(name, context_object, transition_attributes) + self._scsi_list_refresh_timer_flag.reset_timer() + + def update(self): + super().update() + + if self.get_active_menu().name == CtrlBoardMenuBuilder.SCSI_ID_MENU: + self._scsi_list_refresh_timer_flag.check_timer() + if self._scsi_list_refresh_timer_flag.enabled is True: + self._scsi_list_refresh_timer_flag.reset_timer() + self.refresh(name=CtrlBoardMenuBuilder.SCSI_ID_MENU) + if self._menu_renderer.screensaver.enabled is False: + self.set_active_menu(CtrlBoardMenuBuilder.SCSI_ID_MENU, display_on_device=False) diff --git a/python/ctrlboard/start.sh b/python/ctrlboard/start.sh new file mode 100755 index 00000000..bf268346 --- /dev/null +++ b/python/ctrlboard/start.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash +set -e +# set -x # Uncomment to Debug + +PI_MODEL=$(/usr/bin/tr -d '\0' < /proc/device-tree/model) + +cd "$(dirname "$0")" +# verify packages installed +ERROR=0 +if ! command -v dpkg -l i2c-tools &> /dev/null ; then + echo "i2c-tools could not be found" + echo "Run 'sudo apt install i2c-tools' to fix." + ERROR=1 +fi +if ! command -v python3 &> /dev/null ; then + echo "python3 could not be found" + echo "Run 'sudo apt install python3' to fix." + ERROR=1 +fi +if ! python3 -m venv --help &> /dev/null ; then + echo "venv could not be found" + echo "Run 'sudo apt install python3-venv' to fix." + ERROR=1 +fi +# Dep to build Pillow +if ! dpkg -l python3-dev &> /dev/null; then + echo "python3-dev could not be found" + echo "Run 'sudo apt install python3-dev' to fix." + ERROR=1 +fi +if ! dpkg -l libjpeg-dev &> /dev/null; then + echo "libjpeg-dev could not be found" + echo "Run 'sudo apt install libjpeg-dev' to fix." + ERROR=1 +fi +if ! dpkg -l libpng-dev &> /dev/null; then + echo "libpng-dev could not be found" + echo "Run 'sudo apt install libpng-dev' to fix." + ERROR=1 +fi +if ! dpkg -l libopenjp2-7-dev &> /dev/null; then + echo "libopenjp2-7-dev could not be found" + echo "Run 'sudo apt install libopenjp2-7-dev' to fix." + ERROR=1 +fi +if [ $ERROR = 1 ] ; then + echo + echo "Fix errors and re-run ./start.sh" + exit 1 +fi + +if pgrep -f "python3 src/main.py" &> /dev/null; then + echo "Detected active rascsi control board service" + echo "Terminating before launching a new one." + sudo pkill -f "python3 src/main.py" +fi + +if ! i2cdetect -y 1 &> /dev/null ; then + echo "i2cdetect -y 1 did not find a screen." + exit 2 +fi + +# Compiler flags needed for gcc v10 and up +if [[ `gcc --version | awk '/gcc/' | awk -F ' ' '{print $3}' | awk -F '.' '{print $1}'` -ge 10 ]]; then + COMPILER_FLAGS="-fcommon" +fi + +# Test for two known broken venv states +if test -e venv; then + GOOD_VENV=true + ! test -e venv/bin/activate && GOOD_VENV=false + pip3 list 1> /dev/null + test $? -eq 1 && GOOD_VENV=false + if ! "$GOOD_VENV"; then + echo "Deleting bad python venv" + sudo rm -rf venv + fi +fi + +# Create the venv if it doesn't exist +if ! test -e venv; then + echo "Creating python venv for RaSCSI control board service" + python3 -m venv venv --system-site-packages + echo "Activating venv" + source venv/bin/activate + echo "Installing requirements.txt" + pip3 install wheel + CFLAGS="$COMPILER_FLAGS" pip3 install -r requirements.txt + + set +e + git rev-parse --is-inside-work-tree &> /dev/null + if [[ $? -eq 0 ]]; then + git rev-parse HEAD > current + fi +fi + +source venv/bin/activate + +# Detect if someone updates the git repo - we need to re-run pip3 install. +set +e +git rev-parse --is-inside-work-tree &> /dev/null +if [[ $? -eq 0 ]]; then + set -e + if ! test -e current; then + git rev-parse > current + elif [ "$(cat current)" != "$(git rev-parse HEAD)" ]; then + echo "New version detected, updating libraries from requirements.txt" + CFLAGS="$COMPILER_FLAGS" pip3 install -r requirements.txt + git rev-parse HEAD > current + fi +else + echo "Warning: Not running from a valid git repository. Will not be able to update the code." +fi +set -e + +export PYTHONPATH=${PWD}/src:${PWD}/../common/src + +echo "Starting RaSCSI control board service..." + +if [[ ${PI_MODEL} =~ "Raspberry Pi 4" ]] || [[ ${PI_MODEL} =~ "Raspberry Pi 3" ]] || + [[ ${PI_MODEL} =~ "Raspberry Pi Zero 2" ]]; then + echo "Detected: Raspberry Pi 4, Pi 3 or Pi Zero 2" + python3 src/main.py "$@" --transitions 1 +else + echo "Detected: Raspberry Pi Zero, Zero W, Zero WH, ..." + echo "Transition animations will be disabled." + python3 src/main.py "$@" --transitions 0 +fi