summaryrefslogtreecommitdiffstats
path: root/tde-i18n-pt/docs/tdeedu/kstars/scriptbuilder.docbook
blob: ab76872a6fa09d7c136700ad3208cd66a4d32cf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<sect1 id="tool-scriptbuilder">
<title>A Ferramenta de Construção de 'Scripts'</title>
<indexterm><primary>Ferramentas</primary>
<secondary>Construtor de 'Scripts'</secondary>
</indexterm>

<para>As aplicações do KDE podem ser controladas externamente a partir de outro programa, de uma linha de comandos da consola ou a partir de um 'script', usando o Desktop COmmunication Protocol (<abbrev>DCOP</abbrev>). O KStars tira partido desta funcionalidade para permitir que comportamentos mais complexos possam ser usados em 'scripts' e reproduzidos em qualquer altura. Isto pode ser usado, por exemplo, para criar uma demonstração para uma aula que ilustre um conceito astronómico. </para>
<para>O problemas com os programas do DCOP é que escrevê-los é de certa forma uma espécie de programação, o que poderá ser uma tarefa complicada para aqueles que não têm experiência nenhuma em programação. A Ferramenta de Construção de 'Scripts' oferece uma interface <abbrev>GUI</abbrev> para criar programas ou 'scripts' de DCOP, facilitando a criação de programas complexos. </para>

<sect2 id="sb-intro">
<title>Introdução ao Construtor de 'Scripts'</title>

<para>Antes de explicar como usar o Construtor de 'Scripts', será dada uma introdução muito breve a todos os componentes <abbrev>GUI</abbrev>; para mais informações, use a função de "O Que É Isto?". </para>

<screenshot>
<screeninfo>A Ferramenta de Construção de 'Scripts' </screeninfo>
<mediaobject>
  <imageobject>
    <imagedata fileref="scriptbuilder.png" format="PNG"/>
  </imageobject>
  <textobject>
    <phrase>Ferramenta de Construção de 'Scripts'</phrase>
  </textobject>
</mediaobject>
</screenshot>

<para>O Construtor de 'Scripts' é apresentado na imagem acima. A área à esquerda é a do <firstterm>'Script' Actual</firstterm>; ela mostra a lista dos comandos que compõem o 'script' em elaboração. A zona da direita é o <firstterm>Navegador de Funções</firstterm>; ela mostra uma lista com todas as funções de 'scripts' disponíveis. Por baixo do Navegador de Funções, existe um pequeno painel que irá mostrar uma documentação curta sobre a função seleccionada no Navegador de Funções. O painel por baixo do 'Script' Actual é o <firstterm>painel dos Argumentos da Função</firstterm>; quando for seleccionada uma função no 'Script Actual', este painel irá conter os itens para indicar os valores dos argumentos que a função seleccionada necessita. </para><para>Ao longo do topo da janela, existe uma fila de botões que lidam com o 'script' como um todo. Da esquerda para a direita, eles são: <guibutton>Novo 'Script'</guibutton>, <guibutton>Abrir um 'Script'</guibutton>, <guibutton>Gravar 'Script'</guibutton>, <guibutton>Gravar o 'Script' Como...</guibutton> e <guibutton>Testar 'Script'</guibutton>. A função destes botões deverá ser óbvia, talvez exceptuando o último botão. Se carregar em <guibutton>Testar 'Script'</guibutton>, o 'script' actual tentará ser executado na janela principal do KStars. Você deverá mover a janela do Construtor do 'Script' da frente antes de carregar nisto, para que possa ver os resultados. </para><para>No centro da janela, existe uma coluna de botões que operam em funções individuais do 'script'. De cima para baixo, estas são: <guibutton>Adicionar Função</guibutton>, <guibutton>Remover Função</guibutton>, <guibutton>Copiar Função</guibutton>, <guibutton>Subir</guibutton> e <guibutton>Descer</guibutton>. O <guibutton>Adicionar Função</guibutton> adiciona a função seleccionada de momento no Navegador de Funções na zona do 'Script' Actual (você poderá também adicionar uma função se fizer duplo-click nela). O resto dos botões lidam com a função seleccionada no 'Script Actual', removendo-a, duplicando-a ou mudando a sua posição no 'script' actual. </para>
</sect2>

