ExTimen sanomaliikenne

Päivitetty 12.2.2022

Työasemien välillä liikkuva kisa-aikainen data on versiosta 9.0.1 alkaen kokonaan XML:ää. Kaikki tietokentät ovat tekstitietoa ja siis editoitavissa ja vaikkapa notepadillä luettavissa.

Versiossa 9.4.1 (Juhannus 2019) poistin tägeistä kaikki #-merkit ja skandimerkit noudattaakseni paremmin XML-määrittelyitä, joten kaikissa samalla kertaa käytössä olevissa työasemissa on ajettava samaa ExTime-versiota.

Versiosta 10 eteenpäin sarjakohtaisia sanomia kehystää s10- ja urheilijakohtaisia u10-tagi. Ja jos jatkossa rakenne selvästi muuttuu, 10 vaihtuu version mukaan.

Otsakekenttä

Jokaisessa sanomassa on alussa 10 tavun mittainen otsikkokenttä, jossa on kolme eri tietoa

Esimerkki:

0286.00213   

Tulossa oleva sanoma on 286 tavua pitkä ja se on järjestyksessä 213. Sanomaan ei tarvitse lähettää kuittausta, koska viides merkki on piste tai tyhjä (esimerkissä piste luettavuuden takia). Jos viides merkki olisi X tiedon vastaanottajan pitäisi vastata sanomalla

0012.00213OK

eli 12 merkin vakiomittaisella sanomalla, jossa on sama järjestysnumero ja OK, kun sanoma on luettu onnistuneesti. Testit ovat osoittaneet, että kuittausta ei tarvita. TCP/IP-protokolla itsessään sisältää jo riittävästi tarkistuksia.

Esimerkin otsikkoa seuraa siis 286 tavua XML-dataa.

Päivitystieto

Päivitystietoja edeltää siis <s10> tai <u10> riippuen siitä, onko kyse sarjan vai urheilijan tietojen päivityksestä. Itse päivitystapahtumassa on kaksi kokonaisuutta, kohdistustieto (<search>) ja sitten varsinaiset muuttuvat tiedot.

Kun kilpailijasta tai sarjasta lähetetään päivitystietoa, kohdistustietoa (<search>..</search>) seuraa sillä kertaa muuttuneet tiedot. Kohdistustietona on sarjatiedoissa <Class>SNSNSNSN</Class>, jossa SNSNSNSN on maksimissaan kahdeksan merkkiä pitkä sarjan tunnus. Urheilijatiedoissa kohdistustietoja on kaksi, sarjan tunnus ja kilpailijan numero. Samassa sarjassa ei siis saa olla kahta saman numeroista urheilijaa, kilpailussa kylläkin. Esimerkissä sarjan M12 urheilija, jonka lähtönumero on 21. Sarjan tägi on siis Class ja urheilijan sarjan ClassID.

<search><ClassID>M12</ClassID><Bib>21</Bib><action>Insert</action></search>

