3 Taustatietoja toteutukselle 17
3.2 Kielet ja käyttöliittymä
3.2.1 Unicode
Käyttöliittymän tekstien käännökset eri kielille saadaan kääntäjiltä kätevimmin Unicode-merkistöstandardia noudattavassa muodossa. Unicode [15] on kansainväli
nen merkkijärjestelmästandardi, joka varaa uniikin numeroarvon jokaiselle merkil
le. Järjestelmä esittää merkit 16-bittisinä, joten sillä voidaan esittää 65535 erilaista eri kielissä käytettyä merkkiä. Järjestelmä helpottaa huomattavasti erikielisten do
kumentaatioiden kanssa työskentelyä, kun maailmalla käytettyjen satojen erilaisten merkistöjen koodaustapojen sijaan voidaan käyttää yhtä standardia.
Luku 4
UPS-laitteen
käyttöliittymäohjelmiston suunnittelu
4.1 Käyttöliittymäohjelmiston vaatimukset
Kohteena olevan UPS-laitteen oli tavoitteena korvata uudempana mallina jo markki
noilla oleva vanhempi UPS-laite. Käyttöliittymän suunnittelussa haluttiin ottaa huo
mioon mahdollisesti edellisiä malleja käyttäneet käyttäjät, joten etupaneelin käyttö
liittymän haluttiin peruspiirteissään ja toiminnassaan noudattavan edellisen antamaa mallia.
Käyttöliittymä koostuu menurakenteesta, joka sisältää tarvittavan määrän menuruu- tuja. Käyttöliittymän menuruutujen välillä liikkuminen tapahtuu käyttäjän painel
lessa etupaneelin painikkeita. Käyttöliittymällä oli tarkoitus voida tehdä seuraavan
laisia asioita:
e Suorittaa toimintoja, kuten käynnistää ja sammuttaa UPS-laite, tai asettaa se ohitusverkolle
• Tarkistaa/seurata UPS-laitteen toimitilaa, onko laite normaalitoiminnassa, ohitusverkolla, akuilla tms.
• Tarkistaa aktiiviset hälytykset ja huomautukset
• Selata menneitä hälytyksiä ja tapahtumia eli tapahtumalokia
• Lukea mittausarvoja, eli jännitteitä, virtoja, taajuuksia tms.
4.2 Menurakenteen esittäminen 21
• Selata ja asettaa UPS-laitteen parametrejä, eli konfiguroida laitteen toimintaa
• Tarkistaa laitteen ohjelmistoversiot tms.
• Vaihtaa käyttöliittymän kieli, jonka on oltava valittavissa ainakin kahden vaihtoehdon väliltä.
Käyttöliittymän täytyi pystyä myös reagoimaan UPS-laitteen sisäisiin tapahtumiin, kuten toimintatilan muutoksiin sekä uusien hälytysten ja huomautusten aktivoitu
miseen. Lisäksi sen tuli toteuttaa aikavalvontakatkaisu (timeout), jonka tehtävä on palauttaa menu tietyn ajan kuluttua perustilaan kun nappuloita ei paineta.
Käyttöliittymän toteutuksessa haluttiin mahdollisimman pitkälle seurata myös mal
lia, jossa käyttöliittymän toteutus on erillään itse käyttöliittymäohjelmasta. Tätä on kuvattu kuvassa 4.1. Rakenne haluttiin mahdollisimman pitkälle sellaiseksi, että itse käyttöliittymän toteutuksen määritteleminen olisi yksinkertaista ja selkeää. Selkeä rakenne helpottaa koodin muokkaamista ja ymmärtämistä myös jälkikäteen, kun käyttöliittymää tarvitsee ylläpitää.
Käyttöliittymän toteutus
Erikieliset ulkonäkökuvaukset
UPS-laite Käyttöliittymäohjelma
Kuva 4.1 : Käyttöliittymän perusosat
4.2 Menurakenteen esittäminen
Yksi tehtävä ratkaisu käyttöliittymän määrittelemisessä on se miten käyttöliittymän menurakenne esitetään ohjelmakoodissa.
4.2 Menurakenteen esittäminen 22 Yksi tapa lähestyä tätä asiaa on rakennelähtöinen, jossa menurakenne ajatellaan puuna. Jokaisesta solmukohdasta on X kappaletta haaroja, joiden väliltä voidaan tehdä valinta. Jokainen haara taas voi johtaa uuteen valintaan, tai tiettyä asiaa esit
tävään lehtisolmuun.
Tällaisen rakenteen esittäminen vaatii tiedon jokaisen haarakohdan taakse liittyvistä vaihtoehdoista. C-kielellä toteutettuna tämä tarkoittaisi erillistä taulukkoa jokaista haarakohtaa kohden, joihin on listattuna seuraavat haarat tai lehtisolmut.
Valittu ratkaisu
Toinen, ja myös toteutettavaksi valittu esitysmuoto on enemmän menuruutulähtöi- nen. Ajattelu alkaa ennemmin yksittäisestä menuruudusta, kuin menujen muodos
tamasta rakenteesta. Siinä Jokainen menuruutu on itsenäinen kokonaisuus, jossa painikkeen painaminen voi aiheuttaa siirtymän toiseen menuruutuun. Tätä lähesty
mistapaa on esitetty kuvassa 4.2.
• menuruutu Y •
painike2
• — — _ — — — — - — — * painikel
• menuruutu X i menuruutu 4/ ;
J
menuruutu W
painike3
menuruutu Z
Kuva 4.2: Menuruudun rakenne
Kuvattu rakenne voidaan esittää taulukkona, jokaista menuruutua vastaa yksi al
kio taulukossa. Jokaiseen menuruutualkioon liittyy tieto neljästä muusta ruudusta, joihin eri nappuloiden painaminen oletusarvoisesti johtaa. Tällainen ratkaisu on ra
kenteeltaan yksinkertaisen selkeä. Kun kaikki tieto käyttöliittymän rakenteesta ja menuruutujen järjestyksestä on koottuna samaan taulukkoon, on se helposti ym
märrettävissä ja siten myös ylläpidettävissä.
Tällaisessa ratkaisussa ei myöskään sitouduta menujen tietyntyyppiseen hierarkki
seen järjestykseen, vaan tarpeen mukaan painikkeen painaminen voi aiheuttaa siir
4.3 Menujen kielen ja ulkonäön esitysmuoto 23 tymän mihin tahansa ruutuun. Edellä mainittu puutyyppinen rakenne voidaan to
teuttaa, mutta sitä voidaan myös tarpeen mukaan monipuolistaa.
Käyttöliittymän määrittelemistä ja ylläpitämistä helpottaa myös se, jos menuruutu- jen järjestyksellä taulukossa ei ole merkitystä. Yksinkertaisin ratkaisu, joka ei tätä vaatimusta toteuta, on sellainen jossa menuruudun indeksi taulukossa on samalla myös sen ohjelmallinen tunnistekoodi. Tällöin siis tietty menuruutu voidaan löy
tää taulukosta osoittamalla suoraan taulukon alkiota tietyllä indeksillä. Toteutus on prosessorin näkökulmasta nopea, sillä ruutuja ei tarvitse taulukosta etsiä. Käyttöliit
tymän ylläpitäjän näkökulmasta tämä aiheuttaa kuitenkin ylimääräistä vaivannäköä kun indeksit on pidettävä sotilaallisessa järjestyksessä.
Toinen vaihtoehto on liittää taulukkoon jokaista menuruutua kohti myös ruudun oma tunnistekoodi. Tällöin aina kun uusi menuruutu halutaan ohjelmassa kaivaa esiin, täytyy se ensin etsiä taulukosta tunnistekoodin perusteella. Tämän aiheutta
ma viive on kuitenkin nopealla prosessorilla merkityksetön, kun etuna kuitenkin saavutetaan helpommin ylläpidettävä ohjelma.
4.3 Menujen kielen ja ulkonäön esitysmuoto
Taustaa
Yksi aiemmissa UPS-malleissa käytetty tapa on, että erikieliset tekstit esitetään tau
lukoituna menuittain. Jokaiselle kielelle on yksi taulukkoja taulukossa jokaista me
nuruutua kohden yksi merkkijono. Menuruuduissa, joissa on muuttuvaa tietoa, on sille jätetty merkkijonossa tyhjää tilaa. Tämän tyhjän tilan paikalle muuttuva tieto päivitetään.
Ongelmana eri kielien välillä on se, että muuttuvalle tiedolle varatun tilan sijainti ja koko on kiinteä jokaisella kielellä. Tästä aiheutuu ongelmia käännösten tekemises
sä, kun sanoja on sijoiteltava ja lyhenneltävä niille varattuihin tiloihin.
Yksi mahdollisuus toteuttaa tekstin esitys on sanakirjamalli. Siinä yhtä sanaa vastaa numerokoodi, joita peräkkäin asettelemalla saadaan aikaan lauseita. Tämän tyyppi
nen ratkaisu säästää muistia sillä jokainen sana on muistissa vain kerran. Malli toi
mii suhteellisen hyvin englanninkielisen tekstin esittämiseen, jossa sanoilla esiinty
vät usein perusmuodossaan. Mallin istuu kuitenkin huonosti sellaisiin kieliin joissa
4.3 Menujen kielen ja ulkonäön esitysmuoto 24 sanat taipuvat. Myöskään samoja lausepohjia ei tässäkään voitaisi käyttää eri kielil
lä koska sanajärjestys on kielten välillä erilainen.
Tässä UPS-laitteessa Käyttöliittymän menujen haluttiin olevan mahdollisimman va
paasti määriteltävissä, jotta ne soveltuisivat erikielisten versioiden esitykseen mah
dollisimman hyvin. Erikielisten esitysten välillä on eroja sanojan pituuksissa ja sa- najäijestyksessä, tämän takia staattisen ja muuttuvan tekstin sijaintien haluttiin ole
van vapaasti määriteltävissä.
Ratkaisu
Ratkaisuksi lähdettiin miettimään tapaa yhdistää menuruudun staattisen tekstin ja muuttuvan datan sijainti ja sisältö yhteen kuvaukseen. Kuvauksen vaatimuksiin si
sältyy seuraavanlaisia asioita:
• esittää näytöllä staattista tekstiä
• esittää näytöllä muuttuvaa dynaamista tekstiä (mittaustuloksia, parametrien nimiä ja arvoja, jne.)
• määrittää elementtien sijainnit, eli käytännössä siirtää kursoria näytöllä
• muuttaa tekstin ulkonäköä, kuten kokoa tai tyyliä (käänteinen/normaali)
• vaihtaa tekstin kirjoituksessa käytettyä fonttia
Nämä vaatimukset saadaan tarkemmin tarkasteltuna tiivistymään kolmeen ryh
mään. Näitä ryhmiä ovat teksti, muuttujat sekä kontrollointi.
Staattisena pysyvä teksti on selkeä ryhmä, se on tarkoitus kirjoittaa ruudulle kerran ja pysyä paikallaan. Sen esittäminen on luonnollisinta selväkielisenä merkkijonona.
Muuttujat puolestaan muodostavat ryhmän, joka pitää sisällään päivittyvää tietoa.
Ne piirretään näytölle ruutua luotaessa, mutta niitä on palattava aika-ajoin päivit
tämään jotta tieto pysyisi ajan tasalla. Nämä voidaan esittää esimerkiksi järjestyk
sessä numeroituina koodeina, joista koodin perusteella käyttöliittymäohjelma tietää minkä muuttujan sen pitää tulostaa näytölle.
Kontrollointi-informaatio puolestaan tiivistyy ryhmäksi, joka on jonkinlaista eri
koistoimintaa vaativaa tietoa. Siinä missä teksti ja muuttujat luovat ruudulle sisäl
töä, kontrolli-informaatio määrittää miten, missä ja minkä näköisenä sisältö näkyy
4.4 Kontrollikoodien sisällyttäminen merkkijonoihin 25 näytöllä. Myös kontrolli-informaatio voidaan muuttujien tavoin määritellä nume
rokoodeiksi, joista tietyn koodin perusteella käyttöliittymäohjelma osaa suorittaa tietyn operaation.
Tällaiset kontrolli-ja muuttujakoodit voitaisiin esimerkiksi taulukoida muistiin me
nujen tekstikuvausten yhteyteen monellakin eri tavalla. Yksi ratkaisu voisi olla tau
lukoida koodit erikseen merkkijonoista. Tällaisessa ratkaisussa tekstikuvauksen vä
lissä merkittäisiin koodien paikat tietyin erityismerkein, esimerkiksi “Input volta
ge % %V %V %V”. Tämän lisäksi olisi taulukko, jossa varsinaiset koodien arvot sijaitsisivat. Ratkaisun ongelmana olisi ainakin se, että taulukko jossa koodit ovat hukkaisi huomattavasti muistia. C-kielessä taulukon jokaisen rivin leveys on vakio, joten muodostuvan taulukon koko olisi määriteltävä eniten erikoiskoodeja sisältä
vän menuruudun mukaan.
Toinen tapa ratkaista asia on koodata kaikki tieto saman merkkijonon sisään. Täl
lainen tapa ei kuluta samalla tavalla hukkatilaa muistista, sillä C-kielessä merkkijo
nojen taulukko talletetaan osoittimina jolloin jokaisen merkkijonon pituus voi olla yksilöllinen. Jos kaikki tieto on sisällytettynä samoihin merkkijonoihin, ei tilaa kulu erillisiin taulukoihin.
4.4 Kontrollikoodien sisällyttäminen merkkij onoihin
Merkkijonot päätettiin koodata siten, että merkistön alusta varataan muutama ar
vo (0x01-0x03) erikoistarkoitukseen. Näiden erikoismerkkien avulla saadaan luotua erinäisiä koodisarjoja, joihin erikoisinformaatio sisällytetään. Merkkijonoa tulkites
sa erikoismerkki voidaan tunnistaa, jolloin sitä seuraavan tai seuraavien merkkien perusteella suoritetaan koodin määräämiä toimintoja.
Käytetyt yhdistelmät koodien luomisessa on eriteltynä taulukossa 4.1. Merkit 0x01 sekä 0x02 varattiin kontrollikoodien sekä muuttujakoodien alun tunnistamiseen ja erottamiseen toisistaan. Muuttuja- tai kontrollikoodiksi tulkitaan näitä erotinmerk
kejä seuraava merkki. Tämä mahdollistaa 255 erilaista koodia kumpaankin tarkoi
tukseen, jonka todettiin riittävän hyvin. Näiden lisäksi käytetyn erikoismerkin 0x03 merkitys on erotella kontrollikoodien mahdolliset parametrit toisistaan.
Menukuvausmerkkijonoon toteutettiin myös mahdollisuus sisällyttää muuttuvaa si
sältöä dynaamisten merkkijonomuuttujien muodossa. Tällä tarkoitetaan
käytännös-4.4 Kontrollikoodien sisällyttäminen merkkijonoihin 26 sä merkkijonoja, joista yksi kerrallaan voidaan esittää tietyn muuttujakoodin pai
kalla. Tällaista tarvitaan esimerkiksi menuruuduissa joissa asetetaan laitteen para
metrejä. Eri vaihtoehtoja kuvaavat merkkijonot kuten “välittömästi"/1’viiveellä’T’ei ikinä” voidaan sisällyttää ruudun kuvaukseen. Näiden erottamiseen itse menuruu- dun kuvauksesta valittiin erikoismerkki 0x04.
koodi merkitys
0x01 OxYY Kontrollikoodi YY
0x01 OxYY <par> 0x03 Kontrollikoodi YY + yksi parametri (<par> on ASCII-koodattu lukuarvo) 0x01 OxYY <par> 0x03 <par2> 0x03 Kontrollikoodi YY + kaksi parametria
(<par> ja <par2> ASCII-koodattuja lukuarvoja)
0x02 OxZZ muuttujakoodi ZZ
0x04 <str> merkkijonomuuttuj a
(<str> on merkkijono)
Taulukko 4.1: Merkkijonoon koodattavat erikoiskoodisarjat
Kuvassa 4.3 on havainnollistettuna menukuvausmerkkijonon rakennetta. Kuvasta käy ilmi miten muuttuja- sekä kontrollikoodit sijoittuvat merkkijonon keskelle. Ku
van merkkijonoon on sisällytetty myös dynaamisia merkkijonomuuttujia, jotka nä
kyvät kuvauksen loppupäässä.
kontrollikoodi dynaamisia merkkijonomuuttujia
Z \ I I I \
muuttujaksi dynaamisen merkkijonon
erotin 0x04
Kuva 4.3: Menukuvausmerkkijonon rakenne
UPS-laitteen muistissa koodit siis kuvataan taulukon 4.1 kuvaamalla tavalla, mutta tämä esitys ei ole käytännöllinen menukuvauksia kirjoitettaessa koska pelkät nu
merot eivät ilman erillisen listan avulla tulkitsemista kerro tarkoitustaan. Tähän ongelmaan kuitenkin C-kielen esikääntäjä tarjoaa ratkaisun. Esikääntäjän #define -määrettä käyttäen voidaan koodeille kirjoittaa selväkieliset vastineet, joiden käyt
täminen on ihmiselle vaivattomampaa.
Taulukossa 4.2 on esitettynä muutamia esimerkkejä määritellyistä kontrolli- ja
4.4 Kontrollikoodien sisällyttäminen merkkijonoihin 27 muuttujakoodeista. Näiden esimerkkien C-kielinen toteutus on nähtävissä liitteestä A.
koodi selväkielellä toiminto
_CTR_FONT_DOUBLEH Kaksinkertainen merkkien korkeus _CTR_FONT_N ORM AL Normaalikokoiset merkit
_CTR_GOTOY (y) Kursorin siirto haluttuun y-koordinaattiin _CTR_GOTOX(y) Kursorin siirto haluttuun x-koordinaattiin _CTR_GOTOXY(x, y) Kursorin siirto haluttuun (x, y) -koordinaattiin _CTR_GOTOXY_REL(x, y) Kursorin siirto haluttuun (x, y) -koordinaattiin
suhteessa tämänhetkiseen sijaintiin CTR NEWLINE Siirtää kursorin uuden rivin alkuun _VAR_IN_VOLT_X Sisääntulojännite, vaihe X (1-3) _VAR_IN_CURR_X Sisääntulovirta, vaihe X (1-3) _VAR_OUT_VOLT_X Lähtöjännite, vaihe X (1-3) _VAR_OUT_CURR_X Lähtövirta, vaihe X (1-3)
Taulukko 4.2: Esimerkkejä määritellyistä kontrolli- ja muuttujakoodeista selväkie
lellä
Kuvassa 4.4 vielä esimerkkinä menukuvaus, joka tulostaa yläriville tekstin “Input Voltage” ja seuraavalle riville tuplakorkuisella fontilla kolmen vaiheen sisääntulo- jännitteet. Lopuksi esimerkki tulostaa vielä “V” -kirjaimet ilmaisemaan jännitettä jokaisen muuttujan perään oikealle korkeudelle normaalikokoisella fontilla. Tulos näytöllä on esitettynä kuvassa 4.5.
"Input voltage" _CTR_NEWLINE
_CTR_FONT_DOUBLEH _VAR_IN_VOLT_l "
_VAR_IN_VOLT_2 "
_VAR_IN_VOLT_3
_CTR_FONT_NORMAL _CTR_GOTOXY_REL(-4,7) "V"
_CTR_GOTOX(18) "V"
_CTR_GOTOX(48) "V"
Kuva 4.4: menukuvausesimerkki
4.5 Kielen mukaan muuttuvat osat 28
Input
voltage-230U 22% voltage-230U
Kuva 4.5: esimerkin menukuvauksen tulos näytöllä
4.5 Kielen mukaan muuttuvat osat
Jotta käyttöliittymäohjelma osaisi esittää käytössä olevan kielen mukaisesti muuttu
vat asiat oikein, täytyy sen tietää mistä aina kulloinkin käytössä olevaan kieleen liit
tyvät olennaiset tiedot löytyvät. Tätä tarkoitusta palvelee varmasti parhaiten tauluk- kotyyppinen ratkaisu, jossa kootaan yhteen kunkin kielen mukaan muuttuvat asiat.
Seuraavassa listassa on kuvailtuna toteutukseen sisällytetyt kielen mukaan muuttu
vat osat.
Kielen nimi alkuperäiskielellä, joka voidaan esittää menuruudussa jossa kieltä va
litaan.
Menukuvaukset jotka kertovat edellä kuvaillun mukaisesti menuruudun ulkonäön, elementtien sijoittelun sekä sisällön eri kielillä.
Hälytystekstit muuttuvat myös kielen mukaan, nämä sisältävät itse hälytyksiä ku
vaavien merkkijonojen lisäksi eri hälytystasoja kuvaavat merkkijonot.
Merkistö kertoo mitä LCD-näytön sisältämää merkistöä käytetään kielen esittämi
seen oletusarvoisesti. Tämä sisältää myös tiedon merkkien peruskoosta pikse- leinä, joka vaikuttaa siihen kuinka paljon näytöltä on varattava eri elementeil
le tilaa. Merkistöä voidaan tarpeen mukaan kuitenkin vaihtaa kontrollikoodin avulla, jos jokin menun sisältämä asia sitä vaatii.
Muotoilutiedot sisältävät tiedot lukuarvojen esittämisestä. Tähän sisällytettiin tie
dot välimerkeistä, joita käytetään kun kyseisellä kielellä tulostetaan desimaa
lilukuja, kellonaikoja tai päivämääriä. Päivämääristä mukaan otettiin myös järjestys, jossa vuosi, päivämäärä sekä kuukausi esitetään.
4.6 Lisätoiminnallisuus ja tapahtumiin reagointi 29
4.6 Lisätoiminnallisuus ja tapahtumiin reagointi
Edellä luvuissa 4.2 ja 4.3 kuvatulla tavalla saadaan aikaan käyttöliittymän rakenne ja luotua menuruuduille ulkonäköjä sisältö. Menuruudut, jotka sisältävät vain esi
merkiksi alimenun nimen tai mittausdataa eivät muuta tarvitsekaan esittämiseensä.
Tarvitaan kuitenkin menuruutuja jotka sisältävät myös muunlaista toiminnallisuut
ta, tarpeen on siis keino tällaisen lisätoiminnallisuuden esittämiseen ja luomiseen.
4.6.1 Toimintofunktiot
Tällainen vaatimus saadaan toteutettua menuruutukohtaisia funktioita käyttäen. Li- sätoiminnallisuutta varten kirjoitetaan funktio, jossa toiminnallisuus toteutetaan. C- kieleltä käytettäessä voidaan tässä hyödyntää funktio-osoittimia. Ne ovat nimen
sä mukaisesti osoittimia funktioihin, jotka tässä tapauksessa päätettiin taulukoida samaan taulukkoon menun rakenteen (luku 4.2) kuvauksen kanssa. Kun menuihin liittyvä informaatio koottua samaan paikkaan, on siihen helpompi päästä käsiksi käyttöliittymää muokattaessa.
Funktio-osoittimet mahdollistavan myös sen, että jos useassa menuissa tarvittava lisätoiminnallisuus on samanlaista, voidaan samaa Toimintofunktiota käyttää niis
sä kaikissa monistamalla pelkkä funktio-osoitin eikä koko funktiota. Niiden menu- ruutujen kohdalle, jotka eivät lisätoimintoja tarvitse, voidaan tämä funktio-osoitin jättää tyhjäksi.
4.6.2 Tapahtumat
Jotta Toimintofunktiot olisivat käyttökelpoisia, on käyttöliittymäohjelmasta käsin kutsuttava oikean menuruudun funktiota tarpeeksi usein. Tämä voidaan toteuttaa yksinkertaisimmillaan siten että funktiota kutsutaan vain tasaisin väliajoin. Tämä tarkoittaisi käytännössä sitä että olisi toimintofunktion vastuulla selvittää onko jokin tärkeä tapahtuma tapahtunut lähi aikoina (kuten nappulan painallus) ja että onko siihen jotenkin reagoitava.
Tietyt toiminnot halutaan kuitenkin yleensä suorittaa vasteena tiettyyn tapahtu
maan. Tämä johtaa toteutusmalliin, jossa käyttöliittymäohjelmasta kutsutaan me- nuruutun tapahtumafunktiota vain tiettyjen määriteltyjen tapahtumien
aktivoitues-4.7 Käyttöliittymäohjelmaan toteutettuja toimintoja 30 sa. Tapahtumafunktiolle voidaan antaa parametrinä tieto kyseisen tapahtuman laa
dusta, jolloin tapahtumafunktion tarvitsee vain sen perusteella valita oikea toimin
to tai toimintosarja. C-kielen keinoin tämä voidaan tehdä "switch-case-rakenteella joka on myös jälkikäteen selkeälukuinen kun vasteet tapahtumiin saadaan omien
otsikkojensa alle. Tapahtuman kulkua on havainnollistettu kuvassa 4.6.
(2)
Kuva 4.6: Toimintofunktion ja käyttöliittymämoottorin interaktio
4.7 Käyttöliittymäohjelmaan toteutettuja toimintoja
Käyttöliittymän korkeimman tason toteutuksesta haluttiin sellainen että se olisi mahdollisimman selkeä kuvaus käyttöliittymän ulkonäöstä sekä toiminnasta. Täl
löin myös toimintofunktioista haluttiin mahdollisimman selkeitä kuvauksia, jotka olisi helppo toteuttaa sekä ymmärtää jälkikäteen.
Esimerkiksi UPS-laitteen toimitilan esittämistä varten täytyy käyttöliittymän saa
da kyseinen tieto jostain. Käytännössä toimitilan päättelemiseksi täytyy vertailla monen osakokonaisuuden toimitilaa, joista riippuen laite on esimerkiksi normaa
litoiminnassa tai akustosyötöllä. Itse käyttöliittymän selkeämpää toteutusta varten tähän tarkoitukseen ohjelmoitiin erillinen funktio, joka selvittää laitteen toimitilan ja kertoo sen yksiselitteisesti. Vastaavasti toteutettiin muita funktioita toimimaan
rajapintana muuhun laiteohjelmistoon.
Erilaisten asioiden esittämisen helpottamiseksi luotiin joukko epäsuoria osoittimi- na toimivia muuttujia. Nämä ovat muuttujia, jotka viittaavat tiettyihin listamaisiin tietoihin laitteen sisällä, ja mahdollistavat näiden tietojen esittämisen ja selaamisen näytöllä. Osoitinten ominaisuuksiin kuuluu että niiden arvo voidaan asettaa nollaan ja tapauskohtaisen maksimin välille. Osoittimen osoittama tieto puolestaan tuloste
taan siihen liittyvän muuttujakoodin (luku 4.3) paikalle näytöllä.
4.7 Käyttöliittymäohjelmaan toteutettuja toimintoja 31 Kuvatunlaista osoitinta käytettiin ratkaisuna esimerkiksi tapahtumaloki:n sekä ak
tiivisten hälytysten esittämisessä. Osoittimen toimintaa on havainnollistettu kuvassa 4.7. Esimerkissä indeksi osoittaa arvonsa mukaisesti hälytystä aktiivisten hälytysten joukosta. Nappulan painalluksen seurauksena indeksi siirtyy osoittamaan seuraavaa aktiivista hälytystä, jolloin osoittimen osoittama hälytys tulostuu käyttöliittymäoh
jelman toimesta ruudulle muuttujakoodin paikalle.
aktiiviset mahdolliset hälytykset
Kuva 4.7: esimerkki, indeksien käyttö osoittimina
Kuvatunlaiset osoittimet auttavat yksinkertaistamaan käyttöliittymän toteutusta kun lähes kaikki käsittely on toteutettuna jo käyttöliittymäohjelman puolesta. Toiminto- funktion tarvitsee lähinnä muuttaa tarpeen tullen osoittimen arvoa, ja sen osoittama tieto näytöllä päivittyy automaattisesti.
Käyttöliittymän toteutuksessa havaittiin monin paikoin tarpeelliseksi toiminto, jo
ka kahta keskimmäistä painiketta käyttäen selataan asioita näytöllä. Koska myös rajapinta käyttöliittymän toteutuksen ja käyttöliittymäohjelman välille toteutettiin perustumaan yksinkertaisin lukuarvoin, näkyy tämä käytännön ohjelmassa jonkin muuttujan arvon kasvattamisena tai vähentämisenä yhdellä arvolla kerrallaan.
Tällainen toiminnallisuus toteutettiin käyttöliittymäohjelmaan c-kielen tarjoaman muuttujaosoitinta apuna käyttäen. Muuttujaosoittimen avulla voidaan toimintofunk- tiosta käsin osoittaa jotain haluttua muuttujaa ja asettaa sille minimi- sekä maksi
4.8 Käyttöliittymäohjelman perustoiminta 32 miarvot. Tämän jälkeen käyttöliittymäohjelma huolehtii muuttujan arvon kasvatta
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ä
mukset mitoitettiin siten, että tilaa on automaattisen päättelyn jäljiltä ainakin riittä