# Skriptilooja tööriist

KDE rakendusi saab juhtida väljastpoolt mõnest muust rakendusest, konsoolilt või shelliskriptiga niinimetatud töölaua kommunikatsiooniprotokolli kasutades (Desktop COmmunication Protocol, DCOP). KStars kasutab seda võimalust ära selleks, et võimaldada ka üpris keerukat käitumist kirja panna ning suvalisel ajal käivitada skripti abil. Seda on võimalik näiteks tarvitada koolitundides demona mõne astronoomilise mõiste selgitamisel.

DCOP-skriptide hädaks on see, et nende kirjutamine näeb välja nagu korralik programmeerimine ja kui kasutajal ei ole programmeerimisega erilisi kokkupuuteid, võib see lausa eemale peletada. Skriptilooja pakub omalt poolt GUI, mis laseb ka lihtsalt hiirega klõpsates luua KStarsile DCOP-skripte, olgu need siis kui tahes keerukad.

## Skriptilooja sissejuhatus

Enne skriptilooja kasutamise selgitamist tutvustan lühidalt kõiki GUI elemente. Kui soovid nende kohta rohkem infot, kasuta võimalust "Mis see on?"

Skriptilooja tööriist
Skriptilooja tööriist

Nagu pildil näha, asub skriptilooja vasakul pool käesoleva skripti kast, kus on näha käsud, millest koosneb parajasti töötav skript. Paremal asub funktsioonivalija, mis näitab kõiki saadaolevaid skriptifunktsioone. Funktsioonivalija all on väike paneel, mis näitab valijas esile tõstetud funktsiooni kohta lühiinfot. Käesoleva skripti kasti all paikneb funktsiooni argumentide paneel, kus juhul, kui mõni funktsioon on ära märgitud käesoleva skripti kastis, on näha kõigi skriptile vajalike argumentide väärtused.

Akna ülaosas on nupurida, mis võimaldab manipuleerida skripti kui tervikuga. Paremalt vasakule on nupud järgmised: Uus skript, Ava skript, Salvesta skript, Salvesta skript kui... ja Testi skripti. Nende mõte peaks olema ilmselge, kui vahest välja jätta viimane nupp. Klõps nupule Testi skripti püüab käivitada käesoleva skripti KStarsi peaaknas. Skriptilooja aken oleks mõttekas enne selle nupu kasutamist kuhugi kõrvale nihutada, et näha, mida skript siis KStarsis ette võtab.

Keset akent on nupurida, mis manipuleerib konkreetsete skriptifunktsioonidega. Ülalt alla on nupud järgmised: Lisa funktsioon, Eemalda funktsioon, Kopeeri funktsioon, Liiguta üles ja Liiguta alla. Lisa funktsioon lisab funktsioonivalijas parajasti esile tõstetud funktsiooni käesoleva skripti kasti (funktsiooni saab lisada ka selle nimel topeltklõpsu tehes). Ülejäänud nupud käivad käesoleva skripti kohta, eemaldades sealt esile tõstetud funktsiooni, kopeerides selle või muutes selle asukoha skriptis.

## Skriptilooja kasutamine

Skriptilooja kasutamise selgitamiseks näitame, kuidas valmistada skript, mis jälgib Kuud, samal ajal kui kell töötab kiirendusega.

Kui tahame Kuud jälgida, tuleb mõistagi kõigepealt vaade talle tsentreerida. Selleks tuleb kasutada funktsiooni lookToward. Märgi see funktsioonivalijas ning tutvu ka kasti alla ilmuva infoga. Klõpsa nupule Lisa funktsioon, et funktsioon liiguks käesoleva skripti kasti. Funktsiooni argumentide paneelil on nüüd näha liitkast märkega suund. See on suund, kuhu vaade tuleks tsentreerida. Liitkastis on ainult põhiilmakaared, mitte Kuu või mingeid muid taevakehasid. Soovi korral võib kirjutada kasti käsitsi Kuu või siis klõpsata nupule Objekt, mis avab objekti leidmise dialoogi, kus saab nimekirjast Kuu valida. Arvesta, et nagu ikka, toob objektile tsentreerimine automaatselt kaasa selle jälgimise, mistõttu ei ole funktsioonile lookToward vaja lisada funktsiooni setTracking.