<sect2 id="sb-using">
<title>Utilizar o Construtor de 'Scripts'</title>
<para>Para ilustrar a utilização do Construtor de 'Scripts', iremos apresentar um pequeno exemplo de tutorial onde iremos criar um 'script' que segue a Lua enquanto o relógio anda a uma velocidade acelerada. </para><para>Se vamos seguir a Lua, teremos de apontar a visualização para ela em primeiro lugar. A função <firstterm>lookToward</firstterm> é usada para isso. Seleccione esta função no Navegador de Funções, tendo em atenção a documentação que é mostrada no painel por baixo do Navegador. Carregue no botão <guibutton>Adicionar Função</guibutton> para adicionar esta função à área do 'Script Actual'. O painel dos Argumentos da Função irá conter agora uma lista chamada <quote>dir</quote>, que é uma abreviatura de 'direction' (direcção). Esta a direcção para a qual a visualização deverá ser apontada. A lista contém apenas os pontos cardeais, não a Lua ou outros objectos quaisquer. Você poderá então escrever <quote>Lua</quote> na opção manualmente, ou carregar no botão <guibutton>Objecto</guibutton> para usar a janela de <guilabel>Procurar um Objecto</guilabel> para seleccionar a Lua da lista de objectos identificados. Repare que, como de costume, o foco num objecto activa automaticamente o modo de seguimento do objecto, por isso não há necessidade de adicionar a função <firstterm>setTracking</firstterm> depois do 'lookToward'. </para><para>Agora que já tratámos de apontar para a Lua, queremos fazer o tempo passar a uma velocidade acelerada. Use a função <firstterm>setClockScale</firstterm> para isso. Adicione-a ao 'script' fazendo duplo-click nela no Navegador de Funções. O painel de Argumentos da Função contém um selector para indicar a iteração temporal desejada para o relógio da simulação. Mude essa iteração para 3 horas. </para><para>OK, já apontámos para a Lua e acelerámos o relógio. Agora só queremos que o 'script' espere durante vários segundos enquanto a visualização persegue a Lua. Adicione a função <firstterm>waitFor</firstterm> ao 'script' e use o painel de Argumentos da Função para indicar que deverá esperar 20 segundos antes de continuar. </para><para>Para terminar, vamos repor a iteração temporal do relógio para o valor normal de 1 segundo. Adicione outra instância do 'setClockScale', e coloque o seu valor a 1 s. </para><para>De facto, ainda não terminámos realmente. Temos provavelmente que nos certificar a visualização está a usar coordenadas Equatoriais antes de o 'script' seguir a Lua com uma iteração temporal acelerada. Caso contrário, se a visualização estiver a usar coordenadas Horizontais, ela irá rodar muito depressa, com ângulos grandes, à medida que a Lua nasce e se põe. Isto poderá ser muito confuso, e é evitado se usar a opção de visualização <firstterm>UseAltAz</firstterm> igual a <quote>false</quote>. Para mudar uma opção de visualização qualquer, use a função <firstterm>changeViewOption</firstterm>. Adicione esta função ao 'script' e analise o painel dos Argumentos da Função. Existe uma lista que contém todas as opções de visualização que poderão ser ajustadas com o 'changeViewOption'. Dado que sabemos que queremos usar a opção UseAltAz, poderemos simplesmente seleccioná-la na lista. Contudo, a lista é muito grande, e não existe nenhuma explicação para que é que serve cada item. Por isso poderá ser mais fácil carregar no botão <guibutton>Árvore de Navegação</guibutton>, o qual irá abrir uma janela que contém uma árvore com todas as opções de visualização, organizadas por tópico. Para além disso, cada item tem uma breve explicação do que é que a opção faz e o tipo de dados do valor da opção. A opção UseAltAz encontra-se sob a categoria <guilabel>Opções do mapa do céu</guilabel>. Basta seleccionar este item e carregar em <guibutton>OK</guibutton>, para que fique seleccionado na lista do painel dos Argumentos da Função. Finalmente, coloque o seu valor a <quote>false</quote> ou a <quote>0</quote>. </para><para>Um passo mais: a alteração do 'UseAltAz' no fim do 'script' não nos faz nada bem; precisamos que isto seja alterado antes que algo de mau aconteça. Por isso, certifique-se que esta função é seleccionada na janela do 'Script Actual' e carregue no botão <guibutton>Subir</guibutton> até que seja a primeira função. </para><para>Agora que terminámos o 'script', deveremos gravá-lo em disco. Carregue no botão <guibutton>Gravar 'Script'</guibutton>. Isto irá abrir em primeiro lugar uma janela onde poderá indicar um nome para o 'script' e preencher o seu nome como autor. Indique como nome <quote>Seguir a Lua</quote> e o seu nome como autor, carregando depois em <guibutton>OK</guibutton>. De seguida, você irá ver a janela normal de Gravar um Ficheiro do &kde;. Indique o nome do ficheiro do 'script' e carregue em <guibutton>OK</guibutton> para gravar o código. Repare que, se o seu ficheiro não terminar em <quote>.kstars</quote>, este sufixo será adicionado automaticamente. Se você for curioso, poderá examinar o ficheiro do 'script' com um editor de texto qualquer. </para><para>Agora que temos um 'script' completo, poderemos corrê-lo de várias formas. Numa linha de comandos da consola, você poderá simplesmente executar o 'script', desde que esteja aberta uma instância do KStars em execução. Em alternativa, você poderá executar o programa no KStars com o item <guimenuitem>Executar 'Script'</guimenuitem> do menu <guimenu>Ficheiro</guimenu>. </para>
</sect2>

