# script

Добавляет возможности использования скриптов, копирования и вычисления значений тегов. Модуль `script` состоит из сохраняемых переменных (var) и последовательно выполняемых действий (actions).

Данный модуль требует включения в задачу.

    plugin.script:
      enable: on

      module.myscript:
        enable: on

        java.src: java/src
        java.bin: java/bin

        calcexpr:
          my_calc_expr1: x/3+30
          my_calc_expr2: x*3+10

        actions:
          - copy:
              src:   gelios1:State
              dst:   SHDSH:GLSA_404_State
              delay_ms: 10123

          - calc:
              id: 2
              expr:   x*10+y+7.3
              result: 301_StateSost
              x:      SHDSH:GLSA_301_State
              y:      SHDSH:GLSA_301_Sost

          - calc:
              id: text_id_3
              expr:   my_calc_expr1
              result: 301_StateSost_1x
              x:      301_StateSost
              delay_s:  10

        actions:
          - java:
              id:    myscr1
              class: test.TestA
              prm1:  123
              prm2:  hello

        var:
          - MyVar1; type:bool; save:off; hidden:on
          - MyVar2; type:double = 1.2
          - MyVar3 = 22
          - MyVar4

java.src | `scripts/java` | каталог исходного кода скриптов на java
java.bin | `scripts/bin` | каталог байткода скриптов на java. Создается автоматически при компиляции
calcexpr | - | набор выражений для действия calc (см. calc выражения)
var | - | список переменных-тегов
actions | - | список действий:
`copy` - перемещает значение из тега в тег
`calc` - создает вычисляемый тег
`scriptjava` - выполняет скрипт на языке java

## var

var - список определений переменных в формате:

    -tagname[;prop:value;...][=inival]

tagname - имя тега переменной, уникальное в пределах переменных модуля;

prop:value - свойства переменной:

prop | value | Описание
--- | --- | ---
`type` | int double bool string | тип тега
`save` | off / on | тег имеет флаг autosave
`hidden` | off / on | тег имеет флаг hidden

inival - начальное значение, по умолчанию, в зависимости от типа, 0 / off / пустая строка.

## copy

id | - | Имя действия (опционально)
src | - | Имя тега-источника в формате ссылки
dst | - | Имя тега-приемника в формате ссылки
delay_s | `0` | Задержка копирования с секундах. Значение источника после изменения копируется в приемник только, если значение источника не вернулось в прежнее состояние в течение времени задержки
delay_ms | `0` | Задержка копирования в миллисекундах

## calc

id | - | Имя действия (опционально)
expr | - | Арифметическое выражение (см. calc выражения)
result | - | Имя тега результата вычисления. Если модуль еще не содержит такого тега, то он будет создан. Тип тега `double`. Также можно в качестве результирующего тега указать тег другого модуля в формате ссылки.
<arg1> | - | Аргументы могут иметь любые совместимые в yaml-форматом имена. Значениями аргументов являются ссылки на теги в формате ссылки. Количество аргументов может быть любым. Аргументы используются при расчете выражения, подставляя их значения в выражение по их именам.
<argN>
delay_s | `0` | Задержка копирования значения в тег результата. Изменившееся вычисленное значение копируется в тег результата только, если вычисленное значение не вернулось в прежнее состояние в течение времени задержки
delay_ms | `0` | Та же задержка в миллисекундах

## java

java
id | - | Имя действия (обязательный параметр)
class | - | Имя класса скрипта
<arg1> | - | Аргументы для передачи значений в скрипт. Количество аргументов может быть любым
<argN>

Скрипт - это java класс, наследуемый от класса с интерфейсом ScriptJavaApi.java. Для написания скрипта требуется перекрыть методы `load` и `execute`. Файл исходного кода состоит только из методов и полей. Для простого скрипта заголовок класса, пакета, импорт пакетов и прочее указывать не нужно (DemoScript1).

Если же скрипт более сложный, и требуется включение дополнительных пакетов, то класс описывается полностью (DemoScript2).

В целях ограничения области действия скрипта текст исходного кода не может содержать слово `promauto`.

Файлы исходного кода скриптов помещаются в каталог `java.src`. Один файл может содержать один класс. Файлы могут находится во вложенных подкаталогах, при этом имя подкаталога(ов) включается в имя класса через точку. Например, `subdir1.subdir2.MyScript`.

После создания или изменения скрипта при загрузке системы происходит компиляция, и если успешно, то каталог `java.bin` будет содержать байткод скрипта и хеш-файл. Если во время компиляции возникла ошибка, то в этом же каталоге можно будет найти сформированный полный исходный код класса, и используя сообщение об ошибке компилятора, проанализировать код и найти ошибку.

## Ссылка на тег

Ссылки на тег могут быть записаны двумя способами:

1. `modname:tagname` - имя любого модуля проекта и его тег
2. `tagname` - имя своего тега (данного модуля)