• Ei tuloksia

4 UPS-laitteen käyttöliittymäohjelmiston suunnittelu 20

4.8 Käyttöliittymäohjelman perustoiminta

misesta ja vähentämisestä näppäinpainallusten mukaisesti.

Samaan yhteyteen toteutettiin myös toiminto, joka mahdollistaa isonkin lukualueen nopean selaamisen. Tämä tehtiin siten että käyttöliittymäohjelman havaitessa että nappulaa painetaan pohjassa yhtäjaksoisesti pidempään, se alkaa vähitellen kasvat­

taa osoitetun muuttujan kasvattamisessa tai vähentämisessä käytetyn askeleen pi­

tuutta. Tällaisen toiminnon sisään rakentaminen käyttöliittymäohjelmaan tuo sen helposti saataville kaikissa tilanteissa joissa toiminto on tarpeen.

Pääohjelmaan toteutettiin myös tarvittu aikavalvontatoiminto, joka palauttaa käyttö­

liittymän perustilaan kun laite jätetään yksin. Tämä toiminto seuraa aikalaskuria, ja noin varttitunnin jälkeen suorittaa aikakatkaisun. Aikakatkaisu on kaksivaiheinen, jossa ensivaiheessa sammutetaan näytön taustavalo, sekä toisessa vaiheessa muu­

tamaa minuuttia myöhemmin palautetaan käyttöliittymä perustilaansa. Tiedoksi ai­

kakatkaisun tapahtumisesta laukaistaan tapahtuma, jotta aktiivisen menuruudun toi- mintofunktiossa voidaan peruuttaa mahdollisesti keskenjääneet toiminnot. Näiden lisäksi lisättiin pääohjelmaan myös yksi vapaasti käytettävä aikavalvontatoiminto, joka voidaan ohjelmoida toimintofunktiosta käsin.

4.8 Käyttöliittymäohjelman perustoiminta

Käyttöliittymää ylläpitävän pääsilmukan näkyvimmät päätehtävät ovat nappuloiden painamiseen reagointi sekä näytön ylläpitäminen ajan tasalla. Näitä tehtäviä suorit­

tamaan rakennettiin pääohjelmasilmukka, jonka toiminnan osat on pääpiirteittäin kuvailtu seuraavassa.

1) jos näyttöä ei ole kytkettynä, odotetaan. Jos näyttö on oli valmiiksi kytkettynä ja käytössä, jatketaan kohdasta 4). Jos näytölle on pyydetty uudelleenohjel­

mointi, siirrytään kohdan 2) kautta näytön ohjelmointiin.

2) kun näyttö kytketään, mutta se herää käynnistyslataajatilassa, siirrytään odotta­

maan näytön ohjelmointikomentoja (sarjaportin kautta) ja suoritetaan mah­

dollinen näytön ohjelmointi.

3) jos näyttö on vasta kytketty tai ohjelmoitu, suoritetaan tarvittavat alustustoimet.

4.8 Käyttöliittymäohjelman perustoiminta 33 4) tarkistetaan onko näytön nappulaa painettu. Jos on, niin tarkistetaan siirrytäänkö

painalluksen seurauksena toiseen menuruutuun.

5) jos menuruutu on vaihtunut, alustetaan ja piirretään uusi näyttö.

6) jos menuruutu on sama kuin ennen, päivitetään dynaamiset osat.

7) jos kohtien 5) tai 6) kohdalla menuruudun toimintofunktio on pyytänyt siirty­

mään toiseen menuun, siirrytään aina välittömästä takaisin uuden menuruu­

dun piirtämiseen kohdassa 5).

8) päivitetään ruudun alalaitaan tämänhetkisen menuruudun vaatimat kuvakkeen painikkeille, jos ne muuttuvat edellisistä.

9) päivitetään näytön taustavalon, LED-valojen sekä summerin tila jos se on muut­

tunut sitten edellisen asetetun tilan.

4.8.1 Näytön piirtäminen

Näytön päivitys voitaisiin yksinkertaisimmillaan tehdä siten, että jokaisella päivi- tyskerralla yksinkertaisesti koko näyttö piirretään uudestaan. Tämä on ehkä yksin­

kertaisin malli ja myös suoraviivainen toteuttaa, mutta aiheuttaisi käytännössä tur­

haa viivettä koska useimmiten on ruudulla vain muutamia elementtejä jotka vaativat päivittämistä.

Näytön päivitys voidaan kuitenkin jakaa kahteen osaan: joko näyttö piirretään koko­

