2016-02-12 88 views
2

我的問題是什麼?如何使用Edge.js模塊創建和重用實例變量?

當我說「閃爍綠色」時,無人機將完成我想要的。這很好。

當我再次說「閃爍綠色」時,它會執行代碼,但無人機不會給出響應。無人機首次給出了答覆。所以每次我必須重啓程序才能工作。煩人...

第二次發生了什麼?

它會執行完全相同的,它也執行代碼,但無人機不會給出響應。

下面的代碼:

private static void _speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    switch (e.Result.Text) 
    { 
     case "Blink green": 
      Task.Run((Action)blinkGreen); 
      break; 
    } 
} 

// ONLY WORKS THE FIRST TIME 
// WHEN I SAY "BLINK GREEN" AGAIN, IT'S WILL EXECUTE THE 
// CODE BUT THE DRONE DOESN'T GIVE A RESPONSE. ONLY THE 
// FIRST TIME (SO I HAVE TO RESTART THE PROGRAM) 
public static async void blinkGreen() 
{ 
    var func = Edge.Func(@" 
     var arDrone = require('ar-drone'); 
     var client = arDrone.createClient(); 

     return function(data, callback){ 
      client.animateLeds('blinkGreen',5,2); 
      callback(null, data); 
     } 
    "); 
    Console.WriteLine(await func("BLINK EXECUTED!")); 
} 

我認爲有些事情是怎麼回事:

var arDrone = require('ar-drone'); 
var client = arDrone.createClient(); 

允許我創建一個客戶,我猜。我必須創建並重用客戶端實例,以便可以使用同一個客戶端來解決問題。但我不知道如何用Edge.js模塊做到這一點...

我希望有人能幫我解決這個問題。

感謝,

傑米

+0

我對ar-drone庫不熟悉,但一次只能連接一個客戶端?如果您可以創建並重用可能有效的客戶端實例。 – Cyral

+0

@Cyral,我認爲問題是我可以創建一個客戶端,你已經說過。你有一個想法,我可以如何使用一個客戶? – Jamie

+0

我剛剛在我的源中看到了這個問題,但我不太瞭解在C#中運行NodeJS。您需要以某種方式將客戶端創建爲全局變量,但仍然可以稍後訪問它。 – Cyral

回答

0

我不熟悉這個庫,但最需要的NodeJS緩存,所以只在函數內部的部分將運行不止一次。請嘗試移動animateLeds調用返回的函數裏面,像這樣:

public static void blinkGreen() 
{ 
    var func = Edge.Func(@" 
     var arDrone = require('ar-drone'); 
     var client = arDrone.createClient(); 

     return function(data, callback){ 
      client.animateLeds('blinkGreen',5,2); 
      callback(null, data); 
     } 
    "); 
} 
1

老實說,我還沒有使用Edge.js但我可以從你的例子看到張貼您的問題。

爲什麼不將Edge功能分解爲類中的單獨函數?

E.g.定義創建客戶端並返回它的邊緣功能,如果客戶端已經創建,則返回現有的客戶端。調用這個函數Ge​​tOrCreateClient。

然後定義需要客戶端接受客戶端對象的調用,如果您有多個無人駕駛飛機的客戶端可以分別閃爍。

最後解釋語音命令,並根據需要使用GetOrCreateClient函數爲適合無人機的客戶端分派正確無人機的客戶端。

我可以編寫一些代碼來幫助你,但我希望看到你是如何從我首先解釋的,而不是僅僅爲你寫的。

另一種方式是在收到響應後斷開客戶端連接,但發出命令時會產生更多開銷和延遲。

UPDATE

要共享函數調用我認爲你需要導出的變量或函數要共享之間傳輸數據。

可能有一個導出函數或一個窗口或GLOBAL對象,可以使用需要導出的變量進行擴充。

就目前的方法而言,您已經看到想要在C#中定義邏輯,因爲邏輯是在JavaScript中發生的,您實際上可以在edge.js函數中定義GetOrCreateClient,就像在C#中但在Javascript中一樣。

'function GetOrCreateClient(){return!this.client? this.client = require('ardone'):this.client; }'

這可以在處理對blinkGreen的調用之前定義。

然後在javascript中創建client = GetOrCreateClient,第一次創建客戶端,第二次將返回現有客戶端。

然後根據需要進行blinkGreen調用。

最後,C#已經有一個Ardone庫,除非你需要Node,這對我來說是有意義的,讓Node不在等式中,並且僅僅爲此使用c#。

+0

你好@Jay,謝謝你的解釋。我明天會試試這個,並讓你知道結果。 – Jamie

1

@Jay>

我有點進一步,讓我們看看我做了什麼。

  1. 我已經創建了一個布爾值來檢查是否已經有一個客戶端和一個變量來保存客戶端。

    static bool clientCreated = false; 
    static object currentClient; 
    
  2. 在我創建了一個檢查,以獲取現有或新客戶

    // First check to get an existing or new client 
        currentClient = GetOrCreateClient(); 
    
  3. 我創建返回現有或新客戶的方法程序的開頭

    public static object GetOrCreateClient() 
    { 
        // If there is already a client 
        if (clientCreated) 
        { 
         Console.WriteLine("There's already a client!"); 
        } 
        // If there is no client 
        else 
        { 
         // Set boolean 
         clientCreated = true; 
    
         // Create a client 
         var newClient = Edge.Func(@" 
          var arDrone = require('ar-drone'); 
          var client = arDrone.createClient(); 
    
          return function(data, callback){ 
           callback(null, data); 
          } 
         "); 
    
         Console.WriteLine("Client created!"); 
    
         // Return new client 
         return newClient; 
        } 
        // Return current client 
        return currentClient; 
    } 
    
  4. 而且應該使用相同客戶端的動作(無人機的動畫)的功能方法

    public static async void blinkGreen() 
    { 
        // Get an existing or new client 
        var client = GetOrCreateClient(); 
    
        // Execute the functionality 
        var func = Edge.Func(@"    
         var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient() 
         var client = I WANT HERE THE CLIENT, BUT HOW? 
    
         return function(data, callback){ 
          client.animateLeds('blinkGreen',5,2); 
          callback(null, data); 
         } 
        "); 
        Console.WriteLine(await func("BLINK EXECUTED!")); 
    } 
    

現在我被困在幾件事情,因爲這是正確的方式在全球範圍內保存客戶端中的對象?由於GetOrCreateClient()返回以下對象的方法:

`System.Func`2[System.Object,System.Threading.Tasks.Task`1[System.Object]]` 

因此,我的下一個問題是,我該如何使用客戶端對象進入功能?

var client = GetOrCreateClient();

變量應該放到:

 var func = Edge.Func(@"    
      var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient() 
      var client = I WANT HERE THE CLIENT, BUT HOW? 

的另一種方法斷開連接,客戶端將是解決問題爲好,但成本更高的開銷和等待時間確實。