2016-09-18 14 views
0

私のロジックはちょっとしたお尻です。しかし、ここに私が行っていることがあります:私はシリアルデータのストリームと追跡するブール値を持っています。私が本当にやりたいことは、「シリアルデータは[X]と同じですが、特定の関数を1回呼び出すだけです」シリアルデータが特定の数値に評価されている間は関数を1回だけ呼び出す

基本的には、着信シリアルデータをボタンのように動作させる。私はいつも個々の議論のために旗をどこに偽に戻すべきかを不安定にします。今、私はちょうどトータルリセットがあります。何も入っていなければ、すべてリセットします。

個々の引数についてブール値をfalseに戻す場所についての助けがあれば幸いです。私はほとんどそれを見ることができません。

最終的には、「シリアルは2、画面上のランダムな点を取得して円を描いている」という行に沿って何かを行いますが、今のところ私の悪い論理を解決するだけです。

import processing.serial.*; 
Serial myPort; // Create object from Serial class 
int val; 

boolean wasTwo = false; 
boolean wasFour = false; 
boolean wasSeven = false; 


// /dev/cu.LightBlue-Bean 
void setup() 
{ 
    size(800, 800); 
    printArray(Serial.list()); 
    String portName = Serial.list()[1];// /dev/cu.LightBlue-Bean 
    myPort = new Serial(this, portName, 9600); 
} 

void draw(){ 
    background(0); 

    if (myPort.available() > 0) { // If data is available, 
     val = myPort.read();   // read it and store it in val 
    } 

    if(val != 0){ 

     if(!wasTwo && val == 2){ 
      print("2"); 
      wasTwo = true; 
     } 

     if(!wasFour && val == 4){ 
      print("4"); 
      wasFour = true; 
     } 

     if(!wasSeven && val == 7){ 
      print("7"); 
      wasSeven = true; 
     } 

    } else { 
     wasTwo = false; 
     wasFour = false; 
     wasSeven = false; 
    } 


    if(wasTwo){ 
     red(); 
    } 

    if(wasFour){ 
     green(); 
    } 

    if(wasSeven){ 
     blue(); 
    } 

} 

void red(){ 
    fill(255,0,0); 
    ellipse(200,200, 200, 200); 

} 

void green(){ 
    fill(0,200,0); 
    ellipse(400,400, 200, 200); 

} 

void blue(){ 
    fill(0,0,255); 
    ellipse(600,600, 200, 200); 

} 

答えて

0

あなたはすでに目標値を見てきたかどうかを追跡する必要があります。変数booleanでこれを行うことができます。

次に、シリアルデータを読み込むときに値を確認します。 でない場合は、booleanをfalseに設定するだけです。 の目標値である場合、もう一度チェックを行います。既に目標値を見ましたか?そうでない場合は、関数を呼び出してbooleantrueに設定します。その場合は、を呼び出さないでください。一緒にすべてを置く

、それは次のようになります。

boolean sawTarget = false; 
int targetValue = 2; 

void draw(){ 

    if (myPort.available() > 0) { 
     int serialValue = myPort.read(); 

     if(serialValue == targetValue){ 
      if(!sawTarget){ 
       doSomething(); 
      } 
      sawTarget = true; 
     } 
     else{ 
      sawTarget = false; 
     } 
    } 
} 

また、これはあなたのシリアルイベントのタイミングが正しいと仮定していることに注意してください。シリアルイベントが1秒間に60回以上実行される可能性があることに注意してください。この場合、未処理のイベントが蓄積されます。その場合は、最も外側のifステートメントの代わりにwhile()ループを使用するか、代わりにserialEvent()関数を使用します。

関連する問題