Mbed_Text_Reader using an SDcard reader, 12-key touch pad and uLCD.
Dependencies: FATFileSystem mbed-rtos mbed
main.cpp
- Committer:
- ndureja3
- Date:
- 2014-03-24
- Revision:
- 1:806d2fa3e155
- Parent:
- 0:6bd0fe190ecc
File content as of revision 1:806d2fa3e155:
#include <mbed.h> #include <string> #include <list> #include <vector> #include <mpr121.h> // Touchpad #include "SDFileSystem.h" // SD Card #include "uLCD_4DGL.h" // uLCD // Global Variables int wpm; // Words Per Minute int wpmChange; int play; // 1 -> Play || 0-> Pause int pause; // Slight pause int reset; // Reset Flag int menuX; // Menu cursor int menuY; int numFiles; // Number of files in dir int fileChoose; // File choose flag // Setup the Serial to the PC for debugging Serial pc(USBTX, USBRX); // ********** LCD ********** uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object // ********** Touchpad ********** // Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); // Setup the i2c bus on pins 9 and 10 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); void fallInterrupt() { double value = mpr121.read(0x00); value +=mpr121.read(0x01)<<8; if(value!=0) { int val = log(value)/log(2.0); // uLCD.printf("%i\n",val); switch(val) { case 0: // Repeat reset = 1; break; case 2: // Decrease speed if(wpm>100) { wpm -=100; wpmChange = 1; } break; case 5: // Down if(menuY<numFiles+1) menuY++; break; case 6: // Play/Pause play = (play==0) ? 1 :0; break; case 7: // Up if(menuY>2) menuY--; break; case 8: // Enter fileChoose = 1; break; case 10: // Increase Speed if(wpm<500) { wpm +=100; wpmChange = 1; } break; default: break; } } } // ********** SD Card ********** SDFileSystem sd(p5, p6, p7, p8, "sd"); //read all directory and file names in current directory into filename vector vector<string> filenames; void read_file_names(char *dir) { DIR *dp; struct dirent *dirp; dp = opendir(dir); while((dirp = readdir(dp)) != NULL) { filenames.push_back(string(dirp->d_name)); } closedir(dp); } // Function to print the words per minute on uLCD void printWPM() { uLCD.text_width(1); uLCD.text_height(2); uLCD.locate(0,7); uLCD.color(WHITE); uLCD.printf("%i wpm",wpm); } int main() { // Initializations wpm = 300; play = 1; wpmChange = 0; reset = 0; pause = 0; menuX = 15; menuY = 2; numFiles = 0; fileChoose = 0; // Check for input from the touchpad interrupt.mode(PullUp); interrupt.fall(&fallInterrupt); // Debug in console pc.printf("\nHello World\n\r"); read_file_names("/sd/mydir"); uLCD.color(WHITE); uLCD.printf("/sd/mydir\n\n"); uLCD.color(GREEN); // Display file names in the menu for(vector<string>::iterator it=filenames.begin(); it < filenames.end(); it++) { uLCD.printf(" - %s\n\r",(*it).c_str()); numFiles++; } // Choose the file to read while(fileChoose == 0) { uLCD.filled_rectangle(107,0,128,128,BLACK); interrupt.fall(&fallInterrupt); uLCD.locate(menuX,menuY); uLCD.color(BLUE); uLCD.printf("<--"); } char fn[30] = ""; int num = 0; for(vector<string>::iterator it=filenames.begin(); it < filenames.end(); it++) { if(num==(menuY-2)) strcpy(fn,(*it).c_str()); num++; } uLCD.cls(); pc.printf("%s",fn); uLCD.text_width(3); uLCD.text_height(3); uLCD.locate(0,1); uLCD.color(WHITE); uLCD.printf("%s",fn); wait(2); /* // Write to file if needed pc.printf("Start writing\n\r"); mkdir("/sd/mydir", 0777); FILE *fp = fopen("/sd/mydir/sdtest", "w"); if(fp == NULL) { error("Could not open file for write\n"); } fprintf(fp, "This is a demo for our project uLCD Text Reader. You can read at speeds between 100 words per minute to 500 words per minute. "); fprintf(fp, "You can use the MPR121 12-key touch pad to play, pause and reset the text stream. The mbed reads the text file from the microSD card. "); fprintf(fp, "Give it a try: "); fprintf(fp, "3! 2! 1! Go Jackets! "); fprintf(fp, "I'm a Ramblin' Wreck from Georgia Tech, and a hell of an engineer. "); fprintf(fp, "A helluva, helluva, Helluva, helluva, hell of an engineer. "); fprintf(fp, "Like all the jolly good fellows, I drink my whiskey clear. "); fprintf(fp, "I'm a Ramblin' Wreck from Georgia Tech and a hell of an engineer. "); fprintf(fp, "Oh! If I had a daughter, sir, I'd dress her in White and Gold, "); fprintf(fp, "And put her on the campus to cheer the brave and bold. "); fprintf(fp, "But if I had a son, sir, I'll tell you what he'd do— "); fprintf(fp, "He would yell, 'To hell with Georgia!' like his daddy used to do. "); fprintf(fp, "Oh, I wish I had a barrel of rum and sugar three thousand pounds, "); fprintf(fp, "A college bell to put it in and a clapper to stir it round. "); fprintf(fp, "I'd drink to all the good fellows who come from far and near. "); fprintf(fp, "I'm a ramblin', gamblin', hell of an engineer! "); fclose(fp); */ // Open the selected file in read mode char path[] = "/sd/mydir/"; strcat(path,fn); pc.printf("Start reading\n\r %s",path); FILE *fp1 = fopen(path, "r"); if(fp1 == NULL) { error("Could not open file for read\n"); } // Setup the display on uLCD uLCD.cls(); uLCD.line(0, 82, 127, 82, WHITE); uLCD.line(0, 58, 127, 58, WHITE); uLCD.line(62, 54, 62, 62, RED); uLCD.line(63, 54, 63, 62, RED); uLCD.line(62, 80, 62, 88, RED); uLCD.line(63, 80, 63, 88, RED); printWPM(); char oneword[9]; // The current temp word buffer char disp[9]; // The current word int len; // length of the current word while(1) { // Read till the end of the file while(!feof(fp1)) { // Reser Mode if(reset == 1) { fclose(fp1); char path[] = "/sd/mydir/"; strcat(path,fn); FILE *fp1 = fopen(path, "r"); if(fp1 == NULL) { pc.printf("Start reading\n\r %s",path); error("Could not open file for read\n"); } reset = 0; uLCD.text_width(3); uLCD.text_height(3); uLCD.locate(2,0); uLCD.color(RED); uLCD.printf("<<"); wait(0.5); uLCD.filled_rectangle(0,0,128,40,BLACK); } // Pause while(play == 0) { uLCD.text_width(3); uLCD.text_height(3); uLCD.locate(2,0); uLCD.color(RED); uLCD.printf("||"); interrupt.fall(&fallInterrupt); printWPM(); if(reset == 1) { fclose(fp1); char path[] = "/sd/mydir/"; strcat(path,fn); FILE *fp1 = fopen(path, "r"); if(fp1 == NULL) { pc.printf("Start reading\n\r %s",path); error("321Could not open file for read\n"); } reset = 0; play = 1; uLCD.text_width(3); uLCD.text_height(3); uLCD.locate(2,0); uLCD.color(RED); uLCD.printf("<<"); wait(0.5); uLCD.filled_rectangle(0,0,128,40,BLACK); } if(play==1) { uLCD.text_width(3); uLCD.text_height(3); uLCD.locate(2,0); uLCD.color(RED); uLCD.printf("> "); wait(0.5); uLCD.filled_rectangle(0,0,128,40,BLACK); } } // Change in words per minute if(wpmChange == 1) { printWPM(); wpmChange = 0; } uLCD.text_width(2); uLCD.text_height(2); uLCD.color(WHITE); uLCD.locate(0,4); // Diplay the current word fscanf(fp1, "%s",oneword); len = strlen(oneword); //pc.printf("%i",len); for(int i = 0; i< (9-len)/2 ; i++) { disp[i] = ' '; } for(int j = 0 , i = (9-len)/2 ; j< len ; i++) { if(oneword[j] == '.' || oneword[j] == '!' || oneword[j] == ',') { pause = 1; } disp[i] = oneword[j++]; } for(int i = (9-len)/2 + len ; i<9; i++) { disp[i] = ' '; } for(int i=0; i<9; i++) { if(i==4) uLCD.color(RED); else uLCD.color(WHITE); uLCD.printf("%c", disp[i]); } // Handle wait time for wpm speed and processing time // Offer slight pause in the sentence to enhance reading float temp = (pause ==1) ? (60.0/(wpm-(0.5*wpm))) : (60.0/wpm); wait(temp - 0.1); pause = 0; } fclose(fp1); interrupt.fall(&fallInterrupt); } }