From 6cfddf196adadcc8f8f612605868ff75999a4102 Mon Sep 17 00:00:00 2001 From: RobertoAldea Date: Thu, 30 Nov 2023 11:24:17 +0100 Subject: [PATCH 1/4] Include SysShdPeripheralC, for real time --- code/sys_shd/pyproject.toml | 2 +- .../src/system_shared_tool/__init__.py | 3 +- .../sys_shd/src/system_shared_tool/context.py | 4 +- .../src/system_shared_tool/sys_shd_common.py | 40 +++++++++++++++++-- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/code/sys_shd/pyproject.toml b/code/sys_shd/pyproject.toml index 66081ae..44ca929 100644 --- a/code/sys_shd/pyproject.toml +++ b/code/sys_shd/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" # users can install this project, e.g.: # # $ pip install -name = "system_shared_tool" +name = "system_shared_tool_rt" # Versions should comply with PEP 440: # https://www.python.org/dev/peps/pep-0440/ diff --git a/code/sys_shd/src/system_shared_tool/__init__.py b/code/sys_shd/src/system_shared_tool/__init__.py index e5e76de..3cbdffb 100644 --- a/code/sys_shd/src/system_shared_tool/__init__.py +++ b/code/sys_shd/src/system_shared_tool/__init__.py @@ -2,7 +2,8 @@ This file specifies what is going to be exported from this module. In this case is sys_shd. """ -from .sys_shd_common import SysShdErrorC, SysShdNodeParamsC, SysShdNodeC, SysShdNodeStatusE +from .sys_shd_common import (SysShdErrorC, SysShdNodeParamsC, SysShdNodeC, SysShdNodeStatusE, + SysShdPeripheralC) from .sys_shd_channels import SysShdIpcChanC, SysShdChanC from .sys_shd_objects import SysShdSharedObjC __all__= ['SysShdChanC', 'SysShdSharedObjC', 'SysShdErrorC', 'SysShdNodeStatusE', diff --git a/code/sys_shd/src/system_shared_tool/context.py b/code/sys_shd/src/system_shared_tool/context.py index bd64209..437442b 100644 --- a/code/sys_shd/src/system_shared_tool/context.py +++ b/code/sys_shd/src/system_shared_tool/context.py @@ -28,7 +28,9 @@ DEFAULT_CHAN_NUM_MSG : int = 100 # Max number of allowed message per chan DEFAULT_IPC_MSG_SIZE : int = 100 # Size of message sent through IPC message queue DEFAULT_CHAN_TIMEOUT : int = 1 +DEFAULT_GPIO_CONFIG_PATH : str = 'config_gpio.yaml' -CONSTANTS_NAMES = ('DEFAULT_CHAN_NUM_MSG', 'DEFAULT_IPC_MSG_SIZE', 'DEFAULT_CHAN_TIMEOUT') +CONSTANTS_NAMES = ('DEFAULT_CHAN_NUM_MSG', 'DEFAULT_IPC_MSG_SIZE', 'DEFAULT_CHAN_TIMEOUT', + 'DEFAULT_GPIO_CONFIG_PATH') sys_conf_update_config_params(context=globals(), constants_names=CONSTANTS_NAMES) diff --git a/code/sys_shd/src/system_shared_tool/sys_shd_common.py b/code/sys_shd/src/system_shared_tool/sys_shd_common.py index a80e84a..2c1df5e 100644 --- a/code/sys_shd/src/system_shared_tool/sys_shd_common.py +++ b/code/sys_shd/src/system_shared_tool/sys_shd_common.py @@ -11,22 +11,28 @@ from enum import Enum from time import time, sleep ####################### SYSTEM ABSTRACTION IMPORTS ####################### +from system_config_tool import sys_conf_read_config_params from system_logger_tool import Logger, SysLogLoggerC, sys_log_logger_get_module_logger if __name__ == "__main__": cycler_logger = SysLogLoggerC() log: Logger = sys_log_logger_get_module_logger(__name__) ####################### THIRD PARTY IMPORTS ####################### +from RPi.GPIO.GPIO import setmode, BCM, BOARD, setup, output, HIGH, LOW, OUT ####################### MODULE IMPORTS ####################### ####################### PROJECT IMPORTS ####################### -####################### ENUMS ####################### - -####################### CLASSES ####################### +###################### CONSTANTS ###################### +from .context import DEFAULT_GPIO_CONFIG_PATH +gpio_mode = sys_conf_read_config_params(filename=DEFAULT_GPIO_CONFIG_PATH, section= 'GPIO_BOARD') +if gpio_mode == 'BOARD': + setmode(BOARD) +else: + setmode(BCM) _TO_MS = 1000 - +####################### ENUMS ####################### class SysShdNodeStatusE(Enum): ''' Enum class for the node state @@ -37,6 +43,7 @@ class SysShdNodeStatusE(Enum): INIT = 2 STOP = 3 +####################### CLASSES ####################### class SysShdNodeParamsC: ''' Class that contains the can parameters in order to create the thread correctly @@ -66,6 +73,8 @@ def __init__(self,name: str, cycle_period: int, working_flag : Event, working_flag (Event): [description] node_params (SysShdNodeParamsC, optional): .Defaults to SysShdNodeParamsC(). ''' + port: int = sys_conf_read_config_params(filename=DEFAULT_GPIO_CONFIG_PATH, section= name) + self.gpio: SysShdPeripheralC = SysShdPeripheralC(port=port) super().__init__(group = None, target = node_params.target, name = name, args = node_params.args, kwargs = node_params.kwargs, daemon = node_params.daemon) @@ -102,7 +111,9 @@ def run(self) -> None: while self.working_flag.is_set(): try: next_time = time()+self.cycle_period/_TO_MS + self.gpio.set_gpio_up() self.process_iteration() + self.gpio.set_gpio_down() # Sleep the remaining time sleep_time = next_time-int(time()) # sleep_time is measure in miliseconds @@ -135,3 +146,24 @@ def __init__(self, message) -> None: message (str): explanation of the error ''' super().__init__(message) + +class SysShdPeripheralC: + ''' + Class that contains the common methods to toggle gpios. + ''' + def __init__(self, port: int) -> None: + self.port: int = port + setup(port, OUT) + def set_gpio_up(self) -> None: + """ + Sets the GPIO pin to a high state. + """ + log.debug(f"Setting GPIO {self.port} up") + output(self.port, HIGH) + + def set_gpio_down(self) -> None: + """ + Sets the GPIO pin to a low state. + """ + log.debug(f"Setting GPIO {self.port} down") + output(self.port, LOW) From 02131d770baa3a623c19e573202c79fb4aedbb23 Mon Sep 17 00:00:00 2001 From: RobertoAldea Date: Thu, 30 Nov 2023 11:56:00 +0100 Subject: [PATCH 2/4] update requirements --- code/sys_shd/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/code/sys_shd/requirements.txt b/code/sys_shd/requirements.txt index 056410d..58bfddd 100644 --- a/code/sys_shd/requirements.txt +++ b/code/sys_shd/requirements.txt @@ -2,3 +2,4 @@ posix-ipc>=1.1.1 PyYAML>=6.0.1 system-config-tool>=0.0.7 system-logger-tool>=0.2.2 +RPi-GPIO>=0.7.1 \ No newline at end of file From c16ff8ad714cbdfb00fcc07c2d6dbe6df8aae774 Mon Sep 17 00:00:00 2001 From: RobertoAldea Date: Wed, 20 Dec 2023 13:55:16 +0100 Subject: [PATCH 3/4] Minor changes to improve code --- .../src/system_shared_tool/sys_shd_common.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/code/sys_shd/src/system_shared_tool/sys_shd_common.py b/code/sys_shd/src/system_shared_tool/sys_shd_common.py index 2c1df5e..f65f363 100644 --- a/code/sys_shd/src/system_shared_tool/sys_shd_common.py +++ b/code/sys_shd/src/system_shared_tool/sys_shd_common.py @@ -11,7 +11,7 @@ from enum import Enum from time import time, sleep ####################### SYSTEM ABSTRACTION IMPORTS ####################### -from system_config_tool import sys_conf_read_config_params +from system_config_tool import sys_conf_read_config_params, SysConfSectionNotFoundErrorC from system_logger_tool import Logger, SysLogLoggerC, sys_log_logger_get_module_logger if __name__ == "__main__": @@ -73,8 +73,13 @@ def __init__(self,name: str, cycle_period: int, working_flag : Event, working_flag (Event): [description] node_params (SysShdNodeParamsC, optional): .Defaults to SysShdNodeParamsC(). ''' - port: int = sys_conf_read_config_params(filename=DEFAULT_GPIO_CONFIG_PATH, section= name) - self.gpio: SysShdPeripheralC = SysShdPeripheralC(port=port) + try: + port: int = sys_conf_read_config_params(filename=DEFAULT_GPIO_CONFIG_PATH, + section= name) + except SysConfSectionNotFoundErrorC as err: + log.warning(f"No port configurable {err}") + else: + self.gpio: SysShdPeripheralC = SysShdPeripheralC(port=port) super().__init__(group = None, target = node_params.target, name = name, args = node_params.args, kwargs = node_params.kwargs, daemon = node_params.daemon) @@ -111,9 +116,11 @@ def run(self) -> None: while self.working_flag.is_set(): try: next_time = time()+self.cycle_period/_TO_MS - self.gpio.set_gpio_up() + if hasattr(self, 'gpio'): + self.gpio.set_gpio_up() self.process_iteration() - self.gpio.set_gpio_down() + if hasattr(self, 'gpio'): + self.gpio.set_gpio_down() # Sleep the remaining time sleep_time = next_time-int(time()) # sleep_time is measure in miliseconds From 0e136f494f485ca480db2821f83a16a38762cf74 Mon Sep 17 00:00:00 2001 From: RobertoAldea Date: Wed, 20 Dec 2023 14:02:21 +0100 Subject: [PATCH 4/4] Solved timeout problem --- code/sys_shd/src/system_shared_tool/context.py | 2 +- code/sys_shd/src/system_shared_tool/sys_shd_channels.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/sys_shd/src/system_shared_tool/context.py b/code/sys_shd/src/system_shared_tool/context.py index 437442b..47ad90f 100644 --- a/code/sys_shd/src/system_shared_tool/context.py +++ b/code/sys_shd/src/system_shared_tool/context.py @@ -27,7 +27,7 @@ # For further information check out README.md DEFAULT_CHAN_NUM_MSG : int = 100 # Max number of allowed message per chan DEFAULT_IPC_MSG_SIZE : int = 100 # Size of message sent through IPC message queue -DEFAULT_CHAN_TIMEOUT : int = 1 +DEFAULT_CHAN_TIMEOUT : int|None = None DEFAULT_GPIO_CONFIG_PATH : str = 'config_gpio.yaml' CONSTANTS_NAMES = ('DEFAULT_CHAN_NUM_MSG', 'DEFAULT_IPC_MSG_SIZE', 'DEFAULT_CHAN_TIMEOUT', diff --git a/code/sys_shd/src/system_shared_tool/sys_shd_channels.py b/code/sys_shd/src/system_shared_tool/sys_shd_channels.py index 44c00e6..d3bd46b 100644 --- a/code/sys_shd/src/system_shared_tool/sys_shd_channels.py +++ b/code/sys_shd/src/system_shared_tool/sys_shd_channels.py @@ -7,6 +7,7 @@ ####################### MANDATORY IMPORTS ####################### from __future__ import annotations +from typing import Any ####################### GENERIC IMPORTS ####################### from queue import Queue, Empty, Full from pickle import dumps, loads, HIGHEST_PROTOCOL @@ -59,7 +60,7 @@ def delete_until_last(self) -> None: while self.qsize() > 1: self.get() - def receive_data(self) -> object: + def receive_data(self) -> Any: ''' Pop the first element from the queue and return it. If queue is empty, wait until a new element is pushed to the queue. @@ -69,7 +70,7 @@ def receive_data(self) -> object: ''' return self.get() - def receive_data_unblocking(self) -> object: + def receive_data_unblocking(self) -> Any: ''' Receive data from the queue in unblocking mode. @@ -142,7 +143,7 @@ def delete_until_last(self) -> None: while self.current_messages > 0: self.receive(timeout = 0) - def receive_data(self, timeout: int = DEFAULT_CHAN_TIMEOUT) -> object: + def receive_data(self, timeout: int|None = DEFAULT_CHAN_TIMEOUT) -> Any: ''' Pop the first element from the queue and return it. If queue is empty, wait until a new element is pushed to the queue. @@ -162,7 +163,7 @@ def receive_data(self, timeout: int = DEFAULT_CHAN_TIMEOUT) -> object: self.block = False return msg_decoded - def receive_data_unblocking(self) -> object: + def receive_data_unblocking(self) -> Any: ''' Receive data from the queue in unblocking mode. Returns: