# Редактор сценариев

Приложения KDE могут управляться из других приложений, из командной строки, или с помощью Коммуникационного Протокола Рабочего Стола (Desktop COmmunication Protocol -- DCOP). &kstars; предоставляет набор расширений, позволяющих лучше контролировать изображение с помощью сценариев. Эти возможности позволяют, например, создавать демонстрации иллюстрирующие основные концепции астрономии.

Написание DCOP скриптов все-таки является программированием, что может отпугнуть тех, у кого нет опыта программирования. Редактор сценариев предоставляет графический интерфейс (GUI) для конструирования DCOP сценариев &kstars;, что сильно упрощает написание сценариев.

## Введение в редактор сценариев

Перед тем как подробно описывать как пользоваться редактором сценариев, прочтите небольшое вступление обо всех компонентах графического интерфейса. Для более подробной информации воспользуйтесь функцией "справка".

Редактор сценариев Редактор сценариев

На рисунке ниже представлен редактор сценариев. Панель слева -- Текущий скрипт;там показаны команды, которые вы уже включили в сценарий. Панель справа -- Браузер функции; там показан список всех доступных функций. Ниже браузера функций расположена небольшая панель, в которой содержится краткое описание функции выбранной в браузере. Панель ниже текущего скрипта -- Аргументы функций; где вы можете изменить аргументы функции выделенной в текущем скрипте.

Вверху расположен ряд кнопок, которые оперируют со сценарием как с целым: это (слева на право) Создать скрипт, Открыть скрипт, Сохранить скрипт, Сохранить скрипт как..., и Тестировать скрипт. Значение этих кнопок очевидны, за исключением, может быть, последней. Нажав на кнопку Тестировать скрипт вы запустите его в главном окне &kstars;. Отодвиньте окно Редактора сценариев в сторону, перед тем как нажимать эту кнопку, чтобы увидеть результат выполнения сценария.

В центре окна расположены кнопки, которые работают с отдельными функциями сценария. Это (сверху вниз): Добавить функцию, Удалить функцию, Копировать функцию, Выше, и Ниже. Добавить функцию -- добавляет выделенную в браузере функцию в текущий сценарий (вы также можете добавить функцию дважды щёлкнув на её названии мышью). Остальные кнопки оперируют с функциями выделенными в текущем сценарии, т.е. позволяют удалять их, копировать, изменять их положение.

## Использование Редактора сценариев

В качестве иллюстрации использования редактора сценариев, мы приведём небольшой пример, где сделаем скрипт, который покажет след Луны, пока часы симуляции идут в ускоренном режиме.

Прежде чем нарисовать след Луны, нужно привязать к ней экран. Для этого используем функцию lookToward. выделите эту функцию в списке справа, и обратите внимание, что описание этой функции появилось в панели ниже. Нажмите кнопку Добавить функцию , чтобы добавить функцию к текущему сценарию. Теперь в панели Аргументы функцийпоявился выпадающий список направление, где вы можете выбрать направление, на которое будет привязан экран. В выпадающем списке содержаться только направления света, но нет объектов, таких как, например, Луна. Вы можете ввести имя объекта (Луна) в выпадающий список вручную, или воспользоваться окном Поиск объекта нажав кнопку Объект. Заметьте, если вы привязали экран к объекту, то автоматически начинается слежение за объектом, таким образом нет необходимости добавлять функцию setTracking перед lookToward.

Итак, теперь экран центрирован на Луну, следующим шагом мы хотим ускорить время. Для этого используйте функцию setClockScale. Добавьте её в сценарий, одним из описанных выше методов. После этого на панели Аргументы функций появиться окошечко счётчика, с помощью которого вы можете установить требуемую скорость течения времени симуляции. Установите скорость на 3 часа.

Итак, мы привязали экран к Луне и ускорили время. теперь мы просто хотим приостановить исполнение сценария. Добавьте функцию waitFor и установите паузу на 20с., используя панель Аргументов функций.

В завершение, установим скорость течения времени 1с. Добавьте ещё один экземпляр setClockScale, и установите значение аргумента - 1с.

Однако, в приведённом сценарии есть один недостаток. Мы должны сперва убедиться, что для отрисовки используются Экваториальные координаты, прежде чем начнём следить за Луной. Если используются Горизонтальные координаты, то на экране вы увидите очень быстрое вращение небесной сферы. Чтобы этого не произошло, установите параметр вида UseAltAz в false. Чтобы изменить какой-либо параметр вида, используйте функцию changeViewOption. Добавьте эту функцию к сценарию, и обратите внимание на панель аргументов функций. Здесь есть выпадающий список, содержащий все параметры вида. Так как мы точно знаем название опции, то мы можем просто выбрать её из списка. Если вы не знаете название необходимой опции, нажмите на кнопку Просмотреть дерево, чтобы открыть окно, которое показывает опции по разделам. Кроме того, рядом с каждой опцией содержится краткое описание, за что она отвечает, и тип аргументов и их предельные значения. Так опцию UseAltAz мы найдём в разделе Настройка звёздного неба. Выберите опцию и нажмите кнопку OK, после этого опция будет выбрана в выпадающем списке в панели аргументов функций. Наконец в поле Значение, наберите false или 0.

Ещё один шаг: изменение опции UseAltAz в конце сценария не принесёт желаемого результат; мы должны изменить эту опцию в начале сценария. Для этого убедитесь что выделена нужная функция в панели текущий скрипт, и нажимайте кнопку Выше, до тех пор, пока функция не окажется вверху.

Теперь, когда сценарий написан, нужно сохранить его на диск. Для этого нажмите кнопку Сохранить скрипт. Сперва откроется окно, где вам предложат ввести название сценария и ваше имя, как имя автора. Для примера, в качестве названия сценария введите Слежение за луной, и своё имя в поле автор, и нажмите OK. После этого откроется стандартный диалог &kde; Сохранить файл. Введите название файла, и нажмите OK, чтобы сохранить сценарий. Заметьте, что если имя файла НЕ оканчивается .kstars, то этот суффикс будет добавлен автоматически. Если вы чувствуете себя опытным пользователем, вы можете отредактировать сценарий вручную, с помощью любого текстового редактора.

Готовый сценарий, можно запустить множеством способов. Из командной строки можно запустить только если &kstars; уже запущен. Также вы можете запустить сценарий из &kstars; с помощью пункта Запустить сценарий, меню Файл.

## Управление устройствами с помощью INDI

Автоматизация управления доступна для всех устройств совместимых с протоколом INDI. Вы можете координировать работу любого количества устройств с помощью Генератора сценариев &kstars;. Управление можно улучшить, используя интерфейс INDI DCOP, который предоставляет различные функции для решения ваших задач. Функции INDI DCOP можно разбить на четыре класса. Далее следует обзор функций и их аргументов, поддерживаемых &kstars; Перед использованием, мы рекомендуем сперва познакомиться с Концепцией INDI.

1. Основные функции устройств (Generic Device Functions): например функции включения/выключения устройств и т.п. ...

   - `startINDI (QString deviceName, bool useLocal)` : Устанавливает INDI сервис, как локальный для данного компьютера или как сервер.

   - `shutdownINDI (QString deviceName)` : Останавливает INDI сервис.

   - `switchINDI(QString deviceName, bool turnOn)` : Подключает, или отключает устройство (работающее по протоколу) INDI.

   - `setINDIPort(QString deviceName, QString port)` : Устанавливает порт подключения устройства.

   - `setINDIAction(QString deviceName, QString action)` : Выполняет действие INDI. Действие может быть - element или switch property

   - `waitForINDIAction(QString deviceName, QString action)` : Приостановить выполнение сценария, пока свойство действия не вернёт успешный статус завершения.

2. Функции телескопов (Telescope Functions): функции управления движением телескопа и его состоянием.

   - `setINDIScopeAction(QString deviceName, QString action)` : Установить режим, или действие телескопа. возможные значения - SLEW, TRACK, SYNC, PARK, и ABORT.

   - `setINDITargetCoord(QString deviceName, double RA, double DEC)` : установить координаты "цели" телескопа.

   - `setINDITargetName(QString deviceName, QString objectName)` : Установить координаты "цели" по имени objectName. &kstars; ищет имя объекта в своей базе данных, и автоматически задаёт значения склонения и восхождения, если они есть в базе данных..

   - `setINDIGeoLocation(QString deviceName, double longitude, double latitude)` : Устанавливает географическое положение телескопа: долготу и широту. Долгота устанавливается в нотации "E of N". На пример,долгота города Calgary, Canada в &kstars;: -114 04 58 - широта: 51 02 58. Необходимо преобразовывать только отрицательные значения долготы. Чтобы преобразовать долготы в "E of N" нотацию, мы должны прибавить к абсолютному значению долготы прибавить 180 градусов. Так, в нашем примере, долгота INDI = 114 04 08 + 180 00 00 = 294 04 08 "E of N".

   - `setINDIUTC(QString ddeviceName, QString UTCDateTime)` : Установить для телескопа UTC дату и время в вормате ISO 8601, т.е. в формате ГГГГ-ММ-ДДTЧЧ:MM:СС (например 2004-07-12T22:05:32).

3. Функции фокусировки (Focuser Functions): функции управляющие фокусировкой телескопа и статусом фокусировки.

   - `setINDIFocusSpeed(QString deviceName, QString action)` : Установить скорость фокусирующего механизма. Допустимые значения FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, и FOCUS_FAST.

   - `setINDIFocusTimeout(QString deviceName, int timeout)` : Установить максимальную длительность любых операций выполняемых после в результате вызова функции startINDIFocus.

   - `startINDIFocus(QString deviceName, int focusDir)` : Фокусировать на короткое расстояние (focusDir = 0) или на бесконечность (focusDir = 1). Скорость и время устанавливаются функциями `setINDIFocusSpeed()` и `setINDIFocusTimeout()`.

