Mbed_Text_Reader using an SDcard reader, 12-key touch pad and uLCD.
Dependencies: FATFileSystem mbed-rtos mbed
main.cpp@0:6bd0fe190ecc, 2014-03-24 (annotated)
- Committer:
- ndureja3
- Date:
- Mon Mar 24 06:45:02 2014 +0000
- Revision:
- 0:6bd0fe190ecc
24 Mar 2014
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ndureja3 | 0:6bd0fe190ecc | 1 | #include <mbed.h> |
ndureja3 | 0:6bd0fe190ecc | 2 | #include <string> |
ndureja3 | 0:6bd0fe190ecc | 3 | #include <list> |
ndureja3 | 0:6bd0fe190ecc | 4 | #include <vector> |
ndureja3 | 0:6bd0fe190ecc | 5 | |
ndureja3 | 0:6bd0fe190ecc | 6 | #include <mpr121.h> // Touchpad |
ndureja3 | 0:6bd0fe190ecc | 7 | #include "SDFileSystem.h" // SD Card |
ndureja3 | 0:6bd0fe190ecc | 8 | #include "uLCD_4DGL.h" // uLCD |
ndureja3 | 0:6bd0fe190ecc | 9 | |
ndureja3 | 0:6bd0fe190ecc | 10 | |
ndureja3 | 0:6bd0fe190ecc | 11 | // Global Variables |
ndureja3 | 0:6bd0fe190ecc | 12 | int wpm; // Words Per Minute |
ndureja3 | 0:6bd0fe190ecc | 13 | int wpmChange; |
ndureja3 | 0:6bd0fe190ecc | 14 | int play; // 1 -> Play || 0-> Pause |
ndureja3 | 0:6bd0fe190ecc | 15 | int pause; // Slight pause |
ndureja3 | 0:6bd0fe190ecc | 16 | int reset; // Reset Flag |
ndureja3 | 0:6bd0fe190ecc | 17 | int menuX; // Menu cursor |
ndureja3 | 0:6bd0fe190ecc | 18 | int menuY; |
ndureja3 | 0:6bd0fe190ecc | 19 | int numFiles; // Number of files in dir |
ndureja3 | 0:6bd0fe190ecc | 20 | int fileChoose; // File choose flag |
ndureja3 | 0:6bd0fe190ecc | 21 | |
ndureja3 | 0:6bd0fe190ecc | 22 | |
ndureja3 | 0:6bd0fe190ecc | 23 | |
ndureja3 | 0:6bd0fe190ecc | 24 | |
ndureja3 | 0:6bd0fe190ecc | 25 | // Setup the Serial to the PC for debugging |
ndureja3 | 0:6bd0fe190ecc | 26 | Serial pc(USBTX, USBRX); |
ndureja3 | 0:6bd0fe190ecc | 27 | |
ndureja3 | 0:6bd0fe190ecc | 28 | |
ndureja3 | 0:6bd0fe190ecc | 29 | // ********** LCD ********** |
ndureja3 | 0:6bd0fe190ecc | 30 | uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object |
ndureja3 | 0:6bd0fe190ecc | 31 | |
ndureja3 | 0:6bd0fe190ecc | 32 | |
ndureja3 | 0:6bd0fe190ecc | 33 | // ********** Touchpad ********** |
ndureja3 | 0:6bd0fe190ecc | 34 | |
ndureja3 | 0:6bd0fe190ecc | 35 | // Create the interrupt receiver object on pin 26 |
ndureja3 | 0:6bd0fe190ecc | 36 | InterruptIn interrupt(p26); |
ndureja3 | 0:6bd0fe190ecc | 37 | |
ndureja3 | 0:6bd0fe190ecc | 38 | // Setup the i2c bus on pins 9 and 10 |
ndureja3 | 0:6bd0fe190ecc | 39 | I2C i2c(p9, p10); |
ndureja3 | 0:6bd0fe190ecc | 40 | |
ndureja3 | 0:6bd0fe190ecc | 41 | // Setup the Mpr121: |
ndureja3 | 0:6bd0fe190ecc | 42 | // constructor(i2c object, i2c address of the mpr121) |
ndureja3 | 0:6bd0fe190ecc | 43 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
ndureja3 | 0:6bd0fe190ecc | 44 | |
ndureja3 | 0:6bd0fe190ecc | 45 | void fallInterrupt() |
ndureja3 | 0:6bd0fe190ecc | 46 | { |
ndureja3 | 0:6bd0fe190ecc | 47 | double value = mpr121.read(0x00); |
ndureja3 | 0:6bd0fe190ecc | 48 | value +=mpr121.read(0x01)<<8; |
ndureja3 | 0:6bd0fe190ecc | 49 | |
ndureja3 | 0:6bd0fe190ecc | 50 | if(value!=0) { |
ndureja3 | 0:6bd0fe190ecc | 51 | int val = log(value)/log(2.0); |
ndureja3 | 0:6bd0fe190ecc | 52 | // uLCD.printf("%i\n",val); |
ndureja3 | 0:6bd0fe190ecc | 53 | |
ndureja3 | 0:6bd0fe190ecc | 54 | switch(val) { |
ndureja3 | 0:6bd0fe190ecc | 55 | case 0: // Repeat |
ndureja3 | 0:6bd0fe190ecc | 56 | reset = 1; |
ndureja3 | 0:6bd0fe190ecc | 57 | break; |
ndureja3 | 0:6bd0fe190ecc | 58 | case 2: // Decrease speed |
ndureja3 | 0:6bd0fe190ecc | 59 | if(wpm>100) { |
ndureja3 | 0:6bd0fe190ecc | 60 | wpm -=100; |
ndureja3 | 0:6bd0fe190ecc | 61 | wpmChange = 1; |
ndureja3 | 0:6bd0fe190ecc | 62 | } |
ndureja3 | 0:6bd0fe190ecc | 63 | |
ndureja3 | 0:6bd0fe190ecc | 64 | break; |
ndureja3 | 0:6bd0fe190ecc | 65 | case 5: // Down |
ndureja3 | 0:6bd0fe190ecc | 66 | |
ndureja3 | 0:6bd0fe190ecc | 67 | if(menuY<numFiles+1) |
ndureja3 | 0:6bd0fe190ecc | 68 | menuY++; |
ndureja3 | 0:6bd0fe190ecc | 69 | break; |
ndureja3 | 0:6bd0fe190ecc | 70 | case 6: // Play/Pause |
ndureja3 | 0:6bd0fe190ecc | 71 | play = (play==0) ? 1 :0; |
ndureja3 | 0:6bd0fe190ecc | 72 | break; |
ndureja3 | 0:6bd0fe190ecc | 73 | case 7: // Up |
ndureja3 | 0:6bd0fe190ecc | 74 | |
ndureja3 | 0:6bd0fe190ecc | 75 | if(menuY>2) |
ndureja3 | 0:6bd0fe190ecc | 76 | menuY--; |
ndureja3 | 0:6bd0fe190ecc | 77 | break; |
ndureja3 | 0:6bd0fe190ecc | 78 | case 8: // Enter |
ndureja3 | 0:6bd0fe190ecc | 79 | fileChoose = 1; |
ndureja3 | 0:6bd0fe190ecc | 80 | break; |
ndureja3 | 0:6bd0fe190ecc | 81 | case 10: // Increase Speed |
ndureja3 | 0:6bd0fe190ecc | 82 | |
ndureja3 | 0:6bd0fe190ecc | 83 | if(wpm<500) { |
ndureja3 | 0:6bd0fe190ecc | 84 | wpm +=100; |
ndureja3 | 0:6bd0fe190ecc | 85 | wpmChange = 1; |
ndureja3 | 0:6bd0fe190ecc | 86 | } |
ndureja3 | 0:6bd0fe190ecc | 87 | |
ndureja3 | 0:6bd0fe190ecc | 88 | break; |
ndureja3 | 0:6bd0fe190ecc | 89 | |
ndureja3 | 0:6bd0fe190ecc | 90 | default: |
ndureja3 | 0:6bd0fe190ecc | 91 | break; |
ndureja3 | 0:6bd0fe190ecc | 92 | } |
ndureja3 | 0:6bd0fe190ecc | 93 | |
ndureja3 | 0:6bd0fe190ecc | 94 | |
ndureja3 | 0:6bd0fe190ecc | 95 | } |
ndureja3 | 0:6bd0fe190ecc | 96 | |
ndureja3 | 0:6bd0fe190ecc | 97 | } |
ndureja3 | 0:6bd0fe190ecc | 98 | |
ndureja3 | 0:6bd0fe190ecc | 99 | // ********** SD Card ********** |
ndureja3 | 0:6bd0fe190ecc | 100 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
ndureja3 | 0:6bd0fe190ecc | 101 | |
ndureja3 | 0:6bd0fe190ecc | 102 | //read all directory and file names in current directory into filename vector |
ndureja3 | 0:6bd0fe190ecc | 103 | vector<string> filenames; |
ndureja3 | 0:6bd0fe190ecc | 104 | void read_file_names(char *dir) |
ndureja3 | 0:6bd0fe190ecc | 105 | { |
ndureja3 | 0:6bd0fe190ecc | 106 | DIR *dp; |
ndureja3 | 0:6bd0fe190ecc | 107 | struct dirent *dirp; |
ndureja3 | 0:6bd0fe190ecc | 108 | dp = opendir(dir); |
ndureja3 | 0:6bd0fe190ecc | 109 | while((dirp = readdir(dp)) != NULL) { |
ndureja3 | 0:6bd0fe190ecc | 110 | filenames.push_back(string(dirp->d_name)); |
ndureja3 | 0:6bd0fe190ecc | 111 | } |
ndureja3 | 0:6bd0fe190ecc | 112 | closedir(dp); |
ndureja3 | 0:6bd0fe190ecc | 113 | } |
ndureja3 | 0:6bd0fe190ecc | 114 | |
ndureja3 | 0:6bd0fe190ecc | 115 | |
ndureja3 | 0:6bd0fe190ecc | 116 | // Function to print the words per minute on uLCD |
ndureja3 | 0:6bd0fe190ecc | 117 | void printWPM() |
ndureja3 | 0:6bd0fe190ecc | 118 | { |
ndureja3 | 0:6bd0fe190ecc | 119 | uLCD.text_width(1); |
ndureja3 | 0:6bd0fe190ecc | 120 | uLCD.text_height(2); |
ndureja3 | 0:6bd0fe190ecc | 121 | uLCD.locate(0,7); |
ndureja3 | 0:6bd0fe190ecc | 122 | uLCD.color(WHITE); |
ndureja3 | 0:6bd0fe190ecc | 123 | uLCD.printf("%i wpm",wpm); |
ndureja3 | 0:6bd0fe190ecc | 124 | } |
ndureja3 | 0:6bd0fe190ecc | 125 | |
ndureja3 | 0:6bd0fe190ecc | 126 | int main() |
ndureja3 | 0:6bd0fe190ecc | 127 | { |
ndureja3 | 0:6bd0fe190ecc | 128 | |
ndureja3 | 0:6bd0fe190ecc | 129 | // Initializations |
ndureja3 | 0:6bd0fe190ecc | 130 | wpm = 300; |
ndureja3 | 0:6bd0fe190ecc | 131 | play = 1; |
ndureja3 | 0:6bd0fe190ecc | 132 | wpmChange = 0; |
ndureja3 | 0:6bd0fe190ecc | 133 | reset = 0; |
ndureja3 | 0:6bd0fe190ecc | 134 | pause = 0; |
ndureja3 | 0:6bd0fe190ecc | 135 | menuX = 15; |
ndureja3 | 0:6bd0fe190ecc | 136 | menuY = 2; |
ndureja3 | 0:6bd0fe190ecc | 137 | numFiles = 0; |
ndureja3 | 0:6bd0fe190ecc | 138 | fileChoose = 0; |
ndureja3 | 0:6bd0fe190ecc | 139 | |
ndureja3 | 0:6bd0fe190ecc | 140 | // Check for input from the touchpad |
ndureja3 | 0:6bd0fe190ecc | 141 | interrupt.mode(PullUp); |
ndureja3 | 0:6bd0fe190ecc | 142 | interrupt.fall(&fallInterrupt); |
ndureja3 | 0:6bd0fe190ecc | 143 | |
ndureja3 | 0:6bd0fe190ecc | 144 | |
ndureja3 | 0:6bd0fe190ecc | 145 | // Debug in console |
ndureja3 | 0:6bd0fe190ecc | 146 | pc.printf("\nHello World\n\r"); |
ndureja3 | 0:6bd0fe190ecc | 147 | |
ndureja3 | 0:6bd0fe190ecc | 148 | read_file_names("/sd/mydir"); |
ndureja3 | 0:6bd0fe190ecc | 149 | uLCD.color(WHITE); |
ndureja3 | 0:6bd0fe190ecc | 150 | uLCD.printf("/sd/mydir\n\n"); |
ndureja3 | 0:6bd0fe190ecc | 151 | uLCD.color(GREEN); |
ndureja3 | 0:6bd0fe190ecc | 152 | |
ndureja3 | 0:6bd0fe190ecc | 153 | // Display file names in the menu |
ndureja3 | 0:6bd0fe190ecc | 154 | for(vector<string>::iterator it=filenames.begin(); it < filenames.end(); it++) { |
ndureja3 | 0:6bd0fe190ecc | 155 | uLCD.printf(" - %s\n\r",(*it).c_str()); |
ndureja3 | 0:6bd0fe190ecc | 156 | numFiles++; |
ndureja3 | 0:6bd0fe190ecc | 157 | } |
ndureja3 | 0:6bd0fe190ecc | 158 | |
ndureja3 | 0:6bd0fe190ecc | 159 | // Choose the file to read |
ndureja3 | 0:6bd0fe190ecc | 160 | while(fileChoose == 0) { |
ndureja3 | 0:6bd0fe190ecc | 161 | uLCD.filled_rectangle(107,0,128,128,BLACK); |
ndureja3 | 0:6bd0fe190ecc | 162 | interrupt.fall(&fallInterrupt); |
ndureja3 | 0:6bd0fe190ecc | 163 | uLCD.locate(menuX,menuY); |
ndureja3 | 0:6bd0fe190ecc | 164 | uLCD.color(BLUE); |
ndureja3 | 0:6bd0fe190ecc | 165 | uLCD.printf("<--"); |
ndureja3 | 0:6bd0fe190ecc | 166 | } |
ndureja3 | 0:6bd0fe190ecc | 167 | |
ndureja3 | 0:6bd0fe190ecc | 168 | char fn[30] = ""; |
ndureja3 | 0:6bd0fe190ecc | 169 | int num = 0; |
ndureja3 | 0:6bd0fe190ecc | 170 | for(vector<string>::iterator it=filenames.begin(); it < filenames.end(); it++) { |
ndureja3 | 0:6bd0fe190ecc | 171 | if(num==(menuY-2)) |
ndureja3 | 0:6bd0fe190ecc | 172 | strcpy(fn,(*it).c_str()); |
ndureja3 | 0:6bd0fe190ecc | 173 | num++; |
ndureja3 | 0:6bd0fe190ecc | 174 | } |
ndureja3 | 0:6bd0fe190ecc | 175 | |
ndureja3 | 0:6bd0fe190ecc | 176 | uLCD.cls(); |
ndureja3 | 0:6bd0fe190ecc | 177 | |
ndureja3 | 0:6bd0fe190ecc | 178 | |
ndureja3 | 0:6bd0fe190ecc | 179 | pc.printf("%s",fn); |
ndureja3 | 0:6bd0fe190ecc | 180 | |
ndureja3 | 0:6bd0fe190ecc | 181 | uLCD.text_width(3); |
ndureja3 | 0:6bd0fe190ecc | 182 | uLCD.text_height(3); |
ndureja3 | 0:6bd0fe190ecc | 183 | uLCD.locate(0,1); |
ndureja3 | 0:6bd0fe190ecc | 184 | uLCD.color(WHITE); |
ndureja3 | 0:6bd0fe190ecc | 185 | uLCD.printf("%s",fn); |
ndureja3 | 0:6bd0fe190ecc | 186 | wait(2); |
ndureja3 | 0:6bd0fe190ecc | 187 | |
ndureja3 | 0:6bd0fe190ecc | 188 | /* |
ndureja3 | 0:6bd0fe190ecc | 189 | |
ndureja3 | 0:6bd0fe190ecc | 190 | // Write to file if needed |
ndureja3 | 0:6bd0fe190ecc | 191 | pc.printf("Start writing\n\r"); |
ndureja3 | 0:6bd0fe190ecc | 192 | mkdir("/sd/mydir", 0777); |
ndureja3 | 0:6bd0fe190ecc | 193 | |
ndureja3 | 0:6bd0fe190ecc | 194 | |
ndureja3 | 0:6bd0fe190ecc | 195 | FILE *fp = fopen("/sd/mydir/sdtest", "w"); |
ndureja3 | 0:6bd0fe190ecc | 196 | if(fp == NULL) { |
ndureja3 | 0:6bd0fe190ecc | 197 | error("Could not open file for write\n"); |
ndureja3 | 0:6bd0fe190ecc | 198 | } |
ndureja3 | 0:6bd0fe190ecc | 199 | |
ndureja3 | 0:6bd0fe190ecc | 200 | 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. "); |
ndureja3 | 0:6bd0fe190ecc | 201 | 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. "); |
ndureja3 | 0:6bd0fe190ecc | 202 | fprintf(fp, "Give it a try: "); |
ndureja3 | 0:6bd0fe190ecc | 203 | fprintf(fp, "3! 2! 1! Go Jackets! "); |
ndureja3 | 0:6bd0fe190ecc | 204 | fprintf(fp, "I'm a Ramblin' Wreck from Georgia Tech, and a hell of an engineer. "); |
ndureja3 | 0:6bd0fe190ecc | 205 | fprintf(fp, "A helluva, helluva, Helluva, helluva, hell of an engineer. "); |
ndureja3 | 0:6bd0fe190ecc | 206 | fprintf(fp, "Like all the jolly good fellows, I drink my whiskey clear. "); |
ndureja3 | 0:6bd0fe190ecc | 207 | fprintf(fp, "I'm a Ramblin' Wreck from Georgia Tech and a hell of an engineer. "); |
ndureja3 | 0:6bd0fe190ecc | 208 | |
ndureja3 | 0:6bd0fe190ecc | 209 | fprintf(fp, "Oh! If I had a daughter, sir, I'd dress her in White and Gold, "); |
ndureja3 | 0:6bd0fe190ecc | 210 | fprintf(fp, "And put her on the campus to cheer the brave and bold. "); |
ndureja3 | 0:6bd0fe190ecc | 211 | fprintf(fp, "But if I had a son, sir, I'll tell you what he'd do— "); |
ndureja3 | 0:6bd0fe190ecc | 212 | fprintf(fp, "He would yell, 'To hell with Georgia!' like his daddy used to do. "); |
ndureja3 | 0:6bd0fe190ecc | 213 | |
ndureja3 | 0:6bd0fe190ecc | 214 | fprintf(fp, "Oh, I wish I had a barrel of rum and sugar three thousand pounds, "); |
ndureja3 | 0:6bd0fe190ecc | 215 | fprintf(fp, "A college bell to put it in and a clapper to stir it round. "); |
ndureja3 | 0:6bd0fe190ecc | 216 | fprintf(fp, "I'd drink to all the good fellows who come from far and near. "); |
ndureja3 | 0:6bd0fe190ecc | 217 | fprintf(fp, "I'm a ramblin', gamblin', hell of an engineer! "); |
ndureja3 | 0:6bd0fe190ecc | 218 | |
ndureja3 | 0:6bd0fe190ecc | 219 | |
ndureja3 | 0:6bd0fe190ecc | 220 | fclose(fp); |
ndureja3 | 0:6bd0fe190ecc | 221 | */ |
ndureja3 | 0:6bd0fe190ecc | 222 | |
ndureja3 | 0:6bd0fe190ecc | 223 | // Open the selected file in read mode |
ndureja3 | 0:6bd0fe190ecc | 224 | char path[] = "/sd/mydir/"; |
ndureja3 | 0:6bd0fe190ecc | 225 | strcat(path,fn); |
ndureja3 | 0:6bd0fe190ecc | 226 | pc.printf("Start reading\n\r %s",path); |
ndureja3 | 0:6bd0fe190ecc | 227 | |
ndureja3 | 0:6bd0fe190ecc | 228 | FILE *fp1 = fopen(path, "r"); |
ndureja3 | 0:6bd0fe190ecc | 229 | if(fp1 == NULL) { |
ndureja3 | 0:6bd0fe190ecc | 230 | error("Could not open file for read\n"); |
ndureja3 | 0:6bd0fe190ecc | 231 | } |
ndureja3 | 0:6bd0fe190ecc | 232 | |
ndureja3 | 0:6bd0fe190ecc | 233 | // Setup the display on uLCD |
ndureja3 | 0:6bd0fe190ecc | 234 | uLCD.cls(); |
ndureja3 | 0:6bd0fe190ecc | 235 | uLCD.line(0, 82, 127, 82, WHITE); |
ndureja3 | 0:6bd0fe190ecc | 236 | uLCD.line(0, 58, 127, 58, WHITE); |
ndureja3 | 0:6bd0fe190ecc | 237 | uLCD.line(62, 54, 62, 62, RED); |
ndureja3 | 0:6bd0fe190ecc | 238 | uLCD.line(63, 54, 63, 62, RED); |
ndureja3 | 0:6bd0fe190ecc | 239 | uLCD.line(62, 80, 62, 88, RED); |
ndureja3 | 0:6bd0fe190ecc | 240 | uLCD.line(63, 80, 63, 88, RED); |
ndureja3 | 0:6bd0fe190ecc | 241 | printWPM(); |
ndureja3 | 0:6bd0fe190ecc | 242 | |
ndureja3 | 0:6bd0fe190ecc | 243 | |
ndureja3 | 0:6bd0fe190ecc | 244 | char oneword[9]; // The current temp word buffer |
ndureja3 | 0:6bd0fe190ecc | 245 | char disp[9]; // The current word |
ndureja3 | 0:6bd0fe190ecc | 246 | int len; // length of the current word |
ndureja3 | 0:6bd0fe190ecc | 247 | |
ndureja3 | 0:6bd0fe190ecc | 248 | |
ndureja3 | 0:6bd0fe190ecc | 249 | while(1) { |
ndureja3 | 0:6bd0fe190ecc | 250 | |
ndureja3 | 0:6bd0fe190ecc | 251 | // Read till the end of the file |
ndureja3 | 0:6bd0fe190ecc | 252 | while(!feof(fp1)) { |
ndureja3 | 0:6bd0fe190ecc | 253 | |
ndureja3 | 0:6bd0fe190ecc | 254 | // Reser Mode |
ndureja3 | 0:6bd0fe190ecc | 255 | if(reset == 1) { |
ndureja3 | 0:6bd0fe190ecc | 256 | fclose(fp1); |
ndureja3 | 0:6bd0fe190ecc | 257 | char path[] = "/sd/mydir/"; |
ndureja3 | 0:6bd0fe190ecc | 258 | strcat(path,fn); |
ndureja3 | 0:6bd0fe190ecc | 259 | FILE *fp1 = fopen(path, "r"); |
ndureja3 | 0:6bd0fe190ecc | 260 | |
ndureja3 | 0:6bd0fe190ecc | 261 | if(fp1 == NULL) { |
ndureja3 | 0:6bd0fe190ecc | 262 | pc.printf("Start reading\n\r %s",path); |
ndureja3 | 0:6bd0fe190ecc | 263 | error("Could not open file for read\n"); |
ndureja3 | 0:6bd0fe190ecc | 264 | } |
ndureja3 | 0:6bd0fe190ecc | 265 | reset = 0; |
ndureja3 | 0:6bd0fe190ecc | 266 | uLCD.text_width(3); |
ndureja3 | 0:6bd0fe190ecc | 267 | uLCD.text_height(3); |
ndureja3 | 0:6bd0fe190ecc | 268 | uLCD.locate(2,0); |
ndureja3 | 0:6bd0fe190ecc | 269 | uLCD.color(RED); |
ndureja3 | 0:6bd0fe190ecc | 270 | uLCD.printf("<<"); |
ndureja3 | 0:6bd0fe190ecc | 271 | wait(0.5); |
ndureja3 | 0:6bd0fe190ecc | 272 | uLCD.filled_rectangle(0,0,128,40,BLACK); |
ndureja3 | 0:6bd0fe190ecc | 273 | } |
ndureja3 | 0:6bd0fe190ecc | 274 | |
ndureja3 | 0:6bd0fe190ecc | 275 | // Pause |
ndureja3 | 0:6bd0fe190ecc | 276 | while(play == 0) { |
ndureja3 | 0:6bd0fe190ecc | 277 | |
ndureja3 | 0:6bd0fe190ecc | 278 | uLCD.text_width(3); |
ndureja3 | 0:6bd0fe190ecc | 279 | uLCD.text_height(3); |
ndureja3 | 0:6bd0fe190ecc | 280 | uLCD.locate(2,0); |
ndureja3 | 0:6bd0fe190ecc | 281 | uLCD.color(RED); |
ndureja3 | 0:6bd0fe190ecc | 282 | uLCD.printf("||"); |
ndureja3 | 0:6bd0fe190ecc | 283 | interrupt.fall(&fallInterrupt); |
ndureja3 | 0:6bd0fe190ecc | 284 | printWPM(); |
ndureja3 | 0:6bd0fe190ecc | 285 | if(reset == 1) { |
ndureja3 | 0:6bd0fe190ecc | 286 | fclose(fp1); |
ndureja3 | 0:6bd0fe190ecc | 287 | char path[] = "/sd/mydir/"; |
ndureja3 | 0:6bd0fe190ecc | 288 | strcat(path,fn); |
ndureja3 | 0:6bd0fe190ecc | 289 | FILE *fp1 = fopen(path, "r"); |
ndureja3 | 0:6bd0fe190ecc | 290 | if(fp1 == NULL) { |
ndureja3 | 0:6bd0fe190ecc | 291 | pc.printf("Start reading\n\r %s",path); |
ndureja3 | 0:6bd0fe190ecc | 292 | error("321Could not open file for read\n"); |
ndureja3 | 0:6bd0fe190ecc | 293 | } |
ndureja3 | 0:6bd0fe190ecc | 294 | reset = 0; |
ndureja3 | 0:6bd0fe190ecc | 295 | play = 1; |
ndureja3 | 0:6bd0fe190ecc | 296 | uLCD.text_width(3); |
ndureja3 | 0:6bd0fe190ecc | 297 | uLCD.text_height(3); |
ndureja3 | 0:6bd0fe190ecc | 298 | uLCD.locate(2,0); |
ndureja3 | 0:6bd0fe190ecc | 299 | uLCD.color(RED); |
ndureja3 | 0:6bd0fe190ecc | 300 | uLCD.printf("<<"); |
ndureja3 | 0:6bd0fe190ecc | 301 | wait(0.5); |
ndureja3 | 0:6bd0fe190ecc | 302 | uLCD.filled_rectangle(0,0,128,40,BLACK); |
ndureja3 | 0:6bd0fe190ecc | 303 | |
ndureja3 | 0:6bd0fe190ecc | 304 | |
ndureja3 | 0:6bd0fe190ecc | 305 | } |
ndureja3 | 0:6bd0fe190ecc | 306 | if(play==1) { |
ndureja3 | 0:6bd0fe190ecc | 307 | uLCD.text_width(3); |
ndureja3 | 0:6bd0fe190ecc | 308 | uLCD.text_height(3); |
ndureja3 | 0:6bd0fe190ecc | 309 | uLCD.locate(2,0); |
ndureja3 | 0:6bd0fe190ecc | 310 | uLCD.color(RED); |
ndureja3 | 0:6bd0fe190ecc | 311 | uLCD.printf("> "); |
ndureja3 | 0:6bd0fe190ecc | 312 | wait(0.5); |
ndureja3 | 0:6bd0fe190ecc | 313 | uLCD.filled_rectangle(0,0,128,40,BLACK); |
ndureja3 | 0:6bd0fe190ecc | 314 | } |
ndureja3 | 0:6bd0fe190ecc | 315 | } |
ndureja3 | 0:6bd0fe190ecc | 316 | |
ndureja3 | 0:6bd0fe190ecc | 317 | // Change in words per minute |
ndureja3 | 0:6bd0fe190ecc | 318 | if(wpmChange == 1) { |
ndureja3 | 0:6bd0fe190ecc | 319 | printWPM(); |
ndureja3 | 0:6bd0fe190ecc | 320 | wpmChange = 0; |
ndureja3 | 0:6bd0fe190ecc | 321 | } |
ndureja3 | 0:6bd0fe190ecc | 322 | uLCD.text_width(2); |
ndureja3 | 0:6bd0fe190ecc | 323 | uLCD.text_height(2); |
ndureja3 | 0:6bd0fe190ecc | 324 | uLCD.color(WHITE); |
ndureja3 | 0:6bd0fe190ecc | 325 | uLCD.locate(0,4); |
ndureja3 | 0:6bd0fe190ecc | 326 | |
ndureja3 | 0:6bd0fe190ecc | 327 | // Diplay the current word |
ndureja3 | 0:6bd0fe190ecc | 328 | |
ndureja3 | 0:6bd0fe190ecc | 329 | fscanf(fp1, "%s",oneword); |
ndureja3 | 0:6bd0fe190ecc | 330 | len = strlen(oneword); |
ndureja3 | 0:6bd0fe190ecc | 331 | //pc.printf("%i",len); |
ndureja3 | 0:6bd0fe190ecc | 332 | |
ndureja3 | 0:6bd0fe190ecc | 333 | for(int i = 0; i< (9-len)/2 ; i++) { |
ndureja3 | 0:6bd0fe190ecc | 334 | disp[i] = ' '; |
ndureja3 | 0:6bd0fe190ecc | 335 | } |
ndureja3 | 0:6bd0fe190ecc | 336 | for(int j = 0 , i = (9-len)/2 ; j< len ; i++) { |
ndureja3 | 0:6bd0fe190ecc | 337 | if(oneword[j] == '.' || oneword[j] == '!' || oneword[j] == ',') { |
ndureja3 | 0:6bd0fe190ecc | 338 | pause = 1; |
ndureja3 | 0:6bd0fe190ecc | 339 | } |
ndureja3 | 0:6bd0fe190ecc | 340 | disp[i] = oneword[j++]; |
ndureja3 | 0:6bd0fe190ecc | 341 | } |
ndureja3 | 0:6bd0fe190ecc | 342 | |
ndureja3 | 0:6bd0fe190ecc | 343 | for(int i = (9-len)/2 + len ; i<9; i++) { |
ndureja3 | 0:6bd0fe190ecc | 344 | disp[i] = ' '; |
ndureja3 | 0:6bd0fe190ecc | 345 | } |
ndureja3 | 0:6bd0fe190ecc | 346 | |
ndureja3 | 0:6bd0fe190ecc | 347 | for(int i=0; i<9; i++) { |
ndureja3 | 0:6bd0fe190ecc | 348 | if(i==4) |
ndureja3 | 0:6bd0fe190ecc | 349 | uLCD.color(RED); |
ndureja3 | 0:6bd0fe190ecc | 350 | else |
ndureja3 | 0:6bd0fe190ecc | 351 | uLCD.color(WHITE); |
ndureja3 | 0:6bd0fe190ecc | 352 | uLCD.printf("%c", disp[i]); |
ndureja3 | 0:6bd0fe190ecc | 353 | } |
ndureja3 | 0:6bd0fe190ecc | 354 | |
ndureja3 | 0:6bd0fe190ecc | 355 | // Handle wait time for wpm speed and processing time |
ndureja3 | 0:6bd0fe190ecc | 356 | // Offer slight pause in the sentence to enhance reading |
ndureja3 | 0:6bd0fe190ecc | 357 | float temp = (pause ==1) ? (60.0/(wpm-(0.5*wpm))) : (60.0/wpm); |
ndureja3 | 0:6bd0fe190ecc | 358 | wait(temp - 0.1); |
ndureja3 | 0:6bd0fe190ecc | 359 | pause = 0; |
ndureja3 | 0:6bd0fe190ecc | 360 | |
ndureja3 | 0:6bd0fe190ecc | 361 | |
ndureja3 | 0:6bd0fe190ecc | 362 | |
ndureja3 | 0:6bd0fe190ecc | 363 | |
ndureja3 | 0:6bd0fe190ecc | 364 | } |
ndureja3 | 0:6bd0fe190ecc | 365 | fclose(fp1); |
ndureja3 | 0:6bd0fe190ecc | 366 | interrupt.fall(&fallInterrupt); |
ndureja3 | 0:6bd0fe190ecc | 367 | } |
ndureja3 | 0:6bd0fe190ecc | 368 | |
ndureja3 | 0:6bd0fe190ecc | 369 | |
ndureja3 | 0:6bd0fe190ecc | 370 | } |