working type letter with mode button

Dependencies:   SDFileSystem emic2 mbed-rtos mbed

Fork of BAT_Type_letter by BAT

Committer:
nnguyen45
Date:
Tue Dec 05 03:33:11 2017 +0000
Revision:
43:9fb92cb259fc
Parent:
42:bdb6f132a609
working type letter with mode button

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aismail1997 0:9eda4611081a 1 #include "mbed.h"
aismail1997 6:1aa86ad19af9 2 #include "rtos.h"
aismail1997 9:418a4437a693 3 #include "SDFileSystem.h"
aismail1997 10:21268d8bf979 4 #include "button.h"
aismail1997 19:ceac47be2e64 5 #include "buttonArray.h"
aismail1997 23:23970cf718ee 6 #include <string>
aismail1997 23:23970cf718ee 7 #include <iostream>
aismail1997 28:3c4ebc4fde0f 8 #include "emic2.h"
aismail1997 23:23970cf718ee 9
aismail1997 23:23970cf718ee 10 using namespace std;
aismail1997 3:9ed43e974156 11
aismail1997 13:b80dde24e9bc 12 // DEFINE I/O
aismail1997 0:9eda4611081a 13 PwmOut myservo(p21);
aismail1997 0:9eda4611081a 14 DigitalIn pb1 (p20);
aismail1997 14:581a3b02f4c3 15 PwmOut myservo2(p22);
aismail1997 14:581a3b02f4c3 16 DigitalIn pb2 (p19);
aismail1997 18:d14bf57f435b 17 PwmOut myservo3(p23);
aismail1997 18:d14bf57f435b 18 DigitalIn pb3 (p18);
aismail1997 18:d14bf57f435b 19 PwmOut myservo4(p24);
aismail1997 18:d14bf57f435b 20 DigitalIn pb4 (p17);
aismail1997 18:d14bf57f435b 21 PwmOut myservo5(p25);
aismail1997 18:d14bf57f435b 22 DigitalIn pb5 (p16);
aismail1997 18:d14bf57f435b 23 PwmOut myservo6(p26);
aismail1997 18:d14bf57f435b 24 DigitalIn pb6 (p15);
nnguyen45 43:9fb92cb259fc 25 DigitalIn read (p29);
aismail1997 18:d14bf57f435b 26
aismail1997 18:d14bf57f435b 27 //DigitalOut led1(LED1);
aismail1997 18:d14bf57f435b 28 //DigitalOut led3(LED3);
aismail1997 22:6931917c70cd 29 //DigitalOut led4(LED4);
aismail1997 14:581a3b02f4c3 30
nnguyen45 32:e87bb6e83072 31 //DigitalIn linpot(p9);
nnguyen45 33:3090ec93b4aa 32 Serial pc(USBTX, USBRX);
aismail1997 23:23970cf718ee 33 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
aismail1997 21:c5df903f068a 34 //button button1(myservo, pb1, linpot);
aismail1997 21:c5df903f068a 35 button button1(myservo, pb1, 1);
aismail1997 21:c5df903f068a 36 button button2(myservo2, pb2, 2);
aismail1997 21:c5df903f068a 37 button button3(myservo3, pb3, 3);
aismail1997 21:c5df903f068a 38 button button4(myservo4, pb4, 4);
aismail1997 21:c5df903f068a 39 button button5(myservo5, pb5, 5);
aismail1997 21:c5df903f068a 40 button button6(myservo6, pb6, 6);
aismail1997 4:cc181f8f2bd1 41
aismail1997 19:ceac47be2e64 42 buttonArray buttonarr(button1, button2, button3, button4, button5, button6);
aismail1997 19:ceac47be2e64 43
aismail1997 28:3c4ebc4fde0f 44 emic2 myTTS(p28, p27); //serial RX,TX pins to emic
aismail1997 28:3c4ebc4fde0f 45
aismail1997 13:b80dde24e9bc 46 // INITIALIZE VARIABLES
aismail1997 13:b80dde24e9bc 47 // add mode, reset buttons
aismail1997 9:418a4437a693 48 int start = 0;
aismail1997 9:418a4437a693 49 int submit = 0;
aismail1997 18:d14bf57f435b 50 // Buttons begins in up state
aismail1997 17:08c575082052 51 int state = 0;
aismail1997 18:d14bf57f435b 52 int state2 = 0;
aismail1997 18:d14bf57f435b 53 int state3 = 0;
aismail1997 18:d14bf57f435b 54 int state4 = 0;
aismail1997 18:d14bf57f435b 55 int state5 = 0;
aismail1997 18:d14bf57f435b 56 int state6 = 0;
aismail1997 14:581a3b02f4c3 57 int count = 0;
aismail1997 6:1aa86ad19af9 58
aismail1997 6:1aa86ad19af9 59 // THREADS
aismail1997 13:b80dde24e9bc 60
aismail1997 6:1aa86ad19af9 61 void button_thread()
aismail1997 4:cc181f8f2bd1 62 {
aismail1997 14:581a3b02f4c3 63 while(true) {
aismail1997 19:ceac47be2e64 64 state = button1.updateState();
nnguyen45 33:3090ec93b4aa 65 state6 = button6.updateState();
nnguyen45 33:3090ec93b4aa 66
aismail1997 21:c5df903f068a 67 //led4 = button1.getLp();
aismail1997 19:ceac47be2e64 68 Thread::wait(100); // wait till thread is done
aismail1997 10:21268d8bf979 69 }
aismail1997 14:581a3b02f4c3 70 }
aismail1997 14:581a3b02f4c3 71
aismail1997 14:581a3b02f4c3 72 void button2_thread()
aismail1997 14:581a3b02f4c3 73 {
aismail1997 14:581a3b02f4c3 74 while(true) {
aismail1997 19:ceac47be2e64 75 state2 = button2.updateState();
aismail1997 40:85be3490d3a7 76 //state5 = button5.updateState();
nnguyen45 32:e87bb6e83072 77 Thread::wait(200); // wait till thread is done
aismail1997 10:21268d8bf979 78 }
aismail1997 4:cc181f8f2bd1 79 }
aismail1997 4:cc181f8f2bd1 80
aismail1997 18:d14bf57f435b 81 // thread for the custom button
aismail1997 18:d14bf57f435b 82 void button3_thread()
aismail1997 18:d14bf57f435b 83 {
aismail1997 18:d14bf57f435b 84 while(true) {
aismail1997 19:ceac47be2e64 85 state3 = button3.updateState();
aismail1997 40:85be3490d3a7 86 //state5 = button4.updateState();
nnguyen45 32:e87bb6e83072 87 Thread::wait(200); // wait till thread is done
aismail1997 18:d14bf57f435b 88 }
aismail1997 18:d14bf57f435b 89 }
aismail1997 18:d14bf57f435b 90
aismail1997 18:d14bf57f435b 91 // thread for the custom button
aismail1997 18:d14bf57f435b 92 void button4_thread()
aismail1997 18:d14bf57f435b 93 {
aismail1997 18:d14bf57f435b 94 while(true) {
aismail1997 19:ceac47be2e64 95 state4 = button4.updateState();
nnguyen45 32:e87bb6e83072 96 Thread::wait(200); // wait till thread is done
aismail1997 18:d14bf57f435b 97 }
aismail1997 18:d14bf57f435b 98 }
aismail1997 18:d14bf57f435b 99
aismail1997 18:d14bf57f435b 100 // thread for the custom button
aismail1997 18:d14bf57f435b 101 void button5_thread()
aismail1997 18:d14bf57f435b 102 {
aismail1997 18:d14bf57f435b 103 while(true) {
aismail1997 19:ceac47be2e64 104 state5 = button5.updateState();
nnguyen45 32:e87bb6e83072 105 Thread::wait(200); // wait till thread is done
aismail1997 18:d14bf57f435b 106 }
aismail1997 18:d14bf57f435b 107 }
aismail1997 18:d14bf57f435b 108
aismail1997 14:581a3b02f4c3 109
aismail1997 0:9eda4611081a 110 int main()
aismail1997 0:9eda4611081a 111 {
aismail1997 6:1aa86ad19af9 112 // SETUP
aismail1997 4:cc181f8f2bd1 113 // pull up the pushbutton to prevent bouncing
aismail1997 16:5c91af9b4e7c 114 pb1.mode(PullUp);
aismail1997 16:5c91af9b4e7c 115 pb2.mode(PullUp);
aismail1997 18:d14bf57f435b 116 pb3.mode(PullUp);
aismail1997 18:d14bf57f435b 117 pb4.mode(PullUp);
aismail1997 18:d14bf57f435b 118 pb5.mode(PullUp);
aismail1997 18:d14bf57f435b 119 pb6.mode(PullUp);
nnguyen45 43:9fb92cb259fc 120 read.mode(PullUp);
aismail1997 30:79cdf893c8b8 121 wait(.001);
aismail1997 15:7e9308d14faa 122
aismail1997 23:23970cf718ee 123 // PARSE INPUT FILE FOR LETTERS AND WORDS
aismail1997 23:23970cf718ee 124 char delimiter = ',';
aismail1997 29:b9bd85682db1 125 // TODO: fix the letters
aismail1997 23:23970cf718ee 126 string letter[2];
aismail1997 23:23970cf718ee 127 string word[2];
aismail1997 23:23970cf718ee 128 char check;
aismail1997 23:23970cf718ee 129 string temp;
aismail1997 23:23970cf718ee 130 string tempword = "";
aismail1997 23:23970cf718ee 131 int counter = 0;
aismail1997 23:23970cf718ee 132 FILE *fp = fopen("/sd/plan.txt", "r"); //create file
aismail1997 23:23970cf718ee 133 if(fp == NULL) {
aismail1997 30:79cdf893c8b8 134 //pc.printf("Could not open file for write\n");
aismail1997 23:23970cf718ee 135 }
aismail1997 23:23970cf718ee 136 check = fgetc(fp); //grabs a char from file
aismail1997 23:23970cf718ee 137 while(check != '\n') { //while not at the end of line for letters
aismail1997 23:23970cf718ee 138 if((check == delimiter) && (temp.length() == 1)) { //at a comma and have a letter stored
aismail1997 23:23970cf718ee 139 letter[counter] = temp; //write letter
aismail1997 23:23970cf718ee 140 counter = counter + 1; //increment counter
aismail1997 23:23970cf718ee 141 } else {
aismail1997 23:23970cf718ee 142 temp = check; //store letter
aismail1997 23:23970cf718ee 143 }
aismail1997 23:23970cf718ee 144 check = fgetc(fp); //grabs next char
aismail1997 23:23970cf718ee 145 }
aismail1997 23:23970cf718ee 146 counter = 0; //reset counter
aismail1997 23:23970cf718ee 147 check = fgetc(fp); //grabs next char
aismail1997 23:23970cf718ee 148 while(!feof(fp)) { //while not at the end of line for words
aismail1997 23:23970cf718ee 149 if(check == delimiter) { //when at the comma at the end of a word
aismail1997 23:23970cf718ee 150 word[counter] = tempword; //write word
aismail1997 23:23970cf718ee 151 tempword = "";
aismail1997 23:23970cf718ee 152 counter = counter + 1; //increment counter
aismail1997 23:23970cf718ee 153 } else {
aismail1997 23:23970cf718ee 154 tempword = tempword + check; //concatenate letters to build word
aismail1997 23:23970cf718ee 155 }
aismail1997 23:23970cf718ee 156 check = fgetc(fp); //grabs next char
aismail1997 23:23970cf718ee 157 }
aismail1997 23:23970cf718ee 158 fclose(fp); //close file
aismail1997 14:581a3b02f4c3 159
nnguyen45 33:3090ec93b4aa 160 Thread t1(button_thread);
nnguyen45 33:3090ec93b4aa 161 Thread t2(button2_thread);
nnguyen45 33:3090ec93b4aa 162 Thread t3(button3_thread);
nnguyen45 33:3090ec93b4aa 163 Thread t4(button4_thread);
nnguyen45 33:3090ec93b4aa 164 Thread t5(button5_thread);
nnguyen45 33:3090ec93b4aa 165 //Thread t6(button6_thread);
nnguyen45 33:3090ec93b4aa 166 t1.start(button_thread);
nnguyen45 33:3090ec93b4aa 167 t2.start(button2_thread);
nnguyen45 33:3090ec93b4aa 168 t3.start(button3_thread);
nnguyen45 33:3090ec93b4aa 169 t4.start(button4_thread);
nnguyen45 33:3090ec93b4aa 170 t5.start(button5_thread);
nnguyen45 33:3090ec93b4aa 171 //t6.start(button6_thread);
aismail1997 34:1248dfa0740b 172
aismail1997 41:560ee7866781 173 //char currletter;
aismail1997 23:23970cf718ee 174 int lettersize = sizeof(letter)/sizeof(letter[0]);
aismail1997 41:560ee7866781 175 //int type = 0;
aismail1997 34:1248dfa0740b 176
aismail1997 28:3c4ebc4fde0f 177 //TEXT-TO-SPEECH LOGIC
nnguyen45 43:9fb92cb259fc 178 myTTS.volume(18); //max volume is 18
nnguyen45 31:e5024aeca3a7 179 myTTS.voice(2);
aismail1997 28:3c4ebc4fde0f 180
aismail1997 42:bdb6f132a609 181
aismail1997 41:560ee7866781 182 // SETUP
aismail1997 42:bdb6f132a609 183 buttonarr.setup(); //Reset servos so that buttons are up for typing mode
aismail1997 41:560ee7866781 184 button1.setMode(1);
aismail1997 41:560ee7866781 185 button2.setMode(1);
aismail1997 41:560ee7866781 186 button3.setMode(1);
aismail1997 41:560ee7866781 187 button4.setMode(1);
aismail1997 41:560ee7866781 188 button5.setMode(1);
aismail1997 41:560ee7866781 189 button6.setMode(1);
aismail1997 41:560ee7866781 190
aismail1997 41:560ee7866781 191 // LETTER CODE
aismail1997 41:560ee7866781 192 // tell how to type letter
aismail1997 41:560ee7866781 193 // wait for input
aismail1997 41:560ee7866781 194 // check if correct letter
aismail1997 41:560ee7866781 195 // feedback
aismail1997 41:560ee7866781 196 // loop
nnguyen45 43:9fb92cb259fc 197 myTTS.speakf("SPlease switch the device into typing mode.\r"); // Send the desired string to convert to speech
nnguyen45 43:9fb92cb259fc 198 myTTS.ready(); //ready waits for speech to finish from last command with a ":" response
nnguyen45 43:9fb92cb259fc 199 while(read==1) {}
aismail1997 41:560ee7866781 200 for(int i = 0; i < lettersize; i++) { //iterate through the letter array
aismail1997 41:560ee7866781 201 char currletter = letter[i][0];
aismail1997 41:560ee7866781 202 int* pinsup = buttonarr.pinsUp(currletter);
aismail1997 41:560ee7866781 203 int currpress;
aismail1997 41:560ee7866781 204 int numpinsups = pinsup[0]; // size of array is first element of pinsup
nnguyen45 43:9fb92cb259fc 205 string presspin = "STo type the letter ";
aismail1997 41:560ee7866781 206 presspin = presspin + letter[i];
aismail1997 41:560ee7866781 207 presspin = presspin + ", press buttons";
aismail1997 41:560ee7866781 208
aismail1997 41:560ee7866781 209 for (int j = 1; j < numpinsups; j++) { // get what pins to press
aismail1997 41:560ee7866781 210 currpress = pinsup[j];
aismail1997 41:560ee7866781 211 switch (currpress) {
aismail1997 41:560ee7866781 212 case 1:
aismail1997 41:560ee7866781 213 presspin = presspin + " 1,";
aismail1997 41:560ee7866781 214 break;
aismail1997 41:560ee7866781 215 case 2:
aismail1997 41:560ee7866781 216 presspin = presspin + " 2,";
aismail1997 41:560ee7866781 217 break;
aismail1997 41:560ee7866781 218 case 3:
aismail1997 41:560ee7866781 219 presspin = presspin + " 3,";
aismail1997 41:560ee7866781 220 break;
aismail1997 41:560ee7866781 221 case 4:
aismail1997 41:560ee7866781 222 presspin = presspin + " 4,";
aismail1997 41:560ee7866781 223 break;
aismail1997 41:560ee7866781 224 case 5:
aismail1997 41:560ee7866781 225 presspin = presspin + " 5,";
aismail1997 41:560ee7866781 226 break;
aismail1997 41:560ee7866781 227 case 6:
aismail1997 41:560ee7866781 228 presspin = presspin + " 6,";
aismail1997 41:560ee7866781 229 break;
aismail1997 41:560ee7866781 230 }
aismail1997 41:560ee7866781 231 }
aismail1997 41:560ee7866781 232 myTTS.speakf("%s\r",presspin);
aismail1997 41:560ee7866781 233 myTTS.ready(); //ready waits for speech to finish from last command with a ":" response
aismail1997 41:560ee7866781 234 //wait(2);
aismail1997 41:560ee7866781 235
aismail1997 41:560ee7866781 236 //WORKS UP TO HERE
aismail1997 41:560ee7866781 237 char* braille;
aismail1997 41:560ee7866781 238 char* oldbraille;
aismail1997 41:560ee7866781 239
aismail1997 41:560ee7866781 240 // TYPE MODE
aismail1997 41:560ee7866781 241 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 242 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 243
aismail1997 41:560ee7866781 244 // wait for input
aismail1997 41:560ee7866781 245 while (strcmp(braille, "111111") == 0) {
aismail1997 41:560ee7866781 246 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 247 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 248 }
aismail1997 41:560ee7866781 249
aismail1997 41:560ee7866781 250 // while buttons have not been released
aismail1997 41:560ee7866781 251 int oldsum = 0;
aismail1997 41:560ee7866781 252 int sum = 0;
aismail1997 41:560ee7866781 253 while ((strcmp(braille, "111111") != 0) && (oldsum <= sum)) {
aismail1997 41:560ee7866781 254 oldbraille = braille;
aismail1997 41:560ee7866781 255 oldsum = sum;
aismail1997 41:560ee7866781 256 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 257 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 258 sum = button1.getPress() + button2.getPress() + button3.getPress() + button4.getPress()
aismail1997 41:560ee7866781 259 + button5.getPress() + button6.getPress();
aismail1997 41:560ee7866781 260 }
aismail1997 41:560ee7866781 261 braille = oldbraille;
aismail1997 41:560ee7866781 262
aismail1997 41:560ee7866781 263 int currwrong;
aismail1997 41:560ee7866781 264 string wrongpin;
aismail1997 41:560ee7866781 265 // check result
aismail1997 41:560ee7866781 266 int* wrongpins = buttonarr.wrongPins(braille, currletter);
aismail1997 41:560ee7866781 267 int test = 1;
aismail1997 41:560ee7866781 268 while(test == 1) {
aismail1997 41:560ee7866781 269 wrongpin = "SYour answer is incorrect. Buttons";
aismail1997 41:560ee7866781 270 for (int j = 1; j < wrongpins[0]; j++) { // get what pins are wrong
aismail1997 41:560ee7866781 271 currwrong = wrongpins[j];
aismail1997 41:560ee7866781 272 switch (currwrong) {
aismail1997 41:560ee7866781 273 case 1:
aismail1997 41:560ee7866781 274 wrongpin = wrongpin + " 1,";
aismail1997 41:560ee7866781 275 break;
aismail1997 41:560ee7866781 276 case 2:
aismail1997 41:560ee7866781 277 wrongpin = wrongpin + " 2,";
aismail1997 41:560ee7866781 278 break;
aismail1997 41:560ee7866781 279 case 3:
aismail1997 41:560ee7866781 280 wrongpin = wrongpin + " 3,";
aismail1997 41:560ee7866781 281 break;
aismail1997 41:560ee7866781 282 case 4:
aismail1997 41:560ee7866781 283 wrongpin = wrongpin + " 4,";
aismail1997 41:560ee7866781 284 break;
aismail1997 41:560ee7866781 285 case 5:
aismail1997 41:560ee7866781 286 wrongpin = wrongpin + " 5,";
aismail1997 41:560ee7866781 287 break;
aismail1997 41:560ee7866781 288 case 6:
aismail1997 41:560ee7866781 289 wrongpin = wrongpin + " 6,";
aismail1997 41:560ee7866781 290 break;
aismail1997 41:560ee7866781 291 }
aismail1997 41:560ee7866781 292 }
aismail1997 41:560ee7866781 293 if (wrongpins[0] > 1) {
aismail1997 41:560ee7866781 294 wrongpin = wrongpin + " are wrong. Please try again.";
aismail1997 41:560ee7866781 295 myTTS.speakf("%s\r",wrongpin);
aismail1997 41:560ee7866781 296 myTTS.ready(); //ready waits for speech to finish from last command with a ":" response
aismail1997 41:560ee7866781 297
aismail1997 41:560ee7866781 298 //UPDATE THE PINS THAT ARE WRONG BY CHECKING AGAIN BELOW
aismail1997 41:560ee7866781 299
aismail1997 41:560ee7866781 300 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 301 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 302
aismail1997 41:560ee7866781 303 // wait for input
aismail1997 41:560ee7866781 304 while (strcmp(braille, "111111") == 0) {
aismail1997 41:560ee7866781 305 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 306 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 307 }
aismail1997 41:560ee7866781 308
aismail1997 41:560ee7866781 309 // while buttons have not been released
aismail1997 41:560ee7866781 310 int oldsum = 0;
aismail1997 41:560ee7866781 311 int sum = 0;
aismail1997 41:560ee7866781 312 while ((strcmp(braille, "111111") != 0) && (oldsum <= sum)) {
aismail1997 41:560ee7866781 313 oldbraille = braille;
aismail1997 41:560ee7866781 314 oldsum = sum;
aismail1997 41:560ee7866781 315 sprintf(braille, "%d%d%d%d%d%d", !button1.getPress(), !button2.getPress(),
aismail1997 41:560ee7866781 316 !button3.getPress(), !button4.getPress(), !button5.getPress(), !button6.getPress());
aismail1997 41:560ee7866781 317 sum = button1.getPress() + button2.getPress() + button3.getPress() + button4.getPress()
aismail1997 41:560ee7866781 318 + button5.getPress() + button6.getPress();
aismail1997 41:560ee7866781 319 }
aismail1997 41:560ee7866781 320
aismail1997 41:560ee7866781 321 // check result
aismail1997 41:560ee7866781 322 wrongpins = buttonarr.wrongPins(braille, currletter);
aismail1997 41:560ee7866781 323 } else {
aismail1997 41:560ee7866781 324 test = 0;
aismail1997 41:560ee7866781 325 myTTS.speakf("SGood job!\r");
aismail1997 41:560ee7866781 326 myTTS.ready(); //ready waits for speech to finish from last command with a ":" response
aismail1997 41:560ee7866781 327 }
aismail1997 41:560ee7866781 328 }
aismail1997 39:8cc80f0b4398 329 }
nnguyen45 43:9fb92cb259fc 330 myTTS.speakf("SThis is the end of the module.\r"); // Send the desired string to convert to speech
nnguyen45 43:9fb92cb259fc 331 myTTS.ready(); //ready waits for speech to finish from last command with a ":" response
aismail1997 37:d873136dfb12 332
aismail1997 37:d873136dfb12 333 // MAIN THREAD
aismail1997 37:d873136dfb12 334 while(true) {
aismail1997 22:6931917c70cd 335
aismail1997 14:581a3b02f4c3 336 Thread::wait(500); // wait till thread is done
aismail1997 0:9eda4611081a 337 }
aismail1997 0:9eda4611081a 338 }