2016-02-12 41 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? 

的另一种方法断开连接,客户端将是解决问题为好,但成本更高的开销和等待时间确实。