Nüüd, kui vaade on suunatud Kuule, tuleb panna aeg kiiremini käima. Selleks sobib funktsioon setClockScale. Lisa see käesoleva skripti kasti, tehes funktsiooni nimel funktsioonivalijas topeltklõpsu. Funktsiooni argumentide paneelil on näha ajasammu kerimiskast, kus saab määrata kella vajaliku kiiruse. Määrame ajasammu väärtuseks 3 tundi.

Vaade on nüüd Kuul ja kell kiirendatud. Veel läheb meil vaja, et skript ootaks mõned sekundid, kuni vaade Kuud jälgib. Lisame skriptile funktsiooni waitFor ja määrame funktsiooni argumentide paneelil, et enne jätkamist tuleks oodata 20 sekundit.

Lõpetuseks seame kella ajasammu tagasi normaalväärtusele 1 sekund. Selleks lisa veel kord setClockScale ning määra selle väärtuseks 1 sekund.

Tegelikult ei ole see veel aga kõik. Tõenäoliselt soovime, et vaade kasutaks ekvaatorilisi koordinaate, enne kui skript hakkab kiirendatud ajasammuga Kuud jälgima. Kui kasutada horisondilisi koordinaate, hakkaks vaade hirmsa kiirusega pöörlema vastavalt Kuu tõusudele ja loojumistele. See oleks usutavasti üpris häiriv ning me väldime seda nii, et seame vaatevaliku UseAltAz väärtuseks väär. Mis tahes vaatevaliku muutmiseks tuleb kasutada funktsiooni changeViewOption. Lisame selle skriptile ja uurime nüüd funktsiooni argumentide paneeli. Liitkastis on kirjas kõik vaatevalikud, mida saab changeViewOption abil kasutada. Me teame, et meil läheb vaja võimalust UseAltAz, mistõttu võime selle lihtsalt liitkastist valida. Kuid nimekiri on päris pikk ja mitte miski ei seleta, mida mingi element täpselt teeb. Seepärast on mõttekam vajutada nuppu Lehitse puud, mis avab akna, kus vaatevalikud on teemade järgi puusse koondatud. Peale selle on iga elemendi juures ka lühiseletus ning valiku väärtuse andmetüüp. UseAltAz on kirjas kategooria Taevakaardi valikud all. Märgime seal selle elemendi ning vajutame nuppu OK, mille järel see ongi valitud funktsiooni argumentide paneelil. Lõpuks määrame selle väärtuseks väär või 0.

Ja veel üks asi: kui muuta UseAltAz skripti lõpus, ei ole sellest mingit tolku. See tuleb muuta enne seda, kui midagi üldse juhtuma hakkab. Seepärast märgi funktsioon käesoleva skripti kastis ära ning klõpsa nupule Liiguta üles, kuni sellest on saanud kõige esimene funktsioon.

Skript on valmis ja aeg on see kettale salvestada. Klõpsa nupule Salvesta skript. See avab akna, kus saab anda skriptile nime ning ennast selle autoriks tunnistada. Anna nimeks näiteks Kuu jälgimine ning kirjuta autori kohale enda nimi ja vajuta nupule OK. Seejärel ilmub tavapärane &kde; failisalvestamisdialoog. Siin tuleb määrata faili nimi ja skripti salvestamiseks klõpsata taas nupule OK. Pane tähele, et kui sa ei kirjuta ise failinime lõppu .kstars, lisatakse see laiend automaatselt. Kui huvi tunned, võid hiljem skripti uurida suvalise tekstiredaktoriga.

Nüüd, kus skript on valmis, võib selle käivitada mitmel viisil. Konsoolilt saab selle edukalt käivitada juhul, kui KStars parajasti töötab. Skripti saab käivitada ka KStarsi seest, valides menüüst Fail käsu Käivita skript.

## INDI seadmete automatiseerimine

