1
<sect1 id="tool-scriptbuilder">
3
>Værktøjet Scriptopbygning</title>
8
>Scriptopbygning</secondary>
12
>KDE-programmer kan styres fra andre programmer, fra kommandolinjen eller fra et skal-script vha. protokollen "Desktop COmmunication Protocol" (<abbrev
14
>). KStars udnytter denne mulighed til at gøre det muligt at lave scripter der udfører meget komplekse operationer, så de kan udføres igen og igen. Dette kan f.eks. bruges i undervisningsverdenen, til at forberede en demonstration af astronomiske begreber og eksempler. </para>
16
>Problemet med DCOP-scripter er at det minder meget om programmering når man skriver dem. Og derfor kan det virke uoverkommeligt at skulle lave dem i hånden hvis man ikke har erfaring med programmering. Værktøjet Scriptopbygning er en (<abbrev
18
>), en grafisk "peg og klik" brugerflade til at konstruere DCOP-scripter. På den måde bliver det meget nemmere for f.eks. lærere at lave avancerede scripter. </para>
22
>Introduktion til Scriptopbygning</title>
25
>Før jeg forklarer hvordan Scriptopbyggeren bruges, vil jeg lave en kort introduktion af alle <abbrev
27
>-komponenterne. Brug funktionen "Hvad er dette?" for at få flere informationer. </para>
31
>Værktøjet Scriptopbygning </screeninfo>
34
<imagedata fileref="scriptbuilder.png" format="PNG"/>
38
>Værktøjet Scriptopbygning</phrase>
44
>Værktøjet Scriptopbygning er vist på skærmbilledet herover. Feltet til venstre er feltet <firstterm
45
>Nuværende script</firstterm
46
>, den viser listen over de kommandoer scriptet foreløbigt består af. Feltet til højre er <firstterm
47
>Funktionsoversigten</firstterm
48
>, den viser listen over de funktioner der kan bruges i scriptet. Under funktionsoversigten er der et lille panel der kan vise kort information om den scriptfunktion der er markeret i funktionsoversigten. Under feltet nuværende script findes panelet <firstterm
49
>Funktionsargumenter</firstterm
50
>. Når en funktion markeres i feltet med det nuværende script bliver der i panelet Funktionsargumenter mulighed for at indsætte værdier for de forskellige indstillingsmuligheder funktionen har. </para
52
>Langs toppen af vinduet er der en række knapper som indvirker på scriptet som helhed. Fra venstre mod højre er det:<guibutton
53
>Nyt script</guibutton
55
>Åbn script</guibutton
57
>Gem script</guibutton
59
>Gem scriptet som...</guibutton
61
>Test script</guibutton
62
>. Funktionen af disse knapper giver sig selv, undtagen måske den sidste knap. Når man trykker på <guibutton
63
>Test script</guibutton
64
> bliver det nuværende script udført i KStars hovedvindue. Det er smart at flytte vinduet med scriptopbyggeren før du trykker på denne knap, ellers kan du jo ikke se resultatet. </para
66
>I midten af vinduet er der en lodret række knapper, som styrer individuelle scriptfunktioner. Nedefra og op er det:<guibutton
67
>Tilføj funktion</guibutton
69
>Fjern funktionen</guibutton
71
>Kopiér funktionen</guibutton
77
>Tilføj funktion</guibutton
78
> tilføjer den funktion der i øjeblikket er markeret i funktionsoversigten til scriptet (du kan også tilføje en funktion ved at dobbeltklikke på den). Resten af knapperne virker på den funktion der er markeret i feltet Nuværende script, ved enten at sletter funktionen, kopiere den eller ændre dens placering i scriptet. </para>
83
>Brug af scriptopbyggeren</title>
85
>For at illustrere hvordan scriptopbyggeren virker, vil vi gennemgå et lille eksempel, hvor vi laver et script der følger månen mens uret går meget hurtigt. </para
87
>Hvis vi vil følge Månen er vi nødt til først at indstille stjernekortet så det peger på den. Funktionen <firstterm
88
>lookToward</firstterm
89
> bruges til at gøre dette. Markér denne funktion i funktionsoversigten, og se på dokumentationen der kommer frem under oversigten. Tryk på knappen <guibutton
90
>Tilføj funktion</guibutton
91
> for at tilføje denne funktion til scriptfeltet. Panelet funktionsargumenter vil nu indeholde et kombofelt <quote
93
>, forkortelse for retning. Det er den retning stjernekortet skal ses i. Kombinationsfeltet indeholder fra starten hovedkompasretningerne ikke Månen eller andre objekter. Men du kan enten skrive <quote
95
> manuelt i feltet, eller trykke på knappen <guibutton
97
> for at bruge vinduet <guilabel
98
>Find objekt</guilabel
99
> til at vælge Månen fra listen over kendte objekter. Læg mærke til at centrering på et objekt også slår følgning af objektet til, så der er ingen grund til at tilføje <firstterm
100
>setTracking</firstterm
101
>-funktionen efter lookToward. </para
103
>Nu da vi har fået stillet ind på Månen, skal vi have tiden til at gå hurtigere. Brug funktionen <firstterm
104
>setClockScale</firstterm
105
> til dette. Tilføj den til scriptet ved at dobbeltklikke på den i funktionsoversigten. Funktionsargumentpanelet indeholder et rullefelt til at indstille tidsintervallerne for uret i simuleringen. Ret tidsintervallerne til 3 timer. </para
107
>O.k. vi har stillet ind på Månen og speedet uret op. Nu skal vi så have scriptet til at vente nogle sekunder så stjernekortet har tid til at stille ind på månen. Tilføj funktionen <firstterm
109
> til scriptet, og brug funktionsargumentpanelet til at angive at det skal vente i 20 sekunder før det går videre. </para
111
>For at afslutte stiller vi tiden til at gå normalt igen. Indsæt en ny forekomst af setClockScale og sæt dens værdi til 1 sek. </para
113
>Faktisk er vi ikke helt færdige endnu. Vi skal tvinge stjernekortet til at benytte koordinater fra ækvatorsystemet før scriptet låser sig fast på Månen og sætter farten på uret op. Hvis stjernekortet bruger koordinatsystemet horisontsystemet vil det rotere meget hurtigt over store vinkler mens Månen står op og går ned. Dette kan være meget forvirrende, og kan undgås ved at sætte indstillingen <firstterm
117
>.' For at ændre indstillinger af stjernekortet bruges funktionen <firstterm
118
>changeViewOption</firstterm
119
>. Tilføj denne funktion til scriptet og se nærmere på funktionsargumentpanelet. Der er et kombinationsfelt med alle de indstillinger der kan ændres med changeViewOption. Da vi ved at vi vil ændre indstillingen UseAltAz kan vi bare markere dette i kombinationsfeltet. Men listen er ret lang, og der er ingen beskrivelse af hvad hver indstillingsmulighed er til. Så det er måske lettere at trykke på <guibutton
120
>Gennemse træstrukturen</guibutton
121
> som vil åbne et vindue der indeholder en trævisning af de tilgængelige muligheder organiseret efter emne. Tilmed har hver indstillingsmulighed tilknyttet en kort beskrivelse af hvad den gør, og en beskrivelse af datatypen af dens værdier. Vi finder UseAltAz under kategorien <guilabel
122
>Stjernekortsindstillinger</guilabel
123
>. Markér bare dette punkt og tryk på <guibutton
125
>, og den vil blive valgt i kombinationsfeltet i funktionsargumentpanelet. Til sidst mangler vi så bare at sætte dens værdi til <quote
131
>Et skridt mere: ændringen UseAltAz indsat sidst i scriptet gør ingen nytte. Vi har brug for at ændre det før noget andet sker. Så marker funktionen i feltet Nuværende script, og tryk på <guibutton
133
> indtil det er den første funktion. </para
135
>Nu da vi er færdige med scriptet skal det gemmes på disken. Tryk på <guibutton
136
>Gem script</guibutton
137
>. Dette åbner en dialog hvor du først kan give scriptet et navn og skrive dit navn som forfatter. Skriv <quote
138
>På sporet af Månen</quote
139
> som scriptets navn og dit eget navn som forfatter, og tryk på <guibutton
141
>. Derefter vil du se &kde;s standardgemmedialog. Skriv et filnavn og tryk på <guibutton
143
> for at gemme scriptet. Vær opmærksom på at hvis filnavnet ikke ender på <quote
145
>, vil denne filendelse automatisk blive tilføjet. Hvis du er nysgerrig kan du altid læse scriptfilen i enhver teksteditor. </para
147
>Nu da vi er færdige med scriptet kan vi starte det på forskellige måder. Fra kommandolinjen kan du simpelthen køre scriptet, når bare du husker at åbne KStars først. Alternativt kan du starte scriptet inde fra KStars ved at bruge menupunktet <guimenuitem
148
>Kør script</guimenuitem
156
>Enhedsautomatisering med INDI</title>
158
>Enhedsskemalægning og automatisering understøttes for alle enheder som følger <link linkend="what-is-indi"
160
>. Du kan koordinere så mange enheder som helst til at udføre komplekse handlinger med &kstars; <link linkend="sb-intro"
162
>. Dette kan opnås ved at bruge &kstars; INDI DCOP-grænseflade. INDI DCOP-funktionerne kan deles op i fem forskellige klasser. Det følgende er en gennemgang af funktionerne som understøttes i Kstars og deres argumenter. Det anbefales at du læser afsnittet <link linkend="indi-concepts"
164
> eftersom vi udnytter nøglebegreber fra INDI i hele denne vejledning.</para>
168
>Generiske enhedsfunktioner: Funktioner til at oprette eller lukke af for enheder, osv.</para>
173
>startINDI (QString deviceName, bool useLocal)</function
174
>: Opret en INDI-enhed enten i lokaltilstand eller i servertilstand.</para
179
>shutdownINDI (QString deviceName)</function
180
>: Luk af for en INDI-enhed.</para
185
>switchINDI(QString deviceName, bool turnOn)</function
186
>: Forbind eller afbryd en INDI-enhed.</para
191
>setINDIPort(QString deviceName, QString port)</function
192
>: Indstil INDI-enhedens forbindelsesport.</para
197
>setINDIAction(QString deviceName, QString action)</function
198
>: Aktivér en INDI-handling. Handlingen kan være et hvilket som helst <emphasis
201
>skifteegenskab</emphasis
207
>waitForINDIAction(QString deviceName, QString action)</function
208
>: Hold pause i kørsel af scriptet til angiven <emphasis
209
>handlingsegenskab</emphasis
210
> returnerer med status O.k.</para
216
>Teleskopfunktioner: Funktioner til at styre teleskopbevægelser og status.</para>
221
>setINDIScopeAction(QString deviceName, QString action)</function
222
>: Indstil teleskopets tilstand eller handling. Tilgængelige tilvalg er SLEW, TRACK, SYNC, PARK og ABORT.</para
227
>setINDITargetCoord(QString deviceName, double RA, double DEC)</function
228
>: Indstil teleskopets JNow-målkoordinater til <emphasis
237
>setINDITargetName(QString deviceName, QString objectName)</function
238
>: Indstil teleskopets JNow-målkoordinater til koordinaterne for <emphasis
239
>objectName</emphasis
240
>. Kstars slår objektnavnet op i sin database og henter RA og DEC når de er fundet.</para
245
>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function
246
>: Sæt teleskopets geografiske sted til de længdegrader og breddegrader som angives. Længdegraden måles mod øst fra Greenwich, i Storbritannien. Selvom det er almindeligt at bruge negative længdegrader for den vestlige halvklode, kræver INDI imidlertid længdegrader mellem 0 og 360 grader. Hvis du har en negative længdegrad, så læg blot 360 grader til for at få værdien som INDI forventer sig. For eksempel har Calgary i Canada følgende koordinater i KStars: Længdegrad -114 04 58 og breddegrad 51 02 58. Altså ville INDI behøve længdegraden 360 - 114,069 = 245,917 grader.</para
251
>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function
252
>: Indstil teleskopets UTC-tid i ISO 8601-format. Formatet er ÅÅÅÅ/MM/DDTTT:MM:SS.(f.eks. 2004-07-12T22:05:32).</para
258
>Kamera/CCD-funktioner: Funktioner til at styre kamera/CCD-egenskaber og status.</para>
263
>setINDICCDTemp(QString deviceName, int temp)</function
264
>: Indstil CCD-kredsens måltemperatur i grader Celsius.</para
269
>setINDIFrameType(QString deviceName, QString type)</function
270
>: Indstil CCD-rammetype. Tilgængelige tilvalg er FRAME_LIGHT, FRAME_BIAS, FRAME_DARK og FRAME_FLAT.</para
275
>startINDIExposure(QString deviceName, int timeout)</function
276
>: Start eksponering med CCD eller kamera med længden som angives af <emphasis
285
>Fokuseringsfunktioner: Funktioner til at styre fokuseringsenhedens bevægelse og status.</para>
290
>setINDIFocusSpeed(QString deviceName, QString action)</function
291
>: Angiv fokuseringsenhedens hastighed. Tilgængelige tilvalg er FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM og FOCUS_FAST.</para
296
>setINDIFocusTimeout(QString deviceName, int timeout)</function
297
>: Indstil tidsgrænsen i sekunder for alle følgende startINDIFocus-handlinger.</para
302
>startINDIFocus(QString deviceName, int focusDir)</function
303
>: Flyt enten fokuseringsenheden indad (focusDir = 0) eller udad (focusDir = 1). Handlingens hastighed og varighed angives af funktionerne <function
304
>setINDIFocusSpeed()</function
306
>setINDIFocusTimeout()</function
313
>Filterfunktioner: Funktioner til at kontrollere filterpositioner.</para>
318
>setINDIFilterNum(QString deviceName, int filter_num)</function
319
>: Ændr filterposition til <varname
321
>. Brugeren kan tildele alias for filternummer i dialogen <guimenuitem
322
>Indstil INDI</guimenuitem
323
> under menuen <guimenu
325
> (f.eks. Filter 1 = Rød, Filter 2 = Grøn, etc.).</para
333
>Bemærk at enhedsnavnet er det første argument i alle INDI-funktioner. Det tillader at forskellige kommandoer som skal sendes til forskellige INDI-enheder blandes i det samme script. Værktøjet Scriptbygger sørger for to tilvalg for at gøre det nemmere at oprette og redigere INDI-scripter:</para>
338
>Tilføj WaitForINDIAction efter alle INDI-handlinger</option
339
>: Hvis dette er markeret, tilføjer scriptbyggeren automatisk <function
340
>waitForINDIAction()</function
341
> efter hver handling som genkendes. Hvis du for eksempel tilføjer funktionen <function
342
>switchINDI()</function
343
> i scriptet og tilvalget er markeret, tilføjer scriptbyggeren "waitForINDIAction CONNECTION" i scriptfilen lige efter <function
344
>switchINDI()</function
345
>. Det gør at scriptet holder pause efter <function
346
>switchINDI()</function
347
> er udført indtil <function
348
>switchINDI()</function
349
> returnerer med o.k. status (dvs. forbindelse til enheden lykkedes). Det er yderst vigtigt at vide at scriptbyggeren ikke automatisk kan tilføje <function
350
>waitForINDIAction()</function
351
> for generelle handlinger som tilføjes med funktionen <function
352
>setINDIAction()</function
353
>. Dette skyldes at Kstars ikke kan afgøre overliggende egenskab for generiske handlinger. Derfor skal du tilføje <function
354
>waitForINDIAction()</function
355
> manuelt efter generiske handlinger når det ønskes.</para>
360
>Genbrug INDI-enhedsnavn</option
361
>: Hvis dette er markeret udfyldes feltet enhedsnavn i alle efterfølgende funktioner automatisk med det seneste enhedsnavn. Det seneste enhedsnavn indstilles hver gang funktionen <function
362
>startINDI()</function
363
> tilføjes i det nuværende script. Ved arbejde med flere enheder anbefales at dette tilvalg deaktiveres.</para>
368
>Nu er vi klar til at oprette et demonstrationsscript som styrer teleskopet LX200 GPS, udover Finger Lakes CCD-kamera. Vor opgave er enkel. Vi beder teleskopet om at panorere til og følge Mars, og derefter beder vi kameraet om at tage tre billeder 10 sekunder adskilt med 20 sekunder.</para>
371
>Eftersom der ikke er nogen direkte tilbagemelding fra INDI DCOP-grænsefladen om forløbet, værdier eller status for enhedshandlinger og parametre (bortset fra <function
372
>waitForINDIAction()</function
373
>), er enhedsautomatisering i Kstars ligesom et styresystem med åben kreds. I et sådant system er der oftest ingen direkte tilbagemelding for at måle systemets tilstand og korrigere fejl. Følgelig skal du konstruere dine scripter for enhedsautomatisering med stor eftertanke. Alle automatiseringsscripter skal udsættes for nøje afprøvning inden de bruges.</para
378
>Værktøjet Scriptopbygning </screeninfo>
381
<imagedata fileref="indiscript.png" format="PNG"/>
385
>Værktøjet Scriptopbygning</phrase>
391
>Demonstrationsscriptet vises på skærmaftrykket ovenfor. Bemærk at vi markerede <option
392
>"Tilføj WaitForINDIAction efter alle INDI-handlinger"</option
393
> og afmarkerede <option
394
>"Genbrug INDI-enhedsnavn"</option
395
>. Den første funktion at tilføje er <function
396
>startINDI()</function
397
> som vises ovenfor. Vi vil køre vore enheder lokalt, så vi ændrer ikke tjenestetilstand som varetages af funktionens argumentvindue. Vi skriver vort enhedsnavn, og begynder med teleskopet "LX200 GPS". Vi gentager samme handling for "FLI CCD". Funktionen <function
399
> angives derefter. Det anbefales i almindelighed at bruge funktionen <function
401
> med det samme efter <function
402
>startINDI()</function
403
> for at holde pause i scriptet 1-5 sekunder. Dette sikrer at alle egenskaber er bygget og er klare til at tage mod kommandoer. Det er også nyttigt for at styre fjernenheder, eftersom det kan tage en vis tid at hente og bygge egenskaber. I næste funktion, <function
404
>switchINDI()</function
405
>, forbinder vi til alle enheder.</para>
409
>"Tilføj WaitForINDIAction efter alle INDI-handlinger"</option
410
> er markeret, behøver vi ikke at tilføje <function
411
>waitForINDIAction()</function
413
>switchINDI()</function
414
> for at sikre at vi kun fortsætter med at køre scriptet efter at det er lykkedes at blive forbundet. Dette skyldes at scriptbyggeren gør det automatisk for os når vi gemmer scriptet. Lad os nu indstille teleskopets tilstand til sporing. Klik på funktionen <function
415
>setINDIScopeAction()</function
416
> og vælg TRACK. Bemærk at vi skal indstille teleskopet til sporing <emphasis
418
> koordinaterne som det skal følge angives. Funktionen <function
419
>setINDIScopeAction()</function
420
> er der af bekvemmelighedsgrunde, eftersom den kun udfører den generelle funktion <function
421
>setINDIAction()</function
422
> fulgt af nøgleordet TRACK i dette eksempel. Dog er fordelen ved at bruge <function
423
>setINDIScopeAction()</function
424
> at Kstars automatisk kan tilføje <function
425
>waitForINDIAction()</function
426
> bagefter når det kræves. Dette er ikke automatisk tilgængeligt for generiske handlinger, som vi tidligere har beskrevet.</para>
429
>Derefter bruger vi funktionen <function
430
>setINDITargetName()</function
431
> og angiver Mars. Endelig omfatter de sidste få skridt at indfange et billede i 10 sekunder, hvilket kan gøres ved at bruge funktionen <function
432
>startINDIExposure()</function
433
> og vente 20 sekunder mellem kaldene, hvilket kan gøres ved at bruge funktionen <function
435
> med værdien 20.</para>
438
>Nu kan vi gemme scriptet og køre det når som helst. Det gemte script ligner det følgende:</para>
442
#KStars DCOP-script: Demoscript
444
#seneste ændring: Tor Jan 6 2005 09:58:26
446
KSTARS=`dcopfind -a 'kstars*'`
449
dcop $KSTARS $MAIN startINDI "LX200 GPS" true
450
dcop $KSTARS $MAIN startINDI "FLI CCD" true
451
dcop $KSTARS $MAIN waitFor 3
452
dcop $KSTARS $MAIN switchINDI "LX200 GPS" true
453
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" CONNECTION
454
dcop $KSTARS $MAIN switchINDI "FLI CCD" true
455
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" CONNECTION
456
dcop $KSTARS $MAIN setINDIScopeAction "LX200 GPS" TRACK
457
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" ON_COORD_SET
458
dcop $KSTARS $MAIN setINDITargetName "LX200 GPS" Mars
459
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" EQUATORIAL_EOD_COORD
460
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
461
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION
462
dcop $KSTARS $MAIN waitFor 20
463
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
464
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION
465
dcop $KSTARS $MAIN waitFor 20
466
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
467
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION