IRidium DDK
Содержание
- 1 Подготовка к созданию драйвера
- 2 Создание драйвера
- 2.1 Создание драйвера в GUI Editor
- 2.2 Структура драйвера
- 2.3 Написание основного класса
- 2.4 Раздел переменных
- 2.5 Инициализация устройства
- 2.6 События устройства Online / Offline
- 2.7 Слушатель обратной связи
- 2.8 Парсер (обработчик входящих данных)
- 2.9 Слушатель активированного канала
- 2.10 Функции отправки команд устройству
- 2.11 Публичные функции драйвера
- 2.12 Создание экземпляра драйвера
- 2.13 Перенос драйвера в базу устройств
- 3 API для работы с драйверами
- 4 Загрузить пример проекта
В данном разделе описан процесс создания свободно настраиваемого скриптового драйвера в редакторе iRidium GUI Editor на примере драйвера для устройства Marantz SR7007.
Скриптовые драйверы (модули iRidium Script)
это драйверы на базе встроенного AV & Custom Systems, работающие за счет iRidium Script (базируется на языке Java Script). Используются для управления любыми системами, не входящими в стандартную базу данных iRidium. Script обеспечивает отправку команд и обратную связь от управляемых систем, cм. принципы работы драйверов iRidium.
Создание драйвера происходит в несколько этапов:
Подготовка к созданию драйвера
Выбор оборудования
Первым этапом Вам потребуется выбрать управляемое устройство. Это может быть конечное управляемое оборудование или преобразователь формата. Для примера мы выбрали устройство Marantz SR7007, оно поддерживает работу по протоколу TCP.
Управляемое iRidium устройство может получать управляющие команды используя один из ниже перечисленных протоколов:
- TCP
- UDP
- RS232
- HTTP
Поиск документации
Для того чтобы управлять оборудованием и получать от него данные, потребуется найти документацию (API или SDK оборудования). Найти документацию обычно можно на сайте производителя, но не все производители публикуют ее в открытом доступе. В случае отсутствия документации создание драйвера не представляется возможным.
Для устройства Marantz SR7007, на сайте производителя была найдена документация. Вы можете ее скачать.
Анализ документации
Когда документация получена, Вам потребуется ее проанализировать и определить:
- Управляющие команды, существующие для Вашего оборудования
- Синтаксис, использующийся управляющими командами
- Параметры команд
- Данные, которые можно получить от оборудования
- Синтаксис получения данных
Проанализировав документацию Marantz SR7007 были сделаны следующие выводы:
Синтаксис: Команды формируются из двух частей (1 часть - команда, 2 часть - параметр)
- Пример: Разберем команду "POWER ON/STANDBY change". Она имеет вид ASCII строки PWON<CR>.
- Первая часть PW - это сама команда (управление питанием устройства);
- Вторая часть ON - параметры команды (подача питания на устройство);
- <CR> - это не печатаемый символ, обозначающий конец строки (0x0D в формате HEX) .
По данному принципу формируются все команды для устройства Marantz SR7007.
Создание драйвера
Создание драйвера в GUI Editor
Все готовые драйвера хранятся в Device Base (глобальная база данных). iRidium GUI Editor позволяет создать драйвер как в Device Base - без привязки к конкретному проекту (драйвер можно просто добавить в любой свой проект), так и в Project Device Panel - базе устройств проекта. Создание драйвера в Project Device Panel дает возможность запускать его в режиме отладки (эмуляции и дебагинга) прямо в проекте, но для того, чтобы созданный таким образом драйвер добавить в Device Base, потребуется перенести его вручную.
В данном примере мы используем создание драйвера в Project Device Panel (с привязкой к проекту) для возможности быстрой отладки.
После изучения документации можно пристуить к созданию драйвера в Project Device Panel. В iRidium GUI Editor имеются шаблоны свободно настраиваемых драйверов, имеющие разделение по используемому протоколу передачи данных:
- Custom Driver TCP
- Custom Driver UDP
- Custom Driver HTTP
- Custom Driver RS232
Для создания нового устройства в дереве проекта выполните следующие действия:
- Создайте новый проект в редакторе iRidium GUI Editor
- Перейдите во вкладку Project Device Panel
- Нажмите кнопку Add, или кликнете правой кнопкой мыши по свободному пространству Project Device Panel.
- Перейдите в раздел Add Driver > Custom Device
- Устройством Marantz SR7007 можно управлять по протоколу TCP, поэтому выбираем - Custom Driver TCP
В Project Device Panel появился драйвер, дальнейшие действия:
- Выберите созданный драйвер
- Во вкладке Channel Properties в поле Name выберите имя устройства. В нашем случае имя будет Marantz SR7007 (вводится произвольно).
- В разделе Local Connection (подключение по локальной сети) укажите Host - IP адрес устройства, и Port - ТСР порт, по которому передаются команды устройству. Marantz SR7007 управляется по 23 порту.
У каждого устройства есть выпадающие списки:
- Tokens - глобальные переменные, несущие основные свойства управляемого оборудования, эти параметры можно только прочитать (неизменяемые):
- Online - состояние подключения к управляемой системе (Online/Offline = 1/0)
- Status - статус подключения к системе (Offline/Connect/Online/Disconnect = 0...3)
- Host - доменное имя удаленной системы
- HostPort - порт на удаленной системе, к которому подключается iRidium App
- IP - доменное имя узла, к которому производится подключение App
- HostIP - IP-адрес удаленной системы, к которой подключено App
- Port - локальный порт клиента, через который осуществляется связь с удаленным устройством
- Commands - управляющие команды, которые можно отправить управляемой системе
- Feedback - переменные для получения и хранения данных, полученных от управляемой системы.
Структура драйвера
Для создания драйверов следует использовать объектно-ориентированную парадигму.
Объектно-ориентированная парадигма позволяет использовать один и тот же драйвер сразу для нескольких одинаковых устройств одновременно посредством создания экземпляров.
На сайте javascript.ru подробно описаны инструкции по работе с объектами в Java Script.
Драйвер состоит из нескольких частей:
- Основной класс устройства
- Раздел переменных
- Инициализация устройства
- Событие включения устройства
- Событие выключения устройства
- Слушатель обратной связи и парсер данных
- Слушатель активированного канала
- Функции отправления команд устройству
- Публичные функции драйвера
- Создание экземпляра
Написание основного класса
Откройте окно Scripts в редакторе iRidium GUI Editor.
Создайте новый скриптовый модуль с именем вашего устройства. В нашем случае Marantz SR7007.
Имя скриптового модуля как и имя устройства в Project Device Panel должно быть уникальным. Уникальность имени очень важна, так как устройств может быть очень много, и чтобы не возникло конфликтов имен, рекомендуется задавать имя модуля, соответствующее имени устройству.
Создадим основной класс, с помощью которого Вы в последствии будете создавать экземпляры драйвера. В iRidiumScript главный класс создается как функция:
var Marantz_sr7007_main = function(DeviceName) // Класс драйверов для устройства Marantz SR7007 { //тело класса };
Marantz_sr7007_main - имя, означает что это устройство Marantz, модель sr7007, main - означает основной класс.
Раздел переменных
Далее в теле класса следует объявить следующие переменные:
- this.DriverName - имя устройства которое вы создали в Project Device Panel
- this.device - ссылка на устройство, созданное в Project Device Panel
- this.Online - статус устройства, если оно включено Online = True, в противном случае Online = false
В функцию передается переменная DeviceName - она будет принимать имя устройства при создании экземпляра.
По умолчанию переменной this.Online требуется присвоить флаг false, что означает, что устройство отключено.
var Marantz_sr7007_main = function(DeviceName) // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName = DeviceName; this.device; this.Online = false; };
Далее, в раздел переменных будут добавляться и другие переменные, необходимые для работы драйвера.
Инициализация устройства
Инициализация - основная функция класса. В ней будут прописаны все слушатели, события и функции устройства.
Драйвера различаются по именам, поэтому во время инициализации экземпляров класса необходимо присваивать каждый экземпляр класса к своему базовому драйверу из Project Device Panel по его имени, поэтому первое, что требуется сделать - привязать класс драйвера к базовому драйверу созданному в Project Device Panel.
Для этого служит метод this.device = IR.GetDevice(this.DriverName); в него передается имя устройства, которое задается при создании экземпляра. Результат записывается в переменную this.device.
- this.device - переменная хранящая идентификатор драйвера полученный по указанному имени
- this.DriverName - переменная хранящая имя базового драйвера, которое указал пользователь
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции } };
События устройства Online / Offline
- Событие Online - устройство включено и находится в сети.
- Событие Offline - устройство выключилось или по любым причинам связь с ним отсутствует.
Существуют эти события затем, чтобы была возможность проверки, запустилось или нет устройство (открылась ли сессия подключения к управляемому оборудованию).
В начальном состоянии that.Online = false, что означает что девайс не в сети, но после этого происходит старт подключения и статус that.Online меняется на that.Online = true. Если устройство не в сети (подключение не установилось), то мы не сможем посылать на него команды.
В функцию initalization() добавляем слушателей на событие Online:
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); } };
Слушатель обратной связи
В iRidium Script есть событие IR.EVENT_RECEIVE_TEXT, оно срабатывает в случае, если устройство отправило приложению какие-то данные.
Получить эти данные можно передав в функцию слушателю на это событие переменную text. Далее эти данные можно анализировать и извлекать необходимую информацию - анализ и извлечение данных выполняет парсер.
Добавим в функцию initalization() слушателя на событие IR.EVENT_RECEIVE_TEXT:
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Receive Text //------------------------------------------------------- IR.AddListener(IR.EVENT_RECEIVE_TEXT,that.device, function(text) { IR.Log("receive = "+ text); // Выводим в лог полученные данные });
Парсер (обработчик входящих данных)
Задача парсера - извлечь из полученных данных нужную информацию и сохранить ее для дальнейшего вывода в приложение.
Java Script предоставляет несколько функций для извлечения и поиска данных в строковых переменных:
Парсер пишется в слушателе на событие IR.EVENT_RECEIVE_TEXT, в особых случаях выносится в отдельную функцию, но запускается все равно внутри слушателя.
Marantz SR7007 может прислать строку, состоящую из названия команды и ее состояния. Первые два символа - это команда, к примеру - PW Вся остальная часть - это состояние, к примеру - ON или OFF.
Перебор всех вариантов команд осуществляется с помощью функции Switch. Распознав команду, ее состояние требуется сохранить в соответствующую переменную внутри объекта и в переменную в разделе Feedback (переменные создаются вручную в дереве проекта, их имена должны быть уникальны).
- Объявим в разделе переменных переменную this.PowerStatus
- Внутри парсера в разделе case "PW": выполним сохранение в нее полученного состояния.
- Создадим в Project Device Panel, раздел Feedback - переменную Power.
- Продублируем полученное состояние в переменную Power с помощью команды IR.SetVariable("Drivers."+that.DriverName+".Power", answer);.
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; this.PowerStatus; // Будет хранить состояние команды Power //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Receive Text //------------------------------------------------------- IR.AddListener(IR.EVENT_RECEIVE_TEXT,that.device, function(text) { IR.Log("receive = "+ text); // Выводим в лог полученные данные // Parser var cmd = text.slice(0,2); // Вырезаем из полученных данных первые два символа - название команды var answer = text.slice(2,text.length-1); // Вырезаем оставшуюся часть - текущее состояние IR.Log("cmd = "+cmd); // Выводим вырезанную команду IR.Log("answer = "+answer); // Выводим текущее состояние switch (cmd) { case "PW": that.PowerStatus = answer; /* Записываем в переменную that.PowerStatus текущее состояние для * хранения статуса внутри объекта */ IR.SetVariable("Drivers."+that.DriverName+".Power", answer); // Записываем в Feedback текущее состояние для вывода состояния в приложение break; // По такому принципу можно парсить все остальные данные получаемые от Marantz SR7007 } }); } };
Слушатель активированного канала
Все команды - данные для отправки оборудованию, должны различаться по именам.
Добавьте команду Power в Project Device Panel, раздел Commands.
Когда по нажатию на элемент или иначе активируется какая-то команда в приложении iRidium, срабатывает событие IR.EVENT_CHANNEL_SET. Объявив слушателя на данное событие создатель драйвера получает возможность, в зависимости от того, какая команда активирована, сформировать и отправить соответствующую команду на устройство. Имя активированной команды хранится в переменной name, которая передается вместе с функцией слушателю на событие IR.EVENT_CHANNEL_SET.
IR.AddListener(IR.EVENT_CHANNEL_SET,that.device,function(name)
При анализе документации для Marantz SR7007 был сделан вывод, что команда формируется из двух частей и непечатаемого символа.
Что бы сделать драйвер более гибким и легко расширяемым - будем формировать команду из частей.
Основой для команды будет - активированный канал. Канал будет определять какие параметры для команды в данном случае возможны. При активации команды, для отправки оборудованию соответствующих ей данных, пользователю потребуется ввести параметры для команды.
К примеру, у пользователя в Zone 1, есть Marantz SR7007, и ему нужно его включить. Что для этого нужно:
- Активировать канала - Power
- Указать первый параметр - имя зоны - Zone 1
- Указать второй параметр - параметр команды - ON
Параметры для команды мы будем вводить в переменные раздела Feedback. Поэтому добавьте следующие переменные в раздел Feedback окна Project Device Panel:
- Input Action - будет использоваться для ввода параметра команды, к примеру - ON
- Input Zone - будет использоваться для ввода имени зоны, к примеру - Zone 1
- Для примера, отправки параметров, создавайте в редакторе GUI Editor - элемент.
- Перенесите на элемент - уже существующий канал Power. При нажатии на элемент, сработает событие IR.EVENT_CHANNEL_SET и в скрипте будет известно имя канала, вызвавшего данное событие.
- Выберите созданный элемент и перейдите в панель Object Properties
- Откройте вкладку Programming. Здесь вы можете увидеть перенесенный вами канал на элемент. Он добавился в событие Press. Откройте окно Macros для события Press.
- В столбце Commands из раздела Send To Token выберите Send Text и перенесите в столбец Macros
- В появившемся окне в поле Text введите первый параметр для команды - имя зоны, в нашем случае Zone1. В поле Token выберите переменную созданную в разделе Feedback - InputZone.
- Перенесите еще один макрос Send Text и в поле Text введите второй параметр параметр - ON. В поле в Token выберите переменную созданную в разделе Feedback - Input Action.
С помощью макроса Send Text вы можете передавать любые параметры в переменные в разделе Feedback.
Что бы получить значения из переменных в разделе Feedback существует команда IR.GetVariable("Drivers."+that.DriverName+".Имя переменной");
Для сохранения и использования полученных данных в драйвере, введенных в Feedback, добавим в раздел переменных следующие переменные:
- this.param1 - эта переменная будет хранить данные, введенные пользователем в Feedback Input Action
- this.param2 - эта переменная будет хранить данные, введенные пользователем в Feedback Input Zone
- this.Msg = "" - в этой переменной будет храниться строка, которая должна отправиться на устройство
- this.error = false - переменная флаг, если параметр param1 или param2 будут заданы некорректно, то error будет true и на устройство ни чего отправляться не будет. Если все параметры были введены верно - error будет false и на устройство будет отправлена команда из переменной this.Msg:
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; this.param1; // Параметр хранящий имя зоны this.param2; // Параметр команды this.Msg = ""; // Переменная хранящая команду для отправки на устройство this.error = false; // Флаг ошибки this.PowerStatus; // Будет хранить состояние команды Power //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Receive Text //------------------------------------------------------- IR.AddListener(IR.EVENT_RECEIVE_TEXT,that.device, function(text) { IR.Log("receive = "+ text); // Выводим в лог полученные данные // Parser var cmd = text.slice(0,2); // Вырезаем из полученных данных первые два символа - название команды var answer = text.slice(2,text.length-1); // Вырезаем оставшуюся часть - текущее состояние IR.Log("cmd = "+cmd); // Выводим вырезанную команду IR.Log("answer = "+answer); // Выводим текущее состояние switch (cmd) { case "PW": that.PowerStatus = answer; /* Записываем в переменную that.PowerStatus текущее состояние для * хранения статуса внутри объекта */ IR.SetVariable("Drivers."+that.DriverName+".Power", answer); // Записываем в Feedback текущее состояние для вывода состояния в приложение break; // По такому принципу можно парсить все остальные данные получаемые от Marantz SR7007 } }); //------------------------------------------------------- // Channel Set //------------------------------------------------------- IR.AddListener(IR.EVENT_CHANNEL_SET,that.device,function(name) { that.Msg = ""; // Очищаем команду для отправки that.error = false; // Устанавливаем флаг ошибки в false that.param1 = IR.GetVariable("Drivers."+that.DriverName+".InputZone"); // Получаем имя зоны that.param2 = IR.GetVariable("Drivers."+that.DriverName+".InputAction"); // Получаем параметр команды switch(name) // Ищем имя канала { case "Power": Power(name,that.param1,that.param2) // Функция Power будет формировать команду для устройства и отправлять ее // в нее передаются имя активированного канала, имя зоны и параметр команды break; }; }); } };
Функции отправки команд устройству
В качестве примера функции для отправки команды на устройство у нас будет функция Power(name,that.param1,that.param2). Что она должна сделать:
- сформировать команду
- отправить команду
- в случае, если введенные параметры не верны - вывести сообщение об ошибке в лог
Функции Power передается три переменные на основании которых будет формироваться команда:
- name - имя канала
- that.param1 - имя зоны
- that.param2 - параметр команды
Для команды Power устройство Marantz SR7007 поддерживает три зоны Zone1, Zone2, Zone3 и общую зону System.
В зависимости от номера зоны, введенного в перемененной Input Zone функция должна начать формировать команду в переменной that.Msg с параметром ZM для Zone1, Z2 для Zone2 и PW для System. В случае если введено что-то другое, вывести ошибку, что такой зоны нет.
Также и для параметра команды, если пользователь ввел параметр On - добавить в переменную that.Msg - слово ON, если пользователь ввел Off - добавить OFF, в противном случае вывести в лог ошибку.
После добавления имени зоны и параметра команды, команда для Marantz SR7007 должна оканчиваться на <CR>, поэтому под конец добавим в переменную that.Msg слово <CR> (конец строки).
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; this.param1; // Параметр хранящий имя зоны this.param2; // Параметр команды this.Msg = ""; // Переменная хранящая команду для отправки на устройство this.error = false; // Флаг ошибки this.PowerStatus; // Будет хранить состояние команды Power //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Receive Text //------------------------------------------------------- IR.AddListener(IR.EVENT_RECEIVE_TEXT,that.device, function(text) { IR.Log("receive = "+ text); // Выводим в лог полученные данные // Parser var cmd = text.slice(0,2); // Вырезаем из полученных данных первые два символа - название команды var answer = text.slice(2,text.length-1); // Вырезаем оставшуюся часть - текущее состояние IR.Log("cmd = "+cmd); // Выводим вырезанную команду IR.Log("answer = "+answer); // Выводим текущее состояние switch (cmd) { case "PW": that.PowerStatus = answer; /* Записываем в переменную that.PowerStatus текущее состояние для * хранения статуса внутри объекта */ IR.SetVariable("Drivers."+that.DriverName+".Power", answer); // Записываем в Feedback текущее состояние для вывода состояния в приложение break; // По такому принципу можно парсить все остальные данные получаемые от Marantz SR7007 } }); //------------------------------------------------------- // Channel Set //------------------------------------------------------- IR.AddListener(IR.EVENT_CHANNEL_SET,that.device,function(name) { that.Msg = ""; // Очищаем команду для отправки that.error = false; // Устанавливаем флаг ошибки в false that.param1 = IR.GetVariable("Drivers."+that.DriverName+".InputZone"); // Получаем имя зоны that.param2 = IR.GetVariable("Drivers."+that.DriverName+".InputAction"); // Получаем параметр команды switch(name) // Ищем имя канала { case "Power": Power(name,that.param1,that.param2) // Функция Power будет формировать команду для устройства и отправлять ее // в нее передаются имя активированного канала, имя зоны и параметр команды break; }; }); //------------------------------------------------------- // Command Power //------------------------------------------------------- function Power(type,zone,action) // Функция Power { switch(that.param1) // Поиск зоны { case "Zone1": that.Msg+="ZM"; // Добавление имени зоны к команде для отправки break; case "Zone2": that.Msg+="Z2"; break; case "Zone3": that.Msg+="Z3"; break; case "System": that.Msg+="PW"; break; default: // Если зона не найдена вывести ошибку IR.Log("error in parameter 1: There are no zone with that number"); that.error = true; // Поставить флаг ошибку в true, это запретит отправку команды break; }; that.Msg+="" switch(that.param2) // Поиск параметра { case "On": that.Msg+="ON" // Добавление параметра break; case "Off": that.Msg+="OFF" break; default: // Если параметре неверный вывести ошибку IR.Log("error in parameter 2: you can't use "+that.param2+" with "+type); that.error = true; break; }; that.Msg+="<CR>"; // Добавляем символ конца строки if (that.error == false) // Если ошибки отсутствуют отправляем команду на устройство that.device.Send([that.msg]); }; } };
Публичные функции драйвера
Публичные функции в случае работы с iRidium Script - это функции, доступные пользователю. Внутри класса драйвера мы добавили функцию Power, она отправляет команду на устройство, однако верно работать она будет только, когда активируется канал. Пользователь который будет пользоваться драйвером не должен ее использовать вне класса. Поэтому функция не является публичной.
Функция initialization является главной функцией класса и после создания экземпляра необходимо её выполнить для запуска функционала драйвера. Сделаем ее публичной. Ниже самой функции initialization добавьте строчку this.Init = initialization. После создания экземпляра это даст возможность вызвать функцию initialization при помощи .Init:
var Marantz_sr7007_main = function() // Класс драйверов для устройства Marantz SR7007 { //------------------------------------------------------- // Driver Data //------------------------------------------------------- this.DriverName; this.device; this.Online = false; this.param1; // Параметр хранящий имя зоны this.param2; // Параметр команды this.Msg = ""; // Переменная хранящая команду для отправки на устройство this.error = false; // Флаг ошибки this.PowerStatus; // Будет хранить состояние команды Power //------------------------------------------------------- // Device Initialization //------------------------------------------------------- function initialization() // Метод инициализации экземпляра класса { this.device= IR.GetDevice(this.DriverName); // Определение указателя на базовый драйвер по его имени var that = this; // Получение ссылки на объект для использования его внутри функции //------------------------------------------------------- // Device Online //------------------------------------------------------- IR.AddListener(IR.EVENT_ONLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Online"); // Написать в лог, что устройство Online that.Online = true; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Device Offline //------------------------------------------------------- IR.AddListener(IR.EVENT_OFFLINE, that.DEVICE, function(text) { IR.Log(that.DriverName+" DEVICE is Offline"); // Написать в лог, что устройство Offline that.Online = false; // Присвоить переменной that.Online значение true }, that); //------------------------------------------------------- // Receive Text //------------------------------------------------------- IR.AddListener(IR.EVENT_RECEIVE_TEXT,that.device, function(text) { IR.Log("receive = "+ text); // Выводим в лог полученные данные // Parser var cmd = text.slice(0,2); // Вырезаем из полученных данных первые два символа - название команды var answer = text.slice(2,text.length-1); // Вырезаем оставшуюся часть - текущее состояние IR.Log("cmd = "+cmd); // Выводим вырезанную команду IR.Log("answer = "+answer); // Выводим текущее состояние switch (cmd) { case "PW": that.PowerStatus = answer; /* Записываем в переменную that.PowerStatus текущее состояние для * хранения статуса внутри объекта */ IR.SetVariable("Drivers."+that.DriverName+".Power", answer); // Записываем в Feedback текущее состояние для вывода состояния в приложение break; // По такому принципу можно парсить все остальные данные получаемые от Marantz SR7007 } }); //------------------------------------------------------- // Channel Set //------------------------------------------------------- IR.AddListener(IR.EVENT_CHANNEL_SET,that.device,function(name) { that.Msg = ""; // Очищаем команду для отправки that.error = false; // Устанавливаем флаг ошибки в false that.param1 = IR.GetVariable("Drivers."+that.DriverName+".InputZone"); // Получаем имя зоны that.param2 = IR.GetVariable("Drivers."+that.DriverName+".InputAction"); // Получаем параметр команды switch(name) // Ищем имя канала { case "Power": Power(name,that.param1,that.param2) // Функция Power будет формировать команду для устройства и отправлять ее // в нее передаются имя активированного канала, имя зоны и параметр команды break; }; }); //------------------------------------------------------- // Command Power //------------------------------------------------------- function Power(type,zone,action) // Функция Power { switch(that.param1) // Поиск зоны { case "Zone1": that.Msg+="ZM"; // Добавление имени зоны к команде для отправки break; case "Zone2": that.Msg+="Z2"; break; case "Zone3": that.Msg+="Z3"; break; case "System": that.Msg+="PW"; break; default: // Если зона не найдена вывести ошибку IR.Log("error in parameter 1: There are no zone with that number"); that.error = true; // Поставить флаг ошибку в true, это запретит отправку команды break; }; that.Msg+="" switch(that.param2) // Поиск параметра { case "On": that.Msg+="ON" // Добавление параметра break; case "Off": that.Msg+="OFF" break; default: // Если параметре неверный вывести ошибку IR.Log("error in parameter 2: you can't use "+that.param2+" with "+type); that.error = true; break; }; that.Msg+="<CR>"; // Добавляем символ конца строки if (that.error == false) // Если ошибки отсутствуют отправляем команду на устройство that.device.Send([that.msg]); }; } //------------------------------------------------------- // Public //------------------------------------------------------- this.Init = initialization; // Делаем функцию initialization публичной };
Создание экземпляра драйвера
После того как класс драйвера написан, можно создавать экземпляр. Экземпляр создается ниже написанного класса или в другом модуле:
var myMarantz = new Marantz_sr7007_main("Marantz SR7007"); // Создание экземпляра драйвера
Создав экземпляр выполним публичную функцию инициализации.
var myMarantz = new Marantz_sr7007_main("Marantz SR7007"); // Создание экземпляра драйвера myMarantz.Init();
После инициализации, можно запускать проект для отладки и тестирования драйвера.
Перенос драйвера в базу устройств
Когда драйвер полностью готов, чтобы использовать его и в других проектах, требуется занести его в базу устройств Device Base:
- Разверните вкладку Device
- Откройте DB Editor
- Нажмите New Database
- Введите имя базы, в нашем случае Marantz.db
Теперь база устройств Marantz создана.
- Выберите вашу базу из списка
Чтобы в базе устройств легче было ориентироваться, для устройств есть категории, в нашем случае Marantz - это ресивер.
- Нажмите Add Category
- Введите название категории устройства, в нашем случае Marantz Receiver
- Выберите категорию
- Нажмите Add Device
- Выберите Add Custom Device
- Выберите тип устройства, в нашем случае TCP - Add TCP Device
- Введите имя устройства, в нашем случае Marantz SR7007
- Нажмите кнопку JS - JS Editor. Для DB Editor (редкатора скриптов глобальной базы данных) выделен отдельный JS Editor, поэтому когда вы его откроете, вашего скрипта в нем не будет.
- Создайте в нем новый скриптовый модуль с именем тем же, что и у вас в проекте
- Скопируйте в новый модуль Ваш скрипт драйвера
- Перейдите во вкладку General
- В поле Sctipt - выберите только что добавленный модуль
- В поле Type выберите тип входа, в нашем случае TCP
- В поля Host и Port можно задать по умолчанию, Marantz по умолчанию работает по 23 порту
- Перейдите во вкладку Commands & Feedback
- Продублируйте ваши Commands из проекта
- Продублируйте ваши Feedbacks из проекта
На вкладке Outputs задаются выходы устройства, аналогично как и Commands и Feedbacks.
На этом занесение драйвера в базу устройств завершено.
API для работы с драйверами
Функции | |
IR.CreateDevice | Создание драйвера |
Connect | Подключение к устройству |
Disconnect | Разрыв соединения с устройством |
IR.GetDevice | Обращение к устройству |
Set | Установка значения в канал устройства |
Send | Отправка команды на устройство |
InvokeAction | Отсылка команды на устройство UPNP |
Subscribe | Подписка на события UPNP |
UnSubscribe | Отписка от событий UPNP |
HtmlDecode | Замена спецсимволов Html |
JSON.Stringify | преобразование JSON объекта с строку |
JSON.Parse | преобразование строки в JSON объект |
new XML | создание XML объекта |
XML.ToString | преобразование XML объекта в строку |
Events (события) | |
EVENT_RECEIVE_DATA | Получение данных с устройства в байт формате |
EVENT_RECEIVE_TEXT | Получение строки с устройства |
EVENT_RECEIVE_EVENT | Получение события с устройства (UPNP Event) |
EVENT_ONLINE | Соединение с устройством установлено |
EVENT_OFFLINE | Соединение с устройством потеряно |
EVENT_TAG_CHANGE | Изменение значения тега |
EVENT_DEVICE_FOUND | Нахождение UPnP устройства |