我們示範如何使用藍牙遙控器 (具備 USB 硬體鎖) 的按鍵控制待命功能、調高及調低音量及控制協作室或桌面裝置的攝影機。我們建立用於聆聽相關事件的巨集,並使用協作室或桌面裝置 API 執行相關的動作。

本文中有第三方 USB 輸入裝置功能的說明。

在下列範例中,您必須輸入以一般字型寫入的文字。斜體文字是從協作室或桌面裝置接收的回應。

1

在 SSH 登入協作室或桌面裝置。您需要本機管理使用者。

2

設定裝置以允許使用第三方 USB 遙控器。

xConfiguration Peripherals InputDevice Mode: On
** end

OK

               

 

您可以使用此指令檢查組態是開或關:

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

OK

                  
3

請註冊回饋,以便讓我們在按下及放開遙控器按鈕時收到通知。

xFeedback Register /event/userinterface/inputdevice
** end

OK

               

 

您可以使用此指令檢查註冊回饋的裝置:

xFeedback list
/event/userinterface/inputdevice
** end

OK

                  
4

按下並放開遙控器的按鈕,以檢查回饋註冊是否作用中。

此動作會產生兩個事件:已按下已放開。若按住按鈕,在放開之前,您會看到已按下事件。然後會產生已放開事件。

按下並放開 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

寫入用於聆聽相關InputDevice的巨集,並使用裝置 API 執行相關的動作。

  • 喚起待命、音量調高和調低按鈕。當巨集發現包含 KEY_VOLUMEUP、KEY_VOLUMEDOWN 或 KEY_SLEEP 的事件時,會執行相關的指令。

  • 為方向鍵建立攝影機控制功能。我們需要使攝影機在按下按鈕時不斷移動。當放開按鈕時,攝影機會停止移動。當巨集發現包含 KEY_LEFT、KEY_RIGHT、KEY_UP 或 KEY_DOWN 的事件時,會執行相關的指令。

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