<sect2 id="sb-indi">
  <title>Automação do Dispositivo com o INDI</title>
  <para>O escalonamento e automação do dispositivo é suportado por todos os dispositivos compatíveis com o <link linkend="what-is-indi">INDI</link>. Poderá coordenar qualquer número de dispositivos para efectuar operações complexas com o <link linkend="sb-intro">Construtor de 'Scripts'</link> do &kstars;. Isto poderá ser feito se usar a interface DCOP do INDI do &kstars;, que oferece várias classes de funções diferentes para se adequar às suas tarefas. As funções de DCOP do INDI poderão ser decompostas em quatro diferentes classes. Segue-se uma revisão das funções e dos seus argumentos, tal como são suportadas no KStars. É altamente recomendado que leia a secção de <link linkend="indi-concepts">Conceitos do INDI</link>, dado que serão aplicados conceitos-chave do INDI ao longo deste tutorial.</para>
  <orderedlist>
    <listitem><para>Funções Genéricas do Dispositivo: Funções para estabelecer/desligar os dispositivos, etc.</para>
      <itemizedlist>
	<listitem><para><function>startINDI (QString nomeDispositivo, bool usoLocal)</function> : Estabelece um serviço do INDI quer como local quer como servidor.</para></listitem>
	<listitem><para><function>shutdownINDI (QString nomeDispositivo)</function> : Desliga o serviço do INDI.</para></listitem>
	<listitem><para><function>switchINDI(QString nomeDispositivo, bool ligar)</function> : Liga ou desliga um dispositivo do INDI.</para></listitem>
	<listitem><para><function>setINDIPort(QString nomeDispositivo, QString porto)</function> : Indica o porto de ligação do dispositivo.</para></listitem>
	<listitem><para><function>setINDIAction(QString nomeDispositivo, QString accao)</function> : Activa uma acção do INDI. A acção poderá ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção</emphasis></para></listitem>
	<listitem><para><function>waitForINDIAction(QString nomeDispositivo, QString accao)</function> : Coloca a execução do programa em pausa até que a acção <emphasis>propriedade</emphasis> da acção indicada seja devolvida com um estado OK.</para></listitem>
      </itemizedlist>
    </listitem>
    <listitem><para>Funções do Telescópio: Funções para controlar o movimento e o estado do telescópio.</para>
      <itemizedlist>
	<listitem><para><function>setINDIScopeAction(QString nomeDispositivo, QString accao)</function> : Muda o modo ou a acção do telescópio. As opções disponíveis são a SLEW, TRACK, SYNC, PARK e a ABORT.</para></listitem>
	<listitem><para><function>setINDITargetCoord(QString nomeDispositivo, double AR, double DEC)</function> : Define as coordenadas-alvo JNow do telescópio para uma dada <emphasis>AR</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
	<listitem><para><function>setINDITargetName(QString nomeDispositivo, QString nomeObjecto)</function> : Configura as coordenadas-alvo JNow do telescópio para as coordenadas do <emphasis>nomeObjecto</emphasis>. O KStars irá procurar o nome do objecto na sua base de dados e irá obter a AR e a Dec deste, se for encontrado.</para></listitem>
	<listitem><para><function>setINDIGeoLocation(QString nomeDispositivo, double longitude, double latitude)</function> : Configura a localização geográfica do telescópio para a latitude e longitude indicadas. A longitude é medida a partir de Greenwich, no Reino-Unido, para Este. Contudo, embora seja comum usar longitudes negativas para o hemisfério ocidental, o INDI está à espera de valores de longitude entre 0 e 360 graus. Como tal, se estiver uma longitude negativa, basta adicionar 360 graus para obter o valor esperado pelo INDI. Por exemplo, as coordenadas de Calgary, no Canadá, correspondem no &kstars; à longitude: -114 04 58 - latitude: 51 02 58. Como tal, o INDI iria necessitar da longitude = 360 - 114,083 = 245,917 graus.</para></listitem>
	<listitem><para><function>setINDIUTC(QString nomeDispositivo, QString dataHomeUTC)</function> : Configura a data e hora UTC do telescópio no formato ISO 8601. O formato é igual a AAAA-MM-DDTHH:MM:SS (p.ex. 2004-07-12T22:05:32).</para></listitem>
      </itemizedlist>
    </listitem>
    <listitem><para>Funções da Câmara/CCD: Funções para controlar as propriedades e o estado da câmara/CCD.</para>
      <itemizedlist>
	<listitem><para><function>setINDICCDTemp(QString nomeDispositivo, int temp)</function> : Configura a temperatura-alvo do 'chip' CCD em graus Celsius (centígrados).</para></listitem>
	<listitem><para><function>setINDIFrameType(QString nomeDispositivo, QString tipo)</function> : Configura o tipo de imagem do CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK e FRAME_FLAT.</para></listitem>
	<listitem><para><function>startINDIExposure(QString nomeDispositivo, int tempoLimite)</function> : Inicia a exposição do CCD/Câmara durante o período em segundos indicado em <emphasis>tempoLimite</emphasis>.</para></listitem>
      </itemizedlist>
    </listitem>    
   <listitem><para>Funções do Sistema de Foco: Funções para controlar o movimento e o estado do sistema de foco.</para>
      <itemizedlist>
      <listitem><para><function>setINDIFocusSpeed(QString nomeDispositivo, QString accao)</function> : Configura a velocidade do sistema de foco. As opções disponíveis são a FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM e a FOCUS_FAST.</para></listitem>
      <listitem><para><function>setINDIFocusTimeout(QString nomeDispositivo, int tempoLimite)</function> : Configura a duração em segundos para quaisquer operações subsequentes do 'startINDIFocus'.</para></listitem>
      <listitem><para><function>startINDIFocus(QString nomeDispositivo, int dirFoco)</function> : Move o sistema de foco quer para dentro (dirFoco = 0) quer para fora (dirFoco = 1). A velocidade e a duração desta operação é definida pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
    </itemizedlist>
    </listitem>
   <listitem><para>Funções do Filtro: Funções para controlar a posição do filtro.</para>
      <itemizedlist>
      <listitem><para><function>setINDIFilterNum(QString nomeDispositivo, int num_filtro)</function> : Muda a posição do filtro para <varname>num_filtro</varname>. O utilizador poderá atribuir nomes alternativos aos números dos filtros na janela para <guimenuitem>Configurar o INDI</guimenuitem>, no menu <guimenu>Dispositivos</guimenu> (p.ex. Filtro 1 = Vermelho, Filtro 2 = Verde..etc).</para></listitem>
    </itemizedlist>
    </listitem>
    
  </orderedlist>
  
