mirror of https://github.com/DJ2LS/FreeDATA
start-stop modem via command
This commit is contained in:
parent
9e802db6d3
commit
e7c976f5f4
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
daemon.py
|
||||
deprecated_daemon.py
|
||||
|
||||
Author: DJ2LS, January 2022
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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'])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
daemon.py
|
||||
deprecated_daemon.py
|
||||
|
||||
Author: DJ2LS, January 2022
|
||||
|
||||
|
|
Loading…
Reference in New Issue