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
|
<sect1 id="tool-scriptbuilder">
<title>A Ferramenta de Construção de Script</title>
<indexterm><primary>Ferramentas</primary>
<secondary>Construtor de Script</secondary>
</indexterm>
<para>Aplicativos KDE podem ser controlados externamente a partir de outro programa, da linha de comando do console, ou a partir de um script shell usando o Protocolo de Comuniação do Ambiente de Trabalho (do inglês, <abbrev>DCOP</abbrev>). O KStars aproveita este recurso para permitir que comportamentos complexos sejam roteirizados e executados repetidamente a qualquer hora. Isto pode ser usado, por exemplo, para criar uma aula demonstrativa para ilustrar um conceito astronômico. </para>
<para>O problema com scripts DCOP é que escrevê-los é um pouco parecido com programação, e pode ser uma tarefa desanimadora para quem não possui experiência de programação. A Ferramenta de Construção de Script fornece uma <abbrev>GUI</abbrev> do tipo apontar e clicar para construir scripts DCOP para o KStars, tornando muito fácil criar scripts complexos. </para>
<sect2 id="sb-intro">
<title>Introdução ao Construtor de Script</title>
<para>Antes de explanar como usar o Construtor de Script, eu fornecerei uma introdução bem resumida de todos os componentes <abbrev>GUI</abbrev>; para mais informações, use a função "O Que É Isso?". </para>
<screenshot>
<screeninfo>A Ferramenta de Construção de Script </screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="scriptbuilder.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ferramenta de Construção de Script</phrase>
</textobject>
</mediaobject>
</screenshot>
<para>O Construtor de Script é mostrado na captura de tela acima. A caixa à esquerda é a <firstterm>caixa do Script Atual</firstterm>; ela mostra a lista de comandos que compreende o script de trabalho atual. A caixa à direita é o <firstterm>Navegador de Função</firstterm>; ele mostra a lista de todas as funções de script disponíveis. Abaixo do Navegador de Função, existe um pequeno painel que exibirá uma documentação resumida sobre a função de script destacada no Navegador de Função. O painel abaixo da caixa de Script Atual é o <firstterm>painel de Argumentos da Função</firstterm>; quando uma função é destacada na caixa do Script Atual, este painel conterá todos os ítens para valores especificados para qualquer argumento que a função destacada precise. </para><para>Ao longo do topo da janela, existe uma linha de botões que operam no script como um todo. Da esquerda para direita, eles são: <guibutton>Novo Script</guibutton>, <guibutton>Abrir Script</guibutton>, <guibutton>Salvar Script</guibutton>, <guibutton>Salvar Script Como...</guibutton> e <guibutton>Testar Script</guibutton>. A função destes botões deve ser óbvia, execto talvez o último botão. Pressionar <guibutton>Testar Script</guibutton> experimentará a execução do script atual na janela principal do KStars. Você deve tirar a janela do Construtor do Script da frente antes de pressionar isto, de modo 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, elas são: <guibutton>Adicionar Função</guibutton>, <guibutton>Remover Função</guibutton>, <guibutton>Copiar Função</guibutton>, <guibutton>Mover Acima</guibutton> e <guibutton>Mover Abaixo</guibutton>. <guibutton>Adicionar Função</guibutton> adiciona a função atualmente destacada no Navegador de Função à caixa do Script Atual (você pode também adicionar uma função dando um duplo-clique nela). O resto dos botões operam na função destacada na caixa do Script Atual, seja removendo-a, duplicando-a, ou mudando sua posição no script atual. </para>
</sect2>
<sect2 id="sb-using">
<title>Usando o Construtor de Script</title>
<para>Para ilustrar o uso do Construtor de Script, nós apresentaremos um pequeno tutorial exemplo onde nós criaremos um script que rastreia a Lua enquanto o relógio roda a uma taxa acelerada. </para><para>Se nós iremos rastrear a Lua, nós precisaremos apontar o mostrador primeiro. A função <firstterm>lookToward</firstterm> é usada para fazer isto. Destaque esta função no Navegador de Função e observe a documentação exibida no painel abaixo do Navegador. Pressione o botão <guibutton>Adicionar Função</guibutton> para adicionar esta função na caixa de Script Atual. O painel de Argumentos da Função agora conterá uma caixa combinada rotulada <quote>dir</quote>, abreviatura para direção. Esta é a direção na qual o mostrador deverá ser apontado. A caixa combinada contém somente os pontos cardinais, não a Lua ou qualquer outro objeto. Você pode inserir <quote>Lua</quote> na caixa manualmente, ou pressionar o botão <guibutton>Objeto</guibutton> para usar a janela <guilabel>Procurar Objeto</guilabel> para selecionar a Lua na lista de objetos nomeados. Observe que, como sempre, centrar em um objeto engaja automaticamente o modo de rastreamento do objeto, logo não é necessário adicionar a função <firstterm>setTracking</firstterm> após a lookToward. </para><para>Agora que nós já apontamos para Lua, nós vamos em seguida criar um passo de tempo numa taxa acelerada. Use a função <firstterm>setClockScale</firstterm> para isto. Adicione-a ao script com um duplo-clique nela no Navegador de Função. O painel de Argumentos da Função contém um caixa de contagem de passo de tempo para configurar o passo de tempo desejado para a simulação do relógio. Mude o passo de tempo para 3 horas. </para><para>OK, nós já apontamos para a Lua e aceleramos o relógio. Agora nós queremos simplesmente que o script espere por alguns segundo enquanto exibe a trilha da Lua. Adicione a função <firstterm>waitFor</firstterm> ao script, e use o painel de Argumentos da Função para especificar que ele deve esperar por 20 segundos antes de continuar. </para><para>Para finalizar, vamos reiniciar o passo de tempo do relógio para o valor normal de 1 segundo. Adicione outra instância do setClockScale, e configure seu valor para 1 segundo. </para><para>Nós ainda não terminados. Nós devemos provavelmente certificarmos-nos que o mostrador está usando coordenadas Equatoriais antes do script rastrear a Lua com o passo acelerado de tempo. Caso contrário, se o mostrador estiver usando coordenadas Horizontais, ele rotacionará muito rapidamente com grandes ângulos conforme a Lua nasce e se põe. Isto pode ser muito confuso, e é evitado configurando a Opção de Visão <firstterm>UseAltAz</firstterm> para <quote>false</quote>. Para mudar qualquer Opção de Visão, use a função <firstterm>changeViewOption</firstterm>. Adicione esta função ao script, e examine o painel de Argumentos da Função. Existe uma caixa combinada que contém uma lista de todas as opções que pode ser ajustadas pelo changeViewOption. Uma vez que nós desejamos a opção UseAltAz, nós podemos simplesmente selecioná-la na caixa combinada. No entanto, a lista é muito longa, e não existe nehuma explanação sobre o que é cada ítem. Talvez seja mais fácil pressionar o botao <guibutton>Navegar Árvore</guibutton>, que abrirá uma janela contendo uma visão em árvore das opções disponíveis, organizadas por tópico. Além disso, cada ítem possui uma explanação resumida do que a opção faz, e o tipo de dado do valor da opção. Nós encontramos o UseAltAz na categoria <guilabel>Opções do mapa celeste</guilabel>. Simplesmente destaque este ítem e pressione <guibutton>OK</guibutton>, e ele será selecionado na caixa combinada do painel de Argumentos da Função. Finalmente, torne este valor <quote>false</quote> ou <quote>0</quote>. </para><para>Mais um passo: mudar o UseAltAz no final do script não é o que queremos; nós precisamos que isto seja mudado antes de qualquer coisa acontecer. Logo, certifique-se de que esta função esteja destacada na caixa do Script Atual, e pressione o botão <guibutton>Mover Acima</guibutton> até que ela seja a primeira função. </para><para>Agora que terminamos o script, nós devemos salvá-lo no disco. Pressione o botão <guibutton>Salvar Script</guibutton>. Isto primeiro abrirá uma janela da qual você pode fornecer um nome para o script, e preencher seu nome como autor. Insira <quote>Rastreando a Lua</quote> para o nome, e seu nome como autor, e pressione <guibutton>OK</guibutton>. A seguir, você verá o diálogo padrão do &kde; de Salvar Arquivo. Especifique um nome de arquivo para o script e pressione <guibutton>OK</guibutton> para salvar o script. Observe que se seu nome de arquivo não terminar com <quote>.kstars</quote>, este sufixo será automaticamente anexado. Se estiver curioso, você pode examinar o arquivo de script com qualquer editor de texto. </para><para>Agora que nós completamos o script, nós podemos executá-lo de diversas maneiras. A partir da linha de comando do console, você pode simplesmente executar o script caso um instância do KStars esteja atualmente em execução. Alternativamente, você pode executar o script de dentro do KStars usando o ítem <guimenuitem>Executar Script</guimenuitem> no menu <guimenu>Arquivo</guimenu>. </para>
</sect2>
<sect2 id="sb-indi">
<title>Automação de Dispositivos com o INDI</title>
<para>O agendamento e automação de dispositivos é suportado para todos os dispositivos compatíveis com o <link linkend="what-is-indi">INDI</link>. Você pode coordenar qualquer número de dispositivos para realizarem operações complexas usando o <link linkend="sb-intro">Construtor de Scripts</link> do &kstars;. Isto pode ser conseguido usando a interface DCOP INDI do &kstars;, que fornece diferentes classes de funções para atender as suas tarefas. As funções DCOP INDI podem ser divididas em quatro classes diferentes. A seguir está uma revisão das funções e seus argumentos como suportados pelo KStars. É altamente recomendável ler a seção <link linkend="indi-concepts">Conceitos do INDI</link> uma vez que empregaremos conceitos chaves do INDI neste tutorial.</para>
<orderedlist>
<listitem><para>Funções de Dispositivo Genéricas: Funções para estabelecer/desligar dispositivos, etc.</para>
<itemizedlist>
<listitem><para><function>startINDI (TQString dispoNome, bool usarLocal)</function> : Estabelece um serviço INDI seja local ou servidor.</para></listitem>
<listitem><para><function>shutdownINDI (TQString dispoNome)</function> : Desliga o serviço INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString dispoNome, bool tornarOn)</function> : Conecta ou Disconecta um dispositivo INDI.</para></listitem>
<listitem><para><function>setINDIPort(TQString dispoNome, TQString porta)</function> : Configura a porta de conexão do dispositivo.</para></listitem>
<listitem><para><function>setINDIAction(TQString dispoNome, TQString acao)</function> : Ativa uma ação INDI. A ação pode ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção/ação</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(TQString dispoNome, TQString acao)</function> : Pausa a execução do script atá a <emphasis>propriedade</emphasis> de ação especificada retornar com estado OK.</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Funções de Telescópio: Funções para controlar o movimento e estado do telescópio.</para>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(TQString dispoNome, TQString acao)</function> : Configura o modo do telescópio ou ação. As opções disponíveis são SLEW, TRACK, SYNC, PARK, e ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString dispoNome, double RA, double DEC)</function> : Configura as coordenadas alvo JNow do telescópio para <emphasis>RA</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(TQString dispoNome, TQString objetoNome)</function> : Configura as coordenadas alvo JNow do telescópio para as coordenadas do <emphasis>objectName</emphasis>. O KStars procurará o nome do objeto no banco de dados e retornará a RA and Dec uma vez encontradas.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString dispoNome, double longitude, double latitude)</function> : Configura a localização geográfica para a longitude e latitude especificadas. A longitude é calculada E de N. Por exemplo, as coordenadas de Calgary - Canada no KStars são longitude: -114 04 58 - latitude: 51 02 58. <emphasis>Somente</emphasis> longitudes negativas precisam ser convertidas. Para converter a longitude para a notação E de N, consideremos a longitude possitiva e adicionamos 180 graus a ela. Assim, em nosso exemplo, a longitude do INDI = 114 04 08 + 180 00 00 = 294 04 08 E de N.</para></listitem>
<listitem><para><function>setINDIUTC(TQString dispoNome, TQString DataHoraUTC)</function> : Configura a Data e Hora UTC do telescópio no formato ISO 8601. O formato é AAAA-MM-DDTHH:MM:SS (e.g. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Funções de Focador: Funções para controlar o movimento e estado do focador.</para>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(TQString dispoNome, TQString acao)</function> : Configura a velocidade do focador. As opções disponíveis são FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, e FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString dispoNome, int espera)</function> : Configura a duração em segundos para qualquer operação subsequente de startINDIFocus.</para></listitem>
<listitem><para><function>startINDIFocus(TQString dispoNome, int focoDir)</function> : Move o focador seja para próximo (focoDir = 0) ou para longe (focoDir = 1). A velocidade e duração desta operação é configurada pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Funções de Câmera/CCD: Funções para controlar as propriedades e estado da câmera/CCD.</para>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(TQString dispoNome, int temp)</function> : Configura a temperatura alvo do chip CCD em graus celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString dispoNome, TQString tipo)</function> : Configura o tipo de quadro CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, e FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(TQString dispoNome, int espera)</function> : Inicia a exposição do CCD/Câmera pela duração especificada por <emphasis>espera</emphasis> em segundos.</para></listitem>
</itemizedlist>
</listitem>
</orderedlist>
<para>Observe que o nome do dispositivo é o primeiro argumento de todas as funções INDI. Isto permite que comandos diferentes que sejam enviados para dispositivos INDI diferentes sejam misturados juntos em um script. A ferramenta Construtor de Scripts fornece duas opções para facilitar a criação e edição de scripts INDI:</para>
<itemizedlist>
<listitem><para><option>Adicionar waitForINDIAction após qualquer ação INDI</option>: Quando habilitado, a ferramenta Construtor de Script automaticamente adicionará <function>waitForINDIAction()</function> após qualquer ação que ele reconheça. Por exemplo, se você adicionar a função <function>switchINDI()</function> ao script e esta opção estiver habilitada, o Construtor de Scripts adicionará "waitForINDIAction CONNECTION" no arquivo de script logo após o <function>switchINDI()</function>. Isto fará que o script pause após ele enviar o <function>switchINDI()</function> até que o <function>switchINDI()</function> retorne o estado OK (&ie; conexão com dispositivo bem sucedida). É importante saber que o Construtor de Scripts não adicionará automaticamente o <function>waitForINDIAction()</function> para ações genéricas adicionadas usando a função <function>setINDIAction()</function>. Isto é porque o KStars não pode determinar a propriedade pai de ações genéricas. Deste modo, você deve adicionar manualmente o <function>waitForINDIAction()</function> após ações genéricas quando desejar.</para>
</listitem>
<listitem><para><option>Reutilizar o nome do dispositivo INDI</option>: Quando habilitado, o campo do nome do dispositivo de todas as funções subsequentes será automaticamente preenchido com o útlimo nome de dispositivo. O último nome de dispositivo é configurado toda vez que a função <function>startINDI()</function> é adicionada ao script atual. Ao trabalhar com dispositivos múltiplos, é recomendável desligar esta opção.</para>
</listitem>
</itemizedlist>
<para>Agora estamos prontos para criar um script de demonstração que controla o telescópio LX200 GPS, em adição a uma câmera Finger Lakes CCD. Nossa tarefa é simples. Nós pediremos ao telescópio para apontar e rastrear Marte, então nós pediremos para câmera tirar três fotografias de 10 segundos cada separadas por 20 segundos.</para>
<important><para>Uma vez que não existe retorno direto da interface DCOP INDI sobre o progresso, valor ou estado das operações e parâmetros do dispositivo (exceto para o <function>waitForINDIAction()</function>), a automação do dispositivo no KStars é semelhante a um sistema de controle de loop aberto. Neste tipo de sistema, não existe normalmente nenhum retorno direto de medida de progresso do sistema e para correção de erros. Consequentemente, você deve desenhar seu script de automação de dispositivo com muito cuidado. Todos os scripts de automação devem ser sujeitos a testes rigorosos antes do seu emprego.</para></important>
<screenshot>
<screeninfo>A Ferramenta de Construção de Script </screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="indiscript.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ferramenta de Construção de Script</phrase>
</textobject>
</mediaobject>
</screenshot>
<para>O script de demonstração é mostrado na captura de tela acima. Observe que nós habilitamos o <option>"Adicionar waitForINDIAction após qualquer ação INDI"</option> e desabilitamos <option>"Reutilizar o nome do dispositivo INDI"</option>. A primeira função a adicionar é <function>startINDI()</function> como mostrado acima. Nós queremos rodar nossos dispositivos localmente, assim nós não mudamos o modo de serviço fornecido na janela de argumentos da função. Nós digitamos nosso nome de dispositivo, iniciando com o telescópio "LX200 GPS". Nós repetimos a mesma operação novamente para o "FLI CCD". Existe uma função <function>waitFor()</function> após isto. É normalmente recomendável usar a função <function>waitFor()</function> imediatamente após o <function>startINDI()</function> para pausar o script por 1-5 segundos. Isto irá garantir que todas as propriedades estão configuradas e prontas para receberem comandos. Isto também é útil para controlar dispositivos remotos pois a configuração das propriedades pode levar algum tempo. Na próxima função, <function>switchINDI()</function>, nós conectamos cada dispositivo.</para>
<para>Uma vez que o <option>"Adicionar waitForINDIAction após qualquer ação INDI"</option> está habilitada, nós não precisamos adicionar <function>waitForINDIAction()</function> após o <function>switchINDI()</function> para garantir que somente continuaremos a executar o script após uma conexão bem sucedida. Isto é porque a ferramenta do Construtor de Script fará isso automaticamente para nós quando salvarmos o script. Agora vamos configurar o modo do telescópio para rastreio; clique na função <function>setINDIScopeAction()</function> e selecione TRACK. Observe que nós precisamos configurar o telescópio para rastreio <emphasis>antes</emphasis> de enviar as coordenadas necessárias para rastrear. A função <function>setINDIScopeAction()</function> é fornecida por conveniência; uma vez que neste exemplo, ela simplesmente envia uma função <function>setINDIAction()</function> seguida pela chave TRACK. No entanto, a vantagem de usar o <function>setINDIScopeAction()</function> é que o KStars automaticamente adicionará o <function>waitForINDIAction()</function> quando necessário. Este recurso não está automaticamente disponível para ações genéricas como nós já mencionamos antes.</para>
<para>A seguir nós usaremos a função <function>setINDITargetName()</function> e a configuraremos para Marte. Finalmente, os últimos poucos passos envolvem a captura de imagens por 10 segundos que pode ser feita usando a função <function>startINDIExposure()</function>, e esperando por 20 segundos entre elas o que pode ser feito usando a função <function>waitFor()</function> com o valor de 20.</para>
<para>Nós podemos agora salvar nosso script e executá-lo a qualquer hora. O script salvo será semelhante a este:</para>
<blockquote><programlisting>#!/bin/bash
#KStars DCOP script: Script de Demonstração
#por Jasem Mutlaq
#última modificação: Qui 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
</programlisting>
</blockquote>
</sect2>
</sect1>
|