just a test

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Wed Mar 28 14:40:01 2012 +0000
Revision:
0:345b3bc7a0ea
Child:
1:a4050fee11f7
This version (using rigid frame, base and child classes, etc) works, but the blob is strangely smaller. Need to check this.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:345b3bc7a0ea 1 #include "mbed.h"
mbedalvaro 0:345b3bc7a0ea 2 #include "hardwareIO.h"
mbedalvaro 0:345b3bc7a0ea 3 #include "mbedOSC.h"
mbedalvaro 0:345b3bc7a0ea 4 #include "blobConfig.h"
mbedalvaro 0:345b3bc7a0ea 5 #include "simpleLaserRenderer.h"
mbedalvaro 0:345b3bc7a0ea 6
mbedalvaro 0:345b3bc7a0ea 7 extern "C" void mbed_reset();
mbedalvaro 0:345b3bc7a0ea 8
mbedalvaro 0:345b3bc7a0ea 9 blobConfig blobconf;
mbedalvaro 0:345b3bc7a0ea 10 simpleLaserSensingRenderer lsr;
mbedalvaro 0:345b3bc7a0ea 11
mbedalvaro 0:345b3bc7a0ea 12 // For tests:
mbedalvaro 0:345b3bc7a0ea 13 DigitalOut myled(LED1);
mbedalvaro 0:345b3bc7a0ea 14 DigitalOut myled2(LED2);
mbedalvaro 0:345b3bc7a0ea 15 //DigitalOut myled3(LED2);
mbedalvaro 0:345b3bc7a0ea 16
mbedalvaro 0:345b3bc7a0ea 17
mbedalvaro 0:345b3bc7a0ea 18 // To test the time it takes for executing one loop in the main program:
mbedalvaro 0:345b3bc7a0ea 19 //#define LOOPTIMECOMPUTE
mbedalvaro 0:345b3bc7a0ea 20
mbedalvaro 0:345b3bc7a0ea 21 //---------- ETHERNET / OSC related (in the future, put somewhere else...): -------------------------------------------
mbedalvaro 0:345b3bc7a0ea 22 // mbed IP address (server):
mbedalvaro 0:345b3bc7a0ea 23 #ifdef DHCP
mbedalvaro 0:345b3bc7a0ea 24 EthernetNetIf eth;
mbedalvaro 0:345b3bc7a0ea 25 #else
mbedalvaro 0:345b3bc7a0ea 26 EthernetNetIf eth(
mbedalvaro 0:345b3bc7a0ea 27 IpAddr(10,0,0,2), //IP Address
mbedalvaro 0:345b3bc7a0ea 28 IpAddr(255,255,255,0), //Network Mask
mbedalvaro 0:345b3bc7a0ea 29 IpAddr(10,0,0,1), //Gateway
mbedalvaro 0:345b3bc7a0ea 30 IpAddr(10,0,0,1) //DNS
mbedalvaro 0:345b3bc7a0ea 31 );
mbedalvaro 0:345b3bc7a0ea 32 #endif
mbedalvaro 0:345b3bc7a0ea 33
mbedalvaro 0:345b3bc7a0ea 34 //uint8_t serverMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
mbedalvaro 0:345b3bc7a0ea 35 uint8_t serverIp[] = { 10, 0, 0, 2 }; // not needed perhaps!
mbedalvaro 0:345b3bc7a0ea 36 int serverPort = 10000;
mbedalvaro 0:345b3bc7a0ea 37
mbedalvaro 0:345b3bc7a0ea 38 uint8_t destIp[] = { 10, 0, 0, 1};
mbedalvaro 0:345b3bc7a0ea 39 int destPort = 12000;
mbedalvaro 0:345b3bc7a0ea 40
mbedalvaro 0:345b3bc7a0ea 41 char *topAddress="/mbed";
mbedalvaro 0:345b3bc7a0ea 42 char *subAddress[3]={ "/test1" , "/test2" , "/test3" };
mbedalvaro 0:345b3bc7a0ea 43
mbedalvaro 0:345b3bc7a0ea 44 OSCMessage recMes;
mbedalvaro 0:345b3bc7a0ea 45 OSCMessage sendMes;
mbedalvaro 0:345b3bc7a0ea 46
mbedalvaro 0:345b3bc7a0ea 47 OSCClass osc;
mbedalvaro 0:345b3bc7a0ea 48 //OSCClass osc(&recMes); // instantiate OSC communication object, and set the receiver container from the OSC packets
mbedalvaro 0:345b3bc7a0ea 49
mbedalvaro 0:345b3bc7a0ea 50 void processOSC(UDPSocketEvent e);
mbedalvaro 0:345b3bc7a0ea 51 // ----------------------------------------------------------------------------------------------------------------------
mbedalvaro 0:345b3bc7a0ea 52
mbedalvaro 0:345b3bc7a0ea 53 Ticker timerForRendering;
mbedalvaro 0:345b3bc7a0ea 54 Timer measureLoopPeriod;
mbedalvaro 0:345b3bc7a0ea 55
mbedalvaro 0:345b3bc7a0ea 56 void processSerial();
mbedalvaro 0:345b3bc7a0ea 57
mbedalvaro 0:345b3bc7a0ea 58 int main() {
mbedalvaro 0:345b3bc7a0ea 59
mbedalvaro 0:345b3bc7a0ea 60 // Initialize the hardware (laser powers, positions...):
mbedalvaro 0:345b3bc7a0ea 61 IO.init();
mbedalvaro 0:345b3bc7a0ea 62
mbedalvaro 0:345b3bc7a0ea 63 // -------------------------------
mbedalvaro 0:345b3bc7a0ea 64 // Set the Ethernet port:
mbedalvaro 0:345b3bc7a0ea 65 printf("Setting up...\r\n");
mbedalvaro 0:345b3bc7a0ea 66 EthernetErr ethErr = eth.setup();
mbedalvaro 0:345b3bc7a0ea 67 if(ethErr)
mbedalvaro 0:345b3bc7a0ea 68 {
mbedalvaro 0:345b3bc7a0ea 69 printf("Error %d in setup.\r\n", ethErr);
mbedalvaro 0:345b3bc7a0ea 70 return -1;
mbedalvaro 0:345b3bc7a0ea 71 }
mbedalvaro 0:345b3bc7a0ea 72 printf("Setup OK\r\n");
mbedalvaro 0:345b3bc7a0ea 73
mbedalvaro 0:345b3bc7a0ea 74 //(1) Sending message:
mbedalvaro 0:345b3bc7a0ea 75 // Set IP and Port:
mbedalvaro 0:345b3bc7a0ea 76 sendMes.setIp( destIp );
mbedalvaro 0:345b3bc7a0ea 77 sendMes.setPort( destPort );
mbedalvaro 0:345b3bc7a0ea 78 // Set data:
mbedalvaro 0:345b3bc7a0ea 79 // sendMes.setTopAddress(topAddress);
mbedalvaro 0:345b3bc7a0ea 80
mbedalvaro 0:345b3bc7a0ea 81 //setting osc functionnality:
mbedalvaro 0:345b3bc7a0ea 82 //(2) Receiving:
mbedalvaro 0:345b3bc7a0ea 83 // recMes.setIp( serverIp ); // not needed?
mbedalvaro 0:345b3bc7a0ea 84 osc.setReceiveMessage(&recMes); // this sets the receiver container for the OSC packets (we can avoid doing this if we use osc.getMessage() to get messages)
mbedalvaro 0:345b3bc7a0ea 85 osc.begin(serverPort, &processOSC); // binds the upd (osc) messages to an arbitrary listening port ("server" port), and callback function
mbedalvaro 0:345b3bc7a0ea 86 // -------------------------------
mbedalvaro 0:345b3bc7a0ea 87
mbedalvaro 0:345b3bc7a0ea 88 /* // sending seems not to work right after setting the osc object??
mbedalvaro 0:345b3bc7a0ea 89 wait(1);
mbedalvaro 0:345b3bc7a0ea 90 sendMes.setTopAddress("starting");
mbedalvaro 0:345b3bc7a0ea 91 sendMes.setSubAddress("");
mbedalvaro 0:345b3bc7a0ea 92 osc.sendOsc( &sendMes );
mbedalvaro 0:345b3bc7a0ea 93 */
mbedalvaro 0:345b3bc7a0ea 94
mbedalvaro 0:345b3bc7a0ea 95 // initialize with the desired blob configuration:
mbedalvaro 0:345b3bc7a0ea 96
mbedalvaro 0:345b3bc7a0ea 97 // Tested modes:
mbedalvaro 0:345b3bc7a0ea 98 //blobconf.oneElasticLoopContractCentral();
mbedalvaro 0:345b3bc7a0ea 99 blobconf.addOneElasticContourFollowing();
mbedalvaro 0:345b3bc7a0ea 100 // Important: first, set the initial position for all the blobs, this will be useful because
mbedalvaro 0:345b3bc7a0ea 101 // when changing modes we can use the previous central position...
mbedalvaro 0:345b3bc7a0ea 102 // blobconf.setInitialPos(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y);
mbedalvaro 0:345b3bc7a0ea 103
mbedalvaro 0:345b3bc7a0ea 104
mbedalvaro 0:345b3bc7a0ea 105 // RENRERER (attn: setConfigToRender must be called when the blobconf is set - i.e., the number of blobs and number of points/blob is fixed)
mbedalvaro 0:345b3bc7a0ea 106 lsr.setConfigToRender(&blobconf);
mbedalvaro 0:345b3bc7a0ea 107
mbedalvaro 0:345b3bc7a0ea 108 // Timer on the rendering function of the oneLoop object:
mbedalvaro 0:345b3bc7a0ea 109 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL); // the address of the object, member function, and interval (in seconds)
mbedalvaro 0:345b3bc7a0ea 110 // timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThread, RENDER_INTERVAL); // the address of the object, member function, and interval (in seconds)
mbedalvaro 0:345b3bc7a0ea 111
mbedalvaro 0:345b3bc7a0ea 112 //========================================== INFINITE LOOP (in USER PROGRAM CONTEXT) ===================================================================
mbedalvaro 0:345b3bc7a0ea 113 #ifdef LOOPTIMECOMPUTE
mbedalvaro 0:345b3bc7a0ea 114 int timeCounterNum=100000;
mbedalvaro 0:345b3bc7a0ea 115 #endif
mbedalvaro 0:345b3bc7a0ea 116
mbedalvaro 0:345b3bc7a0ea 117
mbedalvaro 0:345b3bc7a0ea 118 while(true) {
mbedalvaro 0:345b3bc7a0ea 119
mbedalvaro 0:345b3bc7a0ea 120 // update config dynamics (this also could be threaded?):
mbedalvaro 0:345b3bc7a0ea 121 blobconf.update();
mbedalvaro 0:345b3bc7a0ea 122
mbedalvaro 0:345b3bc7a0ea 123 // draw the config (note: each kind of blob renders differently)
mbedalvaro 0:345b3bc7a0ea 124 // blobconf.draw();
mbedalvaro 0:345b3bc7a0ea 125
mbedalvaro 0:345b3bc7a0ea 126 // COMMUNICATION:
mbedalvaro 0:345b3bc7a0ea 127 // (a) Reading commands:
mbedalvaro 0:345b3bc7a0ea 128 // Ethernet:
mbedalvaro 0:345b3bc7a0ea 129 Net::poll(); // this will take care of calling processOSC(UDPSocketEvent e) when a new packet arrives.
mbedalvaro 0:345b3bc7a0ea 130
mbedalvaro 0:345b3bc7a0ea 131 // Serial:
mbedalvaro 0:345b3bc7a0ea 132 if(pc.readable()>0) processSerial();
mbedalvaro 0:345b3bc7a0ea 133
mbedalvaro 0:345b3bc7a0ea 134 // (b)Sending Data: // PUT THIS IN AN INTERRUPT OR A TIMER!!! it may be TOO FAST...
mbedalvaro 0:345b3bc7a0ea 135 blobconf.sendConfData();
mbedalvaro 0:345b3bc7a0ea 136
mbedalvaro 0:345b3bc7a0ea 137 // text:
mbedalvaro 0:345b3bc7a0ea 138 /*
mbedalvaro 0:345b3bc7a0ea 139 sendMes.setTopAddress("/hello");
mbedalvaro 0:345b3bc7a0ea 140 sendMes.setSubAddress("/daito"); // ATTENTION: the host computer needs to know in advance how many points are in the loop (I did not implement "bundle" messages yet...)
mbedalvaro 0:345b3bc7a0ea 141 int x=(long)10;
mbedalvaro 0:345b3bc7a0ea 142 sendMes.setArgs( "i", &x);
mbedalvaro 0:345b3bc7a0ea 143 osc.sendOsc( &sendMes );
mbedalvaro 0:345b3bc7a0ea 144 */
mbedalvaro 0:345b3bc7a0ea 145
mbedalvaro 0:345b3bc7a0ea 146 #ifdef LOOPTIMECOMPUTE
mbedalvaro 0:345b3bc7a0ea 147 if (timeCounterNum>50000) myled = 0;
mbedalvaro 0:345b3bc7a0ea 148 //if (timeCounterNum%100==0) blobconf.sendConfData();
mbedalvaro 0:345b3bc7a0ea 149 if (timeCounterNum>100000) {
mbedalvaro 0:345b3bc7a0ea 150 myled = 1;
mbedalvaro 0:345b3bc7a0ea 151 measureLoopPeriod.stop();
mbedalvaro 0:345b3bc7a0ea 152 sendMes.setTopAddress("/timeloop");
mbedalvaro 0:345b3bc7a0ea 153 sendMes.setSubAddress("/");
mbedalvaro 0:345b3bc7a0ea 154 long x=(long)(int(measureLoopPeriod.read_us()/100000));
mbedalvaro 0:345b3bc7a0ea 155 sendMes.setArgs( "i", &x);
mbedalvaro 0:345b3bc7a0ea 156 osc.sendOsc( &sendMes );
mbedalvaro 0:345b3bc7a0ea 157 timeCounterNum=0;
mbedalvaro 0:345b3bc7a0ea 158 measureLoopPeriod.reset();
mbedalvaro 0:345b3bc7a0ea 159 measureLoopPeriod.start();
mbedalvaro 0:345b3bc7a0ea 160 } else timeCounterNum++;
mbedalvaro 0:345b3bc7a0ea 161 #endif
mbedalvaro 0:345b3bc7a0ea 162
mbedalvaro 0:345b3bc7a0ea 163 }
mbedalvaro 0:345b3bc7a0ea 164 }
mbedalvaro 0:345b3bc7a0ea 165
mbedalvaro 0:345b3bc7a0ea 166 // ================= INTERPRET COMMAND =========================
mbedalvaro 0:345b3bc7a0ea 167 // NOTE: the following arrays are GLOBAL (used in processOSC and processSerial, as well as in interpretCommand function):
mbedalvaro 0:345b3bc7a0ea 168 // max of two addresses (top and sub), of a max length of 24 characters:
mbedalvaro 0:345b3bc7a0ea 169 char address[2][24];
mbedalvaro 0:345b3bc7a0ea 170 //long auxdata[2]; // to store a max of two arguments (note: we will only use LONGs)
mbedalvaro 0:345b3bc7a0ea 171 int data[2]; // this is to have -1 as NO DATA, to detect errors.
mbedalvaro 0:345b3bc7a0ea 172
mbedalvaro 0:345b3bc7a0ea 173 //interpretCommand(const char& address[2][], const int& data[2]) {
mbedalvaro 0:345b3bc7a0ea 174 void interpretCommand() {
mbedalvaro 0:345b3bc7a0ea 175 // (I) =========================================== SPECIAL FUNCTIONS (reset, rescan LUT, etc) ====================================================
mbedalvaro 0:345b3bc7a0ea 176 if ( !strcmp(address[0], "takeSnapshot" ) ) { // will reset all the spots, but the 0, and use it for taking measures:
mbedalvaro 0:345b3bc7a0ea 177
mbedalvaro 0:345b3bc7a0ea 178 // for test:
mbedalvaro 0:345b3bc7a0ea 179 for (int i=0; i<2 ; i++) {
mbedalvaro 0:345b3bc7a0ea 180 myled = 1; wait(0.1); myled = 0; wait(0.1);
mbedalvaro 0:345b3bc7a0ea 181 }
mbedalvaro 0:345b3bc7a0ea 182
mbedalvaro 0:345b3bc7a0ea 183 // First, we need to disable the threaded display for the loop:
mbedalvaro 0:345b3bc7a0ea 184 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 185
mbedalvaro 0:345b3bc7a0ea 186 // Then, do the scan (sending values on serial port):
mbedalvaro 0:345b3bc7a0ea 187 IO.scan_serial();
mbedalvaro 0:345b3bc7a0ea 188
mbedalvaro 0:345b3bc7a0ea 189 // Finally, start again threaded display:
mbedalvaro 0:345b3bc7a0ea 190 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL); // the address of the object, member function, and interval (in seconds)
mbedalvaro 0:345b3bc7a0ea 191 }
mbedalvaro 0:345b3bc7a0ea 192
mbedalvaro 0:345b3bc7a0ea 193 else if ( !strcmp(address[0], "mbedReset" ) ) mbed_reset();
mbedalvaro 0:345b3bc7a0ea 194
mbedalvaro 0:345b3bc7a0ea 195 else if ( !strcmp(address[0], "calibrate" ) ) {
mbedalvaro 0:345b3bc7a0ea 196 // First, we need to disable the threaded display for the loop:
mbedalvaro 0:345b3bc7a0ea 197 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 198 // RESCAN (and save LUT table):
mbedalvaro 0:345b3bc7a0ea 199 IO.scanLUT();
mbedalvaro 0:345b3bc7a0ea 200 // Finally, start again threaded display:
mbedalvaro 0:345b3bc7a0ea 201 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL);
mbedalvaro 0:345b3bc7a0ea 202 }
mbedalvaro 0:345b3bc7a0ea 203
mbedalvaro 0:345b3bc7a0ea 204 // (II) ========================================= GLOBAL CONFIG and HARDWARE COMMANDS ===========================================
mbedalvaro 0:345b3bc7a0ea 205
mbedalvaro 0:345b3bc7a0ea 206 else if ( !strcmp(address[0], "setGreenLaser" ) ) {
mbedalvaro 0:345b3bc7a0ea 207 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 208 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 209 if (value==0) IO.setGreenPower(0); else IO.setGreenPower(1);
mbedalvaro 0:345b3bc7a0ea 210 }
mbedalvaro 0:345b3bc7a0ea 211 }
mbedalvaro 0:345b3bc7a0ea 212
mbedalvaro 0:345b3bc7a0ea 213 // SIMPLE BEHAVIOUR MODES (to be read from an XML file in the future):
mbedalvaro 0:345b3bc7a0ea 214 else if (!strcmp(address[0], "crawling")) { //
mbedalvaro 0:345b3bc7a0ea 215 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 216 // blobconf.computeBoundingBox();
mbedalvaro 0:345b3bc7a0ea 217 blobconf.clearConfig();
mbedalvaro 0:345b3bc7a0ea 218 blobconf.addOneElasticContourFollowing();
mbedalvaro 0:345b3bc7a0ea 219 lsr.setConfigToRender(&blobconf);
mbedalvaro 0:345b3bc7a0ea 220 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL);
mbedalvaro 0:345b3bc7a0ea 221 }
mbedalvaro 0:345b3bc7a0ea 222 else if (!strcmp(address[0], "loop")) { //
mbedalvaro 0:345b3bc7a0ea 223 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 224 // blobconf.computeBoundingBox();
mbedalvaro 0:345b3bc7a0ea 225 blobconf.clearConfig();
mbedalvaro 0:345b3bc7a0ea 226 blobconf.addOneElasticLoopContractCentral();
mbedalvaro 0:345b3bc7a0ea 227 lsr.setConfigToRender(&blobconf);
mbedalvaro 0:345b3bc7a0ea 228 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL);
mbedalvaro 0:345b3bc7a0ea 229 }
mbedalvaro 0:345b3bc7a0ea 230
mbedalvaro 0:345b3bc7a0ea 231 else if (!strcmp(address[0], "bouncing")) {
mbedalvaro 0:345b3bc7a0ea 232 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 233 // blobconf.computeBoundingBox();
mbedalvaro 0:345b3bc7a0ea 234 blobconf.clearConfig();
mbedalvaro 0:345b3bc7a0ea 235 blobconf.addOneElasticBouncing();
mbedalvaro 0:345b3bc7a0ea 236 lsr.setConfigToRender(&blobconf);
mbedalvaro 0:345b3bc7a0ea 237 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL);
mbedalvaro 0:345b3bc7a0ea 238 }
mbedalvaro 0:345b3bc7a0ea 239
mbedalvaro 0:345b3bc7a0ea 240 // other:
mbedalvaro 0:345b3bc7a0ea 241
mbedalvaro 0:345b3bc7a0ea 242 else if ( !strcmp(address[0], "standby" ) ) { // will put ALL the spots in stand by mode
mbedalvaro 0:345b3bc7a0ea 243 blobconf.allStandBy(); // will avoid the update function
mbedalvaro 0:345b3bc7a0ea 244 }
mbedalvaro 0:345b3bc7a0ea 245 else if ( !strcmp(address[0], "resume" ) ) { // will put ALL the spots in stand by mode
mbedalvaro 0:345b3bc7a0ea 246 blobconf.allResume(); // will avoid the update function
mbedalvaro 0:345b3bc7a0ea 247 }
mbedalvaro 0:345b3bc7a0ea 248
mbedalvaro 0:345b3bc7a0ea 249 // (III) ========================================= Loop control (parameters, etc) ===========================================
mbedalvaro 0:345b3bc7a0ea 250 // NOte: for the time being, we only have ONE loop, so there is no "per loop or per config" mode.
mbedalvaro 0:345b3bc7a0ea 251
mbedalvaro 0:345b3bc7a0ea 252 else if (!strcmp( address[0], "sendOSC" ) ) {
mbedalvaro 0:345b3bc7a0ea 253 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 254 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 255 for (int i=0; i< blobconf.numBlobs; i++) {
mbedalvaro 0:345b3bc7a0ea 256 blobconf.blobArray[i]->sendOSC=(value>0);
mbedalvaro 0:345b3bc7a0ea 257 }
mbedalvaro 0:345b3bc7a0ea 258 }
mbedalvaro 0:345b3bc7a0ea 259 }
mbedalvaro 0:345b3bc7a0ea 260
mbedalvaro 0:345b3bc7a0ea 261 else if (!strcmp( address[0], "sendArea" ) ) {
mbedalvaro 0:345b3bc7a0ea 262 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 263 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 264 for (int i=0; i< blobconf.numBlobs; i++) {
mbedalvaro 0:345b3bc7a0ea 265 blobconf.blobArray[i]->sendingBlobArea=(value>0);
mbedalvaro 0:345b3bc7a0ea 266 }
mbedalvaro 0:345b3bc7a0ea 267 }
mbedalvaro 0:345b3bc7a0ea 268 }
mbedalvaro 0:345b3bc7a0ea 269
mbedalvaro 0:345b3bc7a0ea 270 else if (!strcmp( address[0], "sendPos" ) ) {
mbedalvaro 0:345b3bc7a0ea 271 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 272 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 273 for (int i=0; i< blobconf.numBlobs; i++) {
mbedalvaro 0:345b3bc7a0ea 274 blobconf.blobArray[i]->sendingLoopPositions=(value>0);
mbedalvaro 0:345b3bc7a0ea 275 }
mbedalvaro 0:345b3bc7a0ea 276 }
mbedalvaro 0:345b3bc7a0ea 277 }
mbedalvaro 0:345b3bc7a0ea 278
mbedalvaro 0:345b3bc7a0ea 279 else if (!strcmp( address[0], "sendRegions" ) ) {
mbedalvaro 0:345b3bc7a0ea 280 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 281 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 282 for (int i=0; i< blobconf.numBlobs; i++) {
mbedalvaro 0:345b3bc7a0ea 283 blobconf.blobArray[i]->sendingLoopRegions=(value>0);
mbedalvaro 0:345b3bc7a0ea 284 }
mbedalvaro 0:345b3bc7a0ea 285 }
mbedalvaro 0:345b3bc7a0ea 286 }
mbedalvaro 0:345b3bc7a0ea 287
mbedalvaro 0:345b3bc7a0ea 288 else if (!strcmp( address[0], "sendTouched" ) ) {
mbedalvaro 0:345b3bc7a0ea 289 int value=data[0];
mbedalvaro 0:345b3bc7a0ea 290 if (value!=-1) { // otherwise do nothing, this is a reception error (there was no data)
mbedalvaro 0:345b3bc7a0ea 291 for (int i=0; i< blobconf.numBlobs; i++) {
mbedalvaro 0:345b3bc7a0ea 292 blobconf.blobArray[i]->sendingTouched=(value>0);
mbedalvaro 0:345b3bc7a0ea 293 }
mbedalvaro 0:345b3bc7a0ea 294 }
mbedalvaro 0:345b3bc7a0ea 295 }
mbedalvaro 0:345b3bc7a0ea 296
mbedalvaro 0:345b3bc7a0ea 297
mbedalvaro 0:345b3bc7a0ea 298
mbedalvaro 0:345b3bc7a0ea 299 }
mbedalvaro 0:345b3bc7a0ea 300
mbedalvaro 0:345b3bc7a0ea 301 //============= RECEIVE OSC COMMANDS =========================
mbedalvaro 0:345b3bc7a0ea 302 // This is the callback function called when there are packets on the listening socket. It is not nice to have it
mbedalvaro 0:345b3bc7a0ea 303 // here, but for the time being having a "wrapping global" is the simplest solution (we cannot pass a member-function pointer
mbedalvaro 0:345b3bc7a0ea 304 // as handler to the upd object).
mbedalvaro 0:345b3bc7a0ea 305 void processOSC(UDPSocketEvent e) {
mbedalvaro 0:345b3bc7a0ea 306 osc.onUDPSocketEvent(e);
mbedalvaro 0:345b3bc7a0ea 307
mbedalvaro 0:345b3bc7a0ea 308 if (osc.newMessage) {
mbedalvaro 0:345b3bc7a0ea 309 // in fact, there is no need to check this if using the method of a global callback function - it is clear this is a new packet... however, it may be
mbedalvaro 0:345b3bc7a0ea 310 // interesting to use a timer, and process data (answers, etc) only after a certain amount of time, so as to avoid blocking the program in IRQ context...
mbedalvaro 0:345b3bc7a0ea 311
mbedalvaro 0:345b3bc7a0ea 312 // Acquire the addresses and arguments and put them in the GLOBAL variables:
mbedalvaro 0:345b3bc7a0ea 313 strcpy(address[0],""); strcpy(address[1],"");
mbedalvaro 0:345b3bc7a0ea 314 for (int i=0; i<recMes.getAddressNum(); i++) strcpy(address[i],recMes.getAddress(i)); // NOTE: up to the rest of the program to check if address[1] is really not null
mbedalvaro 0:345b3bc7a0ea 315 // Acquire data:
mbedalvaro 0:345b3bc7a0ea 316 data[0]=-1; data[1]=-1;
mbedalvaro 0:345b3bc7a0ea 317 for (int i=0; i<recMes.getArgNum(); i++) data[i]=(int)recMes.getArgInt(i);
mbedalvaro 0:345b3bc7a0ea 318
mbedalvaro 0:345b3bc7a0ea 319 // Finally, interpret the command:
mbedalvaro 0:345b3bc7a0ea 320 interpretCommand();//address, data);
mbedalvaro 0:345b3bc7a0ea 321
mbedalvaro 0:345b3bc7a0ea 322 }
mbedalvaro 0:345b3bc7a0ea 323 }
mbedalvaro 0:345b3bc7a0ea 324
mbedalvaro 0:345b3bc7a0ea 325 //============= RECEIVE SERIAL COMMANDS =========================
mbedalvaro 0:345b3bc7a0ea 326 //
mbedalvaro 0:345b3bc7a0ea 327 // NOTE: - NUMERIC PARAMETERS have to be send BEFORE the command word. They must be sent as ASCII DEC, without end character.
mbedalvaro 0:345b3bc7a0ea 328 // - Commands words SHOULD NOT have numbers in it. They should be C compliant STRINGS (ended with character '0')
mbedalvaro 0:345b3bc7a0ea 329 // - order is irrelevant: we can send 10 RADIUS or RADIUS 10.
mbedalvaro 0:345b3bc7a0ea 330
mbedalvaro 0:345b3bc7a0ea 331 // String to store ALPHANUMERIC DATA (i.e., integers, floating point numbers, unsigned ints, etc represented as DEC) sent wirelessly:
mbedalvaro 0:345b3bc7a0ea 332 char stringData[24]; // note: an integer is two bytes long, represented with a maximum of 5 digits, but we may send floats or unsigned int...
mbedalvaro 0:345b3bc7a0ea 333 int indexStringData=0;//position of the byte in the string
mbedalvaro 0:345b3bc7a0ea 334
mbedalvaro 0:345b3bc7a0ea 335 // String to store COMMAND WORDS:
mbedalvaro 0:345b3bc7a0ea 336 char stringCommand[24]; // note: an integer is two bytes long, represented with a maximum of 5 digits, but we may send floats or unsigned int...
mbedalvaro 0:345b3bc7a0ea 337 int indexStringCommand=0;
mbedalvaro 0:345b3bc7a0ea 338 bool commandReady=false; // will become true when receiving the byte 0 (i.e. the '/0' string terminator)
mbedalvaro 0:345b3bc7a0ea 339
mbedalvaro 0:345b3bc7a0ea 340 void processSerial() {
mbedalvaro 0:345b3bc7a0ea 341
mbedalvaro 0:345b3bc7a0ea 342 while(pc.readable()>0){
mbedalvaro 0:345b3bc7a0ea 343
mbedalvaro 0:345b3bc7a0ea 344 char val =pc.getc();
mbedalvaro 0:345b3bc7a0ea 345 // pc.printf("Got :%d\n", incomingByte);
mbedalvaro 0:345b3bc7a0ea 346 //pc.putc(incomingByte);
mbedalvaro 0:345b3bc7a0ea 347
mbedalvaro 0:345b3bc7a0ea 348 // Save ASCII numeric characters (ASCII 0 - 9) on stringData:
mbedalvaro 0:345b3bc7a0ea 349 if ((val >= '0') && (val <= '9')){ // this is 45 to 57 (included)
mbedalvaro 0:345b3bc7a0ea 350 stringData[indexStringData] = val;
mbedalvaro 0:345b3bc7a0ea 351 indexStringData++;
mbedalvaro 0:345b3bc7a0ea 352 }
mbedalvaro 0:345b3bc7a0ea 353
mbedalvaro 0:345b3bc7a0ea 354 // Save ASCII letters in stringCommand:
mbedalvaro 0:345b3bc7a0ea 355 if ((val >= 'A') && (val <= 'z')){ // this is 65 to 122 (included)
mbedalvaro 0:345b3bc7a0ea 356 stringCommand[indexStringCommand] = val;
mbedalvaro 0:345b3bc7a0ea 357 indexStringCommand++;
mbedalvaro 0:345b3bc7a0ea 358 }
mbedalvaro 0:345b3bc7a0ea 359 // is command ready?
mbedalvaro 0:345b3bc7a0ea 360 if (val=='/') {
mbedalvaro 0:345b3bc7a0ea 361 commandReady=true;
mbedalvaro 0:345b3bc7a0ea 362 stringCommand[indexStringCommand] = 0; // string termination.
mbedalvaro 0:345b3bc7a0ea 363 indexStringCommand=0; // reset index string for acquiring next command
mbedalvaro 0:345b3bc7a0ea 364 //Serial.println(stringCommand);
mbedalvaro 0:345b3bc7a0ea 365 }
mbedalvaro 0:345b3bc7a0ea 366
mbedalvaro 0:345b3bc7a0ea 367 // COMMANDS (with or without numeric parameters):
mbedalvaro 0:345b3bc7a0ea 368 if (commandReady==true) { // it means we can interpret the command string:
mbedalvaro 0:345b3bc7a0ea 369 commandReady=false;
mbedalvaro 0:345b3bc7a0ea 370
mbedalvaro 0:345b3bc7a0ea 371 stringData[indexStringData] = 0 ;// string termination for numeric values;
mbedalvaro 0:345b3bc7a0ea 372 indexStringData=0;
mbedalvaro 0:345b3bc7a0ea 373
mbedalvaro 0:345b3bc7a0ea 374 // PARSE DATA: (TO DO!!!!!!!!!!!!!!):
mbedalvaro 0:345b3bc7a0ea 375
mbedalvaro 0:345b3bc7a0ea 376 // (a) Parse command (get address[0] and address[1]):
mbedalvaro 0:345b3bc7a0ea 377 //ex: "/1/standBy" -- > address[0]="1" and address[1]="standBy"
mbedalvaro 0:345b3bc7a0ea 378 // address[2]
mbedalvaro 0:345b3bc7a0ea 379
mbedalvaro 0:345b3bc7a0ea 380 // Serial.println(stringCommand);
mbedalvaro 0:345b3bc7a0ea 381 // Serial.println(stringData);
mbedalvaro 0:345b3bc7a0ea 382
mbedalvaro 0:345b3bc7a0ea 383 // (b) Parse data:
mbedalvaro 0:345b3bc7a0ea 384
mbedalvaro 0:345b3bc7a0ea 385 // char address[2][24];
mbedalvaro 0:345b3bc7a0ea 386 //long auxdata[2]; // to store a max of two arguments (note: we will only use LONGs)
mbedalvaro 0:345b3bc7a0ea 387 //int data[2]; // this is to have -1 as NO DATA, to detect errors.
mbedalvaro 0:345b3bc7a0ea 388
mbedalvaro 0:345b3bc7a0ea 389 // FOR THE TIME BEING there is no parsing for serial commands:
mbedalvaro 0:345b3bc7a0ea 390
mbedalvaro 0:345b3bc7a0ea 391 // SCANNING:
mbedalvaro 0:345b3bc7a0ea 392 if (!strcmp(stringCommand , "takeSnapshot")) {
mbedalvaro 0:345b3bc7a0ea 393 // First, we need to disable the threaded display for the loop:
mbedalvaro 0:345b3bc7a0ea 394 timerForRendering.detach();
mbedalvaro 0:345b3bc7a0ea 395
mbedalvaro 0:345b3bc7a0ea 396 // Then, do the scan (sending values on serial port):
mbedalvaro 0:345b3bc7a0ea 397 IO.scan_serial();
mbedalvaro 0:345b3bc7a0ea 398
mbedalvaro 0:345b3bc7a0ea 399 // Finally, start again threaded display:
mbedalvaro 0:345b3bc7a0ea 400 timerForRendering.attach(&lsr, &simpleLaserSensingRenderer::laserRenderThreadONEBLOBONLY, RENDER_INTERVAL); // the address of the object, member function, and interval (in seconds)
mbedalvaro 0:345b3bc7a0ea 401
mbedalvaro 0:345b3bc7a0ea 402 }
mbedalvaro 0:345b3bc7a0ea 403
mbedalvaro 0:345b3bc7a0ea 404 if (!strcmp(stringCommand , "REDON")) IO.setRedPower(1); // pc.printf("%d\n",incomingByte);
mbedalvaro 0:345b3bc7a0ea 405
mbedalvaro 0:345b3bc7a0ea 406 if (!strcmp(stringCommand , "REDOFF")) IO.setRedPower(0);
mbedalvaro 0:345b3bc7a0ea 407
mbedalvaro 0:345b3bc7a0ea 408 if (!strcmp(stringCommand , "READVALUE")) pc.printf("Value read: %f", lockin.getSmoothValue());//lockin.getLastValue());/
mbedalvaro 0:345b3bc7a0ea 409
mbedalvaro 0:345b3bc7a0ea 410 // FINALLY, interpret commands (but only after parsing):
mbedalvaro 0:345b3bc7a0ea 411 // interpretCommand();//address, data);
mbedalvaro 0:345b3bc7a0ea 412
mbedalvaro 0:345b3bc7a0ea 413 }
mbedalvaro 0:345b3bc7a0ea 414 }
mbedalvaro 0:345b3bc7a0ea 415 }
mbedalvaro 0:345b3bc7a0ea 416
mbedalvaro 0:345b3bc7a0ea 417
mbedalvaro 0:345b3bc7a0ea 418
mbedalvaro 0:345b3bc7a0ea 419 // ================ MISCELANEA
mbedalvaro 0:345b3bc7a0ea 420
mbedalvaro 0:345b3bc7a0ea 421 /* EXAMPLE SEND/RECEIVE on PROCESSING:
mbedalvaro 0:345b3bc7a0ea 422
mbedalvaro 0:345b3bc7a0ea 423 // oscP5sendreceive by andreas schlegel
mbedalvaro 0:345b3bc7a0ea 424 // example shows how to send and receive osc messages.
mbedalvaro 0:345b3bc7a0ea 425 // oscP5 website at http://www.sojamo.de/oscP5
mbedalvaro 0:345b3bc7a0ea 426
mbedalvaro 0:345b3bc7a0ea 427 import oscP5.*;
mbedalvaro 0:345b3bc7a0ea 428 import netP5.*;
mbedalvaro 0:345b3bc7a0ea 429
mbedalvaro 0:345b3bc7a0ea 430 OscP5 oscP5;
mbedalvaro 0:345b3bc7a0ea 431 NetAddress myRemoteLocation;
mbedalvaro 0:345b3bc7a0ea 432
mbedalvaro 0:345b3bc7a0ea 433 void setup() {
mbedalvaro 0:345b3bc7a0ea 434 size(400,400);
mbedalvaro 0:345b3bc7a0ea 435 frameRate(25);
mbedalvaro 0:345b3bc7a0ea 436 // start oscP5, listening for incoming messages at port 12000
mbedalvaro 0:345b3bc7a0ea 437 oscP5 = new OscP5(this,12000);
mbedalvaro 0:345b3bc7a0ea 438
mbedalvaro 0:345b3bc7a0ea 439 // myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
mbedalvaro 0:345b3bc7a0ea 440 // an ip address and a port number. myRemoteLocation is used as parameter in
mbedalvaro 0:345b3bc7a0ea 441 // oscP5.send() when sending osc packets to another computer, device,
mbedalvaro 0:345b3bc7a0ea 442 // application. usage see below. for testing purposes the listening port
mbedalvaro 0:345b3bc7a0ea 443 // and the port of the remote location address are the same, hence you will
mbedalvaro 0:345b3bc7a0ea 444 // send messages back to this sketch.
mbedalvaro 0:345b3bc7a0ea 445 myRemoteLocation = new NetAddress("10.0.0.2",10000);
mbedalvaro 0:345b3bc7a0ea 446 }
mbedalvaro 0:345b3bc7a0ea 447
mbedalvaro 0:345b3bc7a0ea 448
mbedalvaro 0:345b3bc7a0ea 449 void draw() {
mbedalvaro 0:345b3bc7a0ea 450 background(0);
mbedalvaro 0:345b3bc7a0ea 451 }
mbedalvaro 0:345b3bc7a0ea 452
mbedalvaro 0:345b3bc7a0ea 453 void mousePressed() {
mbedalvaro 0:345b3bc7a0ea 454 // in the following different ways of creating osc messages are shown by example
mbedalvaro 0:345b3bc7a0ea 455 OscMessage myMessage = new OscMessage("/mbed/test1");
mbedalvaro 0:345b3bc7a0ea 456
mbedalvaro 0:345b3bc7a0ea 457 myMessage.add(123); // add an int to the osc message
mbedalvaro 0:345b3bc7a0ea 458
mbedalvaro 0:345b3bc7a0ea 459 // send the message
mbedalvaro 0:345b3bc7a0ea 460 oscP5.send(myMessage, myRemoteLocation);
mbedalvaro 0:345b3bc7a0ea 461 }
mbedalvaro 0:345b3bc7a0ea 462
mbedalvaro 0:345b3bc7a0ea 463
mbedalvaro 0:345b3bc7a0ea 464 // incoming osc message are forwarded to the oscEvent method.
mbedalvaro 0:345b3bc7a0ea 465 void oscEvent(OscMessage theOscMessage) {
mbedalvaro 0:345b3bc7a0ea 466 // print the address pattern and the typetag of the received OscMessage
mbedalvaro 0:345b3bc7a0ea 467 print("### received an osc message.");
mbedalvaro 0:345b3bc7a0ea 468 print(" addrpattern: "+theOscMessage.addrPattern());
mbedalvaro 0:345b3bc7a0ea 469 println(" typetag: "+theOscMessage.typetag());
mbedalvaro 0:345b3bc7a0ea 470 }
mbedalvaro 0:345b3bc7a0ea 471
mbedalvaro 0:345b3bc7a0ea 472 */
mbedalvaro 0:345b3bc7a0ea 473