Kõik INDI-ga ühilduvad seadmed toetavad seadmete ajastamist ja automatiseerimist. &kstars;i skriptilooja abil võib panna suvalise arvu seadmeid ette võtma ka väga keerukaid operatsioone. Seda võimaldab &kstars;i INDI DCOP-liides, mis pakub kõikvõimalike ülesannete tarbeks erinevaid funktsiooniklasse. INDI DCOP-funktsioonid võib jagada viide erinevasse klassi. Järgnevalt anname ülevaate KStarsis toetatud funktsioonidest ja nende argumentidest. Äärmiselt soovitatav on lugeda INDI põhimõtteid tutvustavat osa, sest me kasutame neid siin ohtralt.

1. Seadmete üldised funktsioonid: seadmete loomise/sulgemise funktsioonid jne.

   - `startINDI (QString seadmeNimi, bool useLocal)` : INDI-teenuse loomine kohalikuna või serverina.

   - `shutdownINDI (QString seadmeNimi)` : INDI-teenuse lõpetamine.

   - `switchINDI(QString seadmeNimi, bool turnOn)` : INDI-seadme ühendamine või lahutamine.

   - `setINDIPort(QString seadmeNimi, QString port)` : seadme ühenduse pordi määramine.

   - `setINDIAction(QString seadmeNimi, QString toiming)` : INDI-toimingu aktiveerimine. Toiming võib olla lülitamisomaduse mis tahes element.

   - `waitForINDIAction(QString seadmeNimi, QString toiming)` : paus skripti täitmises, kuni määratud toimingu omadus tagastatakse OK-staatusega.

2. Teleskoobifunktsioonid: teleskoobi liikumist ja olekut kontrollivad funktsioonid.

   - `setINDIScopeAction(QString seadmeNimi, QString toiming)` : teleskoobi režiimi või toimingu määramine. Võimalikud valikud on SLEW, TRACK, SYNC, PARK ja ABORT.

   - `setINDITargetCoord(QString seadmeNimi, double otsetõus, double kääne)` : määrab teleskoobi JNow sihtkoordinaadid otsetõusule ja käändele.

   - `setINDITargetName(QString seadmeNimi, QString objektiNimi)` : määrab teleskoobi JNow sihtkoordinaadid objektiNime koordinaatidele. KStars otsib objekti nime oma andmebaasist ja hangib leidmise korral selle otsetõusu ja käände.

   - `setINDIGeoLocation(QString seadmeNimi, double pikkuskraad, double laiuskraad)` : määrab teleskoobi geograafilise asukoha määratud pikkus- ja laiuskraadile. Pikkuskraadi arvestatakse Greenwichist (Suurbritannia) ida poole. Kuid kuigi läänepoolkera kohta kasutatakse sageli negatiivseid pikkuskraade, nõuab INDI, et pikkuskraad jääks 0 ja 360 vahele. See tähendab, et kui sul on kasutada negatiivne pikkuskraad, tuleb sellele liita 360 kraadi, et saada INDI-le sobilik väärtus. Näiteks Kanada linna Calgary koordinaadid &kstars;is on järgmised: pikkuskraad -114 04 58; laiuskraad 51 02 58. Nii on meie näite korral INDI pikkuskraad 360 - 114,093 = 245,917 kraadi.

   - `setINDIUTC(QString seadmeNimi, QString UTCDateTime)` : määrab teleskoobi UTC kuupäeva ja kellaaja ISO-8601 vormingus. Vorminguks on YYYY-MM-DDTHH:MM:SS (nt. 2004-07-12T22:05:32).

3. Kaamera/CCD funktsioonid: kaamera/CCD omaduste ja oleku kontrollimise funktsioonid.

   - `setINDICCDTemp(QString seadmeNimi, int temp)` : määrab CCD-kiibi sihttemperatuuri Celsiuse kraadides.

   - `setINDIFrameType(QString seadmeNimi, QString tüüp)` : määrab CCD kaadritüübi. Võimalikud valikud on FRAME_LIGHT, FRAME_BIAS, FRAME_DARK ja FRAME_FLAT.

   - `startINDIExposure(QString seadmeNimi, int aegumine)` : käivitab CCD/kaamera särituse sekunditeks, mille määrab aegumine.