4. Функции камеры/ПЗС (Camera/CCD Functions) :функции управляющие камерой/ПЗС и их состоянием.

   - `setINDICCDTemp(QString deviceName, int temp)` : Установить температуру ПЗС сенсоров, в градусах Цельсия.

   - `setINDIFrameType(QString deviceName, QString type)` : Установить тип кадра ПЗС. Возможные значения: FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, и FRAME_FLAT.

   - `startINDIExposure(QString deviceName, int timeout)` : Начать экспозицию ПЗС/Камеры, время (timeout) в секундах.

Заметьте, что имя устройства - первый аргумент всех функций INDI. Это позволяет не перемешиваться командам к разным устройствам в одном сценарии. Редактор сценариев две возможности для облегчения написания и редактирования сценариев INDI.

- `Добавить waitForINDIAction после каждого действия INDI` : Если эта опция выбрана, то после любого действия Редактор сценариев добавит команду `waitForINDIAction()`. Например, если вы добавите функцию `switchINDI()`и эта опция была отмечена, редактор сценариев добавит "waitForINDIAction CONNECTION" в сценарий сразу после `switchINDI()`. Это приведёт к приостановке выполнения сценария после `switchINDI()`, покаl `switchINDI()` не вернёт OK (&ie; пока устройство не подключится). Важно знать, что редактор сценариев не добавит `waitForINDIAction()` для действий, добавленных с помощью `setINDIAction()`, так как &kstars; не сможет определить родительское свойство таких действий. Поэтому, вы должны вручную добавить `waitForINDIAction()` после этих действий, если требуется.

- `Повторное использование имён INDI` : Когда эта опция выбрана, то во всех последующих функциях, будет использоваться последнее введённое имя устройства. Новое имя устанавливается с помощью `startINDI()`. Если вы работаете с несколькими устройствами, то рекомендуется выключать эту опцию.

Теперь мы можем создать пример сценария, который будет управлять телескопом LX200 GPS, и ПЗС камерой Finger Lakes, присоединённой к нему. Наш пример очень прост. Мы повернём телескоп и проследим за Марсом, и сделаем три снимка с экспозицией 10с через 20с каждый.

У нас нет средств обратной связи или слежения в INDI DCOP интерфейсе, чтобы узнать степень выполнения операции (за исключением функции `waitForINDIAction()`), поэтому мы должны постоянно следить за устройством. Так как мы не можем следить за возникновением ошибок, и исправлять их "на лету", мы должны писать сценарий с перестраховкой. Все сценарии должны тщательно проверяться, перед их использованием.

Редактор сценариев Редактор сценариев

Пример сценария приведён выше. Обратите внимание, что отмечена опция `Добавить waitForINDIAction после каждого действия INDI` и не отмечена `Повторное использование имён INDI`. Первая функция - `startINDI()`. Мы запускаем наше устройство локально, поэтому нет необходимости менять режим сервиса в окне аргументов функций. Мы вводим имена устройств, начиная с телескопа "LX200 GPS", потом повторяем тоже и для ПЗС матрицы - "FLI CCD".После этого стоит функция `waitFor()`. Рекомендуется использовать функцию `waitFor()` непосредственно после `startINDI()`, чтобы приостановить выполнение сценария на 1-5с. Это сделано для того, чтобы быть уверенными, что внутренние переменные настроены так как надо, и устройства готовы для получения команд. Также это необходимо для управления удалёнными устройствами, так как связь ними может быть затруднена. Далее следует функция `switchINDI()`, чтобы соединиться с устройствами.

Так как опция `Добавить waitForINDIAction после каждого действия INDI` отмечена, то нет необходимости добавлять `waitForINDIAction()` после `switchINDI()`, чтобы убедиться в выполнении команды, потому что редактор сценариев сделает это автоматически при сохранении файла. Далее запустим слежение телескопа, добавив `setINDIScopeAction()` с аргументом TRACK. Заметьте, что мы переводим телескоп в режим слежения перед указанием координат. Функция `setINDIScopeAction()` применена здесь для большего удобства, можно было воспользоваться функцией `setINDIAction()` с ключевым словом TRACK. Тем не менее, благодаря использования `setINDIScopeAction()` &kstars; автоматически добавит функцию `waitForINDIAction()`.

Далее мы используем функцию `setINDITargetName()`, с "целью" - Марс. И, напоследок, получим снимки с экспозицией 10с, используя `startINDIExposure()`, с паузой в 20с между снимками используя `waitFor()` со значением аргумента 20.

Теперь сохраним сценарий, чтобы использовать его в дальнейшем. Сохранённый сценарий должен выглядеть примерно так:

>     #!/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