OTA-updatesysteem

Technische documentatie over de over-the-air-updatearchitectuur van RADR

Dit document beschrijft het over-the-air-(OTA-)updatesysteem van de Research And Desire Wireless Remote (RADR), inclusief de updateketen, het verloop van de toestandsmachine en de onderdelen die worden bijgewerkt.

Overzicht

RADR maakt gebruik van een tweedelig OTA-updatesysteem:

OnderdeelBeschrijvingBinair bestand
FirmwareBinair ESP32-applicatiebestandfirmware.bin
BestandssysteemLittleFS-partitie met apparaatregister en protocolspecificatieslittlefs.bin

De bestandssysteemupdate is vooral belangrijk voor apparaatondersteuning: deze bevat het Buttplug.io-register dat Bluetooth-service-UUID's koppelt aan apparaatconfiguraties. Hierdoor kan ondersteuning voor nieuwe apparaten worden toegevoegd zonder firmwarewijzigingen.

OTA-updatearchitectuur

Updateserver

Updates worden geleverd vanuit Supabase Storage. De server-URL wordt gedefinieerd in platformio.ini:

UPDATE_SERVER_URL="https://acjajruwevyyatztbkdf.supabase.co/storage/v1/object/public/radr-firmware"

Binaire URL's volgen dit patroon:

  • Firmware: {UPDATE_SERVER_URL}/master/firmware.bin
  • Bestandssysteem: {UPDATE_SERVER_URL}/master/littlefs.bin

Verloop van de toestandsmachine

Updates worden beheerd door de RADR-toestandsmachine. Het updateverloop wordt geactiveerd vanuit het Settings-menu.

Statusovergangen

VanNaarVoorwaarde
settings_menuupdateGebruiker selecteert "Update Device" + WiFi verbonden
settings_menuupdate.wifiGebruiker selecteert "Update Device" + WiFi niet verbonden
update.wifiupdateWiFi-verbinding tot stand gebracht
updateupdate.filesystemhasFilesystemUpdate-guard retourneert true
updateupdate.softwarehasSoftwareUpdate-guard retourneert true (geen bestandssysteemupdate)
updateupdate.doneGeen updates beschikbaar
update.filesystemupdate.softwareBestandssysteemupdate voltooid + software-update beschikbaar
update.filesystemrestartBestandssysteemupdate voltooid, geen software-update
update.softwarerestartSoftware-update voltooid (het apparaat wordt altijd opnieuw opgestart)
update.donerestartGebruiker bevestigt

Wat wordt bijgewerkt?

Firmware-update

De firmware-update vervangt het binaire ESP32-applicatiebestand. Dit omvat:

  • Kernapplicatielogica
  • UI en weergavecode
  • Bluetooth-stack en apparaatcommunicatie
  • Toestandsmachine en navigatie
  • Invoerverwerking (encoders, knoppen, bumpers)

Implementatie: updateSoftwareTask() in src/tasks/update.cpp

void updateSoftwareTask(void *pvParameters) {
    // Uses ESP32 HTTPUpdate library
    httpUpdate.setRebootOnUpdate(true);  // Auto-reboot on success

    String url = String(UPDATE_SERVER_URL) + "/master/firmware.bin";
    httpUpdate.update(client, url);
}

De firmware-update start het apparaat automatisch opnieuw op als het succesvol is.

Bestandssysteemupdate

De bestandssysteemupdate vervangt de LittleFS-partitie, die het volgende bevat:

BestandDoel
/registry.jsonKoppelt BLE-service-UUID's aan protocolspecificatiebestanden
/protocols/*.jsonButtplug.io v4-apparaatconfiguratiebestanden

Implementatie: updateFilesystemTask() in src/tasks/update.cpp

void updateFilesystemTask(void *pvParameters) {
    LittleFS.end();  // Unmount before update

    httpUpdate.setRebootOnUpdate(false);  // Don't reboot yet

    String url = String(UPDATE_SERVER_URL) + "/master/littlefs.bin";
    httpUpdate.updateSpiffs(client, url);

    LittleFS.begin();  // Remount after update
}

De update van het bestandssysteem veroorzaakt geen automatische herstart. Hierdoor kunnen zowel het bestandssysteem als de firmware achtereenvolgens worden bijgewerkt voordat opnieuw wordt opgestart.

Updateketen van het register

Wanneer het bestandssysteem wordt bijgewerkt, wordt het Buttplug.io-apparaatregister vernieuwd:

Het register wordt tijdens het opstarten geladen door initRegistry() in src/devices/registry.cpp:

  1. Hardgecodeerde apparaten worden eerst geregistreerd (bijvoorbeeld OSSM)
  2. /registry.json wordt gelezen vanuit LittleFS
  3. Elke service-UUID wordt toegewezen aan een ButtplugIODeviceFactory
  4. Protocolspecificaties worden op aanvraag geladen wanneer apparaten worden ontdekt

Beschikbaarheid van updates

De beschikbaarheid van updates wordt bepaald door guardfuncties in src/state/guards.hpp:

bool hasFilesystemUpdate(const State &state, const Event &event) {
    return isFilesystemUpdateAvailable;
}

bool hasSoftwareUpdate(const State &state, const Event &event) {
    return isSoftwareUpdateAvailable;
}

Deze vlaggen worden ingesteld door:

VlagWordt ingesteld wanneer
isSoftwareUpdateAvailablede FORCE_UPDATE-compileervlag actief is of de server een update meldt
isFilesystemUpdateAvailablede FORCE_UPDATE-compileervlag actief is of de server een update meldt

De huidige implementatie heeft een TODO voor automatische updatecontrole. Momenteel worden updates handmatig geactiveerd en moet de beschikbaarheid worden ingesteld via compileervlaggen of externe mechanismen.

Belangrijke bronbestanden

BestandDoel
src/tasks/update.cppImplementaties van updatetaken (updateSoftwareTask, updateFilesystemTask)
src/tasks/update.hDeclaraties van updatetaken en beschikbaarheidsvlaggen
src/state/machine.hDefinitie van de toestandsmachine met updatetoestanden
src/state/guards.hppGuardfuncties voor de beschikbaarheid van updates
src/devices/registry.cppRegisterinitialisatie vanuit LittleFS
data/registry.jsonKoppelingen van service-UUID's naar protocolspecificatiebestanden
data/protocols/*.jsonButtplug.io v4-apparaatspecificaties

Ontwikkelingsnotities

Updates forceren

Gebruik voor ontwikkeling en testen de compileervlag FORCE_UPDATE:

build_flags =
    -D FORCE_UPDATE

Hierdoor worden zowel isSoftwareUpdateAvailable als isFilesystemUpdateAvailable ingesteld op true.

Lokale bestandssysteemupdates

Wanneer u lokaal ontwikkelt, gebruikt u de functie "Upload Filesystem" van PlatformIO:

pio run --target uploadfs

Hiermee wordt de inhoud van de map data/ geüpload naar de LittleFS-partitie.

"Upload Filesystem" wist de bestaande LittleFS-partitie vóór het schrijven. Eventuele runtime-wijzigingen gaan verloren.

Gerelateerde documentatie

Op deze pagina