adafruit_bno055 / examples / bunny / processing / cuberotate / cuberotate.pde @ 2fa9c672
History | View | Annotate | Download (4.687 KB)
1 |
import processing.serial.*; |
---|---|
2 |
import java.awt.datatransfer.*; |
3 |
import java.awt.Toolkit; |
4 |
import processing.opengl.*; |
5 |
import saito.objloader.*; |
6 |
import g4p_controls.*; |
7 |
|
8 |
float roll = 0.0F; |
9 |
float pitch = 0.0F; |
10 |
float yaw = 0.0F; |
11 |
float temp = 0.0F; |
12 |
float alt = 0.0F; |
13 |
|
14 |
OBJModel model; |
15 |
|
16 |
// Serial port state. |
17 |
Serial port; |
18 |
final String serialConfigFile = "serialconfig.txt"; |
19 |
boolean printSerial = false; |
20 |
|
21 |
// UI controls. |
22 |
GPanel configPanel; |
23 |
GDropList serialList; |
24 |
GLabel serialLabel; |
25 |
GLabel calLabel; |
26 |
GCheckbox printSerialCheckbox; |
27 |
|
28 |
void setup() |
29 |
{ |
30 |
size(640, 480, OPENGL); |
31 |
frameRate(30); |
32 |
model = new OBJModel(this); |
33 |
model.load("bunny.obj"); |
34 |
model.scale(20); |
35 |
|
36 |
// Serial port setup. |
37 |
// Grab list of serial ports and choose one that was persisted earlier or default to the first port. |
38 |
int selectedPort = 0; |
39 |
String[] availablePorts = Serial.list(); |
40 |
if (availablePorts == null) { |
41 |
println("ERROR: No serial ports available!"); |
42 |
exit(); |
43 |
} |
44 |
String[] serialConfig = loadStrings(serialConfigFile); |
45 |
if (serialConfig != null && serialConfig.length > 0) { |
46 |
String savedPort = serialConfig[0]; |
47 |
// Check if saved port is in available ports. |
48 |
for (int i = 0; i < availablePorts.length; ++i) { |
49 |
if (availablePorts[i].equals(savedPort)) { |
50 |
selectedPort = i; |
51 |
} |
52 |
} |
53 |
} |
54 |
// Build serial config UI. |
55 |
configPanel = new GPanel(this, 10, 10, width-20, 90, "Configuration (click to hide/show)"); |
56 |
serialLabel = new GLabel(this, 0, 20, 80, 25, "Serial port:"); |
57 |
configPanel.addControl(serialLabel); |
58 |
serialList = new GDropList(this, 90, 20, 200, 200, 6); |
59 |
serialList.setItems(availablePorts, selectedPort); |
60 |
configPanel.addControl(serialList); |
61 |
calLabel = new GLabel(this, 300, 20, 350, 25, "Calibration: Sys=? Gyro=? Accel=? Mag=?"); |
62 |
configPanel.addControl(calLabel); |
63 |
printSerialCheckbox = new GCheckbox(this, 5, 50, 200, 20, "Print serial data"); |
64 |
printSerialCheckbox.setSelected(printSerial); |
65 |
configPanel.addControl(printSerialCheckbox); |
66 |
// Set serial port. |
67 |
setSerialPort(serialList.getSelectedText()); |
68 |
} |
69 |
|
70 |
void draw() |
71 |
{ |
72 |
background(0,0,0); |
73 |
|
74 |
// Set a new co-ordinate space |
75 |
pushMatrix(); |
76 |
|
77 |
// Simple 3 point lighting for dramatic effect. |
78 |
// Slightly red light in upper right, slightly blue light in upper left, and white light from behind. |
79 |
pointLight(255, 200, 200, 400, 400, 500); |
80 |
pointLight(200, 200, 255, -400, 400, 500); |
81 |
pointLight(255, 255, 255, 0, 0, -500); |
82 |
|
83 |
// Move bunny from 0,0 in upper left corner to roughly center of screen. |
84 |
translate(300, 380, 0); |
85 |
|
86 |
// Rotate shapes around the X/Y/Z axis (values in radians, 0..Pi*2) |
87 |
rotateZ(radians(roll)); |
88 |
rotateX(radians(pitch)); |
89 |
rotateY(radians(yaw)); |
90 |
|
91 |
pushMatrix(); |
92 |
noStroke(); |
93 |
model.draw(); |
94 |
popMatrix(); |
95 |
popMatrix(); |
96 |
//print("draw"); |
97 |
} |
98 |
|
99 |
void serialEvent(Serial p) |
100 |
{ |
101 |
String incoming = p.readString(); |
102 |
if (printSerial) { |
103 |
println(incoming); |
104 |
} |
105 |
|
106 |
if ((incoming.length() > 8)) |
107 |
{ |
108 |
String[] list = split(incoming, " "); |
109 |
if ( (list.length > 0) && (list[0].equals("Orientation:")) ) |
110 |
{ |
111 |
roll = float(list[3]); // Roll = Z |
112 |
pitch = float(list[2]); // Pitch = Y |
113 |
yaw = float(list[1]); // Yaw/Heading = X |
114 |
} |
115 |
if ( (list.length > 0) && (list[0].equals("Alt:")) ) |
116 |
{ |
117 |
alt = float(list[1]); |
118 |
} |
119 |
if ( (list.length > 0) && (list[0].equals("Temp:")) ) |
120 |
{ |
121 |
temp = float(list[1]); |
122 |
} |
123 |
if ( (list.length > 0) && (list[0].equals("Calibration:")) ) |
124 |
{ |
125 |
int sysCal = int(list[1]); |
126 |
int gyroCal = int(list[2]); |
127 |
int accelCal = int(list[3]); |
128 |
int magCal = int(list[4]); |
129 |
calLabel.setText("Calibration: Sys=" + sysCal + " Gyro=" + gyroCal + " Accel=" + accelCal + " Mag=" + magCal); |
130 |
} |
131 |
} |
132 |
} |
133 |
|
134 |
// Set serial port to desired value. |
135 |
void setSerialPort(String portName) { |
136 |
// Close the port if it's currently open. |
137 |
if (port != null) { |
138 |
port.stop(); |
139 |
} |
140 |
try { |
141 |
// Open port. |
142 |
port = new Serial(this, portName, 115200); |
143 |
port.bufferUntil('\n'); |
144 |
// Persist port in configuration. |
145 |
saveStrings(serialConfigFile, new String[] { portName }); |
146 |
} |
147 |
catch (RuntimeException ex) { |
148 |
// Swallow error if port can't be opened, keep port closed. |
149 |
port = null; |
150 |
} |
151 |
} |
152 |
|
153 |
// UI event handlers |
154 |
|
155 |
void handlePanelEvents(GPanel panel, GEvent event) { |
156 |
// Panel events, do nothing. |
157 |
} |
158 |
|
159 |
void handleDropListEvents(GDropList list, GEvent event) { |
160 |
// Drop list events, check if new serial port is selected. |
161 |
if (list == serialList) { |
162 |
setSerialPort(serialList.getSelectedText()); |
163 |
} |
164 |
} |
165 |
|
166 |
void handleToggleControlEvents(GToggleControl checkbox, GEvent event) { |
167 |
// Checkbox toggle events, check if print events is toggled. |
168 |
if (checkbox == printSerialCheckbox) { |
169 |
printSerial = printSerialCheckbox.isSelected(); |
170 |
} |
171 |
} |