Design af en Window Manager for en Micro-Controller - 💡 Fix My Ideas

Design af en Window Manager for en Micro-Controller

Design af en Window Manager for en Micro-Controller


Forfatter: Ethan Holmes, 2019

Dette indlæg blev oprindeligt skrevet af Andrew Rossignol og udgivet i Resistor Network den 4. april. Det er reposted her på MAKE med tilladelse.

Jeg har eksperimenteret med uVGA-II VGA controller i de sidste par uger. Det er et underholdende stykke hardware, der er i stand til at tegne grafik på en VGA framebuffer. VGA-controlleren tager sig af line drawing algoritmer og hjælper med at hardware accelerere tegningen af ​​geometriske primitiver (firkanter, cirkler, trekanter, polygoner, linjer).

Når jeg indså kraften i denne hardware, besluttede jeg mig for at implementere en vinduesmanager som du ville forvente på enhver almindelig stationær pc. Jeg har brugt en mus til brugerindgang til systemet.

Nærbillede af standardkonfigurationen

Standardsystemet starter med tre applikationer: Theme Manager, Audio Player. og vinduesfabrik. Theme Manager bruges til at ændre systemtemaets farver. Lydafspilleren bruges til at afspille nogle lydfiler, der er gemt på et SD-kort, og Window Factory bruges til at oprette nye vinduer til demonstration.

Lille Blå Tema, med flere Windows

Her er en video, der demonstrerer systemet.

Softwareoversigt

Jeg har forsøgt at opretholde lag af abstraktion inden for denne software. Jeg vil begynde med at forklare den lagdelte tilgang, som jeg har taget for driverne, vindueshåndtereren og brugerprogrammet.

En lagdelt tilgang

Nederst i stakken er UART-driveren. Min MCU har to UART-moduler, så jeg kan interface med både uVGA-II og den serielle mus samtidigt.

Desværre er jeg faldet i fælden for at forsøge at skrive god kode, og der er en sløring mellem lagene. Window Manager laver opkald direkte til uVGA-II-laget, hvilket betyder, at det ville være svært at sende denne vinduesmanager til en anden VGA-controller. Dette kan løses ved at oprette et mellemliggende platform uafhængigt hardware interface lag. Hvis en bruger ønskede at køre AVRDE ved hjælp af en anden VGA-controller, ville de ændre hardwareabstraktionslaget i stedet for selve vinduets leder.

På trods af uskarpheden mellem lagene finder jeg det let at vedligeholde. Jeg kunne tilføje en ny widget (skyderen) inden for et par timer.

Modellering af et GUI Toolkit i C

Dette er mit første forsøg på at bruge C til at model kompleks abstraktion. Normalt bruger jeg C til at styre hardware, registre og andre hardwarekoncepter på lavt niveau. Dette projekt tager en helt anden retning og forsøger at modellere desktop metaforen. Jeg hævder ikke at kende C ++, så jeg har besluttet at forblive inden for mit element og bruge strukturer og fagforeninger i C.

Alle on-screen objekter er efterkommere af Widget

DWidget_t har en anonym forening af alle barnetyper. Dette gør det muligt for dWidget_t objektet at være forældetype af alle desktop widgets. MouseDown, mouseMove og mouseUp callbacks af forælder dWidget_t objektet håndteres af vinduets manager selv. Funktionspegerne inden for de "arvede" typer er til brugerprogrammerne. Jeg binder til valueChange () tilbagekald for at håndtere temaændringer.

Administration af Windows

Udover dWidget_t-typen har jeg implementeret en dManager_t. Denne struktur bruges til at opretholde vinduerne og tilhørende funktion tilbagekald.

Window Manager

Denne manager struktur holder styr på størrelsen af ​​vinduet manager (for at undgå hardkodede konstanter), nogle aspekter af markøren, en liste over vinduet pointers og positionerne og størrelserne af knapperne på proceslinjen.

Tegning af skrivebordet

Jeg har brugt malerenes algoritme til at håndtere tegningen af ​​vinduer. Det betyder, at jeg sorterer windows ved Z-Index og derefter tegner dem fra laveste til højeste, så forgrundsvinduet altid er øverst.

Jeg har lånt et koncept fra Android, som jeg er meget glad for. Jeg bruger et repaint flag til at håndtere omsmøring, når det er nødvendigt. Dette betyder, at hvis jeg foretager en ændring til en widget (for eksempel ændrer teksten på en etiket), skal jeg ringe dInvalidate () på den widget for at få den malet på skærmen. Dette minimerer mængden af ​​samlede repaints, der er nødvendigt.

Jeg har også et repaint flag i manager. Dette flag er indstillet, når et vindue er flyttet, temaet ændres eller et vindue minimeres. Manager.repaint-flagmet resulterer i en fuldstændig gentagelse af skrivebordsmiljøet.

Masser af vinduer

Systemtema

Hver widget indeholder en pointer til et tema. Dette gør det muligt for forskellige vinduer at have forskellige temaer eller for applikationer at opretholde deres eget udseende. Jeg har ikke udnyttet denne funktionalitet i demonstrationsvideoen.

Lederen har også en henvisning til systemtemaet til tegning af proceslinjen.

Opgavelinjen

Aktivitetslinjen er ret simpel. Det implementeres ikke som en widget, det er simpelthen trukket oven på vindueshåndteringen, når det er nødvendigt, og placeringen af ​​knapperne gemmes for vindueskift.

Når titlerne i Windows er for lange til knappen, erstattes de sidste 2 tegn med "..".

Titelforkortelse

Hardware

Der er ikke for meget til hardware. Jeg har en ATmega1284p mikrocontroller, en uVGA-II VGA controller, en MAX233 niveau konverter og en Microsoft Serial Mouse.

En nærbillede af brødbrættet hardware

Koden

Jeg skal arbejde på UART-driveren lidt mere og polere lidt dokumentation, før jeg uploader koden til mit Github-lager.

Tak tilAndrew Rossignolfor at lade os omsætte sin artikel her på MAKE-webstedet.



Du Kan Være Interesseret

Projekt: Wedding Favor Seed Packets

Projekt: Wedding Favor Seed Packets


En MAKT Læser opbygger Solar Pendulum fra Volumen 28

En MAKT Læser opbygger Solar Pendulum fra Volumen 28


Math for Makers

Math for Makers


Hvordan træ hårdhed er målt

Hvordan træ hårdhed er målt






Seneste Indlæg