Elektrotehniški vestnik 78(1-2): 36-41, 2011 Existing separate English edition Merjenje časa na športnih tekmovanjih z domensko specifičnim jezikom EasyTime Iztok Fister ml., Iztok Fister Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Smetanova 17, 2000 Maribor, Slovenija E-počta: iztok.fister@uni-mb.si Povzetek. Danes si spremljanje rezultatov na športnih tekmovanjih brez elektronskega merjenja časa tezko predstavljamo. Večina elektronskih merilnih naprav temelji na tehnologiji RFID, ki postaja čedalje cenejša in dostopnejša vse širšemu krogu uporabnikov. Za učinkovito delo pa te zahtevajo zmogljiv računalniški sistem, ki omogoča sprotno obdelavo dogodkov, ki nastajajo na merilnih napravah, dekodiranje rezultatov, njihov zapis v podatkovno bazo, sortiranje tekmovalcev glede na dosezeni rezultat in izpis liste rezultatov. V članku razvijemo domensko spečifični jezik EasyTime, ki omogoča merjenje več kontrolnih točk, na katerih zelijo organizatorji spremljati vmesne rezultate, na eni sami merilni napravi in s tem zmanjšanje števila potrebnih merilnih naprav. Jezik je univerzalen, saj gaje mogoče uporabiti pri merjenju različnih športnih tekmovanj. Ključne besede: domensko spečifični jeziki, sintaktični analizator, notačija BNF, generator kode, merjenje časa, tehnologija RFID Measuring Time in Sporting Competitions with the Domain-Specific Language EasyTime Measuring time in mass sporting competitions is unthinkable manually today because of their long duration and unreliability. Besides, automatic timing devices based on the RFID technology have become cheaper. However, these devices cannot operate stand-alone. To work eficiently, they need a computer timing system for monitoring results. Such system should be capable of processing the incoming events, encoding and assigning results to a individual competitor, sorting results according to the achieved time and printing them. In this paper, a domain-specific language named EasyTime will be deffined. It enables controlling an agent by writing events to a database. Using the agent, the number of measuring devices can be reduced. Also, EasyTime is of a universal type that can be applied to many diferent sporting competitions. 1 UVOD Ni še dalec cas, ko so rezultate na športnih prireditvah merili casomerilci, ki so cas merili rocno. Cas, ki ga je pokazala štoparica, so povezali s startno številko tekmovalcev in te razvrstili glede na dosežen rezultat in kategorijo. Z nastankom tehnologije RFID (angl. Radio Frequency Identification) se je merilna tehnologija pocenila (ChampionChip [7], RFID Race Timing Systems [8]) in postala dostopna tudi širšemu krogu uporabnikov (npr. športnim društvom, prirediteljem športnih tekmovanj ipd.), ki so tako postali konkurenca monopolnim podjetjem (Timing Ljubljana [9]) pri spremljanju rezultatov na manjših športnih tekmovanjih. Za spremljanje rezultatov na športnih tekmovanjih poleg merilne tehnologije potrebujemo fleksibilen račšunalnisški sistem, ki omogočša spremljanje različšnih sšportnih tekmovanj s poljubnim sštevilom merilnih naprav in merilnih mest, sprotno belezenje časov, izpis rezultatov, zanesljivost in varnost. Fleksibilnost sistema lahko povečamo z uporabo domensko spečifičnega jezika (angl. Domain Spečifič Language, krajše DSL) EasyTime. Domensko spečifični jeziki [1] so prikrojeni aplika-čijski domeni in imajo določene prednosti pred splošno namenskimi jeziki v spečifičšni domeni. Te prednosti se kazejo predvsem v večji izrazni moči in s tem večji produktivnosti, lazji uporabi (tudi za domenske strokovnjake, ki niso programerji), preprostejši verifikačiji in optimizačiji. Domensko spečifičšni jezik EasyTime uporabljamo pri konfiguračiji agentov, ki skrbijo za zapis dogodka z merilnih naprav v podatkovno bazo. Agenti so tako ključni elementi merilnega sistema. Z njihovo ustrezno konfiguračijo lahko zmanjšamo število potrebnih merilnih naprav. Struktura članka v nadaljevanju je naslednja: v drugem poglavju opisujemo probleme, s katerimi se soočamo pri merjenju časa na športnih tekmovanjih. Pri tem se osredinimo predvsem na triatlonska tekmovanja, ki so zaradi merjenja časa kar treh panog in njihovih dolzšin za obvladovanje najtezšja. V tretjem poglavju predstavimo DSL EasyTime. V četrtem poglavju opisujemo delovanje programa, napisanega v DSL EasyTime. Clanek končamo s kratko analizo opravljenega dela in pogledom v prihodnost. 2 Merjenje casa na športnih TEKMOVANJIH V praksi lahko merimo čas na športnih tekmovanjih ročno (klasična ali računalniška stoparica) ali avtomatsko (merilna naprava). Računalniška štoparica je računalniški program, ki se po navadi izvaja na delovni postaji (prenosni računalnik) in meri realni čas. Pri tem izkorisščša pročesorski takt, t. j. hitrost, s katero pročesor izvaja računalniške instrukčije. Računalniška štopariča omogoča beleZenje dogodkov, t. j. prehodov tekmovalča prek merilnih mest (krajše MM), podobno kot merilna naprava, vendar v tem primeru sprozši dogodek operater na računalniku s pritiskom na ustrezen gumb. Operater generira dogodke v obliki trojk (#, MM, CAS}, kjer # označuje startno številko tekmovalča, MM merilno mesto, na katerem je dogodek nastal, in CAS čšasovni zig (angl. Timestamp), ki ga je zabelezil računalnik v trenutku nastanka dogodka in pomeni sštevilo sekund od 1.1.1970 ob času 0:0:0. Merilne naprave danes po navadi temeljijo na tehnologiji RFID [2], pri kateri izvajamo identifičiranje s pomočjo elektromagnetnega valovanja na področju radijskih frekvenč in sestojijo iz naslednjih elementov: • čitalča oznak RFID, • primarnega pomnilnika, • zaslona LCD in • numerične tipkovniče. Na napravo lahko priključimo več antenskih polj, ki predstavljajo posamezna merilna mesta. Tekmovalči generirajo dogodke pri prehodu prek antenskega polja s pomočjo pasivnih oznak RFID, ki hranijo identifikačij-sko številko tekmovalča. Ta je unikatna in se razlikuje od sštartne sštevilke. Dogodek z merilne naprave predstavimo s četvercem oblike (#, RFID, MM, CAS}, kjer je ze omenjeni trojki dodana identifikačijska sštevilka oznake RFID. Natančšnost odčšitka merilne naprave RFID je po navadi 1/10 sekunde, kar ustreza zahtevam sodniških organizačij. Merilne naprave in delovne postaje z namesščšeno račšunalnisško sštoparičo, ki so v merilnem sistemu merilna mesta, lahko priključimo na lokalno omrezje in z njimi komuničiramo prek nadzornega programa (agenta), ki teče na strezniku s podatkovno bazo. Ta se z merilno napravo poveze prek ustreznih vtičnič TCP/IP (angl. sočket) z določenim protokolom. Po navadi merilne naprave podpirajo protokol Telnet, ki je za implementa-čijo zelo preprost in omogoča komunikačijo v tekstovni obliki. Agent komuničira z ročno štoparičo prek prenosa datotek. 2.1 Primer: merjenje časa na triatlonih Poseben pristop zahtevajo triatlonska tekmovanja, kjer imamo na enem tekmovanju opravka s tremi panogami, zato se temu problemu v čšlanku tudi podrobneje po-svečšamo. Triatlonsko tekmovanje so prvič izvedli v ZDA leta 1975. To tekmovanje je danes Ze olimpijska panoga, pri kateri tekmovalci najprej plavajo, nato kolesarijo in nazadnje se tečejo. Vse aktivnosti potekajo brez prekinitve, v skupni čas pa se štejeta tudi časa obeh menjav, t. j. ko tekmovalec preide iz vode na kolo in nato še s kolesa na tek. Triatlonskih tekmovanj je več vrst, ki se med seboj razlikujejo po dolzini posameznih prog. Zaradi preprostejše organizačije prireditelji namesto daljših prog uporabljajo raje krozne proge krajših dolzin. S tem pa povečujejo zahtevnost merjenja. Merjenje časa na triatlonskih tekmovanjih delimo v devet kontrolnih točk (slika 1). Kontrolne točke so lokačije na tekmovalni progi, kjer zeli organizator zasledovati izmerjeni čas. Ta je lahko vmesni ali končni. Na sliki 1 imamo opravka s progo za dvojni triatlon (7,6 kilometra plavanja, 360 kilometrov kolesarjenja in 84,4 kilometra teka), kjer je proga za plavanje dolga 380 metrov (20 krogov), proga za kolesarjenje 3,4 kilometra (105 krogov) in proga za tek 1,5 kilometra (55 krogov). Skupni čas triatlonskega tekmovanja je sestavljen iz petih končnih (čas plavanja SWIM (KT2), čas prve menjave TA1 (KT3), čas kolesarjenja BIKE (KT5), čas druge menjave TA2 (KT6) in čas teka RUN (KT8)) in treh vmesnih časov (vmesni čas plavanja (KT1), vmesni čas kolesarjenja (KT4) in vmesni čas teka (KT7)). Pri vmesnih časih merimo tako število krogov ROUND_x kot tudi dosezeni rezultat INTER_x, kjer x = 1... 3 označuje posamezno panogo. Vzemimo, da imamo za merjenje tekmovanja, prikazanega na sliki 1, na voljo merilno napravo z dvema merilnima mestoma (MM3 in MM4), in da tekma poteka na eni lokačiji. V tem primeru lahko zadnji prehod čez MM3 pomeni čas KT5, prvi prehod čez MM4 čas KT6 in zadnji prehod čez MM4 končni dosezek (KT8). Merilni mesti MM1 in MM2 pomenita ročno merjenje časa. S pravilno postavljenimi kontrolnimi točkami in merilnim sistemom lahko število merilnih mest zmanjšamo za tri. Z eno merilno napravo tako izmerimo 162 dogodkov na tekmovalča (oz. 87,6%). Če temu dodamo še, da je merilna tehnologija za merjenje plavanja v jezerih oz. morju še zelo draga in zato plavanje najpogosteje merijo sodniki ročno, lahko na omenjeni tekmi avtomatsko izmerimo kar 98 odstotkov vseh dogodkov. 3 DSL EASYTIME Z DSL EasyTime zelimo opisati različna merjenja, ki jih izvajamo z merilnim sistemom, pri kompleksnejših merjenjih pa z manj merilnimi mesti pokriti več kontrolnih točšk. DSL EasyTime omogočša opisovanje pravil za krmiljenje agenta pred zapisom dogodka, ki prihaja z merilnih mest, v podatkovno bazo. Vsak program, zapisan v tem domensko spečifičnem jeziku, je treba pred izvajanjem najprej prevesti. Prevajanje je sestavljeno iz dveh faz: • sintaktične analize in Slika 1: Definicija kontrolnih tock pri triatlonu • generiranja kode. Sintaktično analizo izvaja sintaktični analizator (raz-poznavalnik), ki program, zapisan v DSL EasyTime, prevede v vmesno kodo. Iz vmesne kode generator kode generira izvajalno kodo za navidezni računalnik in jo shrani v podatkovno bazo. Ker generirana koda predstavlja pravila za krmiljenje agenta, imenujemo tabelo, v katero shranimo izvajalni program, tudi tabelo pravil (angl. Rules). V nadaljevanju predstavljamo značilnosti sintaktičnega analizatorja in generatorja kode podrobneje. 3.1 Sintaktični analizator Pred razvojem sintaktičnega analizatorja je treba definirati sintakso domensko spečifičnega jezika, t. j. mnozičo pravil, s katerimi definiramo strukturo pravilnih stavkov (gramatika), ki sestavljajo program v DSL EasyTime [6]. Sintakso DSL EasyTime predstavljamo v sintaktičnih diagramih na sliki 2, ki so najprimernejša oblika za pisanje sintaktičnih analizatorjev. Sintaktični diagrami so izrazno enako močni kot BNF (angl. Bačkus Naur Form) [4], t. j. notačijska tehnika za kontekstno neodvisne gramatike. Sintaktičšni analizator smo razvili v programskem jeziku C/C++ [3]. Tabela 1: Imena spremenljivk v tabeli RESULTS Spremenljivka Opis ROUND_1 Število krogov pri plavanju INTER 1 Vmesni čas 1 (KT1) SWIM Končni čas plavanja (KT2) TRANS_1 Cas prve menjave (KT3) ROUND 2 Stevilo krogov pri kolesarjenju INTER_2 Vmesni čas 2 (KT4) BIKE Končni čas kolesarjenja (KT5) TRANS_2 Cas druge menjave (KT6) ROUND 3 Stevilo krogov pri teku INTER_3 Vmesni čas 3 (KT7) RUN Končni čas triatlona (KT8) Program v DSL EasyTime je sestavljen iz definičij: • agentov, • spremenljivk in • merilnih mest. Agente opisujemo s stavčnim konstruktom Agenti prikazanim v istoimenskem sintaktičšnem diagramu. Spremenljivke, s katerimi označujemo imena kolon v podatkovni bazi (tabela RESU LTS) in pomenijo kontrolne točške na sliki 1, so prikazane v tabeli 1. Te morajo biti definirane pred uporabo v stavčšnem kon-struktu Merilna_mesta, s katerim definiramo pravila, ki veljajo na določenem merilnem mestu. Pravila so oblike (Predikat)::=(Operačija). V DSL EasyTime pred imena spremenljivk postavimo znak $. Primer definičije agentov v DSL EasyTime, s katerim opišemo merjenje na sliki 1, je prikazan v programu 1, kjer prvi agent shranjuje rezultate ročšnega merjenja v mapi /home/DC2 in drugi agent dobiva podatke od merilne naprave, z naslovom IP 192.168.225.100 prek protokola UDP in vrat 9999, avtomatsko. Program 1 Definicija agentov 1: AGENTS { 2: {1,MANUAL,"/home/DC2/res.ets"} 3: {2,AUTO,"192.168.225.100/UDP/9999"} } Program 2 Definicija merilnih mest 1: MM[1] ::= AGNT[1] { 2: { (TRUE) ::= UPD $SWIM } 3: { (TRUE) ::= DEC $ROUND_1 } } 4: MM[2] ::= AGNT[1] { 5: { (TRUE) ::= UPD $TRANS_1 } } 6: MM[3] ::= AGNT[2] { 7: { (TRUE) ::= UPD $INTER_2 } 8: { (TRUE) ::= DEC $ROUND_2 } 9: { (ROUND_2 == 0) ::= UPD $BIKE } } 10: MM[4] ::= AGNT[2] { 11: { (TRUE) ::= UPD $INTER_3 } 12: { (ROUND_3 == 55) ::= UPD $TRANS_2 }} 13: { (TRUE) ::= DEC $ROUND_3 } 14: { (ROUND_3 == 0) ::= UPD $RUN } } V DSL EasyTime določšimo pravila za merilna mesta s slike 1 z izvorno kodo, prikazano v programu 2. Vsako merilno mesto je označeno s svojo identifikačij- Slika 2: Sintaksa DSL EasyTime sko številko in povezano z ustreznim agentom. Pravila za merilno mesto 4 npr. določajo, da dogodek, ki prihaja z merilne naprave, najprej posodobi vmesni čas teka INTER_3. Če gre za prvi prehod tekmovalca prek merilnega mesta (predikat ROUND_3 == 55), posodobimo čas druge menjave T RAN S_2. Sledi zmanjšanje števila krogov teka (spremenljivka ROUND_3) za ena. Končšno agent v primeru, da je tekmovaleč v zadnjem krogu (predikat ROUNDJ3 == 0), razglasi končni rezultat, t. j. posodobi spremenljivko RUN, ki hkrati pomeni končni dosezek tekmovalca. 3.2 Generator kode Generiranje kode [5] se izvaja samo, če se je sin-taktičšna analiza končšala uspesšno. Pri neuspesšnem prevodu programa sintaktični analizator izpiše poročilo o napakah. Generator DSL EasyTime generira kodo za vsako merilno mesto posebej. Generirano programsko kodo shranimo v podatkovni bazi. Tudi generator smo razvili v programskem jeziku C/C++. Pred generiranjem kode moramo poznati arhitekturo pročesorja, za katerega generiramo kodo. Prevedeni program v DSL EasyTime izvajamo na navideznem računalniku (angl. Virtual Mačhine). V luči paraleli-začije pročesov (več nitenje) za vsako merilno mesto definiramo svoj navidezni računalnik. Arhitektura navideznega račšunalnika (slika 3) je zelo preprosta, saj sestoji iz programskega segmenta, sklada, podatkovnega segmenta, instrukčijskega števča, programskega in statusnega registra. V programski segment nalozšimo ge-nerirano kodo. Na skladu izvajamo aritmetičšno-logičšne operačije. Podatkovni segment vsebuje spremenljivke iz podatkovne baze. Instrukčijski sšteveč kazše na instrukčijo v programskem segmentu, ki jo trenutno interpretiramo. Podatkovni register (REG-A) je namenjen shranjevanju časovnega ziga dogodka, ki ga obdeluje agent. Statusni register (REG-S) določa status predikatov in je dvojiška vrednost (TRUE, če z==1 ali FALSE, če z==0). Programske instrukčije, ki jih nalozimo v programski Slika 3: Arhitektura navideznega računalnika segment navideznega računalnika, definiramo kot trojico (op,pl,p2), kjer op pomeni operacijsko kodo, pl in p2 pa parametra (spremenljivka ali konstanta). Nabor in-strukcij je sestavljen iz logičnih instrukcij (EQ in NEQ), operacij (UPD, DEC in STOP) in vejitvene instrukcije (JNZ). Logicne instrukcije vplivajo na nastavitev statusnega registra, ki krmili delovanje vejitvene instrukcije. Generator generira kodo iz podatkovnih struktur, ki jih zgradi sintakticni analizator. Dejansko kodo generira samo iz podatkovnih struktur, zgrajenih iz stavcnega konstrukta Merilna_mesta.. Imena spremenljivk, zbranih v tabeli, dolocajo njihove naslove v podatkovnem segmentu. Ti nastopajo v instrukcijah kot parametri, medtem ko je podatkovna struktura, zgrajena iz stavcnega konstrukta Agenti, namenjena konfiguraciji posameznih agentov pred izvajanjem. Primer generirane kode, zapisane v simbolicni obliki v programu 2, ki predpisuje pravila za agenta na merilnem mestu 3, prikazuje tabela 2. Tabela 2: Programska koda za merilno mesto 3 Pš OP.K. P1 P2 00 UPD 5 0 01 DEC 4 0 02 EQ 4 0 03 JNZ 5 0 04 UPD 6 0 05 STOP 0 0 Pri paketni obdelavi agent dogodke, zbrane v tekstovni datoteki, bere in zapisuje v ustrezno podatkovno bazo. Po navadi paketno obdelujemo dogodke, ki smo jih zajeli prek racunalniske stoparice. Pri tem nacinu delovanja agent vsako sekundo preverja, ali datoteka, ki smo jo konfigurirali v tabeli agentov, obstaja ali ne. Ce ta obstaja, zažene paketno obdelavo. Datoteko ob koncu obdelave najprej arhivira, potem pa zbrise. Sprotno obdelovanje je dogodkovno orientirano, t. j. vsak dogodek, ki ga possilja merilna naprava, agent obdela sproti. Izvajalno okolje, ki ga zgradi program v DSL EasyTime za spremljanje triatlonskega tekmovanja s slike 1, prikazuje slika 4. Iz primera lahko razberemo, da je generirana koda zelo optimizirana, saj iz treh vrstic izvorne kode dobimo sest vrstic izvajalne kode. Ker je vsaka instrukcija, ki jo zapisujemo v podatkovno bazo, dolga stiri bajte (operacijska koda, dva parametra in delimiter ";"), velikost prevedenega programa za podatkovno bazo ne pomeni nikakršnih tezav. 4 Delovanje agenta Agent, ki ga krmilimo s pomocjo DSL EasyTime, lahko obdeluje dogodke: • paketno: rocni nacin delovanja (MANUAL), • sprotno: avtomatski nacin delovanja (AUTO). Slika 4: Izvajalno okolje programa v DSL EasyTiming Pri obeh nacinih obdelave operira agent s tabelami: pravil (RULES), tekmovalcev (RUNNERS) in rezultatov (RESULTS). Ob zagonu agenta poteka inicia-lizacija navideznega racunalnika, ki zajema nalaganje programske kode iz tabele pravil v podatkovni bazi, kar pomeni, da se ta nalozi samo prvic. Socasno ini-cializiramo tudi vrednosti spremenljivk v podatkovnem segmentu. Zapisovanje dogodka, ki ga obdeluje agent, lahko razbijemo v naslednje faze: • rekonstrukcijo dogodka: tekmovalca identificiramo prek startne stevilke (#) oz. oznake RFID, merilno mesto (MM) doloca stevilko navideznega stroja, cas ((ČAS) pa je casovni zig dogodka, • branje rezultatov: iz tabele RESULTS na podlagi startne stevilke (#) oz. oznake RFID, preberemo trenutni rezultat tekmovalca, ki je sprozil dogodek, • preslikava rezultatov: preslikamo prebrane rezultate tekmovalca v podatkovni segment navideznega racunalnika, ki ga doloca merilno mesto (MM), in napolnimo programski register z vrednostjo casovnega ziga dogodka, • interpretacija kode: postavimo programski stevec na nic in zazenemo program, nalozen v ustreznem navideznem racunalniku, • zapis rezultatov: zapis rezultatov s podatkovnega segmenta ustreznega navideznega racunalnika v tabelo RESULTS. Program v navideznem računalniku interpretiramo sekvenčno, t. j. instrukcijo za instrukcijo, dokler ne pridemo do instrukcije STOP. 5 Sklep Pri razvoju univerzalne programske opreme za merjenje časa na športnih tekmovanjih se pogosto srečamo s problemom fleksibilnosti merilnega sistema. V ta namen smo razvili DSL EasyTime, ki omogoča hitro prilagajanje merilnega sistema zahtevam različnih tekmovanj. Za novo tekmovanje spremenimo izvorni program, zapisan v DSL EasyTime, ga prevedemo in ponovo zazenemo agenta. Uporaba DSL EasyTime v praksi je pokazala, da za merjenje časa na manjših športnih tekmovanjih ni treba več najemati spečializiranih in zelo dragih podjetij, pri večjih tekmovanjih pa bi lahko poenostavil konfi-guračijo merilnega sistema. V nadaljevanju dela zelimo DSL EasyTime nadomestiti z domensko spečifičšnim modelirnim jezikom. Literatura [1] M. Mernik, J. Heering, A. Sloane: When and how to develop domain-speeifie languages, 2005, ACM čomputing surveys, vol. 37, no. 4, pp. 316-344 [2] K. Finkenzeller: RFID Handbook, 2010, John Willey, Chičhester, UK [3] N. Wirth: Algorithms + Data Stručtures = Programs, 1978, Prentiče Hall PTR, Upper Saddle River, NJ, USA [4] A.V. Aho, J.D. Ullman: The theory of parsing, translation, and čompiling (Volume I: Parsing), 1972, Prentiče Hall PTR, Upper Saddle River, NJ, USA [5] A.V. Aho, J.D. Ullman: The theory of parsing, translation, and čompiling (Volume II: Compiling), 1972, Prentiče Hall PTR, Upper Saddle River, NJ, USA [6] A.V. Aho, M.S. Lam, R. Sethi, J.D. Ullman: Compilers: Prinči-ples, Tečhniques, and Tools with Gradianče, 2007, Prentiče Hall PTR, Upper Saddle River, NJ, USA [7] ChampionChip2010, http://www.čhampiončhip.čom [8] RFIDTečhnology2010, http://www.rfidtiming.čom [9] Timing2010, http://www.timingljubljana.si Iztok Fister ml. je študent 3. letnika smeri Računalništva in informacijskih tehnologij na Fakulteti za elektrotehniko, računalništvo in informatiko v Mariboru. Iztok Fister je diplomiral leta 1983 na Univerzi v Ljubljani. V letu 2004 je magistriral na Fakulteti za elektrotehniko, računalništvo in informatiko v Mariboru in v letu 2007 na isti fakulteti tudi doktoriral. Je asistent v Laboratoriju za računalniške arhitekture in jezike. Ukvarja se s programskimi jeziki, operacijskimi raziskavami in evolucijskim računanjem.