2016-04-15 8 views
1

質問のように、私はウェブページを介して、クロムアプリケーションを介してシリアルデバイスと通信しようとしています。目的は、Webページのボタンでスイッチをオンにし、スイッチが実際にオンになっていることを確認することです(シリアル応答)。
これまでのところ、私はスイッチを有効にすることができましたが、実際に有効になっていることを確認する必要があります。シリアルポートから通信 - > Chromeアプリ - >ウェブページ。 Webページが開始されます。

マイChromeアプリケーションコード:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) { 
     if (request.request == 'info') { 
      sendResponse(DEVICE_INFO); 
     } else if (request.request == 'turn_off') { 
      device_array.forEach(function(device){ 
       if (device.id == request.device_id){ 
        device.send('f'); 
       } 
      }); 

//INSTEAD OF "OK" I NEED IT TO ASK THE DEVICE TO CONFIRM OFF/ON STATUS 
      sendResponse('OK'); 

     } else if (request.request == 'turn_on') { 
      device_array.forEach(function(device){ 
       if (device.id == request.device_id){ 
        device.send('n'); 
       } 
      }); 
      sendResponse('OK'); 
     } 
     return true; 
    }); 

私は、デバイスへの「ステータス」クエリを送信する場合、シリアルバッファへの「オン」「オフ」またはを応答するために数ミリ秒を取るために起こっています。これについてどうやって行くかについてのアイデア?前もって感謝します。

答えて

1

最終的には、リスナーのコードブロック内でデバイスのステータスを要求することで機能するようになりました。以下は修正されたものですが、それは仕事が終わったものです。 DEVICE_STATUSは、シリアル接続のonReceiveリスナーによって更新されています。

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) { 
     if (request.request == 'info') { 
      sendResponse(DEVICE_INFO); 
     } else if (request.request == 'turn_off') { 
      device_array.forEach(function(device){ 
       if (device.id == request.device_id){ 
        device.send('f'); 
       } 
      });    
      var time_loop = 0; 
      connection.send('s'); // s is for STATUS 
      var timer = setInterval(device_is_off, 200); 

      function device_is_off(){ 
       if (time_loop > 5){ //Serial Communication Timeout at 1sec 
        sendResponse('ERROR ' + DEVICE_STATUS); 
        clearInterval(timer); 
        return; 
       } 
       if (DEVICE_STATUS == 0){ 
        sendResponse('OK'); 
        clearInterval(timer); 
        return 
       } 
       else time_loop++; 
      } 

     } else if (request.request == 'turn_on') { 
      device_array.forEach(function(device){ 
       if (device.id == request.device_id){ 
        device.send('n'); 
       } 
      });    
      var time_loop = 0; 
      connection.send('s'); // s is for STATUS 
      var timer = setInterval(device_is_on, 200); 

      function device_is_on(){ 
       if (time_loop > 5){ 
        sendResponse('ERROR ' + DEVICE_STATUS); 
        clearInterval(timer); 
        return; 
       } 
       if (DEVICE_STATUS == 1){ 
        sendResponse('OK'); 
        clearInterval(timer); 
        return 
       } 
       else time_loop++; 
      } 
     } 
     return true; 
    }); 
関連する問題