<para>Repare que o nome do dispositivo é o primeiro argumento de todas as funções do INDI. Isto permite vários comandos que são enviados para dispositivos INDI diferentes serem interligados em conjunto num programa. A ferramenta de Construção de 'Scripts' oferece duas opções para facilitar a criação e a edição dos programas INDI:</para>
<itemizedlist>
  <listitem><para><option>Adicionar waitForINDIAction após qualquer acção do INDI</option> : Quando estiver assinalada esta opção, a ferramenta do Construtor de 'Scripts' irá adicionar automaticamente um <function>waitForINDIAction()</function> depois de cada acção que reconhecer. Por exemplo, se adicionar a função <function>switchINDI()</function> ao programa e esta opção estiver assinalada, o Construtor do 'Script' irá adicionar um "waitForINDIAction CONNECTION" no ficheiro do 'script' logo a seguir ao <function>switchINDI()</function>. Isto fará com que o 'script' entre em pausa depois de emitir o <function>switchINDI()</function>, até que o <function>switchINDI()</function> devolva um estado OK (&ie; a ligação ao dispositivo foi bem-sucedida). É de importância crítica saber que o Construtor do 'Script' não poderá adicionar automaticamente o <function>waitForINDIAction()</function> para as acções genéricas adicionadas com a função <function>setINDIAction()</function>. Isto deve-se ao facto de o KStars não conseguir determinar a propriedade 'parent' das acções genéricas. Como tal, terá de adicionar manualmente o <function>waitForINDIAction()</function> a seguir às acções genéricas, sempre que tal for desejado.</para>
  </listitem>
  <listitem><para><option>Reutilizar o nome do dispositivo INDI</option> : Quando estiver assinalada, o campo do nome do dispositivo de todas as funções subsequentes é preenchido automaticamente com o último nome de dispositivo. Este último nome é preenchido de cada vez que a função <function>startINDI()</function> é adicionada ao programa actual. Ao trabalhar com vários dispositivos, recomenda-se ter esta opção desligada.</para>
  </listitem>
