//-------------------
// Processing code:
//-------------------
// analog_Ellipse_Motion
// -Reads analog data from the serial port
// and uses data to change 2D graphic image.

import processing.serial.*;
Serial myPort;        // Create object from Serial class
String serialString;  // variable for serial ASCII date
float val;            // val for data from serial port

float yLoc = 100.0;     // location on Y axis
float speed = 5.0;    // pixels per movement
int radius = 45;      // size of ellipse
int direction = 1;    // 1 goes down, 0 goes up

void setup() {
   size(600, 600);
   smooth();
   noStroke();
   ellipseMode(RADIUS);

   // Open connection to USB (COM port) at 9600 bps
    println(Serial.list());   // -Gives list of available ports 
    myPort = new Serial(this, Serial.list()[1], 9600);
}

void draw() {
    radius = 10 + int(val)/3;   // scale analog reading
    fill(0,12);                    // black, transluscent (alpha=12)
    rect(0, 0, width, height);     // rectangle covers screen 
    fill(255,255,225);             // mix RGB color for ellipse
    ellipse(2 * val, yLoc, radius, radius);
    yLoc += (speed * direction);
    if ((yLoc > height-radius) || (yLoc < radius)) {
      direction = -direction;
    }
  }


//---- The SerialEvent function runs continuously in the background and
//---- stores new values whenever new data comes in on the serial port (USB)

void serialEvent(Serial myPort) {
   serialString = myPort.readStringUntil(10); // Read until end of line character
   if (serialString != null) {
     serialString = trim(serialString); 
     val = int(serialString);
     println(val);
   }                               // end if
}
