annotate SearchMessageOrganiser.h @ 8:d59de9fd3496

Refactored messageController, ready for instroduction of other stages and tests.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Fri, 17 Oct 2014 16:35:22 +0100
parents
children d5e928887f51
rev   line source
rt300@8 1 //
rt300@8 2 // SearchMessageOrganiser.h
rt300@8 3 // riftathon
rt300@8 4 //
rt300@8 5 // Created by Robert Tubb on 17/10/2014.
rt300@8 6 //
rt300@8 7 //
rt300@8 8
rt300@8 9 #ifndef __riftathon__SearchMessageOrganiser__
rt300@8 10 #define __riftathon__SearchMessageOrganiser__
rt300@8 11
rt300@8 12 #include <iostream>
rt300@8 13 #include "MessageOrganiser.h"
rt300@8 14
rt300@8 15 class SearchMessageOrganiser : public MessageOrganiser {
rt300@8 16
rt300@8 17 public:
rt300@8 18
rt300@8 19
rt300@8 20
rt300@8 21 protected:
rt300@8 22
rt300@8 23
rt300@8 24 TimeController altPlaybackController;
rt300@8 25
rt300@8 26 TestController* testController;
rt300@8 27 Buttron* newTestButton;
rt300@8 28 //Buttron* submitButton;
rt300@8 29
rt300@8 30 ButtonPanel* bottomPanel; // shows during test : play buttons and submit
rt300@8 31 Buttron* targetPlayButton; // so we can hide target in memory test. this pointer stuff is getting out of hand
rt300@8 32 CountdownText* countdownPanel;
rt300@8 33 TargetSymbol* targetSymbol;
rt300@8 34 Leap3DBoxGL* box3D;
rt300@8 35 TextPanel* scorePanel;
rt300@8 36 TextPanel* finishPanel;
rt300@8 37 AppModeChangeFunction testAppModeChange;
rt300@8 38
rt300@8 39 //int scoreRunningTotal;
rt300@8 40 TimerID currentSoundPlayTimer;
rt300@8 41
rt300@8 42 int alternationSpeed; // ms between cand and target
rt300@8 43 bool playingAlternating;
rt300@8 44
rt300@8 45 bool okToGetLeapMidi;
rt300@8 46
rt300@8 47
rt300@8 48 // protected methods
rt300@8 49 void testsFinished(){
rt300@8 50 panel->hide();
rt300@8 51 bottomPanel->hide();
rt300@8 52 newTestButton->hide();
rt300@8 53
rt300@8 54 vector<int> eData;
rt300@8 55 eData.push_back(testController->getScoreRunningTotal());
rt300@8 56 eventLogger.logEvent(ALL_TESTS_COMPLETED, eData);
rt300@8 57
rt300@8 58 // TODO set final score screen txt to testController->getScoreRunningTotal()
rt300@8 59 finishPanel->show();
rt300@8 60
rt300@8 61 string user = eventLogger.getUsername();
rt300@8 62 stringstream s;
rt300@8 63 s << "Experiment completed"
rt300@8 64 << endl << endl
rt300@8 65 << "You scored: " << testController->getScoreRunningTotal() << " well done " << user << endl << endl
rt300@8 66 << "to retake test please close " << endl << endl
rt300@8 67 << "the app and restart with username<num test>";
rt300@8 68 finishPanel->setText(s.str());
rt300@8 69 // get test app to do something...
rt300@8 70
rt300@8 71 eventLogger.saveSessionToFile();
rt300@8 72 };
rt300@8 73
rt300@8 74 void setupNewTest(){
rt300@8 75 // get mapping for new test and make sure we have right controls and stuff
rt300@8 76
rt300@8 77
rt300@8 78 Test newTest = testController->goToNextTest();
rt300@8 79
rt300@8 80 // V0.2 put details about what kind of test it is
rt300@8 81 vector<int> eData;
rt300@8 82 eData.push_back(newTest.isPractice());
rt300@8 83 eData.push_back(newTest.isWithHint());
rt300@8 84 eData.push_back(newTest.isMemoryTest());
rt300@8 85 eventLogger.logEvent(NEW_TEST, eData);
rt300@8 86
rt300@8 87
rt300@8 88 vector<int> mappingIDsForChangeableParams = setSynthsUpForNewTest(newTest);
rt300@8 89
rt300@8 90 vector<UIElement*> UIElemHandles = panel->generateControls(testController->getCurrentListOfControls(), testController->getCurrentPanelType());
rt300@8 91
rt300@8 92 mapUIToNewTestParams(UIElemHandles, mappingIDsForChangeableParams);
rt300@8 93
rt300@8 94 countdownPanel->setTestTypeString(newTest.getTestTypeAdvanceWarning());
rt300@8 95
rt300@8 96
rt300@8 97 };
rt300@8 98 void startNewTest(){
rt300@8 99 Test t = testController->getCurrentTest();
rt300@8 100
rt300@8 101 countdownPanel->hide();
rt300@8 102 panel->show();
rt300@8 103 panel->setActive(true);
rt300@8 104 if(t.isWithHint()){
rt300@8 105 panel->showHint(true);
rt300@8 106 }
rt300@8 107
rt300@8 108 bottomPanel->show();
rt300@8 109 targetPlayButton->show(); // incase it was memory test
rt300@8 110 if (t.isMemoryTest()){
rt300@8 111 targetPlayButton->setLabel("Memorise!");
rt300@8 112 }else{
rt300@8 113 targetPlayButton->setLabel("Target");
rt300@8 114 }
rt300@8 115 //startAlternatingPlayback();
rt300@8 116 //timeController.scheduleEvent(boost::bind(&MessageOrganiser::sendSynthValuesAgain, this), 200);
rt300@8 117 timeController.startStopwatch();
rt300@8 118 eventLogger.logEvent(TEST_TIMER_STARTED);
rt300@8 119
rt300@8 120
rt300@8 121 if(t.getListOfControlTypes()[0] == LEAP3D){
rt300@8 122 okToGetLeapMidi = true;
rt300@8 123 }
rt300@8 124 };
rt300@8 125
rt300@8 126 vector<int> setSynthsUpForNewTest(Test newTest){
rt300@8 127 targetSynth.setAllParams(newTest.getTargetValues());
rt300@8 128 eventLogger.logEvent(TARGET_PARAM_SET, newTest.getTargetValues()); // unless something goes wrong in setAllParams
rt300@8 129
rt300@8 130 candidateSynth.setAllParams(newTest.getStartingCandidateValues());
rt300@8 131 eventLogger.logEvent(CANDIDATE_PARAM_SET,newTest.getStartingCandidateValues());
rt300@8 132
rt300@8 133 // eventLogger.logEvent(NEW_TARGET_PARAMS, vector<int> );
rt300@8 134 // eventLogger.logEvent(NEW_CANDIDATE_PARAMS, vector<int> );
rt300@8 135
rt300@8 136 vector<int> mids = candidateSynth.getMappingIDForIndices(newTest.getChangeableIndices());
rt300@8 137
rt300@8 138 eventLogger.logEvent(CANDIDATE_CHANGEABLE_IDX, newTest.getChangeableIndices());
rt300@8 139 eventLogger.logEvent(CANDIDATE_MAPPING_IDS, mids);
rt300@8 140
rt300@8 141 return mids;
rt300@8 142 };
rt300@8 143
rt300@8 144
rt300@8 145 // could have been cleverer. takes forever due to searching ???
rt300@8 146 void mapUIToNewTestParams(vector<UIElement*> elems, vector<int> mids){
rt300@8 147
rt300@8 148 vector<UIElement*>::iterator elit;
rt300@8 149 vector<int> typeListLog;
rt300@8 150 int i = 0;
rt300@8 151 for(elit=elems.begin(); elit<elems.end();elit++){
rt300@8 152 if ( (*elit)->getType() == XYPAD){
rt300@8 153 if(i+1 >= mids.size()){
rt300@8 154 cout << "ERROR ERROR: too many controls for mapping IDs" << endl;
rt300@8 155 }
rt300@8 156
rt300@8 157 ButtronXY* theXY = (ButtronXY*)(*elit);
rt300@8 158 mapXYToParams(theXY, mids[i], mids[i+1]);
rt300@8 159 theXY->setValueAndScale(candidateSynth.getParamValueForID(mids[i]), candidateSynth.getParamValueForID(mids[i+1]));
rt300@8 160 theXY->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i]))
rt300@8 161 ,targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i+1])));
rt300@8 162 i+=2;
rt300@8 163 typeListLog.push_back(int(XYPAD));
rt300@8 164 }else if ( (*elit)->getType() == SLIDER){
rt300@8 165 if(i >= mids.size()){
rt300@8 166
rt300@8 167 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
rt300@8 168 }
rt300@8 169
rt300@8 170 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
rt300@8 171 mapControlToParam((*elit), mids[i]);
rt300@8 172 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
rt300@8 173 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
rt300@8 174 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
rt300@8 175 i++;
rt300@8 176 typeListLog.push_back(int(SLIDER));
rt300@8 177 }else if ( (*elit)->getType() == LEAP3D ){
rt300@8 178 set3Dbox((Leap3DBoxGL*)(*elit));
rt300@8 179 // UH
rt300@8 180 string nameX = candidateSynth.getNameForMappingID(mids[i]);
rt300@8 181 box3D->setHintValue(0,targetSynth.getParamValueFromName(nameX));
rt300@8 182 box3D->setValueAndScale(0, candidateSynth.getParamValueForID(mids[i]));
rt300@8 183 i++;
rt300@8 184
rt300@8 185 string nameY = candidateSynth.getNameForMappingID(mids[i]);
rt300@8 186 box3D->setHintValue(1,targetSynth.getParamValueFromName(nameY));
rt300@8 187 box3D->setValueAndScale(1, candidateSynth.getParamValueForID(mids[i]));
rt300@8 188 i++;
rt300@8 189
rt300@8 190 string nameZ = candidateSynth.getNameForMappingID(mids[i]);
rt300@8 191 box3D->setHintValue(2,targetSynth.getParamValueFromName(nameZ));
rt300@8 192 box3D->setValueAndScale(2, candidateSynth.getParamValueForID(mids[i]));
rt300@8 193 i++;
rt300@8 194
rt300@8 195
rt300@8 196 box3D->setLabels(nameX,nameY,nameZ);
rt300@8 197 typeListLog.push_back(int(LEAP3D));
rt300@8 198
rt300@8 199 }else{
rt300@8 200 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
rt300@8 201 }
rt300@8 202 }
rt300@8 203
rt300@8 204 eventLogger.logEvent(CONTROL_LIST,typeListLog);
rt300@8 205 };
rt300@8 206
rt300@8 207 // TODO - no, triggering playback needs to be logged
rt300@8 208 void startAlternatingPlayback(){
rt300@8 209
rt300@8 210 cout << "start alt playback" << endl;
rt300@8 211 // use our special timer to fire off play to pd
rt300@8 212 // sets off timed alternating playback
rt300@8 213
rt300@8 214 playAlternating();
rt300@8 215 playingAlternating = true;
rt300@8 216
rt300@8 217 };
rt300@8 218 void stopAlternatingPlayback(){
rt300@8 219 cout << "stop alt playback" << endl;
rt300@8 220 // kill the alternation
rt300@8 221 timeController.cancelEvent(currentSoundPlayTimer);
rt300@8 222 playingAlternating = false;
rt300@8 223 };
rt300@8 224
rt300@8 225 void playAlternating(){
rt300@8 226
rt300@8 227 static bool alt;
rt300@8 228 int nextTime;
rt300@8 229 if (alt){
rt300@8 230 targetSynth.trigger();
rt300@8 231 // flash the target thingy
rt300@8 232 targetSymbol->flash();
rt300@8 233 nextTime = alternationSpeed*1.503; // gap after target
rt300@8 234 }else{
rt300@8 235 sendSynthValuesAgain(); // and again and again
rt300@8 236 candidateSynth.trigger();
rt300@8 237 panel->flash();
rt300@8 238 nextTime = alternationSpeed;
rt300@8 239 }
rt300@8 240 alt = !alt;
rt300@8 241 candidateSynth.setNoteLength(alternationSpeed);
rt300@8 242 targetSynth.setNoteLength(alternationSpeed); // could be user alterable
rt300@8 243 currentSoundPlayTimer = timeController.scheduleEvent(boost::bind(&SearchMessageOrganiser::playAlternating,this), nextTime);
rt300@8 244
rt300@8 245
rt300@8 246
rt300@8 247 };
rt300@8 248
rt300@8 249 void delayedShowNewTest(){
rt300@8 250 newTestButton->show();
rt300@8 251 // JUST IN CASE IT CRASHES near end...
rt300@8 252 //eventLogger.saveSessionToFile();
rt300@8 253 };
rt300@8 254 void submitSingleControl(){
rt300@8 255 // if last one
rt300@8 256 // submitPressed()
rt300@8 257
rt300@8 258 // else
rt300@8 259
rt300@8 260 // grey out that slider,
rt300@8 261 // activate next slider and show it's button (same button but moved!???)
rt300@8 262
rt300@8 263 };
rt300@8 264
rt300@8 265
rt300@8 266 void submitPressed(){
rt300@8 267
rt300@8 268 // depending on mode go to next control
rt300@8 269 // if(testController->getCurrentPanelType() == SEQUENTIAL){
rt300@8 270 // submitSingleControl();
rt300@8 271 // return;
rt300@8 272 // }
rt300@8 273 // otherwise do this other - or call
rt300@8 274
rt300@8 275 okToGetLeapMidi = false;
rt300@8 276
rt300@8 277 TimerMillisec timeTaken = timeController.stopStopwatch();
rt300@8 278 vector<int> answer = candidateSynth.getAllParamValues();
rt300@8 279
rt300@8 280 eventLogger.logEvent(SUBMIT_PRESSED, answer); //, answer, scoreRunningTotal, time taken (why not?));
rt300@8 281
rt300@8 282 TestResult result = testController->submitAnswer(answer, timeTaken); // TODO returns all the results
rt300@8 283
rt300@8 284 vector<int> logResult;
rt300@8 285 logResult.push_back(result.realDistanceToTarget*1000); // measured in milliCC !??!
rt300@8 286 logResult.push_back(result.timeTaken); // milliseconds
rt300@8 287 logResult.push_back(result.score);
rt300@8 288 logResult.push_back(result.targetBandHit);
rt300@8 289 logResult.push_back(result.timeWindowHit);
rt300@8 290
rt300@8 291 eventLogger.logEvent(DISTANCE_TIME_SCORE, logResult);
rt300@8 292
rt300@8 293
rt300@8 294 // gui stuff - different controller?
rt300@8 295 panel->setActive(false);
rt300@8 296 panel->showHint(true); // add some encouraging feedback to hint
rt300@8 297 bottomPanel->hide();
rt300@8 298
rt300@8 299 showScoreForTest(result);
rt300@8 300
rt300@8 301 stopAlternatingPlayback();
rt300@8 302
rt300@8 303 // was it the final sumbit?
rt300@8 304 if(testController->isLastTest()){
rt300@8 305 // thats it - show a final score screen etc
rt300@8 306 timeController.scheduleEvent(boost::bind(&SearchMessageOrganiser::testsFinished, this), 500);
rt300@8 307 return;
rt300@8 308 }else{
rt300@8 309 timeController.scheduleEvent(boost::bind(&SearchMessageOrganiser::delayedShowNewTest, this), 300);
rt300@8 310 }
rt300@8 311
rt300@8 312
rt300@8 313 };
rt300@8 314
rt300@8 315 void showScoreForTest(TestResult result){
rt300@8 316 scorePanel->setText(result.displayText);
rt300@8 317 scorePanel->show();
rt300@8 318
rt300@8 319 ofColor c;
rt300@8 320 if(result.targetBandHit == 1){
rt300@8 321 // yellow red blue
rt300@8 322 c = ofColor(255,255,0,255);
rt300@8 323 }else if(result.targetBandHit == 2){
rt300@8 324 c = ofColor(255,0,0,255);
rt300@8 325 }else if(result.targetBandHit == 3){
rt300@8 326 c = ofColor(45,45,255,255);
rt300@8 327 }else if(result.targetBandHit == 4){
rt300@8 328 c = ofColor(0,255,0,255);
rt300@8 329 }else{
rt300@8 330 c = ofColor(150,235,200,255);
rt300@8 331 }
rt300@8 332 scorePanel->setColor(c);
rt300@8 333 panel->setHintColor(c);
rt300@8 334 };
rt300@8 335
rt300@8 336 public:
rt300@8 337 void init( PDSynthWrapper& cs, PDSynthWrapper& ts){
rt300@8 338
rt300@8 339 testController = new TestController;
rt300@8 340
rt300@8 341 MessageOrganiser::init(cs,ts);
rt300@8 342
rt300@8 343 currentSoundPlayTimer = -1;
rt300@8 344 okToGetLeapMidi = false;
rt300@8 345
rt300@8 346 alternationSpeed = 200;
rt300@8 347
rt300@8 348 candidateSynth.setNoteLength(alternationSpeed);
rt300@8 349 targetSynth.setNoteLength(alternationSpeed);
rt300@8 350
rt300@8 351 playingAlternating = false;
rt300@8 352
rt300@8 353
rt300@8 354 verdBig.loadFont("verdana.ttf", 18, true, true);
rt300@8 355 verdBig.setLineHeight(18.0f);
rt300@8 356 verdBig.setLetterSpacing(1.037);
rt300@8 357 };
rt300@8 358
rt300@8 359 //------------------------------------------------------------------------
rt300@8 360 void drawScore(){
rt300@8 361 ofColor txtCol = ofColor(150,235,200,255);
rt300@8 362
rt300@8 363 int score = getScore();
rt300@8 364 stringstream msg;
rt300@8 365
rt300@8 366 msg << "Test: " << testController->getCurrentTestLetter();
rt300@8 367 ofSetColor(txtCol);
rt300@8 368 verdBig.drawString(msg.str(), 40, 140);
rt300@8 369 msg.str(std::string());
rt300@8 370
rt300@8 371 msg << "Score: " << score;
rt300@8 372 verdBig.drawString(msg.str(), 240, 140);
rt300@8 373 msg.str(std::string());
rt300@8 374
rt300@8 375 pair<int,int> time;
rt300@8 376 time = getTime();
rt300@8 377 msg << "Time taken: " << time.first << ":" << time.second << endl;
rt300@8 378 verdBig.drawString(msg.str(), 600, 140);
rt300@8 379
rt300@8 380 }
rt300@8 381
rt300@8 382 void setNewTestButton(Buttron * ntb){
rt300@8 383 newTestButton = ntb;
rt300@8 384 };
rt300@8 385 void set3Dbox(Leap3DBoxGL* box){
rt300@8 386 box3D = box;
rt300@8 387 };
rt300@8 388 void setBottomPanel(ButtonPanel * ntb){
rt300@8 389 bottomPanel = ntb;
rt300@8 390 };
rt300@8 391 void setControlPanel(SliderPanel* p){
rt300@8 392 panel = p;
rt300@8 393
rt300@8 394 };
rt300@8 395 void setCountdownPanel(CountdownText* cd){
rt300@8 396 countdownPanel = cd;
rt300@8 397 };
rt300@8 398 void setTargetSymbol(TargetSymbol* ts){
rt300@8 399 targetSymbol = ts;
rt300@8 400 };
rt300@8 401 void setScorePanel(TextPanel* tp){
rt300@8 402 scorePanel = tp;
rt300@8 403 };
rt300@8 404 void setFinishPanel(TextPanel* fp){
rt300@8 405 finishPanel = fp;
rt300@8 406 }
rt300@8 407 void setTargetButton(Buttron* tb){
rt300@8 408 targetPlayButton = tb;
rt300@8 409 }
rt300@8 410 int getScore(){
rt300@8 411 return testController->getScoreRunningTotal();
rt300@8 412 };
rt300@8 413
rt300@8 414 pair<int,int> getTime(){
rt300@8 415 TimerMillisec tms = timeController.getStopwatchElapsedTime();
rt300@8 416 int s = int(tms/1000);
rt300@8 417 int hs = int((tms%1000)/10);
rt300@8 418 pair<int,int> p(s,hs);
rt300@8 419 return p;
rt300@8 420 };
rt300@8 421 void countdownToNewTest(){
rt300@8 422
rt300@8 423 panel->hide();
rt300@8 424 panel->setActive(false);
rt300@8 425 scorePanel->hide();
rt300@8 426 bottomPanel->hide();
rt300@8 427 newTestButton->hide();
rt300@8 428
rt300@8 429 // set up stuff
rt300@8 430 setupNewTest();
rt300@8 431 eventLogger.logEvent(COUNTDOWN_INITIATED);
rt300@8 432
rt300@8 433 countdownPanel->showAndStart(3);
rt300@8 434
rt300@8 435 timeController.scheduleEvent(boost::bind(&SearchMessageOrganiser::startNewTest, this), 3000);
rt300@8 436
rt300@8 437 };
rt300@8 438
rt300@8 439 void playTargetButtonPressed(){
rt300@8 440
rt300@8 441 static int numPlays = 3;
rt300@8 442
rt300@8 443 Test* t = testController->getCurrentTestPtr();
rt300@8 444 if (!t->checkTargetPlaysRemaining()){
rt300@8 445 cout << t->getTargetPlaysLeft() << endl;
rt300@8 446
rt300@8 447 sendSynthValuesAgain();
rt300@8 448 targetSynth.trigger();
rt300@8 449 eventLogger.logEvent(TARGET_PLAYED);
rt300@8 450 targetPlayButton->hide();
rt300@8 451 return;
rt300@8 452
rt300@8 453 }
rt300@8 454 cout << t->getTargetPlaysLeft() << endl;
rt300@8 455
rt300@8 456 sendSynthValuesAgain();
rt300@8 457 targetSynth.trigger();
rt300@8 458 eventLogger.logEvent(TARGET_PLAYED);
rt300@8 459
rt300@8 460 return;
rt300@8 461 }
rt300@8 462 void playCandidateButtonPressed(){
rt300@8 463 //
rt300@8 464 }
rt300@8 465 void buttonPressCallback(int mappingID, int value){
rt300@8 466 if(mappingID == VOLUME_CHANGE_ID){
rt300@8 467 targetSynth.sendVolume(value);
rt300@8 468 candidateSynth.sendVolume(value);
rt300@8 469
rt300@8 470 }
rt300@8 471 if(mappingID == SPEED_CHANGE_ID){
rt300@8 472 alternationSpeed = 2*(140 - value);
rt300@8 473 vector<int> eData;
rt300@8 474 eData.push_back(alternationSpeed);
rt300@8 475 eventLogger.logEvent(SPEED_CHANGED, eData);
rt300@8 476 }
rt300@8 477 if(mappingID == NEW_TEST_ID){
rt300@8 478 countdownToNewTest();
rt300@8 479 return;
rt300@8 480 }
rt300@8 481 if (mappingID == START_ALTERNATE_ID){
rt300@8 482 if(!playingAlternating){
rt300@8 483 startAlternatingPlayback();
rt300@8 484
rt300@8 485 }else{
rt300@8 486 stopAlternatingPlayback();
rt300@8 487 }
rt300@8 488 return;
rt300@8 489 }
rt300@8 490
rt300@8 491 if (mappingID == RANDOMISE_TARGET_ID){ // bleyeueurrrr
rt300@8 492 targetSynth.randomiseParams();
rt300@8 493 return;
rt300@8 494 }
rt300@8 495 if (mappingID == TRIGGER_TARGET_ID){
rt300@8 496 playTargetButtonPressed();
rt300@8 497
rt300@8 498 }
rt300@8 499 if (mappingID == TRIGGER_CANDIDATE_ID){
rt300@8 500 // log event
rt300@8 501 sendSynthValuesAgain();
rt300@8 502 candidateSynth.trigger();
rt300@8 503 eventLogger.logEvent(CANDIDATE_PLAYED);
rt300@8 504 // flash panel?
rt300@8 505 panel->flash();
rt300@8 506 return;
rt300@8 507 }
rt300@8 508 if (mappingID == SUBMIT_CANDIDATE){
rt300@8 509 // log event
rt300@8 510 submitPressed();
rt300@8 511
rt300@8 512 return;
rt300@8 513 }
rt300@8 514 if (mappingID == CRAP_TEST_ID){
rt300@8 515 // this is rubbish! send a log of target values, and mapping ids
rt300@8 516 vector<int> data;
rt300@8 517 vector<int> tvals = targetSynth.getAllParamValues();
rt300@8 518 vector<int> pidx = testController->getCurrentChangeableParams();
rt300@8 519 data.insert(data.end(), tvals.begin(), tvals.end());
rt300@8 520 data.insert(data.end(), pidx.begin(), pidx.end());
rt300@8 521
rt300@8 522 eventLogger.logEvent(CRAP_TEST, data);
rt300@8 523 }
rt300@8 524 if(mappingID == SHOW_HIDE_PANEL){
rt300@8 525 static bool showing;
rt300@8 526
rt300@8 527 if(showing){
rt300@8 528 cout << " showing"<<endl;
rt300@8 529
rt300@8 530 panel->show();
rt300@8 531
rt300@8 532 }else{
rt300@8 533 cout << " hiding"<<endl;
rt300@8 534 panel->hide();
rt300@8 535 }
rt300@8 536 showing = !showing;
rt300@8 537 }
rt300@8 538 if(mappingID == SHOW_HIDE_HINT){
rt300@8 539 static bool showingHint;
rt300@8 540 if(showingHint){
rt300@8 541 panel->showHint(false);
rt300@8 542 showingHint = false;
rt300@8 543 }else{
rt300@8 544 panel->showHint(true);
rt300@8 545 showingHint = true;
rt300@8 546 }
rt300@8 547 }
rt300@8 548 if(mappingID == SAVE_PRESET_HIT){
rt300@8 549 expPresetManager.savePreset("blah", candidateSynth.getAllParamValues());
rt300@8 550
rt300@8 551 }
rt300@8 552 if(mappingID == RECALL_PRESET_HIT){
rt300@8 553
rt300@8 554 loadPreset("blah");
rt300@8 555 //candidateSynth.startMetronome();
rt300@8 556
rt300@8 557 }
rt300@8 558 }
rt300@8 559 //TODO move this
rt300@8 560 void loadPreset(string pname){
rt300@8 561
rt300@8 562 vector<int> values = expPresetManager.recallPreset(pname);
rt300@8 563 if (values.size()){
rt300@8 564 candidateSynth.setAllParams(values);
rt300@8 565 setAllSlidersToValues(values);
rt300@8 566 }else{
rt300@8 567 cout << "ERROR, no preset found" << endl;
rt300@8 568 }
rt300@8 569 }
rt300@8 570 // called from UI
rt300@8 571 // OVERLOADED
rt300@8 572 void paramChangeCallback(int mappingID, int value){
rt300@8 573 candidateSynth.paramChangeCallback(mappingID, value);
rt300@8 574 vector<int> evtData;
rt300@8 575 evtData.push_back(mappingID); // or just index?
rt300@8 576 evtData.push_back(value);
rt300@8 577
rt300@8 578 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
rt300@8 579 };
rt300@8 580
rt300@8 581
rt300@8 582 void midiFromLeap(int ctl_num, int ctl_val){
rt300@8 583
rt300@8 584 if (!okToGetLeapMidi){
rt300@8 585 return;
rt300@8 586 }
rt300@8 587
rt300@8 588 Test *theTest = testController->getCurrentTestPtr();
rt300@8 589 if (theTest == NULL) return;
rt300@8 590
rt300@8 591 vector<int> ci = theTest->getChangeableIndices();
rt300@8 592 vector<int> mids = candidateSynth.getMappingIDForIndices(ci);
rt300@8 593 if (ctl_num >= mids.size() || ctl_num < 0) return;
rt300@8 594
rt300@8 595 candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val);
rt300@8 596
rt300@8 597 setUIToParam(ctl_num, ctl_val);
rt300@8 598
rt300@8 599 vector<int> evtData;
rt300@8 600 evtData.push_back(mids[ctl_num]); // or just index?
rt300@8 601 evtData.push_back(ctl_val);
rt300@8 602
rt300@8 603 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
rt300@8 604
rt300@8 605 }
rt300@8 606
rt300@8 607
rt300@8 608 ofTrueTypeFont verdBig;
rt300@8 609
rt300@8 610 };
rt300@8 611
rt300@8 612 #endif /* defined(__riftathon__SearchMessageOrganiser__) */