We laten zien hoe u de knoppen van een Bluetooth-afstandsbediening (met een USB-dongle) kunt gebruiken om de stand-byfunctie aan te sturen, het volume te verhogen en te verlagen, en de camera van een ruimte- of bureauapparaat aan te sturen. We maken een macro die luistert naar relevante gebeurtenissen en de bijbehorende acties uitvoert met behulp van de API van het ruimte- of bureauapparaat.

De functie voor USB-invoerapparaat van derden wordt beschreven in dit artikel.

In het volgende voorbeeld, moet u de tekst invoeren die is geschreven in het normale lettertype. De tekst in cursief is het antwoord dat wordt ontvangen van het ruimte- of bureauapparaat.

1

Meld u aan bij het ruimte- of bureauapparaat op SSH. U hebt een lokale admin-gebruiker nodig.

2

Configureer het apparaat om het gebruik van een USB-afstandsbediening van derden toe te staan.

xConfiguration Peripherals InputDevice Mode: On
** end

OK

               

 

U kunt controleren of de configuratie is in- of uitgeschakeld met deze opdracht:

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

OK

                  
3

Registreer voor feedback, zodat we een melding ontvangen wanneer de knoppen van de afstandsbediening worden ingedrukt en losgelaten.

xFeedback Register /event/userinterface/inputdevice
** end

OK

               

 

U kunt controleren voor welke feedback het apparaat is geregistreerd met deze opdracht:

xFeedback list
/event/userinterface/inputdevice
** end

OK

                  
4

Druk op een knop op de afstandsbediening en laat deze los om te controleren dat feedbackregistratie werkt.

Deze actie genereert twee gebeurtenissen: Ingedrukt en Losgelaten. Als u op een knop drukt en deze ingedrukt houdt, ziet u de gebeurtenis Ingedrukt totdat u de knop loslaat. Vervolgens wordt de gebeurtenis Losgelaten gegenereerd.

Deze gebeurtenissen worden uitgegeven wanneer u de Enter-toets indrukt en loslaat:

 
                  
*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

Schrijf een macro die voor de relevante Invoerapparaat-gebeurtenissen luistert en de gekoppelde acties uitvoert met behulp van de API van het apparaat.

  • Breng de knoppen standby, volume omhoog en volume omlaag tot leven. Wanneer de macro een gebeurtenis ziet met KEY_VOLUMEUP, KEY_VOLUMEDOWN of KEY_SLEEP, worden de gerelateerde opdrachten uitgevoerd.

  • Maak een camerabesturingsfunctie voor de pijltoetsen. We willen dat de camera blijft bewegen zolang de knop wordt ingedrukt. Wanneer de knop wordt losgelaten, stopt de camera met bewegen. Wanneer de macro een gebeurtenis ziet met KEY_LEFT, KEY_RIGHT, KEY_UP of KEY_DOWN, worden de gerelateerde opdrachten uitgevoerd.

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();