Как приложение JavaScript может определить, подключено ли устройство Leap Motion

В теме все сказано:

Как приложение JavaScript может определить, подключено ли устройство Leap Motion.

Перемещать устройства Leap Motion с одного компьютера на другой так просто, но как приложение JavaScript может определить, подключено ли устройство в данный момент к компьютеру?

Обновление от 08.08.2013

Я пометил этот вопрос как ответ, потому что, как показывает работа Дмитрия, на момент написания этой статьи не существует простого способа для приложения JavaScript узнать, подключено ли устройство Leap Motion во время загрузки приложения.


person Theo    schedule 27.07.2013    source источник


Ответы (2)


Это зависит от того, какие API операционной системы и драйверы у вас есть. Когда устройство подключено к компьютеру, операционная система может обнаружить устройство, подключенное к одному из ее разъемов (используя IRQ, опрос и т. д.). Затем вы можете использовать драйвер или API ОС (если он изначально поддерживает такие устройства) для проверки состояния устройства. Поскольку это обычно делается с использованием более низкоуровневого языка программирования, такого как C++, C или даже языка ассемблера (javascript не подходит по нескольким причинам), вам следует проверить справку по javascript API (не уверен, что вы используете API браузера, Win8 API или что-то еще) и посмотрите, есть ли какие-либо связанные функции.

Обновление: ссылка на API, которую вы отправили, кажется довольно расплывчатой. Однако я понял, что он устанавливает соединение WebSocket с локальным хостом под капотом. Функция Controller.connect() на самом деле является процедурой (ничего не возвращает). Но я нашел более полезную ссылку (начало работы: http://js.leapmotion.com/start) есть описание различных событий, которые они обеспечивают, включая следующее:

  • deviceConnected — устройство Leap было подключено
  • deviceDisconnected — устройство Leap было отключено.

В этом случае вы можете использовать обратный вызов вместо предиката:

function doMyOwnStuff()
{
      console.log( "O_o" );
}

var controller = new Leap.Controller();

controller.on('deviceConnected', function() {
  console.log("A Leap device has been connected.");
  doMyOwnStuff();
});

controller.on('deviceDisconnected', function() {
  console.log("A Leap device has been disconnected.");
});

//should probably fire a 'deviceConnected'
controller.connect();

Я надеюсь, что это поможет, потому что у меня нет оборудования для тестирования.

person Dmitrii S.    schedule 27.07.2013
comment
Спасибо, @Dmitry. Приложения, которые я создаю для устройства Leap Motion, — это веб-приложения на JavaScript. Они не имеют прямого доступа к клиентской ОС. Документация по Leap Motion API находится здесь: js.leapmotion.com/api/v0. 2.0-beta6/docs Кажется, там нет связанного вызова true/false. - person Theo; 27.07.2013
comment
@Дмитрий Большое спасибо. Ваш код работает хорошо (просто отсутствуют закрывающие скобки). Взгляните на эту скрипту: jsfiddle.net/theo/5x3DA Ваш код отлично работает, чтобы указать, если устройство подключается или отключается после загрузки страницы. Но это не указывает, подключено ли устройство уже или нет во время загрузки страницы. Таким образом, вы должны иметь возможность протестировать этот случай даже без устройства — потому что это тот случай, который я хотел бы идентифицировать... - person Theo; 28.07.2013
comment
@Theo, поскольку я не могу найти ничего приличного в API, у меня есть другое решение: вы можете отслеживать статус после загрузки страницы, а затем использовать ее после этого pastebin.com/nEKjcShN. Попробуйте это - я все еще не могу проверить, потому что он не подключается к локальному серверу (ну, я его не устанавливал :) ). Должна быть возможность проверить это через объекты подключения, но я пока не нашел как. - person Dmitrii S.; 29.07.2013
comment
@ Дмитрий, я попробовал твое предложение, но безуспешно. Все подробности на GitHub: github.com/jaanga/gestification /дерево/gh-страницы/. Я думаю, что ответ заключается в том, что на момент написания этой статьи для устройства Leap Motion не существует простого .isConnected решения. Большое спасибо за вашу хорошую работу. Я отмечу вопрос как ответ/ - person Theo; 09.08.2013

Чтобы узнать об интеграции Leap с веб-приложением, я декомпилировал New York Times Reader для Leap Motion.

Что касается его реализации (построенный.js), может помочь следующий код. (на основе Backbone.js)

var LeapController = новый Leap.Controller({enableGestures: true});

    window.L = LeapController;

    LeapController.on('deviceConnected', function () {
        console.log('deviceConnected', arguments);
        // in the example code, this fires when the app starts.
        // in our app, it only fires when the device is reconnected after having been connected when the app was started.
        dispatch.trigger('LeapControl:reconnect');
    });

    LeapController.on('ready', function () {
        // this fires when the app is ready.
        dispatch.trigger('LeapControl:reconnect');
    });

    LeapController.on('connect', function () {
        console.log('device is connected');
        // this fires when no device is plugged in. wtf.
    });

    LeapController.connection.on('deviceConnect', function () {
        console.log('deviceConnect');
        // this fires when the device is changes state from plugged in to ungplugged and vice versa.
    });

    LeapController.on('deviceDisconnected', function () {
        console.log('deviceDisconnected', arguments);
        dispatch.trigger('LeapControl:disconnect');
    });

Очевидно, разработчики NYTimes Reader уже обнаружили, что было бы непросто определить, был ли Leap Controller уже подключен до загрузки приложения. ("Втф", ха-ха....)

И часть кода, определяющая поведение события LeapControl:disconnect/reconnect, понятно:

newNews.views.Disconnected = Backbone.View.extend({
    el: $('#disconnection-box'),
    initialize: function () {
        _.bindAll(this);
    },
    open: function () {
        this.listenTo(dispatch, 'LeapControl:disconnect', this.show);
        this.listenTo(dispatch, 'LeapControl:reconnect', this.hide);
        return this;
    }, ........

Таким образом, при запуске LeapControl:reconnect всплывающее окно с сообщением о том, что «контроллер движения прыжка не обнаружен», скрывалось.

При отладке, когда скачкообразное движение уже было подключено до запуска приложения, события будут запускаться в следующем порядке, что обеспечивает правильное обнаружение:

  1. LeapController.on('connect', function () { console.log('устройство подключено'); });
  2. LeapController.on('готово', function () { dispatch.trigger('LeapControl:reconnect'); });

Одновременно, если не было подключено заранее, будет запущено это и только это:

  1. LeapController.on('connect', function () { console.log('устройство подключено'); });

В заключение, мы можем использовать событие «готово» для работы с этим сценарием. ХТН

person LuoboTixS    schedule 28.09.2013