Длинное и короткое нажатие pushbutton в веб-интерфейсе

Добрый день! Требуется сделать код для обработки длинного и короткого нажатия виртуальной кнопки в виртуальном устройстве, которая в свою очередь будет связана с кнопкой в SVG панели.? Как реализовать обработчик через таймеры? И вообще возможно ли это с использованием в wb-rules?

На данный момент пока смог заставить работать только так - однократное нажатие на левую кнопку уменьшает уровень от 0 до 100 с шагом 5, однократное нажатие на правую кнопку увеличивает уровень от 0 до 100 с шагом 5

keypad_1 = 'keypad_1';

defineVirtualDevice(keypad_1, {
    title: {'en': 'My Virtual Keypad 1', 'ru': 'Панель 1'} ,
    cells: {
      button3L: {
        title: {'en': 'Button3L', 'ru': 'Кнопка3Л'},
        type: "pushbutton",
        value: false
      },
      state3L: {
        title: {'en': 'Button3L', 'ru': 'Кнопка3Л'},
        type: "switch",
        readonly: true,
        value: false
      },
      button3R: {
        title: {'en': 'Button3R', 'ru': 'Кнопка3П'},
        type: "pushbutton",
        value: false
      },
      state3R: {
        title: {'en': 'Button3R', 'ru': 'Кнопка3П'},
        readonly: true,
        type: "switch",
        value: false
      },
      level_right: {
        title: {'en': 'Level Right', 'ru': 'Уровень Справа'},
        readonly: true,
        type: "range",
        value: 0,
        min: 0,
        max: 100
      }
   
    }
});

defineRule("button_up_short_press_1", {
    whenChanged: "keypad_1/button3R",
    then: function (newValue) {
        if (newValue === true) {
            dev["keypad_1/level_right"] = Math.min(100, dev["keypad_1/level_right"] + 5);
            log.info("Level increased to: " + dev["keypad_1/level_right"]);
        }
    },
});

defineRule("button_down_short_press_1", {
    whenChanged: "keypad_1/button3L",
    then: function (newValue) {
        if (newValue === true) {
            dev["keypad_1/level_right"] = Math.max(0, dev["keypad_1/level_right"] - 5);
            log.info("Level decreased to: " + dev["keypad_1/level_right"]);
        }
    },
});

По-моему, нет. Эта функция срабатывает однократно при нажатии. Она даже отпускание не регистрирует, если мне память не изменяет.

Добрый день!

Ваша реализация верная и наиболее популярная.

Насколько мне известно, обработка длительного нажатия в SVG-панели невозможна. Однако могу ошибаться. Если вам удастся реализовать этот функционал, буду признателен, если поделитесь информацией.

Пока что не получается этого сделать, так как от SVG нужно получать разные типы свойств: onClick, mouseUp, mouseDown и т.д. Пока реализовал нужный функционал через NodeRed, но не тестил на сенсорной панели, возможно реакции на mouseUp, mouseDown не будет.

1 лайк