flandre/flandre/config.py
2025-04-17 20:28:07 +08:00

134 lines
3.4 KiB
Python

import dataclasses
import json
import sys
from pathlib import Path
import platformdirs
from flandre import DEV_PROJECT_FOLDER
ISDEV = False
if '--dev' in sys.argv:
ISDEV = True
CONFIG_FOLDER = platformdirs.user_config_path('Flandre', 'Scarlet')
if ISDEV:
CONFIG_FOLDER = DEV_PROJECT_FOLDER / 'config'
DS = DEV_PROJECT_FOLDER / '@DS'
DS.mkdir(exist_ok=True, parents=True)
SOFTWARE_CONFIG_PATH = CONFIG_FOLDER / 'software.json'
@dataclasses.dataclass
class SoftwareConfig:
def s(self, host, port, proto='tcp'):
return f'{proto}://{host}:{port}'
data_folder: Path = DS
@property
def imaging_config_folder(self):
p = CONFIG_FOLDER / 'imaging'
p.mkdir(exist_ok=True, parents=True)
return p
@property
def device_config_folder(self):
p = CONFIG_FOLDER / 'device'
p.mkdir(exist_ok=True, parents=True)
return p
video_height: int = 1080
video_width: int = 960
live_ip: str = '11.6.1.71'
live_push_port: int = 5555
live_rep_port: int = 5556
device_py_rep_port: int = 5558
@property
def live_push_socket(self):
return f'tcp://{self.live_ip}:{self.live_push_port}'
@property
def live_rep_socket(self):
return f'tcp://{self.live_ip}:{self.live_rep_port}'
@property
def live_rep_socket_http(self):
return f'http://{self.live_ip}:{self.live_rep_port}'
@property
def device_py_rep_socket(self):
return f'tcp://{self.live_ip}:{self.device_py_rep_port}'
playback_port: int = 5003
@property
def playback_socket(self):
return f'tcp://127.0.0.1:{self.playback_port}'
local_ip: str = '127.0.0.1'
mi_rep_port: int = 5557
muxer_rep_port: int = 5560
driver_rep_port: int = 5561
@property
def mi_rep_socket(self):
return self.s(self.local_ip, self.device_py_rep_port)
@property
def muxer_rep_socket(self):
return self.s(self.local_ip, self.muxer_rep_port)
@property
def driver_rep_socket(self):
return self.s(self.local_ip, self.driver_rep_port)
switch1_ip: str = 'c1'
switch1_token: str = '7ad51e0016e7a9d22f753d5110f76c7d'
switch2_ip: str = 'c2'
switch2_token: str = 'bf5a7b77a1ba3761ea63fafd8427b7d6'
@staticmethod
def read_config(path: Path):
j = json.loads(path.read_text(encoding='utf-8'))
arg_d = dict()
for field in dataclasses.fields(SoftwareConfig):
try:
v = j[field.name]
match field.type:
case Path():
arg_d[field.name] = Path(v)
case _:
arg_d[field.name] = v
except KeyError:
pass
sc = SoftwareConfig(**arg_d)
return sc
def write_config(self):
arg_d = dict()
for field in dataclasses.fields(SoftwareConfig):
v = self.__getattribute__(field.name)
match v:
case Path():
arg_d[field.name] = str(v)
case _:
arg_d[field.name] = v
SOFTWARE_CONFIG_PATH.parent.mkdir(exist_ok=True, parents=True)
SOFTWARE_CONFIG_PATH.write_text(json.dumps(arg_d, indent=4), encoding='utf-8')
C = SoftwareConfig()
if SOFTWARE_CONFIG_PATH.exists() and not ISDEV:
C = SoftwareConfig.read_config(SOFTWARE_CONFIG_PATH)
if __name__ == '__main__':
print(C)