<para>KDE rakendusi saab juhtida väljastpoolt mõnest muust rakendusest, konsoolilt või shelliskriptiga niinimetatud töölaua kommunikatsiooniprotokolli kasutades (Desktop COmmunication Protocol, <abbrev>DCOP</abbrev>). 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. </para>
<para>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 <abbrev>GUI</abbrev>, mis laseb ka lihtsalt hiirega klõpsates luua KStarsile DCOP-skripte, olgu need siis kui tahes keerukad. </para>
<para>Enne skriptilooja kasutamise selgitamist tutvustan lühidalt kõiki <abbrev>GUI</abbrev> elemente. Kui soovid nende kohta rohkem infot, kasuta võimalust "Mis see on?" </para>
<para>Nagu pildil näha, asub skriptilooja vasakul pool <firstterm>käesoleva skript</firstterm>i kast, kus on näha käsud, millest koosneb parajasti töötav skript. Paremal asub <firstterm>funktsioonivalija</firstterm>, 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 <firstterm>funktsiooni argumentide paneel</firstterm>, kus juhul, kui mõni funktsioon on ära märgitud käesoleva skripti kastis, on näha kõigi skriptile vajalike argumentide väärtused. </para><para>Akna ülaosas on nupurida, mis võimaldab manipuleerida skripti kui tervikuga. Paremalt vasakule on nupud järgmised: <guibutton>Uus skript</guibutton>, <guibutton>Ava skript</guibutton>, <guibutton>Salvesta skript</guibutton>, <guibutton>Salvesta skript kui...</guibutton> ja <guibutton>Testi skripti</guibutton>. Nende mõte peaks olema ilmselge, kui vahest välja jätta viimane nupp. Klõps nupule <guibutton>Testi skripti</guibutton> 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. </para><para>Keset akent on nupurida, mis manipuleerib konkreetsete skriptifunktsioonidega. Ülalt alla on nupud järgmised: <guibutton>Lisa funktsioon</guibutton>, <guibutton>Eemalda funktsioon</guibutton>, <guibutton>Kopeeri funktsioon</guibutton>, <guibutton>Liiguta üles</guibutton> ja <guibutton>Liiguta alla</guibutton>. <guibutton>Lisa funktsioon</guibutton> 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. </para>
<para>Skriptilooja kasutamise selgitamiseks näitame, kuidas valmistada skript, mis jälgib Kuud, samal ajal kui kell töötab kiirendusega. </para><para>Kui tahame Kuud jälgida, tuleb mõistagi kõigepealt vaade talle tsentreerida. Selleks tuleb kasutada funktsiooni <firstterm>lookToward</firstterm>. Märgi see funktsioonivalijas ning tutvu ka kasti alla ilmuva infoga. Klõpsa nupule <guibutton>Lisa funktsioon</guibutton>, et funktsioon liiguks käesoleva skripti kasti. Funktsiooni argumentide paneelil on nüüd näha liitkast märkega <quote>suund</quote>. 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 <quote>Kuu</quote> või siis klõpsata nupule <guibutton>Objekt</guibutton>, mis avab <guilabel>objekti leidmise</guilabel> 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 <firstterm>setTracking</firstterm>. </para><para>Nüüd, kui vaade on suunatud Kuule, tuleb panna aeg kiiremini käima. Selleks sobib funktsioon <firstterm>setClockScale</firstterm>. 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. </para><para>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 <firstterm>waitFor</firstterm> ja määrame funktsiooni argumentide paneelil, et enne jätkamist tuleks oodata 20 sekundit. </para><para>Lõpetuseks seame kella ajasammu tagasi normaalväärtusele 1 sekund. Selleks lisa veel kord setClockScale ning määra selle väärtuseks 1 sekund. </para><para>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 <firstterm>UseAltAz</firstterm> väärtuseks <quote>väär</quote>. Mis tahes vaatevaliku muutmiseks tuleb kasutada funktsiooni <firstterm>changeViewOption</firstterm>. 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 <guibutton>Lehitse puud</guibutton>, 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 <guilabel>Taevakaardi valikud</guilabel> all. Märgime seal selle elemendi ning vajutame nuppu <guibutton>OK</guibutton>, mille järel see ongi valitud funktsiooni argumentide paneelil. Lõpuks määrame selle väärtuseks <quote>väär</quote> või <quote>0</quote>. </para><para>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 <guibutton>Liiguta üles</guibutton>, kuni sellest on saanud kõige esimene funktsioon. </para><para>Skript on valmis ja aeg on see kettale salvestada. Klõpsa nupule <guibutton>Salvesta skript</guibutton>. See avab akna, kus saab anda skriptile nime ning ennast selle autoriks tunnistada. Anna nimeks näiteks <quote>Kuu jälgimine</quote> ning kirjuta autori kohale enda nimi ja vajuta nupule <guibutton>OK</guibutton>. Seejärel ilmub tavapärane &kde; failisalvestamisdialoog. Siin tul
<para>Kõik <link linkend="what-is-indi">INDI</link>-ga ühilduvad seadmed toetavad seadmete ajastamist ja automatiseerimist. &kstars;i <link linkend="sb-intro">skriptilooja</link> 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 <link linkend="indi-concepts">INDI põhimõtteid</link> tutvustavat osa, sest me kasutame neid siin ohtralt.</para>
<listitem><para><function>switchINDI(TQString seadmeNimi, bool turnOn)</function> : INDI-seadme ühendamine või lahutamine.</para></listitem>
<listitem><para><function>setINDIPort(TQString seadmeNimi, TQString port)</function> : seadme ühenduse pordi määramine.</para></listitem>
<listitem><para><function>setINDIAction(TQString seadmeNimi, TQString toiming)</function> : INDI-toimingu aktiveerimine. Toiming võib olla <emphasis>lülitamisomaduse</emphasis> mis tahes <emphasis>element</emphasis>.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString seadmeNimi, TQString toiming)</function> : paus skripti täitmises, kuni määratud toimingu <emphasis>omadus</emphasis> tagastatakse OK-staatusega.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString seadmeNimi, TQString toiming)</function> : teleskoobi režiimi või toimingu määramine. Võimalikud valikud on SLEW, TRACK, SYNC, PARK ja ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString seadmeNimi, double otsetõus, double kääne)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>otsetõusule</emphasis> ja <emphasis>käändele</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(TQString seadmeNimi, TQString objektiNimi)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>objektiNime</emphasis> koordinaatidele. KStars otsib objekti nime oma andmebaasist ja hangib leidmise korral selle otsetõusu ja käände.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString seadmeNimi, double pikkuskraad, double laiuskraad)</function> : 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.</para></listitem>
<listitem><para><function>setINDIUTC(TQString seadmeNimi, TQString UTCDateTime)</function> : määrab teleskoobi UTC kuupäeva ja kellaaja ISO-8601 vormingus. Vorminguks on YYYY-MM-DDTHH:MM:SS (nt. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString seadmeNimi, int temp)</function> : määrab CCD-kiibi sihttemperatuuri Celsiuse kraadides.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString seadmeNimi, TQString tüüp)</function> : määrab CCD kaadritüübi. Võimalikud valikud on FRAME_LIGHT, FRAME_BIAS, FRAME_DARK ja FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(TQString seadmeNimi, int aegumine)</function> : käivitab CCD/kaamera särituse sekunditeks, mille määrab <emphasis>aegumine</emphasis>.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString seadmeNimi, TQString toiming)</function> : määrab fokuseerija kiiruse. Võimalikud valikud on FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM ja FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString seadmeNimi, int aegumine)</function> : määrab sekundites iga järgneva startINDIFocus operatsiooni kestuse.</para></listitem>
<listitem><para><function>startINDIFocus(TQString seadmeNimi, int fookuseSuund)</function> : liigutab fokuseerijat kas sissepoole (fookuseSuund = 0) või väljapoole (fookuseSuund = 1). Operatsiooni kiiruse ja kestuse saab määrata funktsioonidega <function>setINDIFocusSpeed()</function> ja <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString seadmeNimi, int filtri_number)</function>: annab filtrile positsiooni <varname>filtri_number</varname>. Viimaste aliaseid saab omistada dialoogis <guimenuitem>INDI seadistamine</guimenuitem>, mille saab avada menüüst <guimenu>Seadmed</guimenu> (nt. Filter 1 = punane, Filter 2 = roheline jne.).</para></listitem>
<para>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:</para>
<listitem><para><option>WaitForINDIAction lisamine iga INDI-toimingu järele</option>: märkimisel lisab skriptilooja automaatselt funktsiooni <function>waitForINDIAction()</function> iga tuntud toimingu järele. Kui näiteks lisad skriptile funktsiooni <function>switchINDI()</function> ja antud valik on sisse lülitatud, lisab skriptilooja kohe funktsiooni <function>switchINDI()</function> järele skripti "waitForINDIAction CONNECTION". See sunnib skripti pausi tegema pärast käsu <function>switchINDI()</function> andmist seni, kuni <function>switchINDI()</function> tagastatakse OK-staatusega (&ie; seadme ühendamine oli edukas). Äärmiselt oluline on silmas pidada, et skriptilooja ei saa funktsiooni <function>waitForINDIAction()</function> automaatselt lisada üldistele toimingutele, mis on lisatud funktsiooni <function>setINDIAction()</function> kasutades. Selle põhjuseks on asjaolu, et KStarsil puudub võimalus määrata üldiste funktsioonide eellasomadus. Seetõttu tuleb soovi korral <function>waitForINDIAction()</function> üldiste toimingute järele ise käsitsi lisada.</para>
<listitem><para><option>INDI-seadme nime korduvkasutus</option>: 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 <function>startINDI()</function>. Mitme seadme kasutamisel ei ole mõttekas seda võimalust sisse lülitada.</para>
<para>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.</para>
<important><para>Et INDI DCOP-liides ei anna otsest tagasisidet seadme operatsioonide ja parameetrite (välja arvatud <function>waitForINDIAction()</function>) 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.</para></important>
<para>Demoskripti näeb siintoodud pildil. Pane tähele, et <option>"WaitForINDIAction lisamine iga INDI-toimingu järele"</option> on sisse lülitatud, <option>"INDI-seadme nime korduvkasutus"</option> aga mitte. Esimene lisatav funktsioon on <function>startINDI()</function>, 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 <function>waitFor()</function>. Üldiselt on soovitatav kasutada funktsiooni <function>waitFor()</function> kohe funktsiooni <function>startINDI()</function> 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 <function>switchINDI()</function> ühendame mõlemad seadmed.</para>
<para>Meil oli juba valik <option>"WaitForINDIAction lisamine iga INDI-toimingu järele"</option> sisse lülitatud, nii ei ole meil vaja lisada funktsiooni <function>waitForINDIAction()</function> funktsiooni <function>switchINDI()</function> 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 <function>setINDIScopeAction()</function> ja valides TRACK. Pane tähele, et teleskoop tuleb panna jälgima <emphasis>enne seda</emphasis>, kui anda koordinaadid, mida see peab jälgima. Funktsioon <function>setINDIScopeAction()</function> on õigupoolest lihtsalt mugavuse pärast - meiegi näites annab see lihtsalt üldise funktsiooni <function>setINDIAction()</function>, millele järgneb võtmesõna TRACK. Funktsiooni <function>setINDIScopeAction()</function> kasutamise eeliseks on siiski see, et KStars lisab vajaduse korral selle järele automaatselt <function>waitForINDIAction()</function>. See võimalus ei ole muidu, nagu eespool mainitud, automaatselt kättesaadav üldiste toimingute puhul.</para>
<para>Nüüd kasutame funktsiooni <function>setINDITargetName()</function> ja valime siin Marsi. Viimaste sammudega tuleb meil määrata 10-sekundiliste võtete tegemine, milleks on funktsioon <function>startINDIExposure()</function> ning nende vahele 20-sekundiliste intervallide jätmine, milleks tuleb funktsioonile <function>waitFor()</function> anda väärtuseks 20.</para>
<para>INDI teek pakub väga võimsat skriptimistööriista, mis lubab arendajatel luua ka väga keerukaid skripte. Sellest räägib lähemalt <ulink url="http://indi.sourceforge.net/manual/book1.html">INDI arendajate käsiraamat</ulink>.</para>