start-stop modem via command

This commit is contained in:
DJ2LS 2023-11-09 22:11:53 +01:00
parent 9e802db6d3
commit e7c976f5f4
9 changed files with 97 additions and 47 deletions

View File

@ -14,21 +14,9 @@ const audio = useAudioStore(pinia);
import { useStateStore } from "../store/stateStore.js";
const state = useStateStore(pinia);
import { startModem, stopModem } from "../js/daemon";
import { startModem, stopModem } from "../js/api";
function startStopModem() {
switch (state.modem_running_state) {
case "stopped":
startModem();
break;
case "running":
stopModem();
break;
default:
}
}
</script>
<template>
@ -41,7 +29,7 @@ function startStopModem() {
data-bs-trigger="hover"
data-bs-html="false"
title="Start the Modem. Please set your audio and radio settings first!"
@click="startStopModem()"
@click="startModem"
v-bind:class="{ disabled: state.modem_running_state === 'running' }"
>
<i class="bi bi-play-fill"></i>
@ -55,7 +43,7 @@ function startStopModem() {
data-bs-trigger="hover"
data-bs-html="false"
title="Stop the Modem."
@click="startStopModem()"
@click="stopModem"
v-bind:class="{ disabled: state.modem_running_state === 'stopped' }"
>
<i class="bi bi-stop-fill"></i>

View File

@ -1,4 +1,5 @@
import { getModemConfigAsJSON } from "./settingsHandler.ts";
import { getFromServer, postToServer } from "./rest.js";
@ -17,12 +18,12 @@ export function saveModemConfig(){
}
export function fetchSettings() {
export function startModem() {
postToServer("localhost", 5000, "modem/start", null);
}
export function saveSettings() {
// save settings via post
console.log("post settings");
export function stopModem() {
postToServer("localhost", 5000, "modem/stop", null);
}

View File

@ -44,12 +44,10 @@ class DATA:
def __init__(self, config, event_queue) -> None:
self.stats = stats.stats()
self.event_queue = event_queue
self.mycallsign = config['STATION']['mycall']
self.mygrid = config['STATION']['mygrid']
self.dxcallsign = Station.dxcallsign
self.data_queue_transmit = DATA_QUEUE_TRANSMIT

View File

@ -1,7 +1,7 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
daemon.py
deprecated_daemon.py
Author: DJ2LS, January 2022

View File

@ -64,8 +64,9 @@ class RF:
log = structlog.get_logger("RF")
def __init__(self, config, event_queue, fft_queue) -> None:
def __init__(self, config, event_queue, fft_queue, service_queue) -> None:
self.config = config
self.service_queue = service_queue
self.sampler_avg = 0
self.buffer_avg = 0
@ -157,20 +158,21 @@ class RF:
atexit.register(self.stream.stop)
self.log.info("[MDM] init: receiving audio from '%s'" % in_dev_name)
self.log.info("[MDM] init: transmiting audio on '%s'" % out_dev_name)
try:
self.log.debug("[MDM] init: starting pyaudio callback")
# self.audio_stream.start_stream(
self.stream.start()
except Exception as audioerr:
self.log.error("[MDM] init: starting pyaudio callback failed", e=audioerr)
except Exception as err:
self.log.error("[MDM] init: can't open audio device. Exit", e=err)
# TODO Disabled sys.exit in case of wrong audio devices. We need to ensure flask server is running.
# This needs to be optimized when working on modem startup without daemon
# We also get problems with old configs, using ID instead of CRC as identifier, so
# we need some error handling here
#sys.exit(1)
try:
self.log.debug("[MDM] init: starting pyaudio callback")
# self.audio_stream.start_stream(
self.stream.start()
except Exception as err:
self.log.error("[MDM] init: starting pyaudio callback failed", e=err)
# let's stop the modem service
self.service_queue.put("stop")
# simulate audio class active state for reducing cli output
self.stream = lambda: None
self.stream.active = False
elif not TESTMODE:
# placeholder area for processing audio via TCI
@ -242,7 +244,6 @@ class RF:
"""
while True:
threading.Event().wait(0.01)
x = self.audio_received_queue.get()
x = np.frombuffer(x, dtype=np.int16)

View File

@ -9,6 +9,7 @@ import data_handler
import modem
import queue
import server_commands
import service_manager
app = Flask(__name__)
CORS(app)
@ -30,18 +31,25 @@ def set_config():
app.config_manager = CONFIG(config_file)
# returns a standard API response
def api_response(data):
return make_response(jsonify(data), 200)
set_config()
# start modem
app.modem_events = queue.Queue()
app.modem_fft = queue.Queue()
app.modem_events = queue.Queue() # queue which holds latest events
app.modem_fft = queue.Queue() # queue which holds lates fft data
app.modem_service = queue.Queue() # start / stop modem service
# start service manager
service_manager.SM(app)
# start modem service
app.modem_service.put("start")
# returns a standard API response
def api_response(data):
return make_response(jsonify(data), 200)
app.modem = modem.RF(app.config_manager.config, app.modem_events, app.modem_fft)
data_handler.DATA(app.config_manager.config, app.modem_events)
## REST API
@app.route('/', methods=['GET'])
@ -57,7 +65,9 @@ def index():
@app.route('/config', methods=['GET', 'POST'])
def config():
if request.method == 'POST':
app.modem_service.put("stop")
set_config = app.config_manager.write(request.json)
app.modem_service.put("start")
if not set_config:
response = api_response(None, 'error writing config')
else:
@ -119,8 +129,24 @@ def post_ping():
# @app.route('/mesh/routing_table', methods=['GET'])
# @app.route('/modem/get_rx_buffer', methods=['GET'])
# @app.route('/modem/del_rx_buffer', methods=['POST'])
# @app.route('/modem/start', methods=['POST'])
# @app.route('/modem/stop', methods=['POST'])
@app.route('/modem/start', methods=['POST'])
def post_modem_start():
if request.method in ['POST']:
print("start received...")
app.modem_service.put("start")
return api_response(request.json)
else:
return api_response({"info": "endpoint for STARTING modem via POST"})
@app.route('/modem/stop', methods=['POST'])
def post_modem_stop():
if request.method in ['POST']:
print("stop received...")
app.modem_service.put("stop")
return api_response(request.json)
else:
return api_response({"info": "endpoint for STOPPING modem via POST"})
# @app.route('/rig/status', methods=['GET'])
# @app.route('/rig/mode', methods=['POST'])

View File

@ -23,4 +23,4 @@ def beacon(data):
log.info(
"[CMD] Changing beacon state", state=beacon_state
)
DATA_QUEUE_TRANSMIT.put(["BEACON", 300, beacon_state])
DATA_QUEUE_TRANSMIT.put(["BEACON", 300, beacon_state])

36
modem/service_manager.py Normal file
View File

@ -0,0 +1,36 @@
import threading
import data_handler
import modem
import structlog
class SM:
def __init__(self, app):
self.log = structlog.get_logger("service")
self.modem = False
self.data_handler = False
self.config = app.config_manager.config
self.modem_events = app.modem_events
self.modem_fft = app.modem_fft
self.modem_service = app.modem_service
runner_thread = threading.Thread(
target=self.runner, name="runner thread", daemon=True
)
runner_thread.start()
def runner(self):
while True:
cmd = self.modem_service.get()
if cmd in ['start'] and not self.modem:
self.log.info("starting modem....")
self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service)
self.data_handler = data_handler.DATA(self.config, self.modem_events)
else:
print("--------------------------------------")
self.log.info("stopping modem....")
del self.modem
del self.data_handler
self.modem = False
self.data_handler = False

View File

@ -1,7 +1,7 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
daemon.py
deprecated_daemon.py
Author: DJ2LS, January 2022