2.5 Näyttökortti
2.5.5 Aikavalvonta
Käyttöliittymäkortti valvoo normaalitoiminnassa CAN-väylän toimintaa. Jos väy
lältä ei tule komentoja muutaman sekunnin kuluessa, aikavalvonta asettaa kortin katkotilaan josta se tietyn ajan kuluttua ilmoittaa kirjoittamalla ruudulle viestin.
Katkotilassa ollessaan kortti myös yrittää lähettää CAN-väylälle tiettyä viestiä, jo
hon vastaamalla kortti saadaan herätettyä takaisin normaalitoimintaan.
Luku 3
Taustatietoja toteutukselle
3.1 Laiteohjelmistot UPS-laitteissa
UPS-laitteita ohjaavien mikroprosessoreiden laiteohjelmistot (firmware) on aiem
min yleisesti kirjoitettu symbolista konekieltä (assembly) käyttäen. Symbolista ko
nekieltä tarvitaan edelleen varsinkin aikakriittisten ohjelman osien tekemiseen, mut
ta prosessoritehojen, muistin määrän ja laitteiden ohjelmien monimutkaisuuden kasvaessa tästä työläästä tavasta ohjelmoida ollaan siirtymässä yhä enemmän kor
keamman tason ohjelmointikieliin.
3.1.1 C-ohjelmointikieli
Parhaiten jalansijaa laiteohjelmistojen kirjoittamiseen on pikkuhiljaa saavuttanut ohjelmointikielistä C-kieli. C-kieli on riittävän matalan tason kieli tason kieli laitteistoajureiden- ja ohjelmistojen kirjoittamiseen. Samalla se on myös riittävän korkean tason kieli vielä esimerkiksi käyttöliittymäkirjastojen kirjoittamiseen. C- kieli ei ole kovinkaan laaja kieli eikä ole erikoistunut millekään tietylle alueelle, sen yleispätevyys ja turhien rajoitusten puute tekeekin siitä hyvin yleiskäyttöisen moniin tehtäviin.
C-ohjelmointikielen esittelivät alunperin vuonna 1978 herrat Kernighan ja Ritc
hie kirjassaan C Programming Language [12]. Joitain vuosia myöhemmin ANSI (American National Standards Institute) otti toimekseen kehittää kieltä laitteistosta riippumattomampaan ja vähemmän monitulkintaiseen suuntaanpa lopputuloksena
3.2 Kielet ja käyttöliittymä 18 C-ohjelmointikieli on standardoitiin vuonna 1990 (ANSI/ISO 9899-1990). Tämän standardin mukaisesta C-kielestä käytetään nimitystä ANSI-C.
C-kielisen ohjelman kääntäminen ajettavaan muotoon koostuu kolmesta päävai
heesta. Ensimmäisessä vaiheessa lähdekooditiedostot esikäännetään. Esikääntäjä mahdollistaa muun muassa erilaisten makrojen ja vakioiden korvaamisen varsinai
sella ohjelmakoodilla. Toisessa vaiheessa esikäännetty C-kielinen ohjelma käänne
tään tiedosto tiedostolta varsinaisella C-ohjelmakääntäjällä, jolloin tuloksena saa
daan joukko objektitiedostoja. Nämä sisältävät ohjelman konekielisessä, mutta va
paasti muistiin sijoiteltavassa muodossa. Viimeisessä vaiheessa objektit kootaan varsinaiseksi ohjelmaksi. Tämä vaiheen suorittaa niin kutsuttu linkitysohjelma, joka nimensä mukaisesti linkittää viittaukset objektien välillä yhteen ja kokoaa ohjelman lopulliseen suoritettavaan muotoonsa.
3.2 Kielet ja käyttöliittymä
Käyttöliittymässä esiintyvien tekstin kääntäminen on yksi osa käyttöliittymän kään
tämistä vieraalle kielelle. Kokonaisuudessaan tehtävä ei kuitenkaan rajoitu siihen, vaan on kuitenkin myös monia huomioonotettavia seikkoja joista useat on otettava huomioon jo käyttöliittymää suunniteltaessa.
Yksi asia mikä helposti saattaa aiheuttaa ongelmia kielten esittämisessä oikein, on erilainen sanajärjestys. Esimerkiksi lause, joka toisessa kielessä esitetään muodos
sa “suorita toiminto %A laitteelle %B” voi toisessa kielessä olla luontevin esittää muodossa “laitteelle %B suorita toiminto %A”. Sanajärjestyksen lisäksi myös se, että toisissa kielissä sanat taipuvat ja toisissa eivät juuri ollenkaan voi vaikuttaa jon
kin asian suunnittelussa.
Kaikki kielet eivät myöskään käytä yleisesti esimerkiksi välejä sanoja erottamas
sa, näin on ainakin kiinan kielen [14] tapauksessa. Sanat muodostuvat yhdestä tai useammasta kirjoitusmerkistä, ja niiden vääränlainen ryhmitteleminen aiheut
taa yleensä lauseen merkityksen muuttumisen. Esimerkiksi lause ABCDEFG, jossa jokainen kirjain vastaa yhtä kiinalaista kirjoitusmerkkiä, voi tarkoittaa jotain jos se ryhmitellään AB C DE FG, mutta väärä ryhmittely kuten AB CD E FG voi johtaa lauseen merkityksen muuttumiseen tai tehdä lauseesta merkityksettömän.
Myös sanojen pituus on hyvin erilainen eri kielissä, toisella kielellä esitettynä tietty
3.2 Kielet ja käyttöliittymä 19 asia voi viedä huomattavastikin enemmän tilaa. Yleisenä ohjeena onkin jättää n. 30 prosenttia [13] väljää erikielisten käännösten varalle.
Yksi huomioonotettava asia on käytettyjen fonttien näytöltä vaatima tila. Esimer
kiksi ASCII-merkistöä käytettäessä merkit saadaan helposti mahtumaan jopa vii
den pikselin korkuiseen tilaan luettavuuden vielä kärsimättä. Samaan tilaan on kui
tenkin hyvin vaikeaa mahduttaa jo useissa Eurooppalaisissa kielissä käytettäviä eri
koismerkkejä, puhumattakaan kiinalaisista kirjoitusmerkeistä jotka vaativat vähin
tään noin 10-12 pikselin tilan korkeussuunnassa.
Eri kielissä on myös eroja esimerkiksi lukuarvojen ja kellonaikojen esittämisessä.
Lukuarvojen desimaalipilkku voi kielestä riippuen olla ainakin piste tai pilkku. Kel
lonaikojen ja varsinkin päivämäärän esittämisessä puolestaan on vieläkin enemmän erilaisia merkintätapoja eri kielten välillä. Kellonajat voivat olla 12 tai 24 tunnin muodossa, päivämäärissä puolestaan vaihtuvat usein vähintäänkin lukujen järjestys sekä välimerkit. Nämä voivat olla pieniltä vaikuttavia yksityiskohtia, mutta todelli
suudessa voivat kuitenkin aiheuttaa ainakin sekaannusta laitetta käytettäessä.
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
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