Words
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed
main.cpp
- Committer:
- apaks180
- Date:
- 2017-03-02
- Revision:
- 0:0072ee664a9b
- Child:
- 1:3cf69c15ada7
File content as of revision 0:0072ee664a9b:
#include "mbed.h" #include "Timer.h" #include "uLCD_4DGL.h" #include "Speaker.h" #include "PinDetect.h" #include <iostream> #include <sstream> #include <string> #include "SDFileSystem.h" using namespace std; uLCD_4DGL uLCD(p28, p27, p29); // serial tx, serial rx, reset pin; Timer t; SDFileSystem sd(p5, p6, p7, p8, "sd"); DigitalIn rightButton(p16); DigitalIn leftButton(p17); DigitalIn reset(p18); Speaker mySpeaker(p21); unsigned int m_z=800,m_w=12345; //random number generator shamelessly stolen from https://developer.mbed.org/questions/2886/Why-is-the-rand-function-not-the-least-b/ unsigned int rnd() { m_z = 36969 * (m_z & 65535) + (m_z >>16); m_w = 18000 * (m_w & 65535) + (m_w >>16); return ((m_z <<16) + m_w); } int generateSquare(int box[], int side) { int loc = abs(((int)rnd()))%18; while(box[loc]==1) { loc = abs((int)rnd())%18; } int col = loc%3; int row = (loc-col)/3; int y1 = (row*20); int x1 = (col*20); if(side==1) { x1 = x1 + 68; } int x2 = x1 + 19; int y2 = y1 + 19; int options[7] = {0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF00FF, 0xFFFF00, 0x00FFFF}; int color = options[abs((int)rnd())%7]; uLCD.filled_rectangle(x1, y1, x2, y2, color); return loc; } int generateTriangle(int box[], int side) { int loc = abs(((int)rnd()))%18; while(box[loc]==1) { loc = abs((int)rnd())%18; } int col = loc%3; int row = (loc-col)/3; int y1 = (row*20)+1; int x1 = (col*20); if(side==1) { x1 = x1 + 68; } int x2 = x1 + 19; int y2 = y1; int y3 = y1 + 19; int x3 = x1 + 10; int options[7] = {0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF00FF, 0xFFFF00, 0x00FFFF}; int color = options[abs((int)rnd())%7]; uLCD.triangle(x1, y1, x2, y2, x3, y3, color); return loc; } int generateCircle(int box[], int side) { int loc = abs(((int)rnd()))%18; while(box[loc]==1) { loc = abs((int)rnd())%18; } int col = loc%3; int row = (loc-col)/3; int y = (row*20)+10; int x = (col*20)+10; if(side==1) { x = x + 68; } int options[7] = {0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF00FF, 0xFFFF00, 0x00FFFF}; int color = options[abs((int)rnd())%7]; int size = (abs((int)rnd())%4)+5; uLCD.filled_circle(x, y, size, color); return loc; } string logData(int nT, int nC, int time, bool correct, FILE *fp) { std::ostringstream s; s << "Trial Number: " << nT << endl; if(correct) { s << "Lemur was correct" << endl; } else { s << "Lemur was incorrect\n"; } s << "Fraction correct so far: " << nC << "/" << nT << endl; s << "Time elapsed during last trial, in ms: " << time << endl; fprintf(fp, s.str().c_str()); return s.str(); } int main() { uLCD.display_control(PORTRAIT); uLCD.cls(); uLCD.printf("Hello Friendly Lemur!"); mySpeaker.PlayNote(660,.1,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(660,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(660,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(510,.1,0.1); mySpeaker.PlayNote(0,.1,0.1); mySpeaker.PlayNote(660,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(770,.1,0.1); mySpeaker.PlayNote(0,.55,0.1); mySpeaker.PlayNote(380,.1,0.1); mySpeaker.PlayNote(0,.575,0.1); mySpeaker.PlayNote(510,.1,0.1); mySpeaker.PlayNote(0,.45,0.1); mySpeaker.PlayNote(380,.1,0.1); mySpeaker.PlayNote(0,.4,0.1); mySpeaker.PlayNote(320,.1,0.1); mySpeaker.PlayNote(0,.5,0.1); mySpeaker.PlayNote(440,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(480,.08,0.1); mySpeaker.PlayNote(0,.33,0.1); mySpeaker.PlayNote(450,.1,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(430,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(380,.1,0.1); mySpeaker.PlayNote(0,.2,0.1); mySpeaker.PlayNote(660,.08,0.1); mySpeaker.PlayNote(0,.2,0.1); mySpeaker.PlayNote(760,.05,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(860,.1,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(700,.08,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(760,.05,0.1); mySpeaker.PlayNote(0,.35,0.1); mySpeaker.PlayNote(660,.08,0.1); mySpeaker.PlayNote(0,.3,0.1); mySpeaker.PlayNote(520,.08,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(580,.08,0.1); mySpeaker.PlayNote(0,.15,0.1); mySpeaker.PlayNote(480,.08,0.1); mkdir("/sd/mydir", 0777); FILE *fp = fopen("/sd/mydir/LemurResults.txt", "w"); leftButton.mode(PullUp); rightButton.mode(PullUp); reset.mode(PullUp); bool runTests = true; bool getoutoutside = false; bool getoutinside= false; bool isCorrect = false; int numCorrect = 0; int numTrials = 0; uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display wait(2); //Set up initial conditions uLCD.background_color(BLACK); uLCD.cls(); //draw borders while(runTests) { numTrials++; uLCD.rectangle(0, 0, 59, 120, WHITE); uLCD.rectangle(68, 0, 127, 120, WHITE); int boxL[18] = {}; int boxR[18] = {}; //15 is max number of circles int leftNum=(abs((int)rnd())%14)+1; int rightNum=(abs((int)rnd())%14)+1; while((leftNum==rightNum)||(leftNum==rightNum-1)||(leftNum==rightNum+1)||(leftNum==rightNum-2)||(leftNum==rightNum+2)) { rightNum=(abs((int)rnd())%14)+1; } bool answer = false; //false=left side greater if(leftNum<rightNum) { answer = 1; //true= right side greater } for(int i = 0; i<leftNum; i++) { int choose = abs((int)rnd())%3; int newSpot = -1; if(choose==1) newSpot = generateSquare(boxL, 0); else if(choose==2) newSpot = generateTriangle(boxL, 0); else newSpot = generateCircle(boxL, 0); boxL[newSpot] = 1; } for(int i = 0; i<rightNum; i++) { int choose = abs((int)rnd())%3; int newSpot = -1; if(choose==1) newSpot = generateSquare(boxR, 1); else if(choose==2) newSpot = generateTriangle(boxR, 1); else newSpot = generateCircle(boxR, 1); boxR[newSpot] = 1; } while(!getoutinside) { t.start(); if(!leftButton) { getoutinside=true; if(!answer) { numCorrect++; isCorrect = true; } t.stop(); } if(!rightButton) { getoutinside=true; if(answer) { numCorrect++; isCorrect = true; } t.stop(); } } int time = t.read_ms(); t.reset(); getoutinside=false; wait(.25); uLCD.cls(); string str = logData(numTrials, numCorrect, time, isCorrect, fp); uLCD.printf(str.c_str()); while(!getoutoutside) { if(!reset) { getoutoutside=true; runTests = false; } if((!leftButton)||(!rightButton)) { getoutoutside=true; } } isCorrect = false; getoutoutside = false; uLCD.cls(); } uLCD.printf("Goodbye, thanks for testing!"); wait(4); uLCD.cls(); fclose(fp); }//end main