root / processing / blacklight / Input.pde @ 18
Histórico | Ver | Anotar | Download (7,47 KB)
| 1 |
/* |
|---|---|
| 2 |
BLACKLIGHT v1.0 |
| 3 |
Project made for Mestrado de Comunicação Multimédia, Ramo Multimédia Interactivo at Departamento de Comunicação e Arte at Universidade de Aveiro. |
| 4 |
|
| 5 |
Author: Nuno Simaria - nsimaria@ua.pt - #23652 |
| 6 |
Other workgroup members: Ana Filipa Lacerda, Daniela Rei, Renato Costa, Julien Cuenin |
| 7 |
*/ |
| 8 |
|
| 9 |
import processing.serial.*; |
| 10 |
|
| 11 |
|
| 12 |
final int INPUT_END = 10; |
| 13 |
final int INPUT_SAMPLES = 16; |
| 14 |
final int INPUT_RATE = 19200; |
| 15 |
|
| 16 |
Input [] _inputs_ = {};
|
| 17 |
|
| 18 |
class Input |
| 19 |
{
|
| 20 |
Serial port = null; |
| 21 |
Buffer buffer = null; |
| 22 |
String name = null; |
| 23 |
|
| 24 |
int jX = 0; |
| 25 |
int jY = 0; |
| 26 |
int aX = 0; |
| 27 |
int aY = 0; |
| 28 |
int aZ = 0; |
| 29 |
int bC = 0; |
| 30 |
int bZ = 0; |
| 31 |
int b1 = 0; |
| 32 |
int b2 = 0; |
| 33 |
int p1 = 0; |
| 34 |
|
| 35 |
|
| 36 |
Input () |
| 37 |
{
|
| 38 |
_inputs_ = (Input []) append (_inputs_, this); |
| 39 |
} |
| 40 |
|
| 41 |
void setup (String portName) |
| 42 |
{
|
| 43 |
if ((portName == null) ||(portName == "")) |
| 44 |
{
|
| 45 |
println ("No valid port name for this Input. Getting out!");
|
| 46 |
return; |
| 47 |
} |
| 48 |
|
| 49 |
println ("Setting up Input at " + portName);
|
| 50 |
this.name = portName; |
| 51 |
this.port = new Serial (_root_, portName, INPUT_RATE); |
| 52 |
this.buffer = new Buffer (); |
| 53 |
this.port.bufferUntil (INPUT_END); |
| 54 |
|
| 55 |
} |
| 56 |
|
| 57 |
void draw () |
| 58 |
{
|
| 59 |
/* print ("jX:" + this.jX + ", ");
|
| 60 |
print ("jY:" + this.jY + ", ");
|
| 61 |
print ("aX:" + this.aX + ", ");
|
| 62 |
print ("aY:" + this.aY + ", ");
|
| 63 |
print ("aZ:" + this.aZ + ", ");
|
| 64 |
print ("bC:" + this.bC + ", ");
|
| 65 |
print ("bZ:" + this.bZ + ", ");
|
| 66 |
println ("");*/
|
| 67 |
} |
| 68 |
|
| 69 |
void setData (String raw) |
| 70 |
{
|
| 71 |
if (raw != null) |
| 72 |
{
|
| 73 |
final String [] data = split (trim (raw), ' '); |
| 74 |
|
| 75 |
|
| 76 |
if (data[0].equals ("NK1")) // is main input!
|
| 77 |
{
|
| 78 |
this.jX = int (data [1]); |
| 79 |
this.jY = int (data [2]); |
| 80 |
this.aX = int (data [3]); |
| 81 |
this.aY = int (data [4]); |
| 82 |
this.aZ = int (data [5]); |
| 83 |
this.bZ = int (data [6]); |
| 84 |
this.bC = int (data [7]); |
| 85 |
} |
| 86 |
} |
| 87 |
} |
| 88 |
|
| 89 |
int horizontal() |
| 90 |
{
|
| 91 |
if (this.jX == 0) |
| 92 |
return 0; |
| 93 |
|
| 94 |
return (this.jX - 140); |
| 95 |
} |
| 96 |
|
| 97 |
int vertical() |
| 98 |
{
|
| 99 |
if (this.jY == 0) |
| 100 |
return 0; |
| 101 |
|
| 102 |
return (129 - this.jY); |
| 103 |
} |
| 104 |
|
| 105 |
boolean fire () |
| 106 |
{
|
| 107 |
|
| 108 |
return ((this.bZ == 1) || (keyPressed && ( keyCode == ENTER ))); |
| 109 |
|
| 110 |
// return true; |
| 111 |
// return (this.bZ == 1); |
| 112 |
} |
| 113 |
|
| 114 |
boolean bomb () |
| 115 |
{
|
| 116 |
return (this.bC == 1); |
| 117 |
} |
| 118 |
|
| 119 |
} |
| 120 |
|
| 121 |
|
| 122 |
void serialEvent (Serial port) |
| 123 |
{
|
| 124 |
for (int i = 0; i < _inputs_.length; i++) |
| 125 |
{
|
| 126 |
if (_inputs_ [i].port == port) |
| 127 |
{
|
| 128 |
_inputs_ [i].setData (port.readStringUntil (INPUT_END)); |
| 129 |
} |
| 130 |
} |
| 131 |
|
| 132 |
return; |
| 133 |
} |
| 134 |
|
| 135 |
void keyPressed() |
| 136 |
{
|
| 137 |
// println (keyCode) ; |
| 138 |
String data = "NK1 0 0 0 0 0 0 0"; |
| 139 |
|
| 140 |
switch (keyCode) |
| 141 |
{
|
| 142 |
case 37: data = "NK1 -140 0 0 0 0 0 0"; break; //left |
| 143 |
case 38: data = "NK1 0 240 0 0 0 0 0"; break; //left |
| 144 |
case 39: data = "NK1 240 0 0 0 0 0 0"; break; //left |
| 145 |
case 40: data = "NK1 0 -240 0 0 0 0 0"; break; //left |
| 146 |
case 32: data = "NK1 0 0 0 0 0 1 0"; break; //left |
| 147 |
} |
| 148 |
|
| 149 |
|
| 150 |
for (int i = 0; i < _inputs_.length; i++) |
| 151 |
{
|
| 152 |
_inputs_ [i].setData (data); |
| 153 |
} |
| 154 |
|
| 155 |
return; |
| 156 |
|
| 157 |
} |
| 158 |
|
| 159 |
void keyReleased() |
| 160 |
{
|
| 161 |
// println (keyCode) ; |
| 162 |
String data = "NK1 0 0 0 0 0 0 0"; |
| 163 |
|
| 164 |
for (int i = 0; i < _inputs_.length; i++) |
| 165 |
{
|
| 166 |
_inputs_ [i].setData (data); |
| 167 |
} |
| 168 |
|
| 169 |
return; |
| 170 |
|
| 171 |
} |
| 172 |
|
| 173 |
|
| 174 |
|
| 175 |
/* |
| 176 |
|
| 177 |
|
| 178 |
final int LINE_FEED = 10; |
| 179 |
final int MAX_SAMPLES = 16; |
| 180 |
|
| 181 |
Serial arduinoPort; |
| 182 |
SensorDataBuffer sensorData = new SensorDataBuffer (MAX_SAMPLES); |
| 183 |
|
| 184 |
final int WIDTH = 500; |
| 185 |
final int HEIGHT = 500; |
| 186 |
final int BAUD_RATE = 19200; |
| 187 |
final int X_AXIS_MIN = 300; |
| 188 |
final int X_AXIS_MAX = 700; |
| 189 |
final int Y_AXIS_MIN = 300; |
| 190 |
final int Y_AXIS_MAX = 700; |
| 191 |
final int Z_AXIS_MIN = 300; |
| 192 |
final int Z_AXIS_MAX = 700; |
| 193 |
|
| 194 |
final int MIN_SCALE = 5; |
| 195 |
final int MAX_SCALE = 128; |
| 196 |
|
| 197 |
final float MX = 2.0 / (X_AXIS_MAX - X_AXIS_MIN); |
| 198 |
final float MY = 2.0 / (Y_AXIS_MAX - Y_AXIS_MIN); |
| 199 |
final float MZ = 2.0 / (Z_AXIS_MAX - Z_AXIS_MIN); |
| 200 |
|
| 201 |
final float BX = 1.0 - MX * X_AXIS_MAX; |
| 202 |
final float BY = 1.0 - MX * Y_AXIS_MAX; |
| 203 |
final float BZ = 1.0 - MX * Z_AXIS_MAX; |
| 204 |
|
| 205 |
int xpos = WIDTH / 2; |
| 206 |
int ypos = HEIGHT / 2; |
| 207 |
int scale = 90; |
| 208 |
|
| 209 |
float xrotate = 0.0; |
| 210 |
float yrotate = 0.0; |
| 211 |
float zrotate = 0.0; |
| 212 |
|
| 213 |
void setup () |
| 214 |
{
|
| 215 |
size (WIDTH, HEIGHT, P3D); |
| 216 |
noStroke (); |
| 217 |
colorMode (RGB, 1); |
| 218 |
background (0); |
| 219 |
arduinoPort = new Serial (this, Serial.list () [0], BAUD_RATE); |
| 220 |
arduinoPort.bufferUntil (LINE_FEED); |
| 221 |
} |
| 222 |
|
| 223 |
void draw () |
| 224 |
{
|
| 225 |
background (0); |
| 226 |
pushMatrix (); |
| 227 |
translate (xpos, ypos, -30); |
| 228 |
rotateX (xrotate); |
| 229 |
rotateY (yrotate); |
| 230 |
rotateZ (zrotate); |
| 231 |
scale (scale); |
| 232 |
|
| 233 |
beginShape (QUADS); |
| 234 |
fill (0, 1, 1); vertex (-1, 1, 1); |
| 235 |
fill (1, 1, 1); vertex ( 1, 1, 1); |
| 236 |
fill (1, 0, 1); vertex ( 1, -1, 1); |
| 237 |
fill (0, 0, 1); vertex (-1, -1, 1); |
| 238 |
|
| 239 |
fill (1, 1, 1); vertex ( 1, 1, 1); |
| 240 |
fill (1, 1, 0); vertex ( 1, 1, -1); |
| 241 |
fill (1, 0, 0); vertex ( 1, -1, -1); |
| 242 |
fill (1, 0, 1); vertex ( 1, -1, 1); |
| 243 |
|
| 244 |
fill (1, 1, 0); vertex ( 1, 1, -1); |
| 245 |
fill (0, 1, 0); vertex (-1, 1, -1); |
| 246 |
fill (0, 0, 0); vertex (-1, -1, -1); |
| 247 |
fill (1, 0, 0); vertex ( 1, -1, -1); |
| 248 |
|
| 249 |
fill (0, 1, 0); vertex (-1, 1, -1); |
| 250 |
fill (0, 1, 1); vertex (-1, 1, 1); |
| 251 |
fill (0, 0, 1); vertex (-1, -1, 1); |
| 252 |
fill (0, 0, 0); vertex (-1, -1, -1); |
| 253 |
|
| 254 |
fill (0, 1, 0); vertex (-1, 1, -1); |
| 255 |
fill (1, 1, 0); vertex ( 1, 1, -1); |
| 256 |
fill (1, 1, 1); vertex ( 1, 1, 1); |
| 257 |
fill (0, 1, 1); vertex (-1, 1, 1); |
| 258 |
|
| 259 |
fill (0, 0, 0); vertex (-1, -1, -1); |
| 260 |
fill (1, 0, 0); vertex ( 1, -1, -1); |
| 261 |
fill (1, 0, 1); vertex ( 1, -1, 1); |
| 262 |
fill (0, 0, 1); vertex (-1, -1, 1); |
| 263 |
|
| 264 |
endShape (); |
| 265 |
popMatrix (); |
| 266 |
|
| 267 |
} |
| 268 |
|
| 269 |
void serialEvent (Serial port) |
| 270 |
{
|
| 271 |
final String arduinoData = port.readStringUntil (LINE_FEED); |
| 272 |
|
| 273 |
if (arduinoData != null) |
| 274 |
{
|
| 275 |
final int [] data = int (split (trim (arduinoData), ' ')); |
| 276 |
|
| 277 |
if (data.length == 7) |
| 278 |
{
|
| 279 |
xpos = int (map (data [0], 0x1e, 0xe1, 0, WIDTH)); |
| 280 |
ypos = int (map (data [1], 0x1d, 0xdf, HEIGHT, 0)); |
| 281 |
|
| 282 |
if (data [5] == 1) scale ++; |
| 283 |
if (data [6] == 1) scale --; |
| 284 |
if (scale < MIN_SCALE) scale = MIN_SCALE; |
| 285 |
if (scale > MAX_SCALE) scale = MAX_SCALE; |
| 286 |
|
| 287 |
sensorData.addData (data [2], data [3], data [4]); |
| 288 |
|
| 289 |
final float gx = MX * sensorData.getX () + BX; |
| 290 |
final float gy = MY * sensorData.getY () + BY; |
| 291 |
final float gz = MZ * sensorData.getZ () + BZ; |
| 292 |
|
| 293 |
xrotate = atan2 (gx, sqrt (gy * gy + gz * gz)); |
| 294 |
yrotate = atan2 (gy, sqrt (gx * gx + gz * gz)); |
| 295 |
zrotate = atan2 (sqrt (gx * gx + gy * gy), gz); |
| 296 |
|
| 297 |
} |
| 298 |
} |
| 299 |
} |
| 300 |
|
| 301 |
class SensorDataBuffer |
| 302 |
{
|
| 303 |
private int _maxSamples; |
| 304 |
private int _bufferIndex; |
| 305 |
private int [] _xBuffer; |
| 306 |
private int [] _yBuffer; |
| 307 |
private int [] _zBuffer; |
| 308 |
|
| 309 |
public SensorDataBuffer (final int maxSamples) |
| 310 |
{
|
| 311 |
_maxSamples = maxSamples; |
| 312 |
_bufferIndex = 0; |
| 313 |
_xBuffer = new int [_maxSamples]; |
| 314 |
_yBuffer = new int [_maxSamples]; |
| 315 |
_zBuffer = new int [_maxSamples]; |
| 316 |
} |
| 317 |
|
| 318 |
public void addData (final int x, final int y, final int z) |
| 319 |
{
|
| 320 |
if (_bufferIndex >= _maxSamples) |
| 321 |
_bufferIndex = 0; |
| 322 |
|
| 323 |
_xBuffer [_bufferIndex] = x; |
| 324 |
_yBuffer [_bufferIndex] = y; |
| 325 |
_zBuffer [_bufferIndex] = z; |
| 326 |
_bufferIndex++; |
| 327 |
} |
| 328 |
|
| 329 |
public int getX () |
| 330 |
{
|
| 331 |
return getAverageValue (_xBuffer); |
| 332 |
} |
| 333 |
public int getY () |
| 334 |
{
|
| 335 |
return getAverageValue (_yBuffer); |
| 336 |
} |
| 337 |
public int getZ () |
| 338 |
{
|
| 339 |
return getAverageValue (_zBuffer); |
| 340 |
} |
| 341 |
|
| 342 |
private int getAverageValue (final int[] buffer) |
| 343 |
{
|
| 344 |
int sum = 0; |
| 345 |
for (int i = 0; i < _maxSamples; i++) |
| 346 |
{
|
| 347 |
sum += buffer [i]; |
| 348 |
} |
| 349 |
|
| 350 |
return (int) (sum / _maxSamples); |
| 351 |
} |
| 352 |
|
| 353 |
|
| 354 |
} |
| 355 |
*/ |