flandre/flandre/launcher.py
2025-04-12 01:29:38 +08:00

75 lines
1.9 KiB
Python

import logging
import multiprocessing
import os
import tomllib
from enum import Enum
from pathlib import Path
from flandre.BusClient import BusClient
from flandre.kde_pyqt6_mainui import kde_pyqt6_mainui
from flandre.nodes.Beamformer import Beamformer
from flandre.nodes.Broker import Broker
from flandre.nodes.Device import Device
from flandre.nodes.ImageCV import ImageCV
from flandre.nodes.Loader import Loader
from flandre.nodes.MainUI import MainUI
from flandre.nodes.Muxer import Muxer
from flandre.nodes.Robot import Robot
from flandre.nodes.ImageFFMPEG import ImageFFMPEG
from flandre.utils.Msg import KillMsg
from flandre.config import CONFIG_FOLDER
class LaunchComponent(Enum):
MainUI = MainUI
ImageCV = ImageCV
Muxer = Muxer
Robot = Robot
Loader = Loader
Device = Device
Beamformer = Beamformer
ImageFFMPEG = ImageFFMPEG
def launch(arg: dict[LaunchComponent, dict]):
ps = [
Broker()
]
for k, v in arg.items():
if k == LaunchComponent.MainUI and os.environ.get('XDG_CURRENT_DESKTOP', None) == 'KDE':
ps.append(kde_pyqt6_mainui)
continue
ps.append(k.value(**v))
logging.basicConfig(level=logging.INFO)
multiprocessing.set_start_method('spawn')
multiprocessing.Pool()
pps = []
for p in ps:
pps.append(multiprocessing.Process(target=p))
for p in pps:
p.start()
c = BusClient(KillMsg)
while True:
x: KillMsg = c.recv()
if x.name == '':
break
for p in pps:
p.kill()
def launch_from_file(file: Path):
if not file.exists():
file.parent.mkdir(parents=True, exist_ok=True)
file.write_text('[MainUI]\n')
r = tomllib.loads(file.read_text())
arg_d = dict()
for k, v in r.items():
arg_d[LaunchComponent[k]] = v
launch(arg_d)
if __name__ == '__main__':
launch_from_file(CONFIG_FOLDER / 'gui.toml')