Материал из Module developer
// Получаем уникальный идентификатор модуля и шины при запуске IR.AddListener(IR.EVENT_MODULE_START, 0, function(moduleID, busID){ // Получение копии модуля // moduleID - уникальный идентификатор модуля // Присваивание переменной module var module = B.getModule(moduleID); // Формируем имя подсети и присваиваем переменной netWorkName var netWorkName = "HDL-BUS Pro Network (UDP)"; // Берем существующее устройство и присваиваем переменной device var device = module.getDevice(netWorkName); // Получение адреса подсети var subnetID = module.FromSubnetID; // Получение номера устройства var deviceID = module.FromDeviceID; // Формируем имя устройства var deviceName = "HDL-MC48IPDMX.231"; // Формируем имя канала var statusOnStartName = 'deviceName + ":" + "statusOnStart"'; // Разделитель, используемый в командах var separator = 0x0; // Таблица HDL кодов команд var HDLCodes = { singleChannelLigtning: 0x31, singleChannelReadTarget: 0x33, singleSceneControl: 0x02, singleSequenceControl: 0x1A }; // Неполное имя каналов для простоты использования var drivers = "Drivers." + netWorkName + "." + deviceName + ":" + "channel"; // Формируем параметры канала var Parametrs = [subnetID, deviceID, HDLCodes.singleChannelReadTarget, separator, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0xE8, 0x3, 0x0, 0x0] // Если устройство подключено то if(device) { // Добавляем канал StatusOnStart device.AddChannel(statusOnStartName, Parametrs); // Очистка кеша B.clearEmulatorCahce(true); // Цикл для создания виджетов for (var i = 0; i<3; i++){ // Обращаемся к виджету который собираемся скопировать var popup = module.GetPopup("Dimmer"); // Присваиваем оригинальное имя var name = "Dimmer" + i; // Создаем новое под-устройство с параметрами: // Device - объект драйвера устройства iRidium // Имя создаваемого под-устройства, через которое будем к нему обращаться и это же имя увидит пользователь var NewSubDevice = module.addSubDevice({ Device: device, DeviceName: name }); // Создание виджета var widget = module.ClonePopup(popup, "Dimmer" + i) // Добавляем виджет на экран NewSubDevice.addWidget(widget); // Объявления переменных необходимых для создания виджета var channelName = deviceName + ":" + "channel" + i; var Dimmer = module.GetPopup("Dimmer" + i); var Dimmer_level = Dimmer.GetItem("Level"); var Dimmer_button = Dimmer.GetItem("Button"); var uiDimmer = "UI.Dimmer" + i; // Добавление каналов device.AddChannel(channelName, [subnetID, deviceID, HDLCodes.singleChannelLigtning, separator, parseInt(i+1, 16), 0x0, 0x0, 0x0, 0x01, 0x0, 0x0]); device.AddTag(channelName, [subnetID, deviceID, HDLCodes.singleChannelLigtning, separator, parseInt(i+1, 16), 0x0, 0x0]); // Вызов функции привязки слайдера var UserSlider_1 = new UserSlider(Dimmer_level, Dimmer.GetItem("Slider")); // Отправка команды с уровня на HDL канал диммера IR.AddListener(IR.EVENT_ITEM_RELEASE, Dimmer_level, function () { var data = this; device.Set(data.channel, data.level.Value); },{level: Dimmer_level, channel: channelName}); // Кнопка для включения и отключения (0 или 100) IR.AddListener(IR.EVENT_ITEM_PRESS, Dimmer_button, function() { var data = this; device.Set (data.channel, data.button.Value * 100); }, {button: Dimmer_button, channel: channelName}); // Привязка графических элементов к фидбекам Dimmer.GetItem("Name").Text = "Dimmer" + i; module.AddRelation(drivers + i, uiDimmer + ".Visible Level.Value"); module.AddRelation(drivers + i, uiDimmer + ".Level.Value"); module.AddRelation(drivers + i, uiDimmer + ".label main title 640x88.Value"); module.AddRelation(drivers + i, uiDimmer + ".Button.Value"); } }; // Пользовательский слайдер для уровня function UserSlider(Level, Slider) { Property = "X"; Len = "Width"; // Функция вычисления позиции слайдера относительно уровня function Move(){ Slider[Property] = Level.Value * (Level[Len] -50) / 100; } // Подписка на события IR.AddListener(IR.EVENT_ITEM_PRESS, Level, Move); // нажатие на уровень IR.AddListener(IR.EVENT_MOUSE_MOVE, Level, Move); // движение мыши по уровню IR.AddListener(IR.EVENT_TOUCH_MOVE, Level, Move); // движение пальца по уровню IR.SetInterval(600, Move); // автообновление через 600 мс }; });
Результатом данного модуля должны появиться 3 диммера с разными каналами, как показано на рисунке: