Mikro-ohjaimen ikkunanhallinnan suunnittelu
Tämä viesti oli alun perin kirjoittanut Andrew Rossignol ja julkaissut The Resistor Networkissa 4. huhtikuuta.
Olen kokeillut uVGA-II VGA -ohjainta viimeisten viikkojen aikana. Se on hauska laitteisto, joka pystyy piirtämään grafiikkaa VGA-kehyspuskuriin. VGA-ohjain huolehtii linjapiirustusalgoritmeista ja auttaa laitteistoa nopeuttamaan geometristen primitiivien (neliöt, ympyrät, kolmiot, monikulmio, linjat) piirtämistä.
Kun tajusin tämän laitteiston voiman, päätin toteuttaa sellaisen ikkunanhallinnan, jota odotatte millä tahansa tavallisella työpöytätietokoneella. Olen käyttänyt hiirtä käyttäjän syöttämässä järjestelmässä.
Lähikuva oletusasetuksista
Oletusjärjestelmä käynnistyy kolmella sovelluksella: Theme Manager, Audio Player. ja Window Factory. Teemapäällikköä käytetään järjestelmän teeman värien muokkaamiseen, Audio-soitinta käytetään toistamaan joitakin SD-kortille tallennettuja äänitiedostoja, ja Window Factory -ohjelmaa käytetään uusien ikkunoiden luomiseen esittelyä varten.
Hieman sininen teema, jossa on enemmän Windowsia
Tässä on video, joka näyttää järjestelmän.
Ohjelmiston yleiskatsaus
Olen yrittänyt ylläpitää abstraktiokerroksia tässä ohjelmistossa. Aloitan selittämällä kerrostetun lähestymistavan, jonka olen ottanut kuljettajille, ikkunanhallinnalle ja käyttäjän sovellukselle.
Kerroksinen lähestymistapa
Pino on alhaalla UART-ohjain. Minulla on kaksi UART-moduulia, joten voin liittyä sekä uVGA-II: n että sarjahiiren kanssa samanaikaisesti.
Valitettavasti olen joutunut ansaan yrittää kirjoittaa hyvää koodia ja kerrosten välillä on epätarkka. Ikkunapäällikkö tekee puhelut suoraan uVGA-II-kerrokselle, mikä tarkoittaa, että tämän ikkunanhallinnan siirtäminen toiseen VGA-ohjaimeen olisi vaikeaa. Tämä voidaan ratkaista luomalla keskipitkän, alustasta riippumaton laitteisto-rajapinta. Jos käyttäjä halusi käyttää AVRDE: tä toisella VGA-ohjaimella, ne muuttaisivat laitteiston abstraktiokerroksen itse ikkunanhallinnan sijasta.
Huolimatta kerrosten hämärtymisestä, on helppo pitää yllä. Pystyin lisäämään uuden widgetin (liukusäädin) parin tunnin kuluessa.
GUI-työkalupaketin mallinnus C: ssä
Tämä on ensimmäinen yritys käyttää C: tä mallin monimutkaisen abstraktin mallinnukseen. Käytän tyypillisesti C: tä laitteiden, rekisterien ja muiden matalan tason laitteistokonseptien ohjaamiseen. Tämä projekti on täysin erilainen ja yrittää mallintaa työpöydän metaforaa. En väitä tuntevani C ++: ta, joten olen päättänyt pysyä elementissäni ja käyttää strukteja ja liittoja C.
Kaikki näytön objektit ovat widgetin jälkeläisiä
DWidget_t: llä on anonyymi kaikkien lasten tyypit. Tämä mahdollistaa dWidget_t-objektin olevan kaikkien työpöydän widgetien vanhempi tyyppi. Vanhempien dWidget_t-objektin hiirenpainiketta, hiiren siirtoa ja hiirenpyyntöjä hoitaa itse ikkunahallinta. ”Perinnöllisten” tyyppien toiminnalliset osoittimet ovat käyttäjän sovelluksia varten. Sitoudun arvonmuutos () -palautukseen käsittelemään teeman muutoksia.
Windowsin hallinta
DWidget_t-tyypin lisäksi olen toteuttanut dManager_t. Tätä rakennetta käytetään ylläpitämään ikkunoita ja niihin liittyviä funktiopuheluja.
Window Manager
Tämä hallintajärjestelmä seuraa ikkunanhallinnan kokoa (välttääkseen kovakoodatut vakiot), joitakin kohdistimen näkökohtia, luettelon ikkunoiden osoittimista ja tehtäväpalkin painikkeiden sijainnista ja koosta.
Piirrä työpöytä
Olen käyttänyt Painterin algoritmia käsittelemään ikkunoiden piirtämistä. Tämä tarkoittaa sitä, että lajitan ikkunat Z-Indexin avulla ja piirtää ne alimmasta korkeimpaan siten, että etualan ikkuna on aina päällä.
Olen lainannut Androidista käsitteen, jonka olen melko ihastunut. Käytän uudelleenmaalauslippua käsittelemään maalausta tarvittaessa. Tämä tarkoittaa sitä, että jos muutan widgetiä (esimerkiksi vaihdan Labelin tekstiä), minun täytyy soittaa dInvalidate () -ohjelmaan, jotta se maalataan näytölle. Tämä minimoi tarvittavien kopioiden määrän.
Minulla on myös maalauksen lippu johtajaan. Tämä lippu asetetaan, kun ikkuna siirretään, teema muutetaan tai ikkuna on minimoitu. Manager.repaint-lippu johtaa työpöytäympäristön täydelliseen maalaamiseen.
Paljon ikkunoita
Järjestelmän teema
Jokainen widget sisältää aiheen osoittimen. Tämä mahdollistaa eri ikkunoiden erilaiset teemat tai sovellusten oman ulkonäön säilyttämisen. En ole käyttänyt tätä toimintoa esittelyvideossa.
Johtajalla on myös viittaus tehtäväpalkin piirtämiseen tarkoitettuun järjestelmän teemaan.
Tehtäväpalkki
Tehtäväpalkki on melko yksinkertainen. Sitä ei toteuteta widgetinä, se on yksinkertaisesti piirretty ikkunanhallinnan päälle tarvittaessa ja painikkeiden sijainnit tallennetaan ikkunanvaihtoon.
Kun ikkunan otsikot ovat liian pitkiä painikkeelle, lopulliset 2 merkkiä korvataan merkillä "..".
Otsikon lyhentäminen
Laitteisto
Laitteistoon ei ole liikaa. Minulla on ATmega1284p-mikrokontrolleri, uVGA-II VGA -ohjain, MAX233-tason muunnin ja Microsoft Serial Mouse.
Lähikuva leivonnaisesta laitteistosta
Koodi
Minun täytyy työskennellä UART-ohjaimessa hieman ja kiillottaa joitakin asiakirjoja ennen kuin lähetän koodin Github-arkistoon.
KiitoksetAndrew Rossignoljotta voimme palauttaa artikkelinsa tässä MAKE-sivustossa.