initial commit: Web Bluetooth controller template for M-Spacer / Apollo board

This commit is contained in:
Zac Gaetano 2026-08-22 10:43:20 -04:00
parent b62d6fa338
commit 3c94bb9fbb
2 changed files with 65 additions and 2 deletions

View file

@ -1,3 +1,22 @@
# m-spacer-controller
# M-Spacer / MotionSpace / Apollo BLE Workout Controller
Custom Web Bluetooth & BLE Workout Controller for MotionSpace / Apollo Smart Fitness Board
Custom Web Bluetooth controller for MotionSpace (M-Spacer) and Apollo smart motor fitness boards. Replaces the default QiSense app with a clean web interface for exercise programming, resistance control, and live telemetry.
## Features (Planned)
- **Web Bluetooth API Connection**: Connect directly from Chrome/Edge/Safari without app store installation.
- **BLE GATT Reverse Engineering**: Packet sniffer for pull force, rep count, position encoder, and resistance commands.
- **Workout Modes**:
- Constant Resistance Mode
- Eccentric Overload Mode
- Isokinetic Mode
- **Custom Routines**: Program sets, reps, rest timers, and progressive overload.
## Quick Start
Open `index.html` in Chrome or any Web Bluetooth-supported browser:
```bash
# Local web server
python3 -m http.server 8080
```
Open `http://localhost:8080` and click **Connect Board**.

44
index.html Normal file
View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>M-Spacer Controller</title>
<style>
body { font-family: system-ui, sans-serif; background: #0f1113; color: #e8eaec; padding: 2rem; max-width: 600px; margin: 0 auto; }
button { background: #c8a45c; color: #000; border: 0; padding: 0.75rem 1.5rem; font-weight: bold; border-radius: 4px; cursor: pointer; }
button:hover { opacity: 0.9; }
.card { background: #16191c; border: 1px solid #2a2f34; padding: 1.5rem; border-radius: 8px; margin-top: 1rem; }
.status { color: #9aa3ab; font-size: 0.9rem; margin-top: 0.5rem; }
</style>
</head>
<body>
<h1>M-Spacer / Apollo Controller</h1>
<p>Custom Web Bluetooth controller for smart motor workout board.</p>
<button id="connectBtn">Connect Board</button>
<div className="card">
<h3>Device Status</h3>
<div id="status" className="status">Disconnected</div>
</div>
<script>
document.getElementById('connectBtn').addEventListener('click', async () => {
const statusEl = document.getElementById('status');
try {
statusEl.innerText = "Scanning for BLE board...";
const device = await navigator.bluetooth.requestDevice({
acceptAllDevices: true,
optionalServices: ['0000ffe0-0000-1000-8000-00805f9b34fb']
});
statusEl.innerText = `Connecting to ${device.name || 'Board'}...`;
const server = await device.gatt.connect();
statusEl.innerText = `Connected to ${device.name || 'Board'}!`;
} catch (err) {
statusEl.innerText = `Connection failed: ${err.message}`;
}
});
</script>
</body>
</html>