Pokazujemy, jak wykorzystać klawisze pilota Bluetooth (z kluczem sprzętowym USB) do sterowania funkcją czuwania, zwiększania i zmniejszania głośności oraz sterowania kamerą urządzenia pokojowego lub biurkowego. Tworzymy makro, które nasłuchuje odpowiednich zdarzeń i wykonuje związane z nimi akcje, korzystając z API urządzenia pokojowego lub biurkowego.

Funkcja urządzenia wejściowego USB innej firmy została opisana w tym artykule.

W poniższym przykładzie należy wprowadzić tekst napisany normalną czcionką. Tekst pisany kursywą to odpowiedź otrzymana z urządzenia systemu biurowego lub biurkowego.

1

Zaloguj się do urządzenia w pokoju lub na biurku za pomocą SSH. Potrzebujesz lokalnego użytkownika admin.

2

Skonfiguruj urządzenie, aby umożliwić korzystanie z pilota zdalnego sterowania USB innej firmy.

xConfiguration Peripherals InputDevice Mode: On
** end

OK

               

 

Za pomocą tego polecenia można sprawdzić, czy konfiguracja jest włączona, czy wyłączona:

xConfiguration Peripherals InputDevice Mode
*c xConfiguration Peripherals InputDevice Mode: On
** end

OK

                  
3

Zarejestruj się w celu otrzymywania informacji zwrotnych, abyśmy byli powiadamiani o naciśnięciu i zwolnieniu przycisków pilota.

xFeedback Register /event/userinterface/inputdevice
** end

OK

               

 

Za pomocą tego polecenia można sprawdzić, dla jakich informacji zwrotnych urządzenie jest zarejestrowane:

xFeedback list
/event/userinterface/inputdevice
** end

OK

                  
4

Naciśnij i zwolnij przycisk na pilocie, aby sprawdzić, czy działa rejestracja sprzężenia zwrotnego.

Ta akcja generuje dwa zdarzenia: Wciśnięty i Zwolniony. Jeśli naciśniesz i przytrzymasz przycisk, zobaczysz zdarzenie Wciśnięty do momentu zwolnienia przycisku. Następnie generowane jest zdarzenie Zwolniony.

Zdarzenia te są wywoływane podczas naciskania i zwalniania klawisza Enter:

 
                  
*e UserInterface InputDevice Key Action Key: KEY_ENTER
*e UserInterface InputDevice Key Action Code: 28
*e UserInterface InputDevice Key Action Type: Pressed
** end
*e UserInterface InputDevice Key Action Key: KEY_ENTER
*e UserInterface InputDevice Key Action Code: 28
*e UserInterface InputDevice Key Action Type: Released
** end

               
5

Tworzymy makro, które nasłuchuje odpowiednich zdarzeń InputDevice i wykonuje związane z nimi akcje, korzystając z API urządzenia pokojowego lub biurkowego.

  • Ożywiaj przyciski trybu gotowości, zwiększania i zmniejszania głośności. Kiedy makro widzi zdarzenie zawierające KEY_VOLUMEUP, KEY_VOLUMEDOWN, lub KEY_SLEEP, to wykonuje odpowiednie komendy.

  • Utwórz funkcję sterowania kamerą dla klawiszy strzałek. Chcemy, aby kamera poruszała się tak długo, jak długo przycisk jest wciśnięty. Po zwolnieniu przycisku ruch kamery zostaje zatrzymany. Kiedy makro widzi zdarzenie zawierające KEY_LEFT, KEY_RIGHT, KEY_UP, lub KEY_DOWN, to wykonuje odpowiednie komendy.

const xapi = require('xapi');

function com(command, args='') {
  xapi.command(command, args);
  log(command + ' ' + JSON.stringify(args));
}

function log(event) {
  console.log(event);
}

function notify(message) {
  xapi.command('UserInterface Message TextLine Display', {
    Text: message,
    duration: 3
  });
}

function cameraControl(motor, direction, cameraId='1') {
  com('Camera Ramp', { 'CameraId': cameraId,
                       [motor]: direction
  });
}

function init() {
  let standbyState;
  xapi.status.get('Standby').then((state) => {standbyState = state.State === 'Off' ? false : true; });
  xapi.status.on('Standby', state => {
      standbyState = state.State === 'Off' ? false : true; 
  });
  
  xapi.event.on('UserInterface InputDevice Key Action', press => {
    if (press.Type == "Pressed") {
      switch (press.Key) {
        case "KEY_LEFT":
          cameraControl('Pan', 'Left');
          break;
        case "KEY_RIGHT":
          cameraControl('Pan', 'Right');
          break;
        case "KEY_UP":
          cameraControl('Tilt', 'Up');
          break;
        case "KEY_DOWN":
          cameraControl('Tilt', 'Down');
          break;
        default:
          break;
        }
    } else if (press.Type == "Released") {
        switch (press.Key) {
          case "KEY_LEFT":
            cameraControl('Pan', 'Stop');
          break;
          case "KEY_RIGHT":
            cameraControl('Pan', 'Stop');
          break;
          case "KEY_UP":
            cameraControl('Tilt', 'Stop');
          break;
          case "KEY_DOWN":
            cameraControl('Tilt', 'Stop');
          break;
          case 'KEY_VOLUMEUP':
            com('Audio Volume Increase');
            break;
          case 'KEY_VOLUMEDOWN':
            com('Audio Volume Decrease');
            break;
          case 'KEY_SLEEP':
            com(standbyState ? 'Standby Deactivate' : 'Standby Activate');
            break;
          default:
            break;
          }
      } 
  });
}

init();