2021-11-25 06:44:12 +00:00
|
|
|
# Python imports
|
2022-08-10 01:10:25 +00:00
|
|
|
import builtins, threading
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2021-12-07 04:44:39 +00:00
|
|
|
# Lib imports
|
2021-11-25 06:44:12 +00:00
|
|
|
|
|
|
|
# Application imports
|
2022-03-08 01:18:55 +00:00
|
|
|
from utils.ipc_server import IPCServer
|
2021-11-25 06:44:12 +00:00
|
|
|
|
|
|
|
|
2022-08-10 01:10:25 +00:00
|
|
|
# NOTE: Threads will not die with parent's destruction
|
|
|
|
def threaded_wrapper(fn):
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=False).start()
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
# NOTE: Insure threads die with parent's destruction
|
|
|
|
def daemon_threaded_wrapper(fn):
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start()
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-12-07 04:44:39 +00:00
|
|
|
|
|
|
|
|
2022-02-25 23:58:11 +00:00
|
|
|
class EventSystem(IPCServer):
|
2022-02-02 03:08:02 +00:00
|
|
|
""" Inheret IPCServerMixin. Create an pub/sub systems. """
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2021-10-14 02:30:08 +00:00
|
|
|
def __init__(self):
|
2022-02-25 23:58:11 +00:00
|
|
|
super(EventSystem, self).__init__()
|
|
|
|
|
2022-06-15 04:03:04 +00:00
|
|
|
# NOTE: The format used is list of ['who', target, (data,)] Where:
|
|
|
|
# who is the sender or target ID and is used for context and control flow,
|
|
|
|
# method_target is the method to call,
|
|
|
|
# data is the method parameters OR message data to give
|
2021-10-14 02:30:08 +00:00
|
|
|
# Where data may be any kind of data
|
2021-10-14 03:01:12 +00:00
|
|
|
self._gui_events = []
|
2022-02-01 07:43:09 +00:00
|
|
|
self._module_events = []
|
2022-02-25 23:58:11 +00:00
|
|
|
|
2022-01-24 16:24:55 +00:00
|
|
|
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-06-15 04:03:04 +00:00
|
|
|
# Makeshift "events" system FIFO
|
2022-03-25 03:15:08 +00:00
|
|
|
def _pop_gui_event(self) -> None:
|
2021-10-14 02:30:08 +00:00
|
|
|
if len(self._gui_events) > 0:
|
|
|
|
return self._gui_events.pop(0)
|
|
|
|
return None
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def _pop_module_event(self) -> None:
|
2022-02-01 07:43:09 +00:00
|
|
|
if len(self._module_events) > 0:
|
|
|
|
return self._module_events.pop(0)
|
2021-10-14 02:30:08 +00:00
|
|
|
return None
|
2021-10-11 05:34:13 +00:00
|
|
|
|
|
|
|
|
2022-04-03 04:23:33 +00:00
|
|
|
def push_gui_event(self, event: list) -> None:
|
2021-10-14 02:30:08 +00:00
|
|
|
if len(event) == 3:
|
|
|
|
self._gui_events.append(event)
|
|
|
|
return None
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-06-15 04:03:04 +00:00
|
|
|
raise Exception("Invald event format! Please do: ['sender_id': str, method_target: method, (data,): any]")
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def push_module_event(self, event: list) -> None:
|
2021-10-14 02:30:08 +00:00
|
|
|
if len(event) == 3:
|
2022-02-01 07:43:09 +00:00
|
|
|
self._module_events.append(event)
|
2021-10-14 02:30:08 +00:00
|
|
|
return None
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-06-15 04:03:04 +00:00
|
|
|
raise Exception("Invald event format! Please do: ['target_id': str, method_target: method, (data,): any]")
|
2021-10-11 05:34:13 +00:00
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def read_gui_event(self) -> list:
|
2022-06-15 04:03:04 +00:00
|
|
|
return self._gui_events[0] if self._gui_events else None
|
2021-10-14 02:30:08 +00:00
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def read_module_event(self) -> list:
|
2022-06-15 04:03:04 +00:00
|
|
|
return self._module_events[0] if self._module_events else None
|
2021-10-14 02:30:08 +00:00
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def consume_gui_event(self) -> list:
|
2021-10-14 02:30:08 +00:00
|
|
|
return self._pop_gui_event()
|
|
|
|
|
2022-03-25 03:15:08 +00:00
|
|
|
def consume_module_event(self) -> list:
|
2022-02-01 07:43:09 +00:00
|
|
|
return self._pop_module_event()
|
2021-10-14 02:30:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2022-08-10 01:10:25 +00:00
|
|
|
class EndpointRegistry():
|
|
|
|
def __init__(self):
|
|
|
|
self._endpoints = {}
|
|
|
|
|
|
|
|
def register(self, rule, **options):
|
|
|
|
def decorator(f):
|
|
|
|
_endpoint = options.pop("endpoint", None)
|
|
|
|
self._endpoints[rule] = f
|
|
|
|
return f
|
|
|
|
|
|
|
|
return decorator
|
|
|
|
|
|
|
|
def get_endpoints(self):
|
|
|
|
return self._endpoints
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-10-14 02:30:08 +00:00
|
|
|
# NOTE: Just reminding myself we can add to builtins two different ways...
|
|
|
|
# __builtins__.update({"event_system": Builtins()})
|
2022-01-31 00:09:00 +00:00
|
|
|
builtins.app_name = "SolarFM"
|
2022-02-25 23:58:11 +00:00
|
|
|
builtins.event_system = EventSystem()
|
2022-08-10 01:10:25 +00:00
|
|
|
builtins.endpoint_registry = EndpointRegistry()
|
|
|
|
builtins.threaded = threaded_wrapper
|
|
|
|
builtins.daemon_threaded = daemon_threaded_wrapper
|
2022-06-15 04:03:04 +00:00
|
|
|
builtins.event_sleep_time = 0.05
|
2022-01-20 05:49:19 +00:00
|
|
|
builtins.trace_debug = False
|
2022-03-25 03:15:08 +00:00
|
|
|
builtins.debug = False
|
2022-08-10 01:10:25 +00:00
|
|
|
builtins.app_settings = None
|