mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 10:04:33 +02:00
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";
|
import { useStateStore } from "../store/stateStore.js";
|
||||||
const state = useStateStore(pinia);
|
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>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -41,7 +29,7 @@ function startStopModem() {
|
||||||
data-bs-trigger="hover"
|
data-bs-trigger="hover"
|
||||||
data-bs-html="false"
|
data-bs-html="false"
|
||||||
title="Start the Modem. Please set your audio and radio settings first!"
|
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' }"
|
v-bind:class="{ disabled: state.modem_running_state === 'running' }"
|
||||||
>
|
>
|
||||||
<i class="bi bi-play-fill"></i>
|
<i class="bi bi-play-fill"></i>
|
||||||
|
@ -55,7 +43,7 @@ function startStopModem() {
|
||||||
data-bs-trigger="hover"
|
data-bs-trigger="hover"
|
||||||
data-bs-html="false"
|
data-bs-html="false"
|
||||||
title="Stop the Modem."
|
title="Stop the Modem."
|
||||||
@click="startStopModem()"
|
@click="stopModem"
|
||||||
v-bind:class="{ disabled: state.modem_running_state === 'stopped' }"
|
v-bind:class="{ disabled: state.modem_running_state === 'stopped' }"
|
||||||
>
|
>
|
||||||
<i class="bi bi-stop-fill"></i>
|
<i class="bi bi-stop-fill"></i>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { getModemConfigAsJSON } from "./settingsHandler.ts";
|
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() {
|
export function stopModem() {
|
||||||
// save settings via post
|
postToServer("localhost", 5000, "modem/stop", null);
|
||||||
console.log("post settings");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,12 +44,10 @@ class DATA:
|
||||||
def __init__(self, config, event_queue) -> None:
|
def __init__(self, config, event_queue) -> None:
|
||||||
|
|
||||||
self.stats = stats.stats()
|
self.stats = stats.stats()
|
||||||
|
|
||||||
self.event_queue = event_queue
|
self.event_queue = event_queue
|
||||||
|
|
||||||
self.mycallsign = config['STATION']['mycall']
|
self.mycallsign = config['STATION']['mycall']
|
||||||
self.mygrid = config['STATION']['mygrid']
|
self.mygrid = config['STATION']['mygrid']
|
||||||
|
|
||||||
self.dxcallsign = Station.dxcallsign
|
self.dxcallsign = Station.dxcallsign
|
||||||
|
|
||||||
self.data_queue_transmit = DATA_QUEUE_TRANSMIT
|
self.data_queue_transmit = DATA_QUEUE_TRANSMIT
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
daemon.py
|
deprecated_daemon.py
|
||||||
|
|
||||||
Author: DJ2LS, January 2022
|
Author: DJ2LS, January 2022
|
||||||
|
|
|
@ -64,8 +64,9 @@ class RF:
|
||||||
|
|
||||||
log = structlog.get_logger("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.config = config
|
||||||
|
self.service_queue = service_queue
|
||||||
|
|
||||||
self.sampler_avg = 0
|
self.sampler_avg = 0
|
||||||
self.buffer_avg = 0
|
self.buffer_avg = 0
|
||||||
|
@ -157,20 +158,21 @@ class RF:
|
||||||
atexit.register(self.stream.stop)
|
atexit.register(self.stream.stop)
|
||||||
self.log.info("[MDM] init: receiving audio from '%s'" % in_dev_name)
|
self.log.info("[MDM] init: receiving audio from '%s'" % in_dev_name)
|
||||||
self.log.info("[MDM] init: transmiting audio on '%s'" % out_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:
|
except Exception as err:
|
||||||
self.log.error("[MDM] init: can't open audio device. Exit", e=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.
|
# let's stop the modem service
|
||||||
# This needs to be optimized when working on modem startup without daemon
|
self.service_queue.put("stop")
|
||||||
# We also get problems with old configs, using ID instead of CRC as identifier, so
|
# simulate audio class active state for reducing cli output
|
||||||
# we need some error handling here
|
self.stream = lambda: None
|
||||||
#sys.exit(1)
|
self.stream.active = False
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
elif not TESTMODE:
|
elif not TESTMODE:
|
||||||
# placeholder area for processing audio via TCI
|
# placeholder area for processing audio via TCI
|
||||||
|
@ -242,7 +244,6 @@ class RF:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
threading.Event().wait(0.01)
|
|
||||||
|
|
||||||
x = self.audio_received_queue.get()
|
x = self.audio_received_queue.get()
|
||||||
x = np.frombuffer(x, dtype=np.int16)
|
x = np.frombuffer(x, dtype=np.int16)
|
||||||
|
|
|
@ -9,6 +9,7 @@ import data_handler
|
||||||
import modem
|
import modem
|
||||||
import queue
|
import queue
|
||||||
import server_commands
|
import server_commands
|
||||||
|
import service_manager
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
CORS(app)
|
||||||
|
@ -30,18 +31,25 @@ def set_config():
|
||||||
|
|
||||||
app.config_manager = CONFIG(config_file)
|
app.config_manager = CONFIG(config_file)
|
||||||
|
|
||||||
# returns a standard API response
|
|
||||||
def api_response(data):
|
|
||||||
return make_response(jsonify(data), 200)
|
|
||||||
|
|
||||||
set_config()
|
set_config()
|
||||||
|
|
||||||
# start modem
|
# start modem
|
||||||
app.modem_events = queue.Queue()
|
app.modem_events = queue.Queue() # queue which holds latest events
|
||||||
app.modem_fft = queue.Queue()
|
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
|
## REST API
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
|
@ -57,7 +65,9 @@ def index():
|
||||||
@app.route('/config', methods=['GET', 'POST'])
|
@app.route('/config', methods=['GET', 'POST'])
|
||||||
def config():
|
def config():
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
app.modem_service.put("stop")
|
||||||
set_config = app.config_manager.write(request.json)
|
set_config = app.config_manager.write(request.json)
|
||||||
|
app.modem_service.put("start")
|
||||||
if not set_config:
|
if not set_config:
|
||||||
response = api_response(None, 'error writing config')
|
response = api_response(None, 'error writing config')
|
||||||
else:
|
else:
|
||||||
|
@ -119,8 +129,24 @@ def post_ping():
|
||||||
# @app.route('/mesh/routing_table', methods=['GET'])
|
# @app.route('/mesh/routing_table', methods=['GET'])
|
||||||
# @app.route('/modem/get_rx_buffer', methods=['GET'])
|
# @app.route('/modem/get_rx_buffer', methods=['GET'])
|
||||||
# @app.route('/modem/del_rx_buffer', methods=['POST'])
|
# @app.route('/modem/del_rx_buffer', methods=['POST'])
|
||||||
# @app.route('/modem/start', methods=['POST'])
|
@app.route('/modem/start', methods=['POST'])
|
||||||
# @app.route('/modem/stop', 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/status', methods=['GET'])
|
||||||
# @app.route('/rig/mode', methods=['POST'])
|
# @app.route('/rig/mode', methods=['POST'])
|
||||||
|
|
|
@ -23,4 +23,4 @@ def beacon(data):
|
||||||
log.info(
|
log.info(
|
||||||
"[CMD] Changing beacon state", state=beacon_state
|
"[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
36
modem/service_manager.py
Normal 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
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
daemon.py
|
deprecated_daemon.py
|
||||||
|
|
||||||
Author: DJ2LS, January 2022
|
Author: DJ2LS, January 2022
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue