• Ei tuloksia

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