mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
Connect modem events to /events websocket
This commit is contained in:
parent
a4f4b7b052
commit
08f35903af
15
modem/event_manager.py
Normal file
15
modem/event_manager.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
class EventManager:
|
||||||
|
|
||||||
|
def __init__(self, queues):
|
||||||
|
self.queues = queues
|
||||||
|
|
||||||
|
def broadcast(self, data):
|
||||||
|
for q in self.queues:
|
||||||
|
q.put(data)
|
||||||
|
|
||||||
|
def send_ptt_change(self, on:bool = False):
|
||||||
|
jsondata = {"ptt": str(on)}
|
||||||
|
data_out = json.dumps(jsondata)
|
||||||
|
self.broadcast(data_out)
|
|
@ -30,6 +30,8 @@ import cw
|
||||||
from queues import DATA_QUEUE_RECEIVED, MODEM_RECEIVED_QUEUE, MODEM_TRANSMIT_QUEUE, RIGCTLD_COMMAND_QUEUE, \
|
from queues import DATA_QUEUE_RECEIVED, MODEM_RECEIVED_QUEUE, MODEM_TRANSMIT_QUEUE, RIGCTLD_COMMAND_QUEUE, \
|
||||||
AUDIO_RECEIVED_QUEUE, AUDIO_TRANSMIT_QUEUE, MESH_RECEIVED_QUEUE
|
AUDIO_RECEIVED_QUEUE, AUDIO_TRANSMIT_QUEUE, MESH_RECEIVED_QUEUE
|
||||||
import audio
|
import audio
|
||||||
|
import event_manager
|
||||||
|
import queue
|
||||||
|
|
||||||
TESTMODE = False
|
TESTMODE = False
|
||||||
RXCHANNEL = ""
|
RXCHANNEL = ""
|
||||||
|
@ -111,6 +113,11 @@ class RF:
|
||||||
# Define fft_data buffer
|
# Define fft_data buffer
|
||||||
self.fft_data = bytes()
|
self.fft_data = bytes()
|
||||||
|
|
||||||
|
self.modem_events = queue.Queue()
|
||||||
|
self.event_manager = event_manager.EventManager([
|
||||||
|
self.modem_events,
|
||||||
|
sock.SOCKET_QUEUE])
|
||||||
|
|
||||||
self.init_codec2()
|
self.init_codec2()
|
||||||
self.init_audio()
|
self.init_audio()
|
||||||
self.init_rig_control()
|
self.init_rig_control()
|
||||||
|
@ -127,9 +134,7 @@ class RF:
|
||||||
|
|
||||||
if len(self.modoutqueue) > 0 and not self.mod_out_locked:
|
if len(self.modoutqueue) > 0 and not self.mod_out_locked:
|
||||||
HamlibParam.ptt_state = self.radio.set_ptt(True)
|
HamlibParam.ptt_state = self.radio.set_ptt(True)
|
||||||
jsondata = {"ptt": "True"}
|
self.event_manager.send_ptt_change(True)
|
||||||
data_out = json.dumps(jsondata)
|
|
||||||
sock.SOCKET_QUEUE.put(data_out)
|
|
||||||
|
|
||||||
data_out = self.modoutqueue.popleft()
|
data_out = self.modoutqueue.popleft()
|
||||||
self.tci_module.push_audio(data_out)
|
self.tci_module.push_audio(data_out)
|
||||||
|
@ -312,7 +317,7 @@ class RF:
|
||||||
fifo_write.flush()
|
fifo_write.flush()
|
||||||
fifo_write.flush()
|
fifo_write.flush()
|
||||||
|
|
||||||
# --------------------------------------------------------------------
|
# Callback for the audio streaming devices
|
||||||
def callback(self, data_in48k, outdata, frames, time, status) -> None:
|
def callback(self, data_in48k, outdata, frames, time, status) -> None:
|
||||||
"""
|
"""
|
||||||
Receive data into appropriate queue.
|
Receive data into appropriate queue.
|
||||||
|
@ -364,9 +369,7 @@ class RF:
|
||||||
# TODO Moved to this place for testing
|
# TODO Moved to this place for testing
|
||||||
# Maybe we can avoid moments of silence before transmitting
|
# Maybe we can avoid moments of silence before transmitting
|
||||||
HamlibParam.ptt_state = self.radio.set_ptt(True)
|
HamlibParam.ptt_state = self.radio.set_ptt(True)
|
||||||
jsondata = {"ptt": "True"}
|
self.event_manager.send_ptt_change(True)
|
||||||
data_out = json.dumps(jsondata)
|
|
||||||
sock.SOCKET_QUEUE.put(data_out)
|
|
||||||
|
|
||||||
data_out48k = self.modoutqueue.popleft()
|
data_out48k = self.modoutqueue.popleft()
|
||||||
self.fft_data = data_out48k
|
self.fft_data = data_out48k
|
||||||
|
@ -590,9 +593,7 @@ class RF:
|
||||||
HamlibParam.ptt_state = self.radio.set_ptt(False)
|
HamlibParam.ptt_state = self.radio.set_ptt(False)
|
||||||
|
|
||||||
# Push ptt state to socket stream
|
# Push ptt state to socket stream
|
||||||
jsondata = {"ptt": "False"}
|
self.event_manager.send_ptt_change(False)
|
||||||
data_out = json.dumps(jsondata)
|
|
||||||
sock.SOCKET_QUEUE.put(data_out)
|
|
||||||
|
|
||||||
# After processing, set the locking state back to true to be prepared for next transmission
|
# After processing, set the locking state back to true to be prepared for next transmission
|
||||||
self.mod_out_locked = True
|
self.mod_out_locked = True
|
||||||
|
@ -650,9 +651,7 @@ class RF:
|
||||||
HamlibParam.ptt_state = self.radio.set_ptt(False)
|
HamlibParam.ptt_state = self.radio.set_ptt(False)
|
||||||
|
|
||||||
# Push ptt state to socket stream
|
# Push ptt state to socket stream
|
||||||
jsondata = {"ptt": "False"}
|
self.event_manager.send_ptt_change(False)
|
||||||
data_out = json.dumps(jsondata)
|
|
||||||
sock.SOCKET_QUEUE.put(data_out)
|
|
||||||
|
|
||||||
# After processing, set the locking state back to true to be prepared for next transmission
|
# After processing, set the locking state back to true to be prepared for next transmission
|
||||||
self.mod_out_locked = True
|
self.mod_out_locked = True
|
||||||
|
@ -1471,7 +1470,6 @@ def open_codec2_instance(mode: int) -> ctypes.c_void_p:
|
||||||
|
|
||||||
return ctypes.cast(codec2.api.freedv_open(mode), ctypes.c_void_p)
|
return ctypes.cast(codec2.api.freedv_open(mode), ctypes.c_void_p)
|
||||||
|
|
||||||
|
|
||||||
def get_bytes_per_frame(mode: int) -> int:
|
def get_bytes_per_frame(mode: int) -> int:
|
||||||
"""
|
"""
|
||||||
Provide bytes per frame information for accessing from data handler
|
Provide bytes per frame information for accessing from data handler
|
||||||
|
@ -1520,7 +1518,6 @@ def set_audio_volume(datalist: np.ndarray, dB: float) -> np.ndarray:
|
||||||
# Clip values to int16 range and convert data type
|
# Clip values to int16 range and convert data type
|
||||||
return np.clip(scaled_data, -32768, 32767).astype(np.int16)
|
return np.clip(scaled_data, -32768, 32767).astype(np.int16)
|
||||||
|
|
||||||
|
|
||||||
def get_modem_error_state():
|
def get_modem_error_state():
|
||||||
"""
|
"""
|
||||||
get current state buffer and return True of contains 10
|
get current state buffer and return True of contains 10
|
||||||
|
@ -1538,4 +1535,3 @@ def get_modem_error_state():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ def api_response(data, status = 'ok'):
|
||||||
set_config()
|
set_config()
|
||||||
|
|
||||||
# start modem
|
# start modem
|
||||||
d = data_handler.DATA(app.config_manager.config)
|
data_handler.DATA(app.config_manager.config)
|
||||||
m = modem.RF(app.config_manager.config)
|
app.modem = modem.RF(app.config_manager.config)
|
||||||
|
|
||||||
## REST API
|
## REST API
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
|
@ -79,6 +79,5 @@ def get_serial_devices():
|
||||||
# Event websocket
|
# Event websocket
|
||||||
@sock.route('/events')
|
@sock.route('/events')
|
||||||
def echo(sock):
|
def echo(sock):
|
||||||
while True:
|
ev = app.modem.modem_events.get()
|
||||||
data = sock.receive()
|
sock.send(ev)
|
||||||
sock.send(data)
|
|
||||||
|
|
Loading…
Reference in a new issue