ExTime mahdollistaa koko kilpailun datan lähettämisen bulkkisiirtona. Tämä siirto voidaan kohdistaa vain tietylle työasemalle. Bulkkisiirtossa lähetetään kaikki ne tietokentät, joissa on rasti XML-tietojen määrityksessä. Tietueen alussa on aina em. kohdistustieto, mutta sarjan tiedoissa mukana ei ole toimenpidetietoa (<action> </action>) vaan itse datatiedoissa on sarjan yksilöllinen indeksi (class unique id) ((tägi <Cluniqid>). Jos indeksi on tyhjä (siis nolla), kyseessä ei ole kilpailun sarja vaan kilpailun perustiedot. Sarjan päivitystiedot ovat tägin Classinfo sisällä, urheilijan taas tägin Competitor reunustamina.

Kelloajat ovat yleensä valtakunnan aikaa (GPS-aikaa), eli tapahtumahetken kelloaika. Urheilijan omat ajat (väliaika, loppuaika) saadaan sitten vähentämällä tästä kelloajasta urheilijan todellinen lähtöaika.

Tyypillisin päivitystieto on urheilijan loppuajan välittäminen, siitä esimerkki alla, alussa on kohdistustieto, jossa toimenpiteenä Update, jota seuraa päivittävät tiedot maaliintuloheti, loppuaika ja sijoitus:

<u10><search><ClassID>NYL</ClassID><Bib>105</Bib><action>Update</action></search><Competitor><Finishtime>10:30:57.300</Finishtime><Totaltime>27:27.3</Totaltime><Rank>1.</Rank></Competitor></u10>

Naisten sarjan NYL urheilija numerolla 105 leikkasi maalilinjaa ajassa 10:30:57.300 ja sai sillä hetkellä sijoituksen 1. Loppuaika 27:27.3 ja sijoitus on laskettu sanomaan valmiiksi, mutta vastaanottava pää laskee ne aina myös itse aikaisemmin saamansa lähtöajan mukaan.

Seuraavassa esimerkissä on kilpailijan tilatietoa muutettu, tilatieto on 32 bitin sana, joka tulostetaan 8 merkin hexa-tietona. Tilatiedoista on erillinen selostus, yleisimpiä ovat keskeytys, poisjäänti, hylkäys ja todellinen, rekisteröity lähtöaika.

<u10><search><ClassID>NYL</ClassID><Bib>103</Bib><action>Update</action></search><Competitor><Flags>00080000</Flags></Competitor></u10>

Tässä esimerkissä on taas kyseisen sarjan nimeä muutettu:

<s10><search><Class>NYL</Class><action>Update</action></search><Classinfo><Classname>Naiset, FIS-sarja</Classname></Classinfo></s10>

Uusi nimi sarjassa NYL on nyt Naiset, FIS-sarja.

Toimenpidemahdollisuuksia (action) on kolme:

Tapahtumatieto

Tapahtumatiedolla ExTimessä tarkoitan väliaikoihin, ammuntatuloksiin tai kierrosaikoihin liittyviä tietoja. Niistä erotuksena urheilijan lähtöaika ja maalintuloaika ovat päivitystietoja. Tapahtumatiedot alkavat intermediate-tägillä. Jos tapahtumassa on mukana Competitor-tägi, on kyseessä urheilijan tapahtumatieto, ilman sitä tapahtuma koskee class-tagissä määritettyä sarjaa.

Tässä esimerkissä on sarjaan MYL lisätty 2 väliaikapistettä (type = V) 5.000 ja 10.000 km kohdille, hitain ja nopein mahdollinen väliaika on määritetty, sektori, johon väliaika kuuluu, sekä väliaikaan liittyvä aikakanava ja/tai käytetyn lukijan (Emit ECB-kellolaite) postcode :

<intermediate><class>MYL</class><point>5.000</point><fast>12:45.0</fast><slow>17:10.0</slow><sector>P</sector><postcode>V:</postcode><type>V</type></intermediate>
<intermediate><class>MYL</class><point>10.000</point><fast>20:00.0</fast><slow>24:10.0</slow><sector>K</sector><postcode>V:</postcode><type>V</type></intermediate>

Niitä seuraa välittömäsi sarjan päivitetyt tiedot, esimerkissä on muuttunut vain sarjan väliaikapisteiden lukumäärä kahdeksi:

<s10><search><Class>MYL</Class><action>Update</action></><Classinfo><Intermedpoints>2</Intermedpoints></Classinfo></s10>

MYL-sarjan urheilija numerolla 156 leikkaa sitten 5 km väliaikapisteen (type=V) kelloajassa 10.46.54,2 ja hiukan myöhemmin 10.km kohdan kellon ollessa 11:06:57,6:

<intermediate><class>MYL</class><Competitor>156</Competitor><point>5.000 km</point><elapsed>10:46:54.2</elapsed><type>V</type></intermediate>
<intermediate><class>MYL</class><Competitor>156</Competitor><point>10.000 km</point><elapsed>11:06:57.6</elapsed><type>V</type></intermediate>

Ja kellon ollessa 11:26:58:000 samainen urheilija numerolla 156 saapuu maaliin ja sijoittuu sarjassa MYL sijalle 21:

<u10><search><ClassID>MYL</ClassID><Bib>156</Bib><action>Update</action></search><Competitor><Finishtime>11:26:58.000</Finishtime><Rank>21.</Rank></Competitor></u10>

Tässä esimerkissä on sarjasta MYL poistettu väliaikapiste 10.000 km kohdalta:

<intermediate><class>MYL</class><point>10.000 km</point><action>Delete</action></intermediate>

Jota sitten seuraa sarjan päivitetyt tiedot:

<search><Class>MYL</Class><action>Update</action></search><Classinfo><Intermedpoints>1</Intermedpoints></Classinfo>

Ampumahiihdossa/juoksussa ammuntatapahtumat tunnistetaan tyypillä B, esimerkissä naisten sarjan (NYL) urheilija (nro=4) saa viisi (value=5) ohilaukausta ampumapaikalta, joka on lähdöstä 1 km päässä. Ampumapaikat tunnistetaan etäisyydellä lähdöstä, jolloin väliaikapalvelussa osataan laskea vain siihen asti kertyneet sakot mukaan väliaikaan. Versiosta 9.4.1 lähtien sanomassa tulee mukana myös kaikki urheilijan siihen mennessä saamien (=kirjattujen) sakkojen summa <total>-tägissä.

<intermediate><class>NYL</class><Competitor>4</Competitor><point>1.000 km</point><value>5</value><total>18</total><type>B</type></intermediate>

Allaolevassa esimerkissä (type=G) MYL-B sarjan urheilija numerolla 51 on kiertänyt yhden sakkoringin (lukijan on paikassa 1.180 km) kellon ollessa 12:22:26:

<intermediate><class>MYL-B</class><Competitor>51</Competitor><point>1.180 km</point><elapsed>12:22:26.0</elapsed><type>G</type></intermediate>

Urheilijan tilatiedot

Alla on käyttämäni C-kielen struktuuri kilpailijan tilatiedoista. Tilabittejä on 32 kappaletta, jotka siis tulostetaan XML-tietoihin yhtenä 32 bitin pitkänä hexadesimaalisena kokonaislukuna. Kaikki bitit bivät ole vielä käytössä. Siis kahdeksan kappaletta 4 bitin kenttiä, jokainen arvoltaan 0..9, A..F. Ja Intel-arkkitehtuurin mukaisesti viimeinen merkki koostuu 4:stä ensimmäisestä bitistä (eit, lapped, csped, ral käänteisessä järjestyksessä, eli eit on vähiten merkitsevä bitti).

Jos viimeinen merkki on 1, 3, 5, 7, 9, B, D tai F, urheilijalla ei ole tulosta (bitti eit on 1) ja jos lisäksi toiseksi viimeinen merkki on 1, tuloksen puuttumisen syy on keskeyttäminen, (bitti kes on 1), silloinhan ei oikeastaan muut saman nibblen biteistä voikaan olla päällä.

struct  status_bitit_urheilija_v10	// Kilpailijan tilannetiedot
{
	// tavu 1 alkaa, bitit 1..8, tulosbitit. Jos joku näistä on päällä, tulos on tiedossa
	BOOL eit : 1;           // 1 = eitulosta-lippu
	BOOL lapped : 1;        // 1 = kilpailija on ylösajettu, lapped
	BOOL csped : 1;         // 1 = Jyry keskeyttää ja määrää viimeiseksi
	BOOL ral : 1;           // 1 = Jyry rankkaa viimeiseksi
	BOOL kes : 1;           // 1 = keskeyttänyt
	BOOL hyl : 1;           // 1 = hylätty
	BOOL poi : 1;           // 1 = poisjäänyt
	BOOL laa : 1;           // 1 = lääkärintodistuksella poissa

	// tavu 2 alkaa, bitit 9..16
	BOOL yhsta : 1;         // 1 = Oli mukana viestin yhteislähdössä
	BOOL pakkosija : 1;     // 1 = sijoitus annettu, ei saa muuttaa
	BOOL jal : 1;           // 1 = jälki-ilmoittautunut
	BOOL tark : 1;          // 1 = emit-tarkistus tehty (suunnistus)
	BOOL ulko : 1;          // 1 = ulkopuolella_kilpailun
	BOOL on_lahtenyt : 1 ;  // 1 = on saanut todellisen lähtöajan lähtöviikseltä/laukauksesta
	BOOL kilpailijalla_on_kommentti : 1;
	BOOL FIS_laskettu : 1 ; // FIS-pisteet on laskettu

	// tavu 3 alkaa, bitit 17..24 
	BOOL hyvat_pojot : 1;   // Tällä rankissa parhaita alkupisteitä, ei käytössä versiossa 9
	BOOL tag1_ok : 1;       // tunnistin 1 käsitelty
	BOOL odottaa_FF : 1 ;   // on lähellä toista aikaa, tarvitaan päätös maalikameralta 
	BOOL oma_hajonta : 1 ;  // TRUE = urheilijalla oma hajonta, 0 = sarjan rata pätee (suunnistus)
	BOOL FIS_check : 1 ;    // on tarkistettu FIS:n kannasta
	BOOL yritykset_taynna:1;// urheilija ei enää voi yrittää hyppyä tai heittoa (=TRUE)
	BOOL sisainen_id : 1;   // vapaa
	BOOL vapaa_24 : 1;      // vapaa

	BOOL vapaa_25 : 1;      // vapaa
	BOOL vapaa_26 : 1;      // vapaa
	BOOL vapaa_27 : 1;      // vapaa
	BOOL vapaa_28 : 1;      // vapaa
	BOOL vapaa_29 : 1;      // vapaa
	BOOL vapaa_30 : 1;      // vapaa
	BOOL vapaa_31 : 1;      // vapaa
	BOOL vapaa_32 : 1;      // vapaa
};