2013-07-27 68 views
1

主題說明了這一切:JavaScript應用程序如何檢測是否連接了Leap Motion設備

JavaScript應用程序如何檢測Leap Motion設備是否連接。

將Leap Motion設備從一臺計算機移動到另一臺計算機非常容易,JavaScript應用程序如何檢測當前是否有設備連接到計算機?

更新2013年8月8日

我已經打上了這個問題的回答,因爲作爲梅德工作表明存在 - 在本文寫作 - 爲JavaScript應用程序知道如果一個Leap Motion的相關設備沒有簡單的方法在應用加載時連接。

回答

2

這取決於您可用的操作系統API和驅動程序。當設備連接到計算機時,操作系統可以檢測連接到其中一個插座的設備(使用IRQ,輪詢等)。然後,您可以使用驅動程序或OS 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(); 

我希望它有幫助,因爲我沒有硬件來測試。

+0

謝謝@Dmitry。我爲Leap Motion設備構建的應用程序是JavaScript中的Web應用程序。這些不能直接訪問客戶端操作系統。 Leap Motion API文檔位於:http://js.leapmotion.com/api/v0.2.0-beta6/docs 在那裏似乎沒有連接的真/假呼叫。 – Theo

+0

@Theo我更新了這篇文章 - 試試看。 –

+0

@Dimitry 非常感謝。你的代碼運行良好(只是錯過了關閉的parens)。 看一看這個小提琴:http://jsfiddle.net/theo/5x3DA/ 你的代碼工作正常,表示如果設備連接或斷開加載頁面後。 但它並不表示在加載頁面時設備是否已連接。 所以,你應該可以測試這個案例,即使沒有設備 - 因爲這是我想確定的情況... – Theo

0

要了解如何整合Leap與Web App,我反編譯紐約時報讀者Leap Motion。

關於其實現(built.js),以下代碼可能會有所幫助。 (基於Backbone.js)

var LeapController = new 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'); 
    }); 

顯然紐約時報閱讀器的開發人員已經發現,以及如果飛躍控制器加載應用程序之前已經連接這將是不容易察覺。 ( 「WTF」,哈哈....)的該定義LeapControl的行爲代碼

而部分:斷開/重新連接事件,可理解:

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:重新連接被觸發,一個彈出窗口說「未檢測到跳躍運動控制器」會隱藏起來。

經調試,當飛躍運動啓動應用程序之前已經插入,活動將按照以下順序被觸發,並確保正確的檢測:

  1. LeapController.on(「連接」,函數(){ console.log('device is connected'); }); LeapController.on('ready',function(){ dispatch.trigger('LeapControl:reconnect'); });

同時,如果在預先沒有插入,這和僅僅這將被觸發:

  1. LeapController.on( '連接',函數(){ 的console.log( '裝置連接' ); });

作爲結論,我們可能會使用'ready'事件來處理這種情況。 HTH

相關問題