naan (yleensä kun se piirretään ensimmäistä kertaa) tai vain sen sisältävät muuttuvat osat päivitetään.

Näytön piirtäminen luvussa 4.3 esiteltyjen menuruutujen sisällön kuvausten perus­

tella toteutettiin kuvassa 4.8 esitettyä metodia noudattaen. Menukuvausta tulkitaan merkki kerrallaan. Kaikki normaalit merkit tulostetaan näytölle sellaisenaan. Kont- rollikoodien kohdalla niiden vaatimat toiminnot suoritetaan välittömästi koodin tul­

lessa vastaan.

Muuttujakoodien kohdalla toiminta on hieman monimutkaisempaa, sillä niihin si­

sältyy myös arvon säännöllinen päivittäminen.

Ruutua piirrettäessä muuttuja tunnistetaan. Koska ruudun staattiset osat eivät vaih­

da paikkaansa jälkikäteen, on muuttujalle varattava tilaa näytöltä. Eri muuttujilla

4.8 Käyttöliittymäohjelman perustoiminta 34

Lue seuraava merkki

== kontrollikoodi Lue seuraava merkki

== muuttujakoodi

Varaa tilaa näytöltä ja ota koodi muistiin

päivitystä varten

Lue mahdolliset parametrit, erotettuna merkillä 0x03

Kuva 4.8: Menuruudun sisältökuvausmerkkijonon tulkkaaminen

on erilaisia tilavaatimuksia, joka myös otetaan huomioon piirtovaiheessa. Tilavaati­

mukset mitoitettiin siten, että tilaa on automaattisen päättelyn jäljiltä ainakin riittä­

västi, tämä puolestaan saadaan pisimmän mahdollisimman muuttujan tekstin perus­

teella. Osa näistä pituuksista joudutaan laskemaan lennossa, sillä erikielisillä teks­

teillä on myös erilaisia tilavaatimuksia.

Se, miten muuttuja päivitetään riippuu myös tekstin tyypistä ruudun piirtohetkellä.

Ruudun piirtohetkellä on siis otetaan muistiin myös tekstin koko, käytetty fontti ja muut mahdolliset tekstin attribuutit.

4.8.2 Näytön päivitys

Näytön päivittäminen koostuu vanhojen muuttujien arvojen poistamisesta sekä uusien arvojen tulostamisesta. Tämä voitaisiin tehdä mainitussa järjestyksessä, mut­

ta arvojen poistaminen ennen uusien tulostamista aiheuttaisi vilkuntaa näytöllä.

Uusi arvo voidaan myös tulostaa vanhan päälle suoraan, mutta jos uusi arvo on kapeampi kuin vanha, jää näytölle rippeet vanhasta. Tähän olisi selkeänä ratkaisuna tulostaa välilyöntejä käyttäen tyhjää varatun tilan loppuun asti, mutta kun käytössä

4.8 Käyttöliittymäohjelman perustoiminta 35 on muuttuvan levyiset fontit ei tämäkään ole hyvä ratkaisu sillä välilyönnin leveys ei välttämättä käy tasoihin varatun tilan kanssa.

Jotta päivitys olisi siistiä, toteutettiin se siten että aina muuttujaa tulostettaessa ote­

taan muistiin pikselikoordinaatti johon teksti yltää. Kun uusi arvo tulostetaan van­

han päälle, tarkistetaan jäikö se lyhyemmäksi kuin edellinen. Jos näin on, voidaan vanhan tekstin jäänteet poistaa piirtämällä niiden päälle riittävän kokoinen tausta- värinen laatikko. Tämä ratkaisu on nopea ja yksiselitteinen.

4.8.3 Usearivisten tekstien käsittely

Suhteellisen pienen näytön kanssa tulee myös ongelmaksi että kaikki haluttu teksti ei välttämättä mahdu ruudulle kerralla joten sitä täytyy pystyä jollain tavalla vierit­

tämään ruudulla. Yksi yleisesti käytetty tyyli olisi liu’uttaa tekstiä merkki kerrallaan ruudulla. Periaatteessa tämä voitaisiin tehdä laskemalla varattuun tilaan tulostettu­

ja merkkejä, ja jos niitä jää ylitse, aloitettaisiin tulostaminen jollain myöhemmällä kerralla eri kohdasta jolloin tuloksena on liukuva teksti.

Ongelmaksi tämän toteuttamiseen havaittiin näytöllä käytetyt muuttuvan levyiset fontit. Kun käyttöliittymäohjelmisto ei tiedä fonttien leveyksiä, ei voida laskea mon­

