From fd27e36fa6d42852f390300976af7db56d5a117d Mon Sep 17 00:00:00 2001 From: Tom Brennan Date: Sun, 28 Sep 2025 23:14:23 -0400 Subject: [PATCH] before refactoring --- .gitignore | 2 + Makefile | 52 +++++++++++++++++++ README.md | 1 + build/lib/medtrace_synth/__main__.py | 46 ---------------- pyproject.toml | 36 +++++++------ src/medtrace_synth.egg-info/PKG-INFO | 10 ---- src/medtrace_synth.egg-info/SOURCES.txt | 8 --- .../dependency_links.txt | 1 - src/medtrace_synth.egg-info/requires.txt | 2 - src/medtrace_synth.egg-info/top_level.txt | 1 - src/medtrace_synth/__main__.py | 41 +++++++++++---- 11 files changed, 105 insertions(+), 95 deletions(-) create mode 100644 Makefile create mode 100644 README.md delete mode 100644 build/lib/medtrace_synth/__main__.py delete mode 100644 src/medtrace_synth.egg-info/PKG-INFO delete mode 100644 src/medtrace_synth.egg-info/SOURCES.txt delete mode 100644 src/medtrace_synth.egg-info/dependency_links.txt delete mode 100644 src/medtrace_synth.egg-info/requires.txt delete mode 100644 src/medtrace_synth.egg-info/top_level.txt diff --git a/.gitignore b/.gitignore index 21d0b89..7681686 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .venv/ +__pycache__ +*.egg-info \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..065dbf2 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +# Makefile for medtrace-synth + +VENV := .venv +PYTHON := $(VENV)/bin/python +PIP := $(PYTHON) -m pip + +POJAGI_DSP_PATH ?= ../pojagi-dsp + +help: + @echo "Targets:" + @echo " venv - Create virtualenv in .venv" + @echo " install - Install deps and this package" + @echo " run - Run the server via 'python -m medtrace_synth'" + @echo " install-dev - Install deps (and this package) in dev mode" + @echo " dev - Run using PYTHONPATH=src (no install)" + @echo " build - Build sdist and wheel into dist/" + @echo " clean - Remove build artifacts" + @echo " nuke - Clean artifacts and remove .venv" + +$(VENV): + python3 -m venv $(VENV) + $(PIP) -q install -U pip + +install: $(VENV) + $(PIP) install .[live] + +install-dev: $(VENV) + $(PIP) install -e .[dev] + $(PIP) install -e $(POJAGI_DSP_PATH) + +run: install + $(PYTHON) -m medtrace_synth + +dev: install-dev + PYTHONPATH=src $(PYTHON) -m watchfiles \ + --filter=python \ + --target-type=command \ + "$(PYTHON) -m medtrace_synth" \ + src $(POJAGI_DSP_PATH) + +build: install + $(PIP) install -U hatch + $(PYTHON) -m hatch build + +clean: + rm -rf build dist .eggs *.egg-info + +nuke: clean + rm -rf $(VENV) + + +.PHONY: help install install-dev run dev build clean nuke diff --git a/README.md b/README.md new file mode 100644 index 0000000..c954277 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Back-end \ No newline at end of file diff --git a/build/lib/medtrace_synth/__main__.py b/build/lib/medtrace_synth/__main__.py deleted file mode 100644 index fa8501f..0000000 --- a/build/lib/medtrace_synth/__main__.py +++ /dev/null @@ -1,46 +0,0 @@ -import time -import websockets -import asyncio -from pojagi_dsp.channel.ecg.generator.wavetable import ECGWaveTableSynthesizer -from pojagi_dsp.channel.ecg.generator.wavetable.sinus import SinusWaveTable, TachycardiaWaveTable - -PORT = 7890 - -async def consumer_handler(websocket): - async for message in websocket: - print(f"message received: {message}") - -async def producer_handler(websocket): - ecg = ECGWaveTableSynthesizer( - tables={ - (0,90): SinusWaveTable(), - (70, 300): TachycardiaWaveTable(), - }, - heart_rate=70, - srate=50, - ) - while True: - try: - message = next(ecg) - await websocket.send(str(message)) - time.sleep(0.01) - 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) -asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3bc5f78..76fdc2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,26 @@ -[build-system] -requires = ["setuptools", "setuptools-scm"] -build-backend = "setuptools.build_meta" - [project] name = "medtrace-synth" +version = "0.0.0.dev0" description = "Synthesized biometric signals service" -urls = { "gitlab" = "https://gitlab.pojagi.org/tjb1982/medtrace-synth" } -authors = [ - { name = "Tom Brennan", email = "tjb1982@gmail.com" }, -] readme = "README.md" requires-python = ">=3.8" -classifiers = [] -dependencies = [ - # "pydantic==1.10.2", - "pojagi-dsp==0.0.0.dev0", - # "PyYAML>=5.3.1", - - "websockets==12.0", +authors = [ + { name = "Tom Brennan", email = "tjb1982@gmail.com" }, ] +classifiers = [] +urls = { "gitlab" = "https://git.pojagi.org/tjb1982/medtrace-synth" } +dependencies = ["websockets==12.0"] -version = "0.0.0.dev0" -# dynamic = ["version"] \ No newline at end of file +[project.optional-dependencies] +dev = ["watchfiles"] # "pojagi-dsp @ file://{root}/../pojagi-dsp"] +live = ["pojagi-dsp @ git+https://git.pojagi.org/tjb1982/pojagi-dsp@blueberry"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/medtrace_synth"] + +[tool.hatch.metadata] +allow-direct-references = true diff --git a/src/medtrace_synth.egg-info/PKG-INFO b/src/medtrace_synth.egg-info/PKG-INFO deleted file mode 100644 index 29915c0..0000000 --- a/src/medtrace_synth.egg-info/PKG-INFO +++ /dev/null @@ -1,10 +0,0 @@ -Metadata-Version: 2.1 -Name: medtrace-synth -Version: 0.0.0.dev0 -Summary: Synthesized biometric signals service -Author-email: Tom Brennan -Project-URL: gitlab, https://gitlab.pojagi.org/tjb1982/medtrace-synth -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Requires-Dist: pojagi-dsp==0.0.0.dev0 -Requires-Dist: websockets==12.0 diff --git a/src/medtrace_synth.egg-info/SOURCES.txt b/src/medtrace_synth.egg-info/SOURCES.txt deleted file mode 100644 index a18b3eb..0000000 --- a/src/medtrace_synth.egg-info/SOURCES.txt +++ /dev/null @@ -1,8 +0,0 @@ -.gitignore -pyproject.toml -src/medtrace_synth/__main__.py -src/medtrace_synth.egg-info/PKG-INFO -src/medtrace_synth.egg-info/SOURCES.txt -src/medtrace_synth.egg-info/dependency_links.txt -src/medtrace_synth.egg-info/requires.txt -src/medtrace_synth.egg-info/top_level.txt \ No newline at end of file diff --git a/src/medtrace_synth.egg-info/dependency_links.txt b/src/medtrace_synth.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/src/medtrace_synth.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/medtrace_synth.egg-info/requires.txt b/src/medtrace_synth.egg-info/requires.txt deleted file mode 100644 index 8462ae7..0000000 --- a/src/medtrace_synth.egg-info/requires.txt +++ /dev/null @@ -1,2 +0,0 @@ -pojagi-dsp==0.0.0.dev0 -websockets==12.0 diff --git a/src/medtrace_synth.egg-info/top_level.txt b/src/medtrace_synth.egg-info/top_level.txt deleted file mode 100644 index 13a9243..0000000 --- a/src/medtrace_synth.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -medtrace_synth diff --git a/src/medtrace_synth/__main__.py b/src/medtrace_synth/__main__.py index fa8501f..c09027a 100644 --- a/src/medtrace_synth/__main__.py +++ b/src/medtrace_synth/__main__.py @@ -1,33 +1,50 @@ -import time -import websockets 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 +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): + +async def consumer_handler(websocket: websockets.WebSocketServerProtocol): async for message in websocket: print(f"message received: {message}") -async def producer_handler(websocket): + +async def producer_handler(websocket: websockets.WebSocketServerProtocol): + srate = 50 + ecg = ECGWaveTableSynthesizer( tables={ - (0,90): SinusWaveTable(), + (0, 90): SinusWaveTable(), (70, 300): TachycardiaWaveTable(), }, - heart_rate=70, - srate=50, + heart_rate=60, + srate=srate, ) while True: try: message = next(ecg) await websocket.send(str(message)) - time.sleep(0.01) + 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}") @@ -43,4 +60,8 @@ async def handler(websocket, path): # Start the server start_server = websockets.serve(handler, "0.0.0.0", PORT) asyncio.get_event_loop().run_until_complete(start_server) -asyncio.get_event_loop().run_forever() \ No newline at end of file + +try: + asyncio.get_event_loop().run_forever() +except KeyboardInterrupt: + log.info("exiting...")