4. Fokuseerija funktsioonid: fokuseerija liikumist ja olekut kontrollivad funktsioonid.

   - `setINDIFocusSpeed(QString seadmeNimi, QString toiming)` : määrab fokuseerija kiiruse. Võimalikud valikud on FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM ja FOCUS_FAST.

   - `setINDIFocusTimeout(QString seadmeNimi, int aegumine)` : määrab sekundites iga järgneva startINDIFocus operatsiooni kestuse.

   - `startINDIFocus(QString seadmeNimi, int fookuseSuund)` : liigutab fokuseerijat kas sissepoole (fookuseSuund = 0) või väljapoole (fookuseSuund = 1). Operatsiooni kiiruse ja kestuse saab määrata funktsioonidega `setINDIFocusSpeed()` ja `setINDIFocusTimeout()`.

5. Filtrifunktsioonid: filtri positsiooni kontrollivad funktsioonid.

   - `setINDIFilterNum(QString seadmeNimi, int filtri_number)`: annab filtrile positsiooni `filtri_number`. Viimaste aliaseid saab omistada dialoogis INDI seadistamine, mille saab avada menüüst Seadmed (nt. Filter 1 = punane, Filter 2 = roheline jne.).

Pane tähele, et kõigis INDI-funktsioonides on esimene argument seadme nimi. See võimaldab liita ühte skripti erinevaid käske, mida saata erinevatele INDI-seadmetele. Skriptilooja pakub kaks võimalust lihtsustada INDI-skriptide loomist ja muutmist:

- `WaitForINDIAction lisamine iga INDI-toimingu järele`: märkimisel lisab skriptilooja automaatselt funktsiooni `waitForINDIAction()` iga tuntud toimingu järele. Kui näiteks lisad skriptile funktsiooni `switchINDI()` ja antud valik on sisse lülitatud, lisab skriptilooja kohe funktsiooni `switchINDI()` järele skripti "waitForINDIAction CONNECTION". See sunnib skripti pausi tegema pärast käsu `switchINDI()` andmist seni, kuni `switchINDI()` tagastatakse OK-staatusega (&ie; seadme ühendamine oli edukas). Äärmiselt oluline on silmas pidada, et skriptilooja ei saa funktsiooni `waitForINDIAction()` automaatselt lisada üldistele toimingutele, mis on lisatud funktsiooni `setINDIAction()` kasutades. Selle põhjuseks on asjaolu, et KStarsil puudub võimalus määrata üldiste funktsioonide eellasomadus. Seetõttu tuleb soovi korral `waitForINDIAction()` üldiste toimingute järele ise käsitsi lisada.

- `INDI-seadme nime korduvkasutus`: märkimisel täidetakse kõigi järgnevate funktsioonide seadmenimeväli automaatselt viimati kasutatud seadme nimega. Viimase seadme nimi määratakse iga kord, kui skriptile lisatakse funktsioon `startINDI()`. Mitme seadme kasutamisel ei ole mõttekas seda võimalust sisse lülitada.

Nüüd oleme valmis looma demoskripti, mis juhib LX200 GPS teleskoopi, millele lisandub Finger Lakesi CCD-kaamera. Ülesanne on lihtne. Me tahame, et teleskoop asuks jälgima Marssi, seejärel aga peaks kaamera tegema 20-sekundiliste vahedega kolm 10-sekundilist võtet.

Et INDI DCOP-liides ei anna otsest tagasisidet seadme operatsioonide ja parameetrite (välja arvatud `waitForINDIAction()`) edenemise, väärtuse ega oleku kohta, kujutab seadmete automatiseerimine KStarsis endast sisuliselt otsejuhtimist. Sellistes süsteemides puudubki tavaliselt vahetu tagasiside süsteemi edenemise kohta, samuti pole võimalik jooksvalt vigu korrigeerida. Seepärast tuleb seadmete automatiseerimise skriptid väga hoolikalt kirja panna ja neid igakülgselt testida, enne kui lõplikult kasutusele võtta.

Skriptilooja tööriist
Skriptilooja tööriist