tako merkkiä johonkin tilaan mahtuu. Taas voitaisiin käyttää tilaan varmasti mah­

tuvien merkkien määrää laskien leveimmän merkin perusteella, mutta lopputulos ei olisi välttämättä erityisen siisti koska myös liputettavan tekstin leveys muuttuisi.

Tarkastellussa tapauksessa havaittiin että tekstin merkki kerrallaan liu’utus voitai­

siin siististi toteuttaa vain jos Hukutettava teksti olisi ruudun oikeassa laidassa jolloin ei ole vaaraa alueen oikealla puolella olevien muiden tekstien ylikirjoittamiselle.

Tekstien liputtaminen päätettiin korvata kokonaisia rivejä kerrallaan vaihtamalla.

Tieto rivityksestä sisällytettiin tulostettaviin merkkijonoihin tiettyä erikoismerkkiä käyttäen. Ratkaisu toimii siten, että kyseisiä dynaamisia merkkijonoja tulostettaes­

sa poimitaan näytölle tulostettavaksi ainoastaan kerrallaan vuorossa oleva rivi. Toi­

mintoon sisällytettiin myös mahdollisuus näyttää kyseistä rivitettyä tekstiä useita rivejä kerrallaan laittamalla peräkkäisille riveille samaan tekstiin viittaavat muuttu- jakoodit.

Tämän rivi kerrallaan liuottamisen positiivisena puolena on se, että koko teksti saadaan luettavaksi suhteellisen nopeasti kun yhtä riviä näytetään vain muutaman

4.8 Käyttöliittymäohjelman perustoiminta 36 sekunnin, liputettava teksti olisi mahdollisesti ärsyttävän hidas jos merkki kerral­

laan liputus tapahtuisi vain muutaman kerran sekunnissa käyttöliittymän hitaasta päivitystahdista johtuen.

4.8.4 Näytön ohjaaminen

Näytön ohjaamiseksi toteutettiin rajapinta jonka avulla taustalla oleva fyysinen CAN-väylä saatiin näkymättömäksi. Rajapintaan toteutettiin funktiot tekstin tulos­

tamiseen, kursorin siirtelyyn sekä muiden toimintojen ohjaamiseen siten että näytön ohjaaminen ohjelmasta käsin on selkeätä.

Todellisessa maailmassa täytyy ottaa huomioon myös odottamattomia tekijöitä, ku­

ten se että joku voi käydä irrottamassa näytön laitteesta kesken näytön päivityk­

sen. Ohjelmisto ei tällaisissakaan tilanteissa saa jäädä jumiin, vaan sen on toimitta­

va loogisesti. Käytännössä pääohjelman on tällaisessa tilanteessa palattava alkuun odottamaan kunnes sama, tai jokin muu näyttö kytketään uudestaan.

Alemmalla tasolla näytön irtoaminen CAN-väylältä havaitaan jos kuittausta johon­

kin lähetettyyn komentoon ei kuulu. Tämmöisessä tilanteessa alin, eli ajuritaso to­

teutettiin siten että se yrittää muutaman kerran muutaman sekunnin viiveen jälkeen lähettää samaa komentoa uudestaan. Jos vastausta ei edelleenkään kuulu, todetaan näyttö irrotetuksi.

Periaatteessa tilanne on selkeä, jos näyttö on irti, riittäisi kun aina näyttöä käsi­

teltäessä tarkistettaisiin onko näyttö edelleen kiinni laitteessa. Tämä ei kuitenkaan ole käytännöllistä, sillä näyttöä käsitteleviä kutsuja on ohjelmassa lukemattomissa eri paikoissa. Jos jokaisen yhteyteen lisättäisiin ylemmällä tasolla erikseen tarkistus siitä onko näyttö edelleen kytketty, tulisi ohjelmasta vähintäänkin sotkuinen.

Tämän ongelman ratkaisu perustuukin samaan rajapintaan jolla näyttöä ohjataan.

Havaittiin, että tilanne voidaan aivan yhtä hyvin toteutettiin alimmalla ajuritasol- la siten, että jos näyttö on edellisellä komennolla julistettu irrotetuksi, toimitaan muuten normaalisti mutta jätetään CAN-väylän ylitse toimitettavat komennot suo­

rittamatta. Pääohjelma kuvittelee ohjaavansa näyttöä, vaikka käytännössä mitään ei tapahdu. Näytön irtoaminen tarkistetaan vasta kun pääohjelma normaalisti palaa kiertonsa alkuun, jolloin jäädään odottamaan näytön uudelleen kytkemistä.