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ä.