diff --git a/doc/openscale-integration.md b/doc/openscale-integration.md new file mode 100644 index 0000000..203096e --- /dev/null +++ b/doc/openscale-integration.md @@ -0,0 +1,68 @@ +# openScale BT-vågar — integrationsplan + +Bygga in [openScale](https://github.com/oliexdev/openScale):s Bluetooth- +drivrutiner i FitnessDroid så att vägningar (vikt + %muskler/fett/vatten) +kan hämtas direkt från en BT-våg in i appens kroppsmätningar. + +## Beslut (2026-07-26) + +- **Licens: FitnessDroid relicensas till GPL-3.0.** openScale är GPL-3.0; + att bädda in deras kod kräver att hela appen blir GPL-3.0. LICENSE byts, + och källfilerna som kommer från openScale behåller sina copyright-headers. +- **Alla drivrutiner portas** (hela `core/bluetooth`-paketet, ~55 handlers + + adaptrar), inte bara en modell. `ScaleFactory` auto-detekterar vågen vid + skanning precis som i openScale. +- **Attribution:** en **About**-vy under Profil som anger att appen använder + openScales drivrutiner, med länk till deras GitHub och GPL-3.0-licensen, + plus en lista på öppen källkod som används (openScale, Blessed-Kotlin). + +## Teknik (bekräftat från repot) + +- openScale använder **Blessed-Kotlin** (coroutine-BLE-wrapper) — läggs till + som Gradle-beroende; vi portar drivrutinerna som ligger ovanpå, inte + BLE-plumbingen. +- `ScaleDeviceHandler.supportFor(device)` → `DeviceSupport` (displayName, + linkMode, tuningProfile). `ScaleFactory` returnerar första matchande handler. +- Tre kopplingslägen: `CONNECT_GATT`, `BROADCAST_ONLY`, `CLASSIC_SPP` med var + sin adapter (Gatt/Broadcast/Spp). +- `ScaleMeasurement` bär weight, fat, water, muscle, visceralFat, bone, lbm, + bmr, protein, impedance m.m. → vi mappar weight + muscle/fat/water till vår + `BodyMeasurement` (resten kan tas in senare). +- minSdk 31 matchar vår app (BLE-permissions `BLUETOOTH_SCAN`/`_CONNECT`). + +## Fallgrop: impedansvågar behöver användarprofil + +Vissa vågar skickar bara **rå impedans**; openScale räknar då själv ut +fett/muskler/vatten med en formel som kräver **längd, ålder, kön** (ScaleUser). +Vi måste därför: +- Lägga till längd/födelseår/kön i profilen (lokalt; kan senare speglas i API). +- Porta openScales BIA-beräkning för de vågar som kräver den. +Vågar som räknar ombord och skickar färdiga procent behöver inte detta. + +## Milstolpar (byggbara steg) + +1. **Grund + licens + About** — LICENSE → GPL-3.0; `blessed-kotlin`-beroende; + BLE-permissions i manifestet; About-vy under Profil (attribution + länkar + + openetlicens-text); körruntime-permission-flöde. *Ingen vågkod än — bara + att allt kompilerar och About visas.* +2. **Porta bluetooth-paketet** — vendora `com.health.openscale.core.bluetooth` + (ScaleCommunicator, ScaleFactory, scales/, adaptrar, data/, libs/) med + copyright-headers kvar. Slimmad `ScaleMeasurement`/`ScaleUser`. Får det att + kompilera mot Blessed. +3. **Skanna + koppla** — "Anslut våg" i inställningar: skanna BLE, kör + `ScaleFactory` mot varje enhet, visa matchade vågar, spara vald MAC. +4. **Väg dig-flöde** — knapp som skannar/kopplar vald våg, tar emot en + `ScaleMeasurement`, förhandsvisar och sparar via `addBodyMeasurement` + (offline-kön tar resten). Live-status ("står på vågen…"). +5. **Impedansvågar** — profilfält (längd/ålder/kön) + BIA-beräkning för de + vågar som skickar rå impedans. Verifieras mot din våg. +6. **Polering + docs** — felhantering, timeouts, ominställning av våg; + uppdatera README/wiki + infra-Doc (GPL-relicens noterad). + +## Öppna frågor / risker + +- **Vilken våg du har** avgör om milstolpe 5 (impedans-BIA) behövs eller om + din våg skickar färdiga procent. Identifieras i milstolpe 3 via skanning. +- Blessed-Kotlins exakta koordinater/version verifieras vid milstolpe 1. +- APK växer (drivrutiner + BLE-lib) — troligen någon MB, oproblematiskt. +- GPL-relicens är permanent för koden; medvetet val. diff --git a/doc/plan.md b/doc/plan.md index d303afc..efd3030 100644 --- a/doc/plan.md +++ b/doc/plan.md @@ -61,7 +61,11 @@ mallar, grunddata och profil. mätningar från profilen med datumväljare, viktgraf i statistiken med glidande medelvärde och linjär trendlinje. Profilens bodyWeightKg speglar alltid senaste mätningen. -4. **Passhistorik** — lista, visa, redigera och ta bort tidigare pass. +4. **BT-våg via openScale-drivrutiner** *(planerad)* — hämta vägningar + (vikt + %muskler/fett/vatten) direkt från en Bluetooth-våg genom att + bädda in openScales drivrutiner. Kräver relicens till GPL-3.0. Full plan: + [`doc/openscale-integration.md`](openscale-integration.md). +5. **Passhistorik** — lista, visa, redigera och ta bort tidigare pass. 4. **Logga lyft (snabbloggning) + PB** — enkel lyftlogg och PB-matrisen. 5. **Statistik** — perioder (vecka/månad/halvår/år), KPI-kort, trenddiagram, muskelfördelning, aktivitets-heatmap.