</itemizedlist>

<para>Agora, está tudo pronto para criar um programa de demonstração que controla o telescópio GPS LX200, para além da câmara CCD Finger Lakes. A tarefa será simples. Vai-se pedir ao telescópio para apontar e seguir Marte, pelo que se pede depois à câmara para tirar três fotografias de 10 segundos, separadas por 20 segundos.</para>
<important><para>Dado que não existe nenhuma reacção na interface de DCOP do INDI sobre o progresso, o valor ou o estado das operações e parâmetros do dispositivo (excepto no <function>waitForINDIAction()</function>), a automação do dispositivo no KStars é semelhante a um sistema de controlo com uma malha aberta. Nestes sistemas, não existe normalmente qualquer reacção directa para medir o progresso do sistema e para corrigir os seus erros. Por consequência, terá de desenhar os seus programas de automação do dispositivo com uma consideração cuidadosa. Todos os programas de automação deverão ser sujeitos a testes rigorosos antes da instalação.</para></important>

<screenshot>
  <screeninfo>A Ferramenta de Construção de 'Scripts' </screeninfo>
  <mediaobject>
    <imageobject>
      <imagedata fileref="indiscript.png" format="PNG"/>
    </imageobject>
    <textobject>
      <phrase>Ferramenta de Construção de 'Scripts'</phrase>
    </textobject>
  </mediaobject>
