move LED key handling to LEDControl; cleanup

This commit is contained in:
jan 2016-07-10 07:53:20 -07:00
parent 58bb1611c8
commit 1bbe2361ec
4 changed files with 126 additions and 374 deletions

View File

@ -2,10 +2,9 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="6e752a8c-6cb9-4ef9-9031-0329ce15fcb4" name="Default" comment=""> <list default="true" id="6e752a8c-6cb9-4ef9-9031-0329ce15fcb4" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/Ellipse.java" afterPath="$PROJECT_DIR$/src/Ellipse.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/EuglenaApplet.java" afterPath="$PROJECT_DIR$/src/EuglenaApplet.java" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/EuglenaApplet.java" afterPath="$PROJECT_DIR$/src/EuglenaApplet.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/Menu.java" afterPath="$PROJECT_DIR$/src/Menu.java" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/LEDControl.java" afterPath="$PROJECT_DIR$/src/LEDControl.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/euglena_basic_stimuli.java" afterPath="$PROJECT_DIR$/src/euglena_basic_stimuli.java" />
</list> </list>
<ignored path="processing-intellij.iws" /> <ignored path="processing-intellij.iws" />
<ignored path=".idea/workspace.xml" /> <ignored path=".idea/workspace.xml" />
@ -29,10 +28,9 @@
<file leaf-file-name="euglena_basic_stimuli.java" pinned="false" current-in-tab="true"> <file leaf-file-name="euglena_basic_stimuli.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/euglena_basic_stimuli.java"> <entry file="file://$PROJECT_DIR$/src/euglena_basic_stimuli.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="517"> <state relative-caret-position="-1787">
<caret line="455" column="12" selection-start-line="455" selection-start-column="5" selection-end-line="455" selection-end-column="12" /> <caret line="82" column="0" selection-start-line="82" selection-start-column="0" selection-end-line="82" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#16478#0" expanded="true" />
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
</state> </state>
@ -50,17 +48,17 @@
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="EuglenaApplet.java" pinned="false" current-in-tab="true"> <file leaf-file-name="EuglenaApplet.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/EuglenaApplet.java"> <entry file="file://$PROJECT_DIR$/src/EuglenaApplet.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="273"> <state relative-caret-position="565">
<caret line="45" column="49" selection-start-line="45" selection-start-column="49" selection-end-line="45" selection-end-column="49" /> <caret line="101" column="22" selection-start-line="101" selection-start-column="22" selection-end-line="101" selection-end-column="22" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -92,11 +90,11 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="LEDControl.java" pinned="false" current-in-tab="false"> <file leaf-file-name="LEDControl.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/LEDControl.java"> <entry file="file://$PROJECT_DIR$/src/LEDControl.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288"> <state relative-caret-position="252">
<caret line="8" column="27" selection-start-line="8" selection-start-column="27" selection-end-line="8" selection-end-column="27" /> <caret line="7" column="20" selection-start-line="7" selection-start-column="20" selection-end-line="7" selection-end-column="20" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
@ -139,12 +137,10 @@
<list> <list>
<option value="$PROJECT_DIR$/src/Settings.java" /> <option value="$PROJECT_DIR$/src/Settings.java" />
<option value="$PROJECT_DIR$/src/ExampleApplet.java" /> <option value="$PROJECT_DIR$/src/ExampleApplet.java" />
<option value="$PROJECT_DIR$/src/euglena_basic_stimuli.java" />
<option value="$PROJECT_DIR$/src/Projector.java" /> <option value="$PROJECT_DIR$/src/Projector.java" />
<option value="$PROJECT_DIR$/src/heatup.java" /> <option value="$PROJECT_DIR$/src/heatup.java" />
<option value="$PROJECT_DIR$/src/TriangleClass.java" /> <option value="$PROJECT_DIR$/src/TriangleClass.java" />
<option value="$PROJECT_DIR$/src/RectangleClass.java" /> <option value="$PROJECT_DIR$/src/RectangleClass.java" />
<option value="$PROJECT_DIR$/src/LEDControl.java" />
<option value="$PROJECT_DIR$/src/Calibrator.java" /> <option value="$PROJECT_DIR$/src/Calibrator.java" />
<option value="$PROJECT_DIR$/lib/core.jar!/processing/core/PApplet.class" /> <option value="$PROJECT_DIR$/lib/core.jar!/processing/core/PApplet.class" />
<option value="$PROJECT_DIR$/src/Camera.java" /> <option value="$PROJECT_DIR$/src/Camera.java" />
@ -158,6 +154,8 @@
<option value="$PROJECT_DIR$/src/Ellipse.java" /> <option value="$PROJECT_DIR$/src/Ellipse.java" />
<option value="$PROJECT_DIR$/src/Menu.java" /> <option value="$PROJECT_DIR$/src/Menu.java" />
<option value="$PROJECT_DIR$/src/EuglenaApplet.java" /> <option value="$PROJECT_DIR$/src/EuglenaApplet.java" />
<option value="$PROJECT_DIR$/src/LEDControl.java" />
<option value="$PROJECT_DIR$/src/euglena_basic_stimuli.java" />
</list> </list>
</option> </option>
</component> </component>
@ -526,8 +524,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -591,7 +589,6 @@
<state relative-caret-position="0"> <state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#16478#0" expanded="true" />
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
</state> </state>
@ -605,8 +602,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -631,7 +628,6 @@
<state relative-caret-position="0"> <state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#16478#0" expanded="true" />
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
</state> </state>
@ -645,8 +641,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -659,8 +655,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -673,8 +669,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -687,8 +683,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -701,8 +697,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -715,8 +711,8 @@
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@ -830,16 +826,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/LEDControl.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="8" column="27" selection-start-line="8" selection-start-column="27" selection-end-line="8" selection-end-column="27" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/Ellipse.java"> <entry file="file://$PROJECT_DIR$/src/Ellipse.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="573"> <state relative-caret-position="573">
@ -850,12 +836,11 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/euglena_basic_stimuli.java"> <entry file="file://$PROJECT_DIR$/src/Menu.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="517"> <state relative-caret-position="36">
<caret line="455" column="12" selection-start-line="455" selection-start-column="5" selection-end-line="455" selection-end-column="12" /> <caret line="190" column="43" selection-start-line="190" selection-start-column="43" selection-end-line="190" selection-end-column="43" />
<folding> <folding>
<element signature="e#0#16478#0" expanded="true" />
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
</state> </state>
@ -873,10 +858,10 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/Menu.java"> <entry file="file://$PROJECT_DIR$/src/euglena_basic_stimuli.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="36"> <state relative-caret-position="-1787">
<caret line="190" column="43" selection-start-line="190" selection-start-column="43" selection-end-line="190" selection-end-column="43" /> <caret line="82" column="0" selection-start-line="82" selection-start-column="0" selection-end-line="82" selection-end-column="0" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
@ -885,14 +870,24 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/EuglenaApplet.java"> <entry file="file://$PROJECT_DIR$/src/EuglenaApplet.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="273"> <state relative-caret-position="565">
<caret line="45" column="49" selection-start-line="45" selection-start-column="49" selection-end-line="45" selection-end-column="49" /> <caret line="101" column="22" selection-start-line="101" selection-start-column="22" selection-end-line="101" selection-end-column="22" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#474#475#0" expanded="true" /> <element signature="e#474#475#0" expanded="true" />
<element signature="e#519#520#0" expanded="true" /> <element signature="e#519#520#0" expanded="true" />
<element signature="e#1641#1642#0" expanded="true" /> <element signature="e#2486#2487#0" expanded="true" />
<element signature="e#1684#1685#0" expanded="true" /> <element signature="e#2529#2530#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/LEDControl.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="7" column="20" selection-start-line="7" selection-start-column="20" selection-end-line="7" selection-end-column="20" />
<folding>
<element signature="imports" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>

