diff --git a/gui/src/js/eventHandler.js b/gui/src/js/eventHandler.js index dc279e3b..e0ac1d38 100644 --- a/gui/src/js/eventHandler.js +++ b/gui/src/js/eventHandler.js @@ -121,17 +121,43 @@ export function stateDispatcher(data) { export function eventDispatcher(data) { data = JSON.parse(data); - // get ptt state as a first test - stateStore.ptt_state = data.ptt; - - var message = ""; - if (data["freedata"] == "modem-message") { // break early if we received a dummy callsign // thats a kind of hotfix, as long as the modem isnt handling this better if (data["dxcallsign"] == "AA0AA-0" || data["dxcallsign"] == "ZZ9YY-0") { return; } + + // get ptt state as a first test + stateStore.ptt_state = data.ptt; + + // catch modem related events + if (data["freedata"] == "modem-event") { + + switch (data["event"]) { + case "start": + displayToast("success", "bi-arrow-left-right", "Modem started", 5000); + return; + + case "stop": + displayToast("success", "bi-arrow-left-right", "Modem stopped", 5000); + return; + + case "restart": + displayToast("secondary", "bi-bootstrap-reboot", "Modem restarted", 5000); + return; + + case "failed": + displayToast("danger", "bi-bootstrap-reboot", "Modem startup failed | bad config?", 5000); + return; + } + } + +/* + + var message = ""; + if (data["freedata"] == "modem-message") { + console.log(data); switch (data["fec"]) { @@ -341,4 +367,5 @@ export function eventDispatcher(data) { } } } + */ } diff --git a/modem/server.py b/modem/server.py index 76f2b107..e724bd14 100644 --- a/modem/server.py +++ b/modem/server.py @@ -70,9 +70,8 @@ def index(): @app.route('/config', methods=['GET', 'POST']) def config(): if request.method in ['POST']: - app.modem_service.put("stop") set_config = app.config_manager.write(request.json) - app.modem_service.put("start") + app.modem_service.put("restart") if not set_config: response = api_response(None, 'error writing config') else: diff --git a/modem/service_manager.py b/modem/service_manager.py index 03916611..975ba5ab 100644 --- a/modem/service_manager.py +++ b/modem/service_manager.py @@ -3,6 +3,8 @@ import data_handler import modem import structlog import audio +import ujson as json + class SM: def __init__(self, app): @@ -26,26 +28,54 @@ class SM: while True: cmd = self.modem_service.get() if cmd in ['start'] and not self.modem: - audio_test = audio.test_audio_devices(self.config['AUDIO']['input_device'], self.config['AUDIO']['output_device']) - print(audio_test) - if False not in audio_test and None not in audio_test and not self.states.is_modem_running: - self.log.info("starting modem....") - self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service, self.states) - self.data_handler = data_handler.DATA(self.config, self.modem_events) - self.states.set("is_modem_running", True) - - else: - self.log.warning("starting modem failed", input_test=audio_test[0], output_test=audio_test[1]) - self.states.set("is_modem_running", False) + self.log.info("------------------ FreeDATA ------------------") + self.log.info("------------------ MODEM ------------------") + self.start_modem() + elif cmd in ['stop'] and self.modem: + self.stop_modem() + # we need to wait a bit for avoiding a portaudio crash + threading.Event().wait(0.5) + elif cmd in ['restart']: + self.stop_modem() + # we need to wait a bit for avoiding a portaudio crash + threading.Event().wait(0.5) + if self.start_modem(): + self.modem_events.put(json.dumps({"freedata": "modem-event", "event": "restart"})) else: - print("--------------------------------------") - self.log.info("stopping modem....") - del self.modem - del self.data_handler - self.modem = False - self.data_handler = False - self.states.set("is_modem_running", False) + self.log.warning("[SVC] modem command processing failed", cmd=cmd, state=self.states.is_modem_running) - threading.Event().wait(0.5) + + def start_modem(self): + audio_test = self.test_audio() + if False not in audio_test and None not in audio_test and not self.states.is_modem_running: + self.log.info("starting modem....") + self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service, self.states) + self.data_handler = data_handler.DATA(self.config, self.modem_events) + self.states.set("is_modem_running", True) + return True + elif self.states.is_modem_running: + self.log.warning("modem already running") + return False + + else: + self.log.warning("starting modem failed", input_test=audio_test[0], output_test=audio_test[1]) + self.states.set("is_modem_running", False) + self.modem_events.put(json.dumps({"freedata": "modem-event", "event": "failed"})) + return False + + def stop_modem(self): + self.log.info("stopping modem....") + del self.modem + del self.data_handler + self.modem = False + self.data_handler = False + self.states.set("is_modem_running", False) + + def test_audio(self): + audio_test = audio.test_audio_devices(self.config['AUDIO']['input_device'], + self.config['AUDIO']['output_device']) + self.log.info("tested audio devices", result=audio_test) + + return audio_test \ No newline at end of file