</screenshot>

<para>O programa de demonstração é mostrado na imagem acima. Repare que a opção <option>"Adicionar o waitForINDIAction após qualquer acção do INDI"</option> está ligada e a <option>"Reutilizar o nome do dispositivo INDI"</option> está desligada. A primeira função a adicionar é a <function>startINDI()</function>, tal como é demonstrado acima. Os dispositivos vão ser corridos de forma local, como tal não serão alterado o modo de serviço fornecido na janela de argumento da função. Será indicado o nome do dispositivo, a começar pelo telescópio "LX200 GPS". A mesma operação será repetida para o "FLI CCD". Existe uma função <function>waitFor()</function> a seguir a isso. Recomenda-se geralmente o uso da função <function>waitFor()</function> logo a seguir ao <function>startINDI()</function> para parar o programa durante 1-5 segundos. Isto irá garantir que todas as propriedades são criadas e que estão prontas para receber comandos. Também é útil para controlar dispositivos remotos, dado que a obtenção e criação de propriedades poderá levar algum tempo. Na próxima função, a <function>switchINDI()</function>, vai-se estabelecer a ligação a cada dispositivo.</para>

<para>Dado que a opção <option>"Adicionar o waitForINDIAction após qualquer acção do INDI"</option> está assinalada, não é necessário adicionar um <function>waitForINDIAction()</function> depois do <function>switchINDI()</function> para garantir que só se continua a execução do programa após uma ligação com sucesso. Isto acontece porque a ferramenta do Construtor de 'Scripts' fará isso automaticamente pelo utilizador, quando gravar o programa. Agora, vai-se colocar o modo do telescópio em seguimento, carregando para tal na função <function>setINDIScopeAction()</function> e seleccionando o TRACK. Lembre-se que necessita de colocar o telescópio no modo de seguimento <emphasis>antes</emphasis> de emitir as coordenadas que ele irá seguir. A função <function>setINDIScopeAction()</function> é oferecida por conveniência, dado que, neste exemplo, ela emite apenas uma função genérica <function>setINDIAction()</function>, seguida da palavra-chave TRACK. Contudo, o benefício de usar o <function>setINDIScopeAction()</function> é que o KStars poderá adicionar automaticamente um <function>waitForINDIAction()</function> a seguir, quando for necessário. Esta funcionalidade não fica disponível automaticamente para as acções genéricas, tal como foi discutido anteriormente.</para>

<para>A seguir, será usada a função <function>setINDITargetName()</function> para apontá-lo para Marte. Finalmente, os últimos passos envolvem a captura de uma imagem durante 10 segundos, o qual poderá ser feito com a função <function>startINDIExposure()</function>, esperando 20 segundos entre cada uma, o que poderá também ser feito com a função <function>waitFor()</function> com um valor igual a 20.</para>

<para>Poder-se-á agora gravar o programa e executá-lo em qualquer altura. O programa gravado será semelhante ao seguinte:</para>
<blockquote><programlisting>#!/bin/bash
    #Programa de DCOP do KStars: Programa de Demonstração
    #de Jasem Mutlaq
    #última modificação: Qui 6 Jan 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
</programlisting>
</blockquote>

<note>
<para>A biblioteca do INDI oferece ferramentas de programação robustas quer permitem aos programadores orquestrarem programas muito complexos. Para mais detalhes, veja o <ulink url="http://indi.sourceforge.net/manual/book1.html">Manual de Programador do INDI</ulink>.</para>
</note>
</sect2>
</sect1>