Blog

I vår produkt Edda Fysik 1 erbjuder vi skolor möjligheten att köra vår applikation på vilket headset de vill, och detta genom OpenXR!

Detta innebär att vi stödjer alla standalone-headsets som finns på marknaden, men även desktops. Den vedertagna distributionsplattformen för detta är Steam, och om man utvecklar konsumentprodukter är det toppen. Från ett utvecklar/företagsperspektiv är tröskeln också relativt låg, för 99$ får man tillgång till Steamworks och därmed möjligheten att eventuellt publicera sin app eller sitt spel på Steam.

Vi vill publicera våra appar direkt till skolorna och gärna med automatiserad uppdatering. En eventuell möjlighet är att olika skolor vill ha olika labbar och därmed olika konfigurationer, så en lösning som stödjer det hade också varit toppen.

Men steamworks är nog inte utformat med det usecaset i första hand. Man kan nog trixa med release channels och så, men det blir en väldig bearbetning som eventuellt förlorar support under årens gång.

Därför lade jag lite tid på att utveckla ett eget autoupdater-program, som på enklast möjligast vis kollar om det finns en ny uppdatering av appen, och helt enkelt laddar ned den. Det är skrivet i Rust och har alla fördelar Rust lovar utvecklare, det vill säga säker minneshantering och ett error handlingssystem som bara funkar.

Jag använde reqwest för alla anrop och tokio för parallelisering. Det kan nog vara lite i överkant för vad vi använder det för, men if it aint broke etc! 😊

Först var jag väldigt taggad på att använda native-windows-gui för att ge användaren en någorlunda familjär upplevelse. Om en ny version har hittats —> visa en dialogruta, om något går fel —> visa det i en errorruta, osv. Men när jag försökte baka ihop mina två separata, men fungerande prototyper så kompilerade projektet, men när jag körde programmet fick jag felmeddelande (exit code: 0xc0000139, STATUS_ENTRYPOINT_NOT_FOUND), vilket kändes som ett väldigt “windows-coded”-fel. När jag försökte hitta någon annan som hade stött på samma problem var det bara i StackOverflow-trådar som handlade om C++. En användare lade följande kommentar:

Kommentar av användare drescherjm på StackOverflow

Och helt plötsligt kändes det som ett problem som hade mindre med mig att göra. Jag fick acceptera att det här bara skulle vara ett hjälpprogram, och att ett terminalfönster nog är tillräckligt bra för vad programmet ska åstadkomma.

Jag debuggade och hittade att problemet bara uppstod när use reqwest::Client fanns, så det måste bero på någon form av fundamental inkompabilitet mellan reqwest och NWG.

I vilket fall - det funkar! Och även om jag inte kan titulera mig som Rust-expert på något sätt känns det otroligt roligt att kunna dyka ut i det stora programmeringshavet och att få knacka ihop något som förhoppningsvis underlättar för oss och för våra kunder. Som en del av exkursionen hittade jag egui och rerun, något som fick mitt hjärta att ta ett litet skutt! Efter att ha spenderat X antal timmar i Rviz (som jag också älskar och har submittat PRs till), känns det som en frisk fläkt att se att det finns ett gäng människor som jobbar med att utveckla nya visualiseringsverktyg för allt vad robotar innebär.

Allez!

/Kaspian