import processing.core.*; 
import processing.data.*; 
import processing.event.*; 
import processing.opengl.*; 

import processing.serial.*; 
import static javax.swing.JOptionPane.*; 

import java.util.HashMap; 
import java.util.ArrayList; 
import java.io.File; 
import java.io.BufferedReader; 
import java.io.PrintWriter; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

public class Versuchsaufbau_Actio_Reactio extends PApplet {




 
Serial myPort;        // The serial port
 
final boolean debug = true;

int Sensor_1_HByte, Sensor_1_LByte, Sensor_2_HByte, Sensor_2_LByte, x = 70, Muell, test = 1;
short Sensor_1, Sensor_1_2, Sensor_2, Sensor_2_2, y_last_1 = 0, y_last_2 = 0;
float Varfloat;
boolean invertieren_on = false, ein_Newton_on = true, fuenf_Newton_on = false, zehn_Newton_on = false, mouseflag = true, Skala_wechseln = true, abwechselnd_rot_blau_zeichnen = true;



public void setup() {
String COMx, COMlist = "";
  


background(255,255,255);



  try {
    if(debug) printArray(Serial.list());
    int i = Serial.list().length;
    if (i != 0) {
      if (i >= 2) {
        // need to check which port the inst uses -
        // for now we'll just let the user decide
        for (int j = 0; j < i;) {
          COMlist += PApplet.parseChar(j+'a') + " = " + Serial.list()[j];
          if (++j < i) COMlist += ",  ";
        }
        COMx = showInputDialog("An welchem COM-Port ist der Arduino angeschlossen?\n"+COMlist);
        if (COMx == null) exit();
        if (COMx.isEmpty()) exit();
        i = PApplet.parseInt(COMx.toLowerCase().charAt(0) - 'a') + 1;
      }
      String portName = Serial.list()[i-1];
      if(debug) println(portName);
      myPort = new Serial(this, portName, 9600); // change baud rate to your liking
      myPort.bufferUntil('\n'); // buffer until CR/LF appears, but not required..
    }
    else {
      showMessageDialog(frame,"Arduino ist nicht angeschlossen!");
      exit();
    }
  }
  catch (Exception e)
  { //Print the type of error
    showMessageDialog(frame,"COM-port ist nicht verfügbar");
    println("Error:", e);
    exit();
  }

}




public void draw()
{

  
if(millis() < 6000 )
  {
    Skala_wechseln = true;
  }  
  
  
  
  
        
if(x >= 1000)
  {
    Skala_wechseln = true;
  }  
  
  
  
  
  
  
  
  
if(myPort.available() > 8) 
  {
      
   if( myPort.read() != 0xDD)
     {
        // Muell =  myPort.read(); 
     }  
   else
     {
              
        Sensor_1_HByte = myPort.read();  
        Sensor_1_LByte = myPort.read();   
        Sensor_1 = (short) ((Sensor_1_HByte << 8 ) | Sensor_1_LByte);
            
        Sensor_1_HByte = myPort.read();  
        Sensor_1_LByte = myPort.read();   
        Sensor_1_2 = (short) ((Sensor_1_HByte << 8 ) | Sensor_1_LByte);
              
        Sensor_2_HByte = myPort.read();  
        Sensor_2_LByte = myPort.read();   
        Sensor_2 = (short) ((Sensor_2_HByte << 8 ) | Sensor_2_LByte);

        Sensor_2_HByte = myPort.read();  
        Sensor_2_LByte = myPort.read();   
        Sensor_2_2 = (short) ((Sensor_2_HByte << 8 ) | Sensor_2_LByte);    
       
               
        if(abwechselnd_rot_blau_zeichnen)
          {
             Sensor_1();
             Sensor_2();
             abwechselnd_rot_blau_zeichnen = false;
          }
        else
          {
             Sensor_2();
             Sensor_1();
             abwechselnd_rot_blau_zeichnen = true; 
          }

        x++;
      }
  }

   
   
   
   
   
   
   

  
      
      
      
      
      
      
      
if (Skala_wechseln)
  {
    if(ein_Newton_on)
      {
        PImage img;
        img = loadImage("0-1N.png");
        image(img, 0, 0);
        x = 70;        
      }  
    else if(fuenf_Newton_on)
      {
        PImage img;
        img = loadImage("0-5N.png");
        image(img, 0, 0);
        x = 70;        
      }
    else
      {
        PImage img;
        img = loadImage("0-10N.png");
        image(img, 0, 0);
        x = 70;           
      }  
    
    Skala_wechseln = false;
  }  
      
      
      
      
/* Wandert der Mauszeiger über ein Button erscheint ein Kreis der dem Nutzer zeigen soll, dass dieser Button mit der linken Maustaste klickbar ist */ 
/* Wandert der Mauszeiger aus dem Bereich heraus, wird der Bereich refreshed sodass kein Rest von dem Kreis mehr sichtbar ist*/
stroke(255);    
fill(255);
rect(1154, 169, 25, 25);
rect(1154, 254, 25, 25);
rect(1154, 289, 25, 25);
rect(1154, 324, 25, 25);
/* Wandert der Mauszeiger über ein Button erscheint ein Kreis der dem Nutzer zeigen soll, dass dieser Button mit der linken Maustaste klickbar ist */ 
/* Wandert der Mauszeiger aus dem Bereich heraus, wird der bereich refreshed sodas keine Reste von dem Kreis mehr sichtbar ist*/













/* Button "Kraft invertieren" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   Sensorauswertung ausgewertet wird (Die rote Sensordarstellung wird invertiert)*/
if(mouseX > 1155 && mouseX < 1175 && mouseY > 170 && mouseY < 190)
  {
    if(mousePressed && mouseflag == true) /* mouseflag dient dazu, dass bei gedrückthalten der linken Maustaste, der Status sich nicht ständig ändert */
       {                                  /* siehe Funktion mouseReleased() */
         mouseflag = false;
         if(invertieren_on)
           {
             invertieren_on = false;
           }
         else
           {
             invertieren_on = true;
           }  
       }
    

    
     stroke(0);
     circle(1165, 180, 22);
     stroke(255);
  } 
  
if(invertieren_on)
  {
    fill(0,255,0);
    stroke(0); 
    circle(1165, 180, 18);
    fill(255,255,255);
    stroke(255); 
  }  
else
  {
    stroke(0); 
    fill(200);
    circle(1165, 180, 18);
    fill(255,255,255);
    stroke(255); 
  }  
/* Button "Kraft invertieren" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird ein variable gesetzt die bei der 
   Sensorauswertung ausgewertet wird */





/* Button "0-1 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */  
if(mouseX > 1155 && mouseX < 1175 && mouseY > 255 && mouseY < 275)
  {
     if(mousePressed && mouseflag == true)
       {
         mouseflag = false;
         if(ein_Newton_on)
           {
             
             
           }
         else
           {
             Skala_wechseln = true;
             ein_Newton_on = true;
             fuenf_Newton_on= false;
             zehn_Newton_on= false;
           }  
       }  

      stroke(0);
      circle(1165, 265, 22);
      stroke(255);
  } 
  
if(ein_Newton_on)
  {
    fill(0,255,0);
    stroke(0); 
    circle(1165, 265, 18);
    fill(255,255,255);
    stroke(255); 
  }
else
  {
    stroke(0); 
    fill(200);
    circle(1165, 265, 18);
    fill(255,255,255);
    stroke(255); 
  }  
/* Button "0-1 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */  
  
 
  
  
  
  
/* Button "0-5 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */    
if(mouseX > 1155 && mouseX < 1175 && mouseY > 290 && mouseY < 310)
  {
    
    if(mousePressed && mouseflag == true)
       {
         mouseflag = false;
         if(fuenf_Newton_on)
           {
             
             
           }
         else
           {
             Skala_wechseln = true;
             fuenf_Newton_on = true;
             ein_Newton_on= false;
             zehn_Newton_on= false;
           }  
       }
    
     stroke(0);
     circle(1165, 300, 22);
     stroke(255);
  } 
  
if( fuenf_Newton_on)
  {
    stroke(0); 
    fill(0,255,0);
    circle(1165, 300, 18);
    fill(255,255,255);
    stroke(255); 
  }    
else
  {
    stroke(0); 
    fill(200);
    circle(1165, 300, 18);
    fill(255,255,255);
    stroke(255); 
  }    
/* Button "0-5 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */    
  
  
  
  
  
  
  
/* Button "0-10 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */    
if(mouseX > 1155 && mouseX < 1175 && mouseY > 325 && mouseY < 345)
  {
    
    if(mousePressed && mouseflag == true)
       {
         mouseflag = false;
         if(zehn_Newton_on)
           {
            
             
           }
         else
           {
             Skala_wechseln = true;
             zehn_Newton_on = true;
             ein_Newton_on= false;
             fuenf_Newton_on= false;
           }  
       }
    
    
      stroke(0);
      circle(1165, 335, 22);
      stroke(255);
  }   

if( zehn_Newton_on)
  {
    stroke(0); 
    fill(0,255,0);
    circle(1165, 335, 18);
    fill(255,255,255);
    stroke(255); 
  }  
else
  {
    stroke(0); 
    fill(200);
    circle(1165, 335, 18);
    fill(255,255,255);
    stroke(255); 
  }  
/* Button "0-10 N" - wird der Button gedrückt erscheint der Button grün bzw. grau (Ein/Aus). Es wird eine Variable gesetzt die bei der 
   if Funktion "Skala_wechseln" ausgewertet wird */  


  } 
  
public void mouseReleased() {
  mouseflag = true;
}  
  
public void Sensor_1(){

              if(invertieren_on)
                {
                  Sensor_1_2 = (short) ~Sensor_1_2;
                }
                
                
              if(ein_Newton_on)
                {        
                 fill(255);
                 rect(500,65,45,18);
                 textSize(16);
                 fill(255,0,0);
                 text(nf((float) Sensor_1_2 / 169,0,2), 500, 80); 
                 fill(255);

                 Sensor_1_2 = (short) ~Sensor_1_2;
                 
                 int casting;
                 casting = (int) Sensor_1_2;
                 casting = casting << 1;
                 Sensor_1_2 = (short) casting;
                 
                 
                }

              else if(zehn_Newton_on)
                {
                 
                 fill(255);
                 rect(500,65,45,18);
                 textSize(16);
                 fill(255,0,0);
                 text(nf((float) Sensor_1_2 / 169,0,2), 500, 80); 
                 fill(255);
                 
                 Sensor_1_2 = (short) ~Sensor_1_2;
                  
                 int casting;
                 casting = (int) Sensor_1_2;
                 casting = casting / 5;
                 Sensor_1_2 = (short) casting;
                } 
               
              else
                {
                  
                 fill(255);
                 rect(500,65,45,18);
                 textSize(16);
                 fill(255,0,0);
                 text(nf((float) Sensor_1_2 / 169,0,2), 500, 80); 
                 fill(255);
                  
                 Sensor_1_2 = (short) ~Sensor_1_2;
                  
                 float casting;
                 casting = (float) Sensor_1_2;
                 casting = casting / 2.5f;
                 Sensor_1_2 = (short) casting;
                }    
                 
              stroke(255, 0, 0);
              

              line(x, 478 + y_last_1,x+1,478 + Sensor_1_2);
              line(x, 479 + y_last_1,x+1,479 + Sensor_1_2);
              line(x, 480 + y_last_1,x+1,480 + Sensor_1_2);
              line(x, 481 + y_last_1,x+1,481 + Sensor_1_2);
              y_last_1 = Sensor_1_2;
              stroke(255);
           
  
}

public void Sensor_2 (){
 

              if(ein_Newton_on)
                {
                 fill(255);
                 rect(500,110,45,18);
                 textSize(16);
                 fill(0,0,255);
                 text(nf((float) Sensor_2_2 / 169,0,2), 500, 125); 
                 fill(255);
                  
                 Sensor_2_2 = (short) ~Sensor_2_2; 
                  
                 int casting;
                 casting = (int) Sensor_2_2;
                 casting = casting << 1;
                 Sensor_2_2 = (short) casting;
                }

              else if(zehn_Newton_on)
                {
                 fill(255);
                 rect(500,110,45,18);
                 textSize(16);
                 fill(0,0,255);
                 text(nf((float) Sensor_2_2 / 169,0,2), 500, 125); 
                 fill(255);

                 Sensor_2_2 = (short) ~Sensor_2_2;  
                  
                 int casting;
                 casting = (int) Sensor_2_2;
                 casting = casting / 5;
                 Sensor_2_2 = (short) casting;
                } 
               
               else
                {
                 fill(255);
                 rect(500,110,45,18);
                 textSize(16);
                 fill(0,0,255);
                 text(nf((float) Sensor_2_2 / 169,0,2), 500, 125); 
                 fill(255);
                  
                 Sensor_2_2 = (short) ~Sensor_2_2;  
                  
                 float casting;
                 casting = (float) Sensor_2_2;
                 casting = casting / 2.5f;
                 Sensor_2_2 = (short) casting;
                }   
                    

       
              stroke(0, 0, 255);

              line(x, 478 + y_last_2,x+1,478 + Sensor_2_2);
              line(x, 479 + y_last_2,x+1,479 + Sensor_2_2);
              line(x, 480 + y_last_2,x+1,480 + Sensor_2_2);
              line(x, 481 + y_last_2,x+1,481 + Sensor_2_2);
              stroke(255, 255, 255);

              
              y_last_2 = Sensor_2_2;  
  
}
  public void settings() { 
size(1200, 900); }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "Versuchsaufbau_Actio_Reactio" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}
