Files
medtrace-synth/src/medtrace_synth/__main__.py
2025-09-28 23:14:23 -04:00

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...")