mirror of https://github.com/DJ2LS/FreeDATA.git
82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
from queue import Queue
|
|
from event_manager import EventManager
|
|
from state_manager import StateManager
|
|
from schedule_manager import ScheduleManager
|
|
from config import CONFIG
|
|
from service_manager import SM as ServiceManager
|
|
from message_system_db_manager import DatabaseManager
|
|
from message_system_db_attachments import DatabaseManagerAttachments
|
|
from websocket_manager import wsm as WebsocketManager
|
|
import audio
|
|
import constants
|
|
from fastapi import Request, WebSocket
|
|
class AppContext:
|
|
def __init__(self, config_file: str):
|
|
self.config_manager = CONFIG(self, config_file)
|
|
self.constants = constants
|
|
self.p2p_data_queue = Queue()
|
|
self.state_queue = Queue()
|
|
self.modem_events = Queue()
|
|
self.modem_fft = Queue()
|
|
self.modem_service = Queue()
|
|
self.event_manager = EventManager(self, [self.modem_events])
|
|
self.state_manager = StateManager(self.state_queue)
|
|
self.schedule_manager = ScheduleManager(self)
|
|
self.service_manager = ServiceManager(self)
|
|
self.websocket_manager = WebsocketManager(self)
|
|
|
|
self.socket_interface_manager = None # Socket interface instance, We start it as we need it
|
|
self.rf_modem = None # Modem instnace, we start it as we need it
|
|
self.message_system_db_manager = DatabaseManager(self)
|
|
self.message_system_db_attachments = DatabaseManagerAttachments(self)
|
|
|
|
self.TESTMODE = False
|
|
self.TESTMODE_TRANSMIT_QUEUE = Queue() # This is a helper queue which holds bursts to be transmitted for helping using tests
|
|
self.TESTMODE_RECEIVE_QUEUE = Queue() # This is a helper queue which holds received bursts for helping using tests
|
|
self.TESTMODE_EVENTS = Queue() # This is a helper queue which holds events
|
|
|
|
def startup(self):
|
|
|
|
# initially read config
|
|
self.config_manager.read()
|
|
|
|
self.websocket_manager.startWorkerThreads(self)
|
|
|
|
# start modem service
|
|
self.modem_service.put("start")
|
|
|
|
# DB setup
|
|
db = DatabaseManager(self.event_manager)
|
|
db.check_database_version()
|
|
db.initialize_default_values()
|
|
db.database_repair_and_cleanup()
|
|
DatabaseManagerAttachments(self).clean_orphaned_attachments()
|
|
|
|
def shutdown(self):
|
|
try:
|
|
for s in self.state_manager.arq_irs_sessions.values():
|
|
s.transmission_aborted()
|
|
for s in self.state_manager.arq_iss_sessions.values():
|
|
s.abort_transmission(send_stop=False)
|
|
s.transmission_aborted()
|
|
except Exception:
|
|
pass
|
|
self.websocket_manager.shutdown()
|
|
self.schedule_manager.stop()
|
|
self.service_manager.shutdown()
|
|
#self._audio.terminate()
|
|
import os
|
|
os._exit(0)
|
|
# Dependency provider for FastAPI (HTTP & WebSocket)
|
|
def get_ctx(request: Request = None, websocket: WebSocket = None) -> AppContext:
|
|
"""
|
|
Provide the application context for HTTP requests or WebSocket connections.
|
|
|
|
FastAPI will pass either a Request or WebSocket instance.
|
|
|
|
Returns:
|
|
AppContext: The application context stored in state.
|
|
"""
|
|
conn = request or websocket
|
|
return conn.app.state.ctx
|