Jeffrey Cross
Jeffrey Cross

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.

Osake

Jättänyt Kommenttia