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__) */
|