From e0482ee1a02266b2f7155207f74a30a47d96d601 Mon Sep 17 00:00:00 2001 From: Brosef Date: Thu, 4 Jun 2026 01:22:27 +0100 Subject: [PATCH] Implemented basic headpat firmware --- requirements.txt | 2 ++ src/Python/main.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 requirements.txt create mode 100644 src/Python/main.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7bac581 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +python-osc +pyserial \ No newline at end of file diff --git a/src/Python/main.py b/src/Python/main.py new file mode 100644 index 0000000..4a551d0 --- /dev/null +++ b/src/Python/main.py @@ -0,0 +1,71 @@ +""" +Basic arse driver / software that just does the haptics. +""" + +from threading import Thread +import argparse +import struct +import time +import os + +from pythonosc.dispatcher import Dispatcher +from pythonosc import osc_server +import serial + +class Device: + """ + Holds the serial port and opccasionally updates it + """ + + def __init__(self, port: os.PathLike, refreshRate: int=30): + self._run = True + self._ser = serial.Serial(port, 9600) + self.areas = {'Fwd': 0, 'Mid': 0, 'Bck': 0} + self._updateThread = Thread(target=self._update) + self.refreshRate = refreshRate + self.intensity = 1 + + self._updateThread.start() + + def updateAreasFromOSC(self, addr: str, value: float): + """ + Updates the areas variable based on an OSC message. + """ + + area = addr.split('/')[-1] + self.areas[area] = round(value*255) + + def _update(self): + while self._run: + values = self.areas.values() + values = [round(v * self.intensity) for v in values] + self._ser.write(struct.pack('