Demoskripti näeb siintoodud pildil. Pane tähele, et `"WaitForINDIAction lisamine iga INDI-toimingu järele"` on sisse lülitatud, `"INDI-seadme nime korduvkasutus"` aga mitte. Esimene lisatav funktsioon on `startINDI()`, nagu ka pildil näha. Me tahame oma seadmed panna tööle kohalikuna, sestab ei ole funktsiooni argumentide aknas vajalik muuta teenuse režiimi. Paneme kirja seadme nime, kõigepealt siis teleskoobi "LX200 GPS". Kordame sama operatsiooni, et panna kirja "FLI CCD". Selle järel on funktsioon `waitFor()`. Üldiselt on soovitatav kasutada funktsiooni `waitFor()` kohe funktsiooni `startINDI()` järel, et peatada skript 1-5 sekundiks. Nii saab tagada kõigi omaduste korrektse loomise ja nende valmisoleku käsklusi vastu võtma. See tuleb kasuks ka võrguseadmete juhtimisel, sest omaduste hankimine ja loomine võib võtta veidi aega. Järgmise funktsiooniga `switchINDI()` ühendame mõlemad seadmed.

Meil oli juba valik `"WaitForINDIAction lisamine iga INDI-toimingu järele"` sisse lülitatud, nii ei ole meil vaja lisada funktsiooni `waitForINDIAction()` funktsiooni `switchINDI()` järele, et tagada skripti täitmine ainult juhul, kui ühendus õnnestub luua. Seda teeb skriptilooja meie eest automaatselt ise. Nüüd seame teleskoobi jälgimisrežiimi, klõpsates funktsioonil `setINDIScopeAction()` ja valides TRACK. Pane tähele, et teleskoop tuleb panna jälgima enne seda, kui anda koordinaadid, mida see peab jälgima. Funktsioon `setINDIScopeAction()` on õigupoolest lihtsalt mugavuse pärast - meiegi näites annab see lihtsalt üldise funktsiooni `setINDIAction()`, millele järgneb võtmesõna TRACK. Funktsiooni `setINDIScopeAction()` kasutamise eeliseks on siiski see, et KStars lisab vajaduse korral selle järele automaatselt `waitForINDIAction()`. See võimalus ei ole muidu, nagu eespool mainitud, automaatselt kättesaadav üldiste toimingute puhul.

Nüüd kasutame funktsiooni `setINDITargetName()` ja valime siin Marsi. Viimaste sammudega tuleb meil määrata 10-sekundiliste võtete tegemine, milleks on funktsioon `startINDIExposure()` ning nende vahele 20-sekundiliste intervallide jätmine, milleks tuleb funktsioonile `waitFor()` anda väärtuseks 20.

Nüüd võime skripti salvestada ja millal tahes käivitada. Salvestatud skript näeb välja selline:

>     #!/bin/bash
>         #KStars DCOP script: Demo Script
>         #by Jasem Mutlaq
>         #last modified: Thu Jan 6 2005 09:58:26
>         #
>         KSTARS=`dcopfind -a 'kstars*'`
>         MAIN=KStarsInterface
>         CLOCK=clock#1
>         dcop $KSTARS $MAIN  startINDI "LX200 GPS" true
>         dcop $KSTARS $MAIN  startINDI "FLI CCD" true
>         dcop $KSTARS $MAIN  waitFor 3
>         dcop $KSTARS $MAIN  switchINDI "LX200 GPS" true
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" CONNECTION
>         dcop $KSTARS $MAIN  switchINDI "FLI CCD" true
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" CONNECTION
>         dcop $KSTARS $MAIN  setINDIScopeAction "LX200 GPS" TRACK
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" ON_COORD_SET
>         dcop $KSTARS $MAIN  setINDITargetName "LX200 GPS" Mars
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" EQUATORIAL_EOD_COORD
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION
>         dcop $KSTARS $MAIN  waitFor 20
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION
>         dcop $KSTARS $MAIN  waitFor 20
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION

INDI teek pakub väga võimsat skriptimistööriista, mis lubab arendajatel luua ka väga keerukaid skripte. Sellest räägib lähemalt INDI arendajate käsiraamat.