68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
import asyncio
|
|
import logging
|
|
import time
|
|
|
|
import websockets
|
|
from pojagi_dsp.channel.ecg.generator.wavetable import ECGWaveTableSynthesizer
|
|
from pojagi_dsp.channel.ecg.generator.wavetable.sinus import (
|
|
SinusWaveTable, TachycardiaWaveTable)
|
|
|
|
if __name__ != "__main__":
|
|
raise ImportWarning("This script is not intended to be imported.")
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
|
)
|
|
log = logging.getLogger(__name__)
|
|
|
|
PORT = 7890
|
|
|
|
|
|
async def consumer_handler(websocket: websockets.WebSocketServerProtocol):
|
|
async for message in websocket:
|
|
print(f"message received: {message}")
|
|
|
|
|
|
async def producer_handler(websocket: websockets.WebSocketServerProtocol):
|
|
srate = 50
|
|
|
|
ecg = ECGWaveTableSynthesizer(
|
|
tables={
|
|
(0, 90): SinusWaveTable(),
|
|
(70, 300): TachycardiaWaveTable(),
|
|
},
|
|
heart_rate=60,
|
|
srate=srate,
|
|
)
|
|
while True:
|
|
try:
|
|
message = next(ecg)
|
|
await websocket.send(str(message))
|
|
await asyncio.sleep(1/srate)
|
|
except websockets.exceptions.ConnectionClosed as e:
|
|
print("A client just disconnected")
|
|
break
|
|
|
|
|
|
async def handler(websocket, path):
|
|
while True:
|
|
print(f"New connection. Path: {path}")
|
|
consumer_task = asyncio.create_task(consumer_handler(websocket))
|
|
producer_task = asyncio.create_task(producer_handler(websocket))
|
|
done, pending = await asyncio.wait(
|
|
[consumer_task, producer_task],
|
|
return_when=asyncio.FIRST_COMPLETED,
|
|
)
|
|
for task in pending:
|
|
task.cancel()
|
|
|
|
# Start the server
|
|
start_server = websockets.serve(handler, "0.0.0.0", PORT)
|
|
asyncio.get_event_loop().run_until_complete(start_server)
|
|
|
|
try:
|
|
asyncio.get_event_loop().run_forever()
|
|
except KeyboardInterrupt:
|
|
log.info("exiting...")
|