View File

@ -67,6 +67,42 @@ public class EuglenaApplet extends PApplet {
} }
} }
@Override
public void keyPressed() {
if (key == CODED) {
projectorApplet.calibrator.buttonPressed(keyCode);
} else {
switch(key) {
case 'd':
case 'w':
case 'a':
case 's':
ledControl.keyPressed(key);
break;
case ENTER:
//TODO: snapshot
//snapshot();
break;
case 'r':
//TODO: record
break;
}
}
}
@Override
public void keyReleased() {
switch(key) {
case 'd':
case 'w':
case 'a':
case 's':
ledControl.keyReleased(key);
break;
}
}
public void controlEvent(ControlEvent theEvent) { public void controlEvent(ControlEvent theEvent) {
menu.controlEvent(theEvent); menu.controlEvent(theEvent);
} }

View File

@ -34,17 +34,17 @@ class LEDControl {
return this.state[dir.index]; return this.state[dir.index];
} }
public void turnOff(Direction dir) { void turnOff(Direction dir) {
this.arduino.digitalWrite(dir.pin, Arduino.LOW); this.arduino.digitalWrite(dir.pin, Arduino.LOW);
this.state[dir.index] = false; this.state[dir.index] = false;
} }
public void turnOn(Direction dir) { void turnOn(Direction dir) {
this.arduino.digitalWrite(dir.pin, Arduino.HIGH); this.arduino.digitalWrite(dir.pin, Arduino.HIGH);
this.state[dir.index] = true; this.state[dir.index] = true;
} }
public void toggle(Direction dir) { void toggle(Direction dir) {
if (isActive(dir)) { if (isActive(dir)) {
turnOff(dir); turnOff(dir);
} else { } else {
@ -52,18 +52,51 @@ class LEDControl {
} }
} }
public void allOn() { void allOn() {
for (Direction dir : Direction.values()) { for (Direction dir : Direction.values()) {
turnOn(dir); turnOn(dir);
} }
} }
public void allOff() { void allOff() {
for (Direction dir : Direction.values()) { for (Direction dir : Direction.values()) {
turnOff(dir); turnOff(dir);
} }
} }
void keyPressed(char key) {
switch (key) {
case 'd':
turnOn(Direction.RIGHT);
break;
case 'w':
turnOn(Direction.UP);
break;
case 's':
turnOn(Direction.DOWN);
break;
case 'a':
turnOn(Direction.LEFT);
break;
}
}
void keyReleased(char key) {
switch (key) {
case 'd':
turnOff(Direction.RIGHT);
break;
case 'w':
turnOff(Direction.UP);
break;
case 's':
turnOff(Direction.DOWN);
break;
case 'a':
turnOff(Direction.LEFT);
break;
}
}
enum Direction { enum Direction {
LEFT (0, 10), LEFT (0, 10),

View File

@ -1,33 +1,3 @@
/* Development Version
Created By: Seung Ah Lee
Modified by: Karina Samuel-Gama
Modified by: Amy Lam
This program runs patterned light stimuli. Users choose between different stimuli which
are projected through the projector and displayed onto Euglena. A webcam records the
projections overlayed with the view of the Euglena.
Current Functionality
- Screen calibration. Users can line up the 4 colored dots with the 4 corners of the screen
using the directional keys and home, end, page up, and page down
- Allows free draw. Users can change colors and pen width to interact with the euglena.
Users can also activate the four LEDs using 'a' 'w' 'd' 's'. In free draw users can also
see the computer tracking the top right corner of the screen by hitting CTRL
- Users can input LED sequences and see the reaction of the euglena. This allows for the
user to easily draw while the sequence is running. [The code can also be saved for future
functionality]
- The User can also save LED sequences and paint drawings for future uses. The data is only saved
in the current instance of the program. NEED to integrate the program with remote database
___________________________________________________________
| | |
| | Projection |
| Display Screen | Off Screen doodle |
| visible on laptop | appears here |
| | |
| | |
|___________________________|_____________________________|
*/
import org.firmata.*; import org.firmata.*;
import gab.opencv.*; import gab.opencv.*;
import processing.video.*; import processing.video.*;
@ -35,27 +5,14 @@ import processing.serial.*;
import cc.arduino.*; import cc.arduino.*;
import controlP5.*; import controlP5.*;
Capture cam; // One camera object needed to display euglena
Arduino arduino; // One arduino to control the LEDs
ControlP5 cp5; // Library to create nicer GUI
OpenCV opencv; // One opencv object needed per region of interest with unique dimension OpenCV opencv; // One opencv object needed per region of interest with unique dimension
OpenCV opencv2;
OpenCV opencv3;
OpenCV opencv4;
OpenCV opencv5;
/* CONSTANTS */ /* CONSTANTS */
/////////////////// Program Controls /////////////////// Program Controls
final long ledDelay = 5000; // Duration of light from LED during LED sequence final long ledDelay = 5000; // Duration of light from LED during LED sequence
final int recordDelay = 0; // Time delay befoe taking next xcoord in case of lag final int recordDelay = 0; // Time delay befoe taking next xcoord in case of lag
final int paintSize = 100; // Number of xcoord taken in limited paint activity final int paintSize = 100; // Number of xcoord taken in limited paint activity
final int ledLimit = 3; // Number of LEDs in sequence
////////////////// LED Controls
final int left = 10;
final int right = 5;
final int down = 9;
final int up = 6;
//////////////////// Image Processing for doodle exploration //////////////////// Image Processing for doodle exploration
final int roiWidth = 500; // Width of ROI final int roiWidth = 500; // Width of ROI
@ -67,22 +24,8 @@ final int roiCornerY = 290;
final int centerY = 540; // Center Y coordinate final int centerY = 540; // Center Y coordinate
final int centerX = 860; // Center X coordinate final int centerX = 860; // Center X coordinate
/////////////////// Game Controls
final int goalEntrance = 150; // 250 Width of entrance of goal
final int goalDepth = 150; // 100 Depth of goal
final float totalGameTime = 45000; // Duration of game
final float scoreDelay = 100; // time to wait before score update so score display doesn't look as jumpy
final float clearTime = 100000; // Duration of clear function : 1 minute 40 seconds
final String gameInstructions = "Pulsed 488 nm light for whole screen"; // Instructions
final String game2Instructions = "Draw barriers and use a, w, d, s to change the driection to get the euglena into the green box.";
final String game3Instructions = "Draw barriers to get the eugelna into the green box. Don't let them escape. You have limited paint.";
/* Global Variables */ /* Global Variables */
///////////////// Miscellaneaous Variables ///////////////// Miscellaneaous Variables
int penWidth = 15; // Default width of pen
int ledPin = 5; // LED of interest
boolean load = false; // Boolean to determine if user wants to load previously saved led sequences or paint boolean load = false; // Boolean to determine if user wants to load previously saved led sequences or paint
long ledTime; // Temporary time storage used to keep LED's on for certain period of time long ledTime; // Temporary time storage used to keep LED's on for certain period of time
long paintTime; // Temporary time storage used to determine when paint "runs out" long paintTime; // Temporary time storage used to determine when paint "runs out"
@ -97,15 +40,9 @@ int count; // Equivalent to number of outline
///////////////////////// Color Variables ///////////////////////// Color Variables
int iColor=0;//current color int iColor=0;//current color
int rightArrow = 0;
int downArrow = 0;
int leftArrow = 0;
int upArrow = 0;
float lagTime = 1; float lagTime = 1;
int totalTime = 15000; int totalTime = 15000;
int presetProg;
//////////////////// Storage Variables //////////////////// Storage Variables
IntList paintLimit = new IntList(); // Stores finite limit of XCoord of points drawn. Once limit is reached "drawing" is stopped IntList paintLimit = new IntList(); // Stores finite limit of XCoord of points drawn. Once limit is reached "drawing" is stopped
@ -131,41 +68,6 @@ PImage goal2;
PImage gameScreen; PImage gameScreen;
PImage entireScreen; PImage entireScreen;
PImage cvscreen; PImage cvscreen;
// score handling
int plusScore; // Equivalent to number of outlines
int minusScore;
int totalScore;
float scoreTime; // Temporary variable to ensure score is displayed for proper length of time
float scoreUpdateTime; // Temporary variable to ensure score changes at even intervals
// Game time handling
float currentGameTime; // Temporary variable to ensure game runs for proper length of time
float secondCounter;
// screen clearing
float clearScreenTime; // Temporary variable to ensure screen clearing lasts for proper length of time
boolean cleared = false; // Keeps track of whether screen has been cleared
// LED control
int gamePin = 10; // Used to keep track of activated LED pin serves to limit user control over LED's
/////////////////////////Program Session Variables
int startSession = 0; // 0: "play" button, 1: menu, 2: ledSequence, 3: limitedPaint, 4: Level developer, 5: doodling, 6:Game Menu, 7: Level 1, 8: Level 2
int ledSession = 0; // 0: pick LED sequence, 1: run through sequence, 2: reset activity
int paintSession = 0; // 0: initialize Paint, 1: Run through paint session, 2: reset activity
int levelSession = 1; // 0: finish development, 1: Choose LED level or paint level, 2 : paint level, 3 : led level
int gameSession = 0; // 0: instructions and screen clear, 1: play level, 2: score game, 3: reset first level
int game2Session = 0; // 0: instructions and screenclear, 1: play level, 2: score game, 3: reset second level
int game3Session = 0; // 0: instructions and screenclear, 1: play level, 2: score game, 3: reset third level
int protoGameSession = 0;
int screenWidth;
int screenHeight;
int totalCount = 1;
float percentDensity;
int densityTSTime;
int densityROITime;
int displayDensityTime;
int densitySession = 0;
int gameScreenWidth = 600;
int gameScreenHeight = 600;
static float densityThreshold = 6; static float densityThreshold = 6;
boolean densityMeasured = false; boolean densityMeasured = false;
@ -173,83 +75,18 @@ boolean densityMeasured = false;
FloatList fadeXCoord = new FloatList(); // Stores x-coordinate of each point FloatList fadeXCoord = new FloatList(); // Stores x-coordinate of each point
FloatList fadeYCoord = new FloatList(); FloatList fadeYCoord = new FloatList();
DropdownList presetsList;
ArrayList<Line> lines = new ArrayList<Line>();
ArrayList<Ellipse> ellipses = new ArrayList<Ellipse>();
ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>();
ArrayList<Triangle> triangles = new ArrayList<Triangle>();
ArrayList<ShrinkWindow> shrinkwindows = new ArrayList<ShrinkWindow>();
ArrayList<ExpandWindow> expandwindows = new ArrayList<ExpandWindow>();
ArrayList<TranslateWindow> translatewindows = new ArrayList<TranslateWindow>();
ArrayList<RotateWindow> rotatewindows = new ArrayList<RotateWindow>();
EllipseDrawer ellipseDrawer = new EllipseDrawer();
LineDrawer lineDrawer = new LineDrawer();
RectangleDrawer rectangleDrawer = new RectangleDrawer();
TriangleDrawer triangleDrawer = new TriangleDrawer();
Shrink shrink = new Shrink(); Shrink shrink = new Shrink();
Expand expand = new Expand(); Expand expand = new Expand();
Translate translate = new Translate(); Translate translate = new Translate();
Rotate rotate = new Rotate(); Rotate rotate = new Rotate();
Calibrator calibrator = new Calibrator();
Menu menu;
char drawtype = 'd';
int preset;
void setup() { void setup() {
count = 1; count = 1;
totalCount = 1; totalCount = 1;
background(200); background(200);
size(displayWidth*2, displayHeight*2);
screenWidth = displayWidth;
screenHeight = displayHeight;
ellipseMode(CORNER);
smooth(); smooth();
/*
// Capture cam - initialize correct camera
String[] cameras = Capture.list();
if (cameras.length == 0) {
println("There are no cameras available for capture.");
exit();
} else {
println("Available cameras:");
for(int i = 0; i < cameras.length; i++) {
println(i, cameras[i]);
}
println(cameras[37]);
cam = new Capture(this, cameras[69]); //cameras[39] : 1280x1024 fps=10, cameras[37] 1280 X 800 fps=25
cam.start();
}
// Arduino - initialize correct arduino
String[] arduinos = Arduino.list();
if (arduinos.length == 0) {
println("There are no arduinos available for use.");
exit();
} else {
println("Available arduinos:");
for(int i = 0; i < arduinos.length; i++) {
println(arduinos[i]);
}
println(arduinos[0]);
arduino = new Arduino(this, arduinos[0], 57600); // arduinos[1] : COM4
arduino.pinMode(ledPin, Arduino.OUTPUT);
}
*/
// OpenCV - initialize correct frames and images
// opencv = new OpenCV(this, roiWidth, roiHeight);
// opencv.startBackgroundSubtraction(7, 3, .35);
// roiFrame = new PImage(roiWidth, roiHeight);
menu = new Menu(this);
menu.drawBackground();
menu.drawArrows();
clearDisplay(); clearDisplay();
} }
@ -257,14 +94,6 @@ void setup() {
/* Runs contionous display of mouse in the background; keeps /* Runs contionous display of mouse in the background; keeps
track of what mode app is in and where mouse is on the screen */ track of what mode app is in and where mouse is on the screen */
void draw() { void draw() {
// camera display - webcam feed reads into background of laptop display
if(cam.available() == true) {
cam.read();
}
imageMode(CORNER);
image(cam, 0, 0, displayWidth - menu.width, displayHeight);
if (showcv) { // Show image tracking when CTRL is pressed if (showcv) { // Show image tracking when CTRL is pressed
identifyEuglena(); identifyEuglena();
@ -274,10 +103,6 @@ void draw() {
recordTimelapse(lagTime, totalTime); //Note: the maximum fps is around 5 recordTimelapse(lagTime, totalTime); //Note: the maximum fps is around 5
calibrator.draw();
menu.draw();
for (int i=0; i < shrinkwindows.size(); i++) { for (int i=0; i < shrinkwindows.size(); i++) {
shrinkwindows.get(i).draw(); shrinkwindows.get(i).draw();
} }
@ -302,22 +127,6 @@ and off with standard directional keys. It also allows calibration of
the projectorApplet field of view */ the projectorApplet field of view */
void keyPressed() { void keyPressed() {
if (key == CODED) {
// Calibration of projectorApplet field of view
calibrator.buttonPressed(keyCode);
switch(keyCode) {
case 112: // F1 key
if (startSession == 8) { // Level 2
if(gamePin == 5) {
gamePin = 10; // Euglena move left
arduino.digitalWrite(right, Arduino.LOW);
} else {
gamePin = 5; // Euglena move right
arduino.digitalWrite(left, Arduino.LOW);
}
}
break;
case CONTROL: case CONTROL:
if(showcv) showcv = false; if(showcv) showcv = false;
@ -331,30 +140,6 @@ void keyPressed() {
// Control LED with standard directional keys // Control LED with standard directional keys
switch(key) { switch(key) {
case 'd':
ledPin = right; // Forces Euglena right
rightArrow = 204;
arduino.digitalWrite(ledPin, Arduino.HIGH);
break;
case 'w':
ledPin = up; // Forces Euglena up
upArrow = 204;
arduino.digitalWrite(ledPin, Arduino.HIGH);
break;
case 's':
ledPin = down; // Forces Euglena down
downArrow = 204;
arduino.digitalWrite(ledPin, Arduino.HIGH);
break;
case 'a':
ledPin = left; //Forces Euglena left
leftArrow = 204;
arduino.digitalWrite(ledPin, Arduino.HIGH);
break;
default: // Turn off last light
arduino.digitalWrite(ledPin, Arduino.LOW);
leftArrow = rightArrow = upArrow = downArrow = 0;
break;
case ENTER: // Takes a snapshot of the FOV case ENTER: // Takes a snapshot of the FOV
snapshot(); snapshot();
@ -366,41 +151,6 @@ void keyPressed() {
} }
} }
/* Turns off LED's that have been turned on while the app is running*/
void keyReleased() {
switch(key) {
case 'd':
ledPin = right;
rightArrow = 0;
arduino.digitalWrite(ledPin, Arduino.LOW);
break;
case 'w':
ledPin = up;
upArrow = 0;
arduino.digitalWrite(ledPin, Arduino.LOW);
break;
case 's':
ledPin = down;
downArrow = 0;
arduino.digitalWrite(ledPin, Arduino.LOW);
break;
case 'a':
ledPin = left;
leftArrow = 0;
arduino.digitalWrite(ledPin, Arduino.LOW);
break;
// case 'n':
// opencv = new OpenCV(this, roiWidth, roiHeight);
// opencv.startBackgroundSubtraction(7, 3, .35);
// roiFrame = new PImage(roiWidth, roiHeight);
// break;
default :
arduino.digitalWrite(ledPin, Arduino.LOW);
leftArrow = rightArrow = upArrow = downArrow = 0;
break;
}
}
/* Listens for user dragging mouse and draws points of appropriate /* Listens for user dragging mouse and draws points of appropriate
color and width on the screen */ color and width on the screen */
@ -413,68 +163,6 @@ void mouseDragged() {
} }
} }
void mouseClicked(){
if (mouseX < displayWidth-menu.width){
switch(drawtype) {
case 'e' :
ellipseDrawer.mouseClicked(mouseX, mouseY);
break;
case 'l' :
lineDrawer.mouseClicked(mouseX, mouseY);
break;
case 'r' :
rectangleDrawer.mouseClicked(mouseX, mouseY);
break;
case 't' :
triangleDrawer.mouseClicked(mouseX, mouseY);
break;
case 's' :
shrink.mouseClicked(mouseX, mouseY);
break;
case 'x' :
expand.mouseClicked(mouseX, mouseY);
break;
case 'm' :
translate.mouseClicked(mouseX, mouseY);
break;
case 'c' :
rotate.mouseClicked(mouseX, mouseY);
break;
}
}
}
void controlEvent(ControlEvent theEvent) {
menu.controlEvent(theEvent);
}
/* Translates x coordinate of point from user screen to projection screeen */
float convertXCoord(float x) {
return (x / calibrator.magx + displayWidth * calibrator.offsetx);
}
/* Translates y coordinate of point from user screen to projection screen */
float convertYCoord(float y) {
return (y / calibrator.magy + displayHeight * calibrator.offsety);
}
/* Translates x distances on screen to projectorApplet*/
float convertXDistance(float x) {
return (x / calibrator.magx);
}
/* Translates y distances on screen to projectorApplet*/
float convertYDistance(float y) {
return (y / calibrator.magy);
}