just a test

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Tue Dec 02 04:28:42 2014 +0000
Revision:
48:7633d8e7b0d3
Parent:
47:2312a8dc9658
this is the working version of the skin games sowtware (aka, scorelight but with pre-determined "games")

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:345b3bc7a0ea 1
mbedalvaro 0:345b3bc7a0ea 2 #include "blobConfig.h"
mbedalvaro 0:345b3bc7a0ea 3
mbedalvaro 0:345b3bc7a0ea 4 blobConfig::blobConfig(): numBlobs(0) {
mbedalvaro 1:a4050fee11f7 5 //blobArray.clear();// there is no need to do this, the vector does not contains anything here.
mbedalvaro 0:345b3bc7a0ea 6 }
mbedalvaro 0:345b3bc7a0ea 7
mbedalvaro 0:345b3bc7a0ea 8 blobConfig::~blobConfig() {
mbedalvaro 1:a4050fee11f7 9 clearConfig();
mbedalvaro 0:345b3bc7a0ea 10 }
mbedalvaro 0:345b3bc7a0ea 11
mbedalvaro 0:345b3bc7a0ea 12 // =========================================== STANDARD CONFIGURATIONS =============================================================================
mbedalvaro 0:345b3bc7a0ea 13
mbedalvaro 30:d8af03f01cd4 14
mbedalvaro 0:345b3bc7a0ea 15
mbedalvaro 0:345b3bc7a0ea 16 void blobConfig::clearConfig() {
mbedalvaro 1:a4050fee11f7 17 for (int i=0; i<blobArray.size(); i++) delete blobArray[i]; // we must delete the pointer created with new, so the memory for the object is liberated (calls its destructor)
mbedalvaro 1:a4050fee11f7 18 blobArray.clear();
mbedalvaro 1:a4050fee11f7 19 numBlobs=0;// this is just equal to blobArray.size()
mbedalvaro 0:345b3bc7a0ea 20 }
mbedalvaro 0:345b3bc7a0ea 21
mbedalvaro 31:5f039cbddee8 22 void blobConfig::initConfig(configType cfType, int numblobs) {
mbedalvaro 30:d8af03f01cd4 23 myConfigType=cfType;
mbedalvaro 31:5f039cbddee8 24 int i;
mbedalvaro 30:d8af03f01cd4 25 switch(myConfigType) {
mbedalvaro 30:d8af03f01cd4 26 case ONE_ELASTIC_FOLLOWING:
mbedalvaro 30:d8af03f01cd4 27 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 28 clearConfig();
mbedalvaro 30:d8af03f01cd4 29 addOneElasticContourFollowing();
mbedalvaro 30:d8af03f01cd4 30 break;
mbedalvaro 30:d8af03f01cd4 31 case ONE_ELASTIC_MOUTH:
mbedalvaro 30:d8af03f01cd4 32 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 33 clearConfig();
mbedalvaro 30:d8af03f01cd4 34 addOneElasticLoopContractCentral();
mbedalvaro 30:d8af03f01cd4 35 break;
mbedalvaro 30:d8af03f01cd4 36 case ONE_ELASTIC_MOUTH_SMALL:
mbedalvaro 30:d8af03f01cd4 37 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 38 clearConfig();
mbedalvaro 30:d8af03f01cd4 39 addOneElasticLoopContractCentralFast();
mbedalvaro 30:d8af03f01cd4 40 break;
mbedalvaro 30:d8af03f01cd4 41 case BOUNCING_SPOTS:
mbedalvaro 30:d8af03f01cd4 42 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 43 clearConfig();
mbedalvaro 31:5f039cbddee8 44 for (i=0; i<numblobs ; i++) addOneRigidLoopBouncing();
mbedalvaro 35:35af5086ab4f 45 randomizeAllColors();
mbedalvaro 30:d8af03f01cd4 46 break;
mbedalvaro 30:d8af03f01cd4 47 case LORENTZ_SPOTS:
mbedalvaro 30:d8af03f01cd4 48 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 49 clearConfig();
mbedalvaro 31:5f039cbddee8 50 for (i=0; i<numblobs ; i++) addOneRigidLoopLorentz();
mbedalvaro 35:35af5086ab4f 51 randomizeAllColors();
mbedalvaro 30:d8af03f01cd4 52 break;
mbedalvaro 30:d8af03f01cd4 53 case FOLLOWING_SPOTS:
mbedalvaro 30:d8af03f01cd4 54 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 55 clearConfig();
mbedalvaro 33:43e8bc451ef0 56 for (i=0; i<numblobs ; i++) {
mbedalvaro 33:43e8bc451ef0 57 addOneRigidLoopFollowing(vector2Df(CENTER_AD_MIRROR_X+i*200, CENTER_AD_MIRROR_Y+i*200), vector2Df(11,0));
mbedalvaro 33:43e8bc451ef0 58 }
mbedalvaro 35:35af5086ab4f 59 // randomize colors:
mbedalvaro 35:35af5086ab4f 60 randomizeAllColors();
mbedalvaro 31:5f039cbddee8 61 break;
mbedalvaro 31:5f039cbddee8 62 case ONE_TRACKING_SPOT:
mbedalvaro 31:5f039cbddee8 63 clearConfig();
mbedalvaro 31:5f039cbddee8 64 addOneRigidTrackingSpot();
mbedalvaro 31:5f039cbddee8 65 break;
mbedalvaro 31:5f039cbddee8 66 case ONE_TRACKING_SPOT_DOT:
mbedalvaro 31:5f039cbddee8 67 clearConfig();
mbedalvaro 31:5f039cbddee8 68 addOneRigidTrackingSpotDot();
mbedalvaro 30:d8af03f01cd4 69 break;
mbedalvaro 30:d8af03f01cd4 70 case AIR_HOCKEY_GAME:
mbedalvaro 30:d8af03f01cd4 71 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 72 clearConfig();
mbedalvaro 31:5f039cbddee8 73 for (i=0; i<numblobs ; i++) addOneRigidLoopAirHockey();
mbedalvaro 30:d8af03f01cd4 74 break;
mbedalvaro 30:d8af03f01cd4 75 case CIRCULAR_PONG_GAME:
mbedalvaro 30:d8af03f01cd4 76 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 77 clearConfig();
mbedalvaro 30:d8af03f01cd4 78 // (1) One SPOT_TRACK to track the background. It will be the number 0 in the config.
mbedalvaro 31:5f039cbddee8 79 addOneRigidTrackingSpotDot();
mbedalvaro 30:d8af03f01cd4 80 // (2) Add bouncing spots:
mbedalvaro 31:5f039cbddee8 81 for (i=0; i<numblobs ; i++) {
mbedalvaro 31:5f039cbddee8 82 float anglaux=1.0*i/numblobs*2*PI;
mbedalvaro 31:5f039cbddee8 83 addOneRigidLoopBouncing(vector2Df(CENTER_AD_MIRROR_X+200*cos(anglaux), CENTER_AD_MIRROR_Y+200*sin(anglaux)),
mbedalvaro 48:7633d8e7b0d3 84 vector2Df(5*cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 85 }
mbedalvaro 30:d8af03f01cd4 86 break;
mbedalvaro 30:d8af03f01cd4 87 case VERTICAL_PINBALL_GAME:
mbedalvaro 30:d8af03f01cd4 88 clearConfig();
mbedalvaro 32:52273c3291fe 89 // (1) one (or two) SPOT_TRACK or SPOT_TRACK_DOT to track the background - It will be the number 0 (and 1) in the config.
mbedalvaro 31:5f039cbddee8 90 addOneRigidTrackingSpotDot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y+600),
mbedalvaro 31:5f039cbddee8 91 vector2Df(0,0));
mbedalvaro 32:52273c3291fe 92 // addOneRigidTrackingSpot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y+600),
mbedalvaro 32:52273c3291fe 93 // vector2Df(0,0));
mbedalvaro 35:35af5086ab4f 94 // (2) one or more bouncing spots with gravity:
mbedalvaro 35:35af5086ab4f 95 for (i=0; i<numblobs ; i++) {
mbedalvaro 35:35af5086ab4f 96 addOneRigidLoopBouncingGravity(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y-600),
mbedalvaro 35:35af5086ab4f 97 vector2Df(i*10-5,0));
mbedalvaro 35:35af5086ab4f 98 }
mbedalvaro 30:d8af03f01cd4 99
mbedalvaro 30:d8af03f01cd4 100 break;
mbedalvaro 32:52273c3291fe 101 case RAIN_MODE:
mbedalvaro 32:52273c3291fe 102 clearConfig();
mbedalvaro 32:52273c3291fe 103 // Add bouncing spot with gravity:
mbedalvaro 32:52273c3291fe 104 for (i=0; i<numblobs ; i++) {
mbedalvaro 32:52273c3291fe 105 addOneRigidLoopBouncingGravity(vector2Df(CENTER_AD_MIRROR_X, 10), vector2Df(0,0));
mbedalvaro 32:52273c3291fe 106 }
mbedalvaro 35:35af5086ab4f 107 randomizeAllColors();
mbedalvaro 32:52273c3291fe 108 break;
mbedalvaro 31:5f039cbddee8 109 case FISH_NET_GAME:
mbedalvaro 31:5f039cbddee8 110 clearConfig();
mbedalvaro 31:5f039cbddee8 111 // (1) one SPOT_TRACK_DOT to track the background - It will be the number 0
mbedalvaro 31:5f039cbddee8 112 addOneRigidTrackingSpotDot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), // CENTERED
mbedalvaro 31:5f039cbddee8 113 vector2Df(0,0));
mbedalvaro 31:5f039cbddee8 114 // (2) Add bouncing spots without gravity:
mbedalvaro 31:5f039cbddee8 115 for (i=0; i<numblobs ; i++) {
mbedalvaro 31:5f039cbddee8 116 float anglaux=1.0*i/numblobs*2*PI;
mbedalvaro 31:5f039cbddee8 117 addOneRigidLoopBouncing(vector2Df(CENTER_AD_MIRROR_X+400*cos(anglaux), CENTER_AD_MIRROR_Y+400*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 118 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 119 }
mbedalvaro 31:5f039cbddee8 120 break;
mbedalvaro 30:d8af03f01cd4 121 case PAC_MAN_GAME:
mbedalvaro 30:d8af03f01cd4 122 clearConfig();
mbedalvaro 35:35af5086ab4f 123 //(1) add one very slowly slidind-bouncing spot, the PACMAN (number 0 in the config):
mbedalvaro 31:5f039cbddee8 124 // addOneRigidLoopPacman(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), vector2Df(20,0));
mbedalvaro 35:35af5086ab4f 125
mbedalvaro 35:35af5086ab4f 126 // note: the pacman behaviour is not so good... for the time being, let's just use a following spot:
mbedalvaro 31:5f039cbddee8 127 addOneRigidLoopFollowing(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), vector2Df(10,0));
mbedalvaro 35:35af5086ab4f 128 // set the color to red+green:
mbedalvaro 35:35af5086ab4f 129 blobArray.back()->setColor(0x06);
mbedalvaro 35:35af5086ab4f 130
mbedalvaro 35:35af5086ab4f 131
mbedalvaro 35:35af5086ab4f 132 // (2) Add some initial SPOT_FOLLOWING or SPOT_GHOST spots (the ghosts):
mbedalvaro 35:35af5086ab4f 133 addOneRigidLoopGhost(vector2Df(CENTER_AD_MIRROR_X+500, CENTER_AD_MIRROR_Y-500), vector2Df(-5,0));
mbedalvaro 35:35af5086ab4f 134 addOneRigidLoopGhost(vector2Df(CENTER_AD_MIRROR_X-500, CENTER_AD_MIRROR_Y-500), vector2Df(5,0));
mbedalvaro 31:5f039cbddee8 135
mbedalvaro 30:d8af03f01cd4 136 break;
mbedalvaro 30:d8af03f01cd4 137 default:
mbedalvaro 30:d8af03f01cd4 138 break;
mbedalvaro 30:d8af03f01cd4 139 }
mbedalvaro 44:46e25fa1669b 140
mbedalvaro 44:46e25fa1669b 141 // make sure lockin red is ON (could be off if using blue for checking mirror delay...):
mbedalvaro 44:46e25fa1669b 142 IO.setLaserLockinPower(1);
mbedalvaro 30:d8af03f01cd4 143 }
mbedalvaro 30:d8af03f01cd4 144
mbedalvaro 47:2312a8dc9658 145 void blobConfig::printParameters() {
mbedalvaro 46:90516893793a 146 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 46:90516893793a 147 pc.printf("Blob n.%d\n", i);
mbedalvaro 47:2312a8dc9658 148 blobArray[i]->printParameters(); // a blob that is in stand-by mode may send data (good for testing with a fixed loop)
mbedalvaro 46:90516893793a 149 }
mbedalvaro 46:90516893793a 150 }
mbedalvaro 46:90516893793a 151
mbedalvaro 30:d8af03f01cd4 152 // ==================== Template spots from which to create multi-spot configurations: =====================
mbedalvaro 30:d8af03f01cd4 153
mbedalvaro 30:d8af03f01cd4 154 void blobConfig::addOneElasticLoopRelax(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 155 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 156 pBlob->createBlob(blobArray.size(), RELAX, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 157 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 158 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 159
mbedalvaro 1:a4050fee11f7 160 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 161 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 162
mbedalvaro 0:345b3bc7a0ea 163 }
mbedalvaro 0:345b3bc7a0ea 164
mbedalvaro 0:345b3bc7a0ea 165
mbedalvaro 30:d8af03f01cd4 166 void blobConfig::addOneElasticLoopContract(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 167 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 168 pBlob->createBlob(blobArray.size(), CONTRACT, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 169 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 170 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 171
mbedalvaro 1:a4050fee11f7 172 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 173 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 174 }
mbedalvaro 0:345b3bc7a0ea 175
mbedalvaro 30:d8af03f01cd4 176 void blobConfig::addOneElasticLoopContractCentral(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 177 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 178 pBlob->createBlob(blobArray.size(), CONTRACT_CENTRAL, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 179 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 180 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 181
mbedalvaro 1:a4050fee11f7 182 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 183 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 184 }
mbedalvaro 0:345b3bc7a0ea 185
mbedalvaro 30:d8af03f01cd4 186 void blobConfig::addOneElasticLoopContractCentralFast(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 19:228430f1350e 187 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 188 pBlob->createBlob(blobArray.size(), CONTRACT_CENTRAL_FAST, initpos, initspeed);
mbedalvaro 19:228430f1350e 189 // add this relaxing loop to the present config:
mbedalvaro 19:228430f1350e 190 blobArray.push_back(pBlob);
mbedalvaro 19:228430f1350e 191
mbedalvaro 19:228430f1350e 192 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 19:228430f1350e 193 numBlobs=blobArray.size();
mbedalvaro 19:228430f1350e 194 }
mbedalvaro 19:228430f1350e 195
mbedalvaro 30:d8af03f01cd4 196 void blobConfig::addOneElasticContourFollowing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 197
mbedalvaro 1:a4050fee11f7 198 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 199 pBlob->createBlob(blobArray.size(), CONTOUR_FOLLOWING, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 200 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 201 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 202
mbedalvaro 1:a4050fee11f7 203 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 204 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 205 }
mbedalvaro 0:345b3bc7a0ea 206
mbedalvaro 0:345b3bc7a0ea 207
mbedalvaro 30:d8af03f01cd4 208 void blobConfig:: addOneElasticContourFollowingFAST(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 209 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 210 pBlob->createBlob(blobArray.size(), CONTOUR_FOLLOWING_FAST, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 211 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 212 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 213
mbedalvaro 30:d8af03f01cd4 214 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 215 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 216 }
mbedalvaro 30:d8af03f01cd4 217
mbedalvaro 30:d8af03f01cd4 218 void blobConfig::addOneElasticBouncing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 219 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 220 pBlob->createBlob(blobArray.size(), BOUNCING, initpos, initspeed);
mbedalvaro 0:345b3bc7a0ea 221 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 222 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 223
mbedalvaro 1:a4050fee11f7 224 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 225 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 226 }
mbedalvaro 31:5f039cbddee8 227 void blobConfig::addOneRigidLoopBouncingGravity(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 31:5f039cbddee8 228 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 32:52273c3291fe 229 pBlob->createBlob(blobArray.size(), SPOT_BOUNCING_FACTOR, initpos, initspeed);
mbedalvaro 31:5f039cbddee8 230 // (We can use here methods of the child class, even if these are not declared virtual on the base class, because we are doing this BEFORE
mbedalvaro 31:5f039cbddee8 231 // adding this to the blobArray as a pointer). This is good to set parameters...
mbedalvaro 47:2312a8dc9658 232 pBlob->gravity.set(0,3.5);
mbedalvaro 31:5f039cbddee8 233 pBlob->centerMass.dampMotion = 0.002;
mbedalvaro 32:52273c3291fe 234 pBlob->factorBouncingForce=0;//0.003; // this is because we will use a force on the central mass (not used in SPOT_BOUNCING_FACTOR)
mbedalvaro 47:2312a8dc9658 235 pBlob->factorAbsorptionShock=0.9; // coef elastic bouncing
mbedalvaro 31:5f039cbddee8 236
mbedalvaro 31:5f039cbddee8 237 // add this relaxing loop to the present config:
mbedalvaro 31:5f039cbddee8 238 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 239
mbedalvaro 31:5f039cbddee8 240 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 31:5f039cbddee8 241 numBlobs=blobArray.size();
mbedalvaro 31:5f039cbddee8 242 }
mbedalvaro 30:d8af03f01cd4 243 void blobConfig::addOneRigidLoopBouncing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 244 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 32:52273c3291fe 245 pBlob->createBlob(blobArray.size(), SPOT_BOUNCING_FACTOR, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 246 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 247 blobArray.push_back(pBlob);
mbedalvaro 33:43e8bc451ef0 248
mbedalvaro 1:a4050fee11f7 249 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 250 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 251 }
mbedalvaro 0:345b3bc7a0ea 252
mbedalvaro 30:d8af03f01cd4 253 void blobConfig::addOneRigidLoopPacman(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 254 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 255 pBlob->createBlob(blobArray.size(), SPOT_PACMAN, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 256 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 257 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 258
mbedalvaro 30:d8af03f01cd4 259 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 260 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 261 }
mbedalvaro 30:d8af03f01cd4 262 void blobConfig::addOneRigidLoopGhost(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 263 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 264 pBlob->createBlob(blobArray.size(), SPOT_GHOST, initpos, initspeed);
mbedalvaro 0:345b3bc7a0ea 265 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 266 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 267
mbedalvaro 1:a4050fee11f7 268 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 269 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 270 }
mbedalvaro 0:345b3bc7a0ea 271
mbedalvaro 30:d8af03f01cd4 272
mbedalvaro 30:d8af03f01cd4 273 void blobConfig::addOneRigidLoopLorentz(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 27:1ce994629ffc 274 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 275 pBlob->createBlob(blobArray.size(), SPOT_LORENTZ_FORCE, initpos, initspeed);
mbedalvaro 27:1ce994629ffc 276 // add this loop to the present config:
mbedalvaro 27:1ce994629ffc 277 blobArray.push_back(pBlob);
mbedalvaro 27:1ce994629ffc 278
mbedalvaro 27:1ce994629ffc 279 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 27:1ce994629ffc 280 numBlobs=blobArray.size();
mbedalvaro 27:1ce994629ffc 281 }
mbedalvaro 27:1ce994629ffc 282
mbedalvaro 30:d8af03f01cd4 283 void blobConfig::addOneRigidLoopAirHockey(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 28:44b7b6e35548 284 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 285 pBlob->createBlob(blobArray.size(), SPOT_AIR_HOCKEY, initpos, initspeed);
mbedalvaro 28:44b7b6e35548 286 // add this loop to the present config:
mbedalvaro 28:44b7b6e35548 287 blobArray.push_back(pBlob);
mbedalvaro 28:44b7b6e35548 288
mbedalvaro 28:44b7b6e35548 289 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 28:44b7b6e35548 290 numBlobs=blobArray.size();
mbedalvaro 28:44b7b6e35548 291 }
mbedalvaro 28:44b7b6e35548 292
mbedalvaro 30:d8af03f01cd4 293 void blobConfig::addOneRigidLoopFollowing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 294 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 295 pBlob->createBlob(blobArray.size(), SPOT_FOLLOWING, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 296 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 297 blobArray.push_back(pBlob);
mbedalvaro 33:43e8bc451ef0 298
mbedalvaro 33:43e8bc451ef0 299 // random color for Tokyo Designer Week:
mbedalvaro 35:35af5086ab4f 300 //randomizeAllColors();
mbedalvaro 1:a4050fee11f7 301
mbedalvaro 1:a4050fee11f7 302 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 303 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 304 }
mbedalvaro 0:345b3bc7a0ea 305
mbedalvaro 30:d8af03f01cd4 306 void blobConfig::addOneRigidLoopTest(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 5:73cd58b58f95 307 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 308 pBlob->createBlob(blobArray.size(), SPOT_TEST, initpos, initspeed);
mbedalvaro 5:73cd58b58f95 309 // add this relaxing loop to the present config:
mbedalvaro 5:73cd58b58f95 310 blobArray.push_back(pBlob);
mbedalvaro 5:73cd58b58f95 311
mbedalvaro 5:73cd58b58f95 312 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 5:73cd58b58f95 313 numBlobs=blobArray.size();
mbedalvaro 5:73cd58b58f95 314 }
mbedalvaro 5:73cd58b58f95 315
mbedalvaro 30:d8af03f01cd4 316 void blobConfig::addOneRigidTrackingSpot(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 317 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 318 pBlob->createBlob(blobArray.size(), SPOT_TRACK, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 319 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 320 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 321
mbedalvaro 30:d8af03f01cd4 322 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 323 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 324 }
mbedalvaro 0:345b3bc7a0ea 325
mbedalvaro 31:5f039cbddee8 326 void blobConfig::addOneRigidTrackingSpotDot(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 31:5f039cbddee8 327 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 31:5f039cbddee8 328 pBlob->createBlob(blobArray.size(), SPOT_TRACK_DOT, initpos, initspeed);
mbedalvaro 31:5f039cbddee8 329 // add this relaxing loop to the present config:
mbedalvaro 31:5f039cbddee8 330 blobArray.push_back(pBlob);
mbedalvaro 31:5f039cbddee8 331
mbedalvaro 31:5f039cbddee8 332 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 31:5f039cbddee8 333 numBlobs=blobArray.size();
mbedalvaro 31:5f039cbddee8 334 }
mbedalvaro 0:345b3bc7a0ea 335 // ==================================================================================================================================================
mbedalvaro 44:46e25fa1669b 336 void blobConfig::processSensedData() {
mbedalvaro 44:46e25fa1669b 337 for (int i=0; i<blobArray.size(); i++) blobArray[i]->displaySensingBuffer.processSensedData(); // note: region with light is -1, and without is 2 (TO CHANGE!!! then we don't need to do "if" in the moment computation, but just a product)
mbedalvaro 44:46e25fa1669b 338 }
mbedalvaro 0:345b3bc7a0ea 339
mbedalvaro 1:a4050fee11f7 340 void blobConfig::allKill() { // this put all the blobs in "dead" mode, meaning that neither rendering nor update is done (but they are not deleted).
mbedalvaro 1:a4050fee11f7 341 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 342 blobArray[i]->render = false;
mbedalvaro 1:a4050fee11f7 343 blobArray[i]->standByMode = false;
mbedalvaro 1:a4050fee11f7 344 }
mbedalvaro 1:a4050fee11f7 345 }
mbedalvaro 0:345b3bc7a0ea 346 void blobConfig::allAlive() {
mbedalvaro 1:a4050fee11f7 347 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 348 blobArray[i]->render = true;
mbedalvaro 1:a4050fee11f7 349 blobArray[i]->standByMode = true;
mbedalvaro 1:a4050fee11f7 350 }
mbedalvaro 1:a4050fee11f7 351 }
mbedalvaro 1:a4050fee11f7 352
mbedalvaro 0:345b3bc7a0ea 353 void blobConfig::allStandBy() {
mbedalvaro 1:a4050fee11f7 354 for (int i=0; i<blobArray.size(); i++) blobArray[i]->standByMode = true;
mbedalvaro 0:345b3bc7a0ea 355 }
mbedalvaro 0:345b3bc7a0ea 356
mbedalvaro 0:345b3bc7a0ea 357 void blobConfig::allResume() {
mbedalvaro 1:a4050fee11f7 358 for (int i=0; i<blobArray.size(); i++) blobArray[i]->standByMode = false;
mbedalvaro 0:345b3bc7a0ea 359 }
mbedalvaro 0:345b3bc7a0ea 360
mbedalvaro 1:a4050fee11f7 361 void blobConfig::allVisible() {
mbedalvaro 1:a4050fee11f7 362 for (int i=0; i<blobArray.size(); i++) blobArray[i]->render = true;
mbedalvaro 0:345b3bc7a0ea 363 }
mbedalvaro 0:345b3bc7a0ea 364
mbedalvaro 0:345b3bc7a0ea 365 void blobConfig::allInvisible() { // note that they may continue to evolve
mbedalvaro 1:a4050fee11f7 366 for (int i=0; i<blobArray.size(); i++) blobArray[i]->render = false;
mbedalvaro 0:345b3bc7a0ea 367 }
mbedalvaro 0:345b3bc7a0ea 368
mbedalvaro 25:74cb85b85fd2 369 void blobConfig::allSetColor(unsigned char c) {
mbedalvaro 25:74cb85b85fd2 370 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setColor(c);
mbedalvaro 25:74cb85b85fd2 371 }
mbedalvaro 32:52273c3291fe 372
mbedalvaro 32:52273c3291fe 373 void blobConfig::allSetGreen(unsigned char c) {
mbedalvaro 32:52273c3291fe 374 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setGreenColor(c);
mbedalvaro 32:52273c3291fe 375 }
mbedalvaro 32:52273c3291fe 376
mbedalvaro 32:52273c3291fe 377 void blobConfig::allSetBlue(unsigned char c) {
mbedalvaro 32:52273c3291fe 378 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setBlueColor(c);
mbedalvaro 32:52273c3291fe 379 }
mbedalvaro 33:43e8bc451ef0 380
mbedalvaro 33:43e8bc451ef0 381 void blobConfig::randomizeAllColors() {
mbedalvaro 33:43e8bc451ef0 382 int c;
mbedalvaro 33:43e8bc451ef0 383 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 33:43e8bc451ef0 384 c= rand() % 2;
mbedalvaro 33:43e8bc451ef0 385 blobArray[i]->setBlueColor(c);
mbedalvaro 33:43e8bc451ef0 386 c= rand() % 2;
mbedalvaro 33:43e8bc451ef0 387 blobArray[i]->setGreenColor(c);
mbedalvaro 33:43e8bc451ef0 388 }
mbedalvaro 33:43e8bc451ef0 389 }
mbedalvaro 25:74cb85b85fd2 390
mbedalvaro 30:d8af03f01cd4 391 void blobConfig::update() { // update dynamics of the blob configuration:
mbedalvaro 31:5f039cbddee8 392 int i;
mbedalvaro 31:5f039cbddee8 393 float minDist=5000, dist;
mbedalvaro 31:5f039cbddee8 394 bool win;
mbedalvaro 31:5f039cbddee8 395 // Depending on the config type, perform some special test and updates:
mbedalvaro 30:d8af03f01cd4 396 switch(myConfigType) {
mbedalvaro 30:d8af03f01cd4 397 // simple behaviours:
mbedalvaro 30:d8af03f01cd4 398 case ONE_ELASTIC_FOLLOWING:
mbedalvaro 30:d8af03f01cd4 399 case ONE_ELASTIC_MOUTH:
mbedalvaro 30:d8af03f01cd4 400 case ONE_ELASTIC_MOUTH_SMALL:
mbedalvaro 30:d8af03f01cd4 401 case BOUNCING_SPOTS:
mbedalvaro 30:d8af03f01cd4 402 case LORENTZ_SPOTS:
mbedalvaro 30:d8af03f01cd4 403 case FOLLOWING_SPOTS:
mbedalvaro 31:5f039cbddee8 404 case ONE_TRACKING_SPOT:
mbedalvaro 31:5f039cbddee8 405 case AIR_HOCKEY_GAME:
mbedalvaro 31:5f039cbddee8 406 // In all these simple cases, update dynamics of each blob independently:
mbedalvaro 31:5f039cbddee8 407 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 408 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 409 }
mbedalvaro 31:5f039cbddee8 410 break;
mbedalvaro 30:d8af03f01cd4 411 // more game-like:
mbedalvaro 30:d8af03f01cd4 412 case CIRCULAR_PONG_GAME:
mbedalvaro 31:5f039cbddee8 413 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 414 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 415 // all the other spots are bouncing spots:
mbedalvaro 31:5f039cbddee8 416 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 417 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 418 }
mbedalvaro 31:5f039cbddee8 419 // GAME CHECK: is some bouncing spot too far from the anchor? if so, make it "explode" (and then dissapear, but leave this for now):
mbedalvaro 31:5f039cbddee8 420 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 421 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 422 if (dist>1000) {
mbedalvaro 31:5f039cbddee8 423 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 424 float anglaux=1.0*(i-1)/(blobArray.size()-1)*2*PI;
mbedalvaro 31:5f039cbddee8 425 blobArray[i]->setPositionSpeed(vector2Df(CENTER_AD_MIRROR_X+200*cos(anglaux), CENTER_AD_MIRROR_Y+200*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 426 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 427 }
mbedalvaro 31:5f039cbddee8 428 }
mbedalvaro 30:d8af03f01cd4 429 break;
mbedalvaro 32:52273c3291fe 430 case RAIN_MODE: // this is just spots with gravity that reapears in the top position when reaching the bottom:
mbedalvaro 32:52273c3291fe 431 // others are bouncing with gravity:
mbedalvaro 32:52273c3291fe 432 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 32:52273c3291fe 433 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 32:52273c3291fe 434 }
mbedalvaro 32:52273c3291fe 435 // GAME CHECKS:
mbedalvaro 32:52273c3291fe 436 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 32:52273c3291fe 437 if (blobArray[i]->getCenter().y>MAX_AD_MIRRORS-20) {
mbedalvaro 32:52273c3291fe 438 // Replace position of spot to the initial position:
mbedalvaro 32:52273c3291fe 439 blobArray[i]->explosion();
mbedalvaro 32:52273c3291fe 440 blobArray[i]->resetPositionSpeed();
mbedalvaro 32:52273c3291fe 441 }
mbedalvaro 32:52273c3291fe 442 }
mbedalvaro 32:52273c3291fe 443 break;
mbedalvaro 30:d8af03f01cd4 444 case VERTICAL_PINBALL_GAME:
mbedalvaro 31:5f039cbddee8 445 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 446 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 447 // others are bouncing with gravity:
mbedalvaro 31:5f039cbddee8 448 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 449 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 450 }
mbedalvaro 31:5f039cbddee8 451 // GAME CHECKS:
mbedalvaro 31:5f039cbddee8 452 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 453 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 454 //(1) win (meaning bouncing spot very close to anchor):
mbedalvaro 31:5f039cbddee8 455 if (dist<60) {
mbedalvaro 31:5f039cbddee8 456 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 457 blobArray[i]->setPositionSpeed(vector2Df(blobArray[0]->getCenter().x-400+rand()%800, blobArray[0]->getCenter().y-1200),
mbedalvaro 31:5f039cbddee8 458 vector2Df(0, 0));
mbedalvaro 31:5f039cbddee8 459 }
mbedalvaro 31:5f039cbddee8 460 //(2) loose (meaning spot went outside range):
mbedalvaro 31:5f039cbddee8 461 if (blobArray[i]->getCenter().y>blobArray[0]->getCenter().y) {
mbedalvaro 31:5f039cbddee8 462 blobArray[i]->setPositionSpeed(vector2Df(blobArray[0]->getCenter().x-400+rand()%800, blobArray[0]->getCenter().y-1200),
mbedalvaro 35:35af5086ab4f 463 vector2Df(i*10-5, 0));
mbedalvaro 31:5f039cbddee8 464 }
mbedalvaro 31:5f039cbddee8 465 }
mbedalvaro 30:d8af03f01cd4 466 break;
mbedalvaro 31:5f039cbddee8 467 case FISH_NET_GAME:
mbedalvaro 31:5f039cbddee8 468 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 469 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 470 // all the other spots are bouncing spots:
mbedalvaro 31:5f039cbddee8 471 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 472 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 473 }
mbedalvaro 31:5f039cbddee8 474 // GAME CHECKS: a win only, when all the spots are very close to the mother spot:
mbedalvaro 31:5f039cbddee8 475 win=true;
mbedalvaro 31:5f039cbddee8 476 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 477 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 478 win&=(dist<80);
mbedalvaro 31:5f039cbddee8 479 }
mbedalvaro 31:5f039cbddee8 480 if (win) {
mbedalvaro 31:5f039cbddee8 481 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 482 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 483 float anglaux=1.0*(i-1)/(blobArray.size()-1)*2*PI;
mbedalvaro 31:5f039cbddee8 484 blobArray[i]->setPositionSpeed(vector2Df(CENTER_AD_MIRROR_X+400*cos(anglaux), CENTER_AD_MIRROR_Y+400*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 485 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 486 }
mbedalvaro 31:5f039cbddee8 487 }
mbedalvaro 31:5f039cbddee8 488 break;
mbedalvaro 30:d8af03f01cd4 489 case PAC_MAN_GAME:
mbedalvaro 31:5f039cbddee8 490 // spot index 0 is the pacman:
mbedalvaro 31:5f039cbddee8 491 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 492 // spot 1 and 2 are ghosts:
mbedalvaro 31:5f039cbddee8 493 if (blobArray[1]->standByMode==false) blobArray[1]->update(blobArray[0]->getCenter());
mbedalvaro 31:5f039cbddee8 494 if (blobArray[2]->standByMode==false) blobArray[2]->update(blobArray[0]->getCenter()); // pass the position of the PACMAN!
mbedalvaro 31:5f039cbddee8 495
mbedalvaro 31:5f039cbddee8 496 // GAME CHECK: are any ghost too close to the pacman?
mbedalvaro 31:5f039cbddee8 497 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 498 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 499 if (minDist>dist) minDist=dist;
mbedalvaro 31:5f039cbddee8 500 }
mbedalvaro 31:5f039cbddee8 501 if (minDist<50) {
mbedalvaro 31:5f039cbddee8 502 blobArray[0]->explosion();
mbedalvaro 31:5f039cbddee8 503 // then restart the game:
mbedalvaro 31:5f039cbddee8 504 // initConfig(PAC_MAN_GAME);
mbedalvaro 31:5f039cbddee8 505 }
mbedalvaro 31:5f039cbddee8 506
mbedalvaro 30:d8af03f01cd4 507 break;
mbedalvaro 30:d8af03f01cd4 508 default:
mbedalvaro 30:d8af03f01cd4 509 break;
mbedalvaro 30:d8af03f01cd4 510 }
mbedalvaro 30:d8af03f01cd4 511
mbedalvaro 30:d8af03f01cd4 512
mbedalvaro 30:d8af03f01cd4 513 }
mbedalvaro 30:d8af03f01cd4 514
mbedalvaro 30:d8af03f01cd4 515 void blobConfig::computeBoundingBox() {
mbedalvaro 30:d8af03f01cd4 516 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 30:d8af03f01cd4 517 blobArray[i]->computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 518 }
mbedalvaro 0:345b3bc7a0ea 519 }
mbedalvaro 0:345b3bc7a0ea 520
mbedalvaro 1:a4050fee11f7 521 void blobConfig::draw() { // draw uses the opengl like renderer (if any), and save projected trajectory in the LaserSensingTrajectory object of each blob
mbedalvaro 1:a4050fee11f7 522 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 523 if (blobArray[i]->render==true) blobArray[i]->draw();
mbedalvaro 1:a4050fee11f7 524 }
mbedalvaro 0:345b3bc7a0ea 525 }
mbedalvaro 0:345b3bc7a0ea 526
mbedalvaro 1:a4050fee11f7 527 void blobConfig::sendConfData() {
mbedalvaro 1:a4050fee11f7 528 // For the time being, only "per blob" data sending:
mbedalvaro 1:a4050fee11f7 529 // (b) Per-spot sending of data (note: both are NOT exclusive; so if we want just packaged data, we need to make all the spot STOP sending data.
mbedalvaro 18:d72935b13858 530 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 531 if (blobArray[i]->render==true) blobArray[i]->sendData(); // a blob that is in stand-by mode may send data (good for testing with a fixed loop)
mbedalvaro 1:a4050fee11f7 532 }
mbedalvaro 0:345b3bc7a0ea 533 }
mbedalvaro 0:345b3bc7a0ea 534
mbedalvaro 0:345b3bc7a0ea 535
mbedalvaro 0:345b3bc7a0ea 536
mbedalvaro 0:345b3bc7a0ea 537