Component Test's Software to work with "Universal Controller Box" - Software is an interpreter or "compiler" for programs to be done with a .txt file and read off of the SD Card
Dependencies: BridgeDriver FrontPanelButtons MCP23017 SDFileSystem TextLCD mbed
main.cpp@1:5731f31f96be, 2014-09-16 (annotated)
- Committer:
- mehatfie
- Date:
- Tue Sep 16 18:27:41 2014 +0000
- Revision:
- 1:5731f31f96be
- Parent:
- 0:22618cf06f45
- Child:
- 2:3e7baa3e3fec
- Noticed having issues with code in terms of memory(?); - Loop functionality works fine; - Depending on the number of cycles, the code will randomly freeze up. Same thing happens if you extend the number of tasks within the loop, and decrease count
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mehatfie | 0:22618cf06f45 | 1 | |
mehatfie | 0:22618cf06f45 | 2 | #include "mbed.h" |
mehatfie | 0:22618cf06f45 | 3 | #include "LocalPinNames.h" |
mehatfie | 0:22618cf06f45 | 4 | #include "BridgeDriver.h" |
mehatfie | 0:22618cf06f45 | 5 | #include "FrontPanelButtons.h" |
mehatfie | 0:22618cf06f45 | 6 | #include "TextLCD.h" |
mehatfie | 0:22618cf06f45 | 7 | #include "SDFileSystem.h" |
mehatfie | 0:22618cf06f45 | 8 | #include "Initialization.hpp" |
mehatfie | 0:22618cf06f45 | 9 | //#include "DeviceClasses.h" |
mehatfie | 0:22618cf06f45 | 10 | #include "Device.hpp" |
mehatfie | 0:22618cf06f45 | 11 | //#include "Motor.hpp" |
mehatfie | 0:22618cf06f45 | 12 | //#include "VoltageDriver.hpp" |
mehatfie | 0:22618cf06f45 | 13 | #include "TextFile.h" |
mehatfie | 0:22618cf06f45 | 14 | #include <stdio.h> |
mehatfie | 0:22618cf06f45 | 15 | #include <string> |
mehatfie | 0:22618cf06f45 | 16 | #include <stdlib.h> |
mehatfie | 0:22618cf06f45 | 17 | #include <iostream> |
mehatfie | 0:22618cf06f45 | 18 | #include <fstream> |
mehatfie | 0:22618cf06f45 | 19 | #include <vector> |
mehatfie | 0:22618cf06f45 | 20 | using std::string; |
mehatfie | 0:22618cf06f45 | 21 | |
mehatfie | 0:22618cf06f45 | 22 | //const int MAX_LINE_LENGTH = 100; |
mehatfie | 0:22618cf06f45 | 23 | struct Line lineData; |
mehatfie | 0:22618cf06f45 | 24 | //Device devices[15]; |
mehatfie | 0:22618cf06f45 | 25 | DeviceData devices[15]; |
mehatfie | 0:22618cf06f45 | 26 | |
mehatfie | 1:5731f31f96be | 27 | FrontPanelButtons buttons(&i2c); |
mehatfie | 1:5731f31f96be | 28 | |
mehatfie | 0:22618cf06f45 | 29 | //extern "C" void mbed_reset(); //enable software reset of code |
mehatfie | 0:22618cf06f45 | 30 | /* |
mehatfie | 0:22618cf06f45 | 31 | http://stackoverflow.com/questions/3081289/how-to-read-a-line-from-a-text-file-in-c-c |
mehatfie | 0:22618cf06f45 | 32 | http://stackoverflow.com/questions/12475915/rewind-stream-pointer-to-the-line-back |
mehatfie | 0:22618cf06f45 | 33 | |
mehatfie | 0:22618cf06f45 | 34 | recurrsive |
mehatfie | 0:22618cf06f45 | 35 | */ |
mehatfie | 0:22618cf06f45 | 36 | |
mehatfie | 1:5731f31f96be | 37 | |
mehatfie | 1:5731f31f96be | 38 | |
mehatfie | 1:5731f31f96be | 39 | int interpretCommand(FILE *); |
mehatfie | 1:5731f31f96be | 40 | int loopCommand(FILE *); |
mehatfie | 1:5731f31f96be | 41 | |
mehatfie | 1:5731f31f96be | 42 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 43 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 44 | /*************************** <FUNCTION: resetLineData> **************************/ |
mehatfie | 1:5731f31f96be | 45 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 46 | /**********************************************************************************************************************************/ |
mehatfie | 0:22618cf06f45 | 47 | void resetLineData(){ |
mehatfie | 0:22618cf06f45 | 48 | |
mehatfie | 0:22618cf06f45 | 49 | lineData.fullLine = NULL; |
mehatfie | 0:22618cf06f45 | 50 | lineData.lineNumber = 0; |
mehatfie | 0:22618cf06f45 | 51 | lineData.numWords = 0; |
mehatfie | 0:22618cf06f45 | 52 | } |
mehatfie | 0:22618cf06f45 | 53 | |
mehatfie | 0:22618cf06f45 | 54 | |
mehatfie | 0:22618cf06f45 | 55 | |
mehatfie | 1:5731f31f96be | 56 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 57 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 58 | /************************ <FUNCTION: cyclePrograms> *****************************/ |
mehatfie | 1:5731f31f96be | 59 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 60 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 61 | |
mehatfie | 0:22618cf06f45 | 62 | int cyclePrograms(string files[], int SIZE, int currIndex, int direction){ |
mehatfie | 0:22618cf06f45 | 63 | |
mehatfie | 0:22618cf06f45 | 64 | int nextIndex = 0; |
mehatfie | 0:22618cf06f45 | 65 | switch(direction){ |
mehatfie | 0:22618cf06f45 | 66 | case 0: //Cycle Back one File |
mehatfie | 0:22618cf06f45 | 67 | if ((currIndex - 1) < 0) |
mehatfie | 0:22618cf06f45 | 68 | nextIndex = SIZE - 1; |
mehatfie | 0:22618cf06f45 | 69 | else |
mehatfie | 0:22618cf06f45 | 70 | nextIndex = currIndex - 1; |
mehatfie | 0:22618cf06f45 | 71 | break; |
mehatfie | 0:22618cf06f45 | 72 | case 1: //Cycle Forward one File |
mehatfie | 0:22618cf06f45 | 73 | if ((currIndex + 1) >= SIZE) |
mehatfie | 0:22618cf06f45 | 74 | nextIndex = 0; |
mehatfie | 0:22618cf06f45 | 75 | else |
mehatfie | 0:22618cf06f45 | 76 | nextIndex = currIndex + 1; |
mehatfie | 0:22618cf06f45 | 77 | break; |
mehatfie | 0:22618cf06f45 | 78 | case -1: //set the selectedFile to the currIndex (used for initialization) |
mehatfie | 0:22618cf06f45 | 79 | nextIndex = currIndex; |
mehatfie | 0:22618cf06f45 | 80 | break; |
mehatfie | 0:22618cf06f45 | 81 | } |
mehatfie | 0:22618cf06f45 | 82 | |
mehatfie | 0:22618cf06f45 | 83 | //Output file on Display |
mehatfie | 0:22618cf06f45 | 84 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 85 | lcd.printf(" "); // Clear the Line using Spaces (Emptyness) - Note one line is 20 Characters |
mehatfie | 0:22618cf06f45 | 86 | wait(.2); |
mehatfie | 0:22618cf06f45 | 87 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 88 | lcd.printf("%s",files[nextIndex]); |
mehatfie | 0:22618cf06f45 | 89 | |
mehatfie | 0:22618cf06f45 | 90 | return nextIndex; // Return the file index in the Array |
mehatfie | 0:22618cf06f45 | 91 | } |
mehatfie | 0:22618cf06f45 | 92 | |
mehatfie | 1:5731f31f96be | 93 | |
mehatfie | 1:5731f31f96be | 94 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 95 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 96 | /************************** <FUNCTION: resize_StringArr> ************************/ |
mehatfie | 1:5731f31f96be | 97 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 98 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 99 | |
mehatfie | 0:22618cf06f45 | 100 | string* resize_StringArr(string oldArr[], int newSize) { |
mehatfie | 0:22618cf06f45 | 101 | |
mehatfie | 0:22618cf06f45 | 102 | string newArr[newSize]; |
mehatfie | 0:22618cf06f45 | 103 | memcpy(newArr, oldArr, newSize * sizeof(string)); |
mehatfie | 0:22618cf06f45 | 104 | |
mehatfie | 0:22618cf06f45 | 105 | return newArr; |
mehatfie | 0:22618cf06f45 | 106 | } |
mehatfie | 0:22618cf06f45 | 107 | |
mehatfie | 0:22618cf06f45 | 108 | |
mehatfie | 1:5731f31f96be | 109 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 110 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 111 | /************************** <FUNCTION: loopCommand> *****************************/ |
mehatfie | 1:5731f31f96be | 112 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 113 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 114 | |
mehatfie | 1:5731f31f96be | 115 | int loopCommand(FILE *selectedFile){ |
mehatfie | 1:5731f31f96be | 116 | |
mehatfie | 1:5731f31f96be | 117 | char *loopCondition = lineData.word[1]; |
mehatfie | 1:5731f31f96be | 118 | int loopConditionValue = atoi(loopCondition); |
mehatfie | 1:5731f31f96be | 119 | int loopStartAddress = 0, loopLineNumber = 0; |
mehatfie | 1:5731f31f96be | 120 | int firstLineOfLoop = 1; |
mehatfie | 1:5731f31f96be | 121 | |
mehatfie | 1:5731f31f96be | 122 | int counter = 0; |
mehatfie | 1:5731f31f96be | 123 | while (counter < loopConditionValue){ |
mehatfie | 1:5731f31f96be | 124 | |
mehatfie | 1:5731f31f96be | 125 | getNextLine(selectedFile); |
mehatfie | 1:5731f31f96be | 126 | /*lcd.setAddress(0,2); |
mehatfie | 1:5731f31f96be | 127 | lcd.printf("wrd1: %s", lineData.word[0]); |
mehatfie | 1:5731f31f96be | 128 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 129 | lcd.printf("TEST012 ");*/ |
mehatfie | 1:5731f31f96be | 130 | |
mehatfie | 1:5731f31f96be | 131 | int checkEnd = interpretCommand(selectedFile); |
mehatfie | 1:5731f31f96be | 132 | /*lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 133 | lcd.printf("TEST022 "); |
mehatfie | 1:5731f31f96be | 134 | wait(2);*/ |
mehatfie | 1:5731f31f96be | 135 | |
mehatfie | 1:5731f31f96be | 136 | if (firstLineOfLoop){ |
mehatfie | 1:5731f31f96be | 137 | loopStartAddress = lineData.lineAddress; //Save the Line Address |
mehatfie | 1:5731f31f96be | 138 | loopLineNumber = lineData.lineNumber; //Save the Line Number |
mehatfie | 1:5731f31f96be | 139 | firstLineOfLoop = 0; |
mehatfie | 1:5731f31f96be | 140 | /* lcd.setAddress(0,2); |
mehatfie | 1:5731f31f96be | 141 | lcd.printf("ldLN: %d, ldLA: %d", lineData.lineNumber, lineData.lineAddress); |
mehatfie | 1:5731f31f96be | 142 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 143 | lcd.printf("lln: %d, lsa: %d", loopLineNumber, loopStartAddress); |
mehatfie | 1:5731f31f96be | 144 | wait(3);*/ |
mehatfie | 1:5731f31f96be | 145 | } |
mehatfie | 1:5731f31f96be | 146 | |
mehatfie | 1:5731f31f96be | 147 | //Increase the loop counter and go back to the beginning of the loop |
mehatfie | 1:5731f31f96be | 148 | if (checkEnd == 1){ |
mehatfie | 1:5731f31f96be | 149 | lcd.setAddress(0,2); |
mehatfie | 1:5731f31f96be | 150 | lcd.printf("%dldLN: %d, ldLA: %d", counter, lineData.lineNumber, lineData.lineAddress); |
mehatfie | 1:5731f31f96be | 151 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 152 | lcd.printf("%dlln: %d, lsa: %d", counter, loopLineNumber, loopStartAddress); |
mehatfie | 1:5731f31f96be | 153 | wait(3); |
mehatfie | 1:5731f31f96be | 154 | |
mehatfie | 1:5731f31f96be | 155 | counter++; |
mehatfie | 1:5731f31f96be | 156 | fseek(selectedFile, loopStartAddress, SEEK_SET); |
mehatfie | 1:5731f31f96be | 157 | lineData.lineNumber = loopLineNumber - 1; |
mehatfie | 1:5731f31f96be | 158 | } |
mehatfie | 1:5731f31f96be | 159 | } |
mehatfie | 1:5731f31f96be | 160 | |
mehatfie | 1:5731f31f96be | 161 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 162 | lcd.printf("TEST1 "); |
mehatfie | 1:5731f31f96be | 163 | |
mehatfie | 1:5731f31f96be | 164 | return 1; |
mehatfie | 1:5731f31f96be | 165 | } |
mehatfie | 1:5731f31f96be | 166 | |
mehatfie | 1:5731f31f96be | 167 | /* |
mehatfie | 1:5731f31f96be | 168 | Make LOOP function |
mehatfie | 1:5731f31f96be | 169 | - All you need to do is remember (val = ftell(fp)) the beginning of the line you're currently reading. |
mehatfie | 1:5731f31f96be | 170 | - If it turns out to be a LOOP call, then you simply send that remembered value to the LOOP function, and it will continue to LOOP back to that position until the condition is met. |
mehatfie | 1:5731f31f96be | 171 | |
mehatfie | 1:5731f31f96be | 172 | |
mehatfie | 1:5731f31f96be | 173 | func LOOP (FILE *fp, int loopStart){ |
mehatfie | 1:5731f31f96be | 174 | |
mehatfie | 1:5731f31f96be | 175 | string conditions; |
mehatfie | 1:5731f31f96be | 176 | fseek(fp, loopStart, SEEK_SET); |
mehatfie | 1:5731f31f96be | 177 | fgets(conditions, MAX_LINE_LENGTH, fp); |
mehatfie | 1:5731f31f96be | 178 | |
mehatfie | 1:5731f31f96be | 179 | int numCycles = interpretLoopCondtions(); |
mehatfie | 1:5731f31f96be | 180 | |
mehatfie | 1:5731f31f96be | 181 | int i = 0; |
mehatfie | 1:5731f31f96be | 182 | int checkEndLoop = 0; |
mehatfie | 1:5731f31f96be | 183 | while (i < numCycles) { |
mehatfie | 1:5731f31f96be | 184 | |
mehatfie | 1:5731f31f96be | 185 | checkEndLoop = interpretLine(fp); //if end Loop return ____ (1?), return 0 on success |
mehatfie | 1:5731f31f96be | 186 | if (checkEndLoop) //if it's not the end of the loop, the counter will not increase and we'll just interpret the next line |
mehatfie | 1:5731f31f96be | 187 | i++; |
mehatfie | 1:5731f31f96be | 188 | } |
mehatfie | 1:5731f31f96be | 189 | } //loop conditions met, return to main code |
mehatfie | 1:5731f31f96be | 190 | |
mehatfie | 1:5731f31f96be | 191 | |
mehatfie | 1:5731f31f96be | 192 | */ |
mehatfie | 1:5731f31f96be | 193 | |
mehatfie | 1:5731f31f96be | 194 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 195 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 196 | /************************* <FUNCTION: interpretCommand> *************************/ |
mehatfie | 1:5731f31f96be | 197 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 198 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 199 | |
mehatfie | 1:5731f31f96be | 200 | int interpretCommand(FILE *selectedFile){ |
mehatfie | 1:5731f31f96be | 201 | |
mehatfie | 1:5731f31f96be | 202 | if (strncmp(lineData.word[0],"device", 6) == 0){ |
mehatfie | 1:5731f31f96be | 203 | |
mehatfie | 1:5731f31f96be | 204 | int i = 0, deviceFound = -1; |
mehatfie | 1:5731f31f96be | 205 | for (i = 0; i < numDevices; i++) |
mehatfie | 1:5731f31f96be | 206 | if (strncmp(lineData.word[2], DeviceNames[i], strlen(DeviceNames[i])) == 0) |
mehatfie | 1:5731f31f96be | 207 | deviceFound = i; |
mehatfie | 1:5731f31f96be | 208 | |
mehatfie | 1:5731f31f96be | 209 | //if the device type does not match any known type, error out |
mehatfie | 1:5731f31f96be | 210 | if (deviceFound == -1){ |
mehatfie | 1:5731f31f96be | 211 | //Error Out since the device Name was not matched with anything ************************* |
mehatfie | 1:5731f31f96be | 212 | } |
mehatfie | 1:5731f31f96be | 213 | |
mehatfie | 1:5731f31f96be | 214 | //Add device to the array of devices and initialize it |
mehatfie | 1:5731f31f96be | 215 | else |
mehatfie | 1:5731f31f96be | 216 | addDevice(deviceFound); |
mehatfie | 1:5731f31f96be | 217 | } |
mehatfie | 1:5731f31f96be | 218 | |
mehatfie | 1:5731f31f96be | 219 | else if (strncmp(lineData.word[0],"delay", 5) == 0){ |
mehatfie | 1:5731f31f96be | 220 | char *duration = lineData.word[1]; |
mehatfie | 1:5731f31f96be | 221 | int durationValue = atoi(duration); |
mehatfie | 1:5731f31f96be | 222 | |
mehatfie | 1:5731f31f96be | 223 | if (durationValue){ |
mehatfie | 1:5731f31f96be | 224 | timer.reset(); |
mehatfie | 1:5731f31f96be | 225 | timer.start(); |
mehatfie | 1:5731f31f96be | 226 | while (timer.read_ms() < durationValue); //Do Nothing while the timer has not reached the duration |
mehatfie | 1:5731f31f96be | 227 | timer.stop(); //Stop the Timer |
mehatfie | 1:5731f31f96be | 228 | } |
mehatfie | 1:5731f31f96be | 229 | else{ |
mehatfie | 1:5731f31f96be | 230 | //Error Out |
mehatfie | 1:5731f31f96be | 231 | return -1; |
mehatfie | 1:5731f31f96be | 232 | } |
mehatfie | 1:5731f31f96be | 233 | } |
mehatfie | 1:5731f31f96be | 234 | |
mehatfie | 1:5731f31f96be | 235 | else if (strncmp(lineData.word[0],"loop", 4) == 0){ |
mehatfie | 1:5731f31f96be | 236 | int checkLoopEnd = loopCommand(selectedFile); |
mehatfie | 1:5731f31f96be | 237 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 238 | lcd.printf("TEST2 "); |
mehatfie | 1:5731f31f96be | 239 | if (checkLoopEnd == 1) |
mehatfie | 1:5731f31f96be | 240 | return 1; |
mehatfie | 1:5731f31f96be | 241 | } |
mehatfie | 1:5731f31f96be | 242 | |
mehatfie | 1:5731f31f96be | 243 | else if (strncmp(lineData.word[0],"end", 3) == 0){ |
mehatfie | 1:5731f31f96be | 244 | if (strncmp(lineData.word[1],"program", 7) == 0) |
mehatfie | 1:5731f31f96be | 245 | return 0; |
mehatfie | 1:5731f31f96be | 246 | else if (strncmp(lineData.word[1],"loop", 4) == 0) |
mehatfie | 1:5731f31f96be | 247 | return 1; |
mehatfie | 1:5731f31f96be | 248 | } |
mehatfie | 1:5731f31f96be | 249 | |
mehatfie | 1:5731f31f96be | 250 | //not a keyword so check if it's a localName for a device |
mehatfie | 1:5731f31f96be | 251 | else{ |
mehatfie | 1:5731f31f96be | 252 | |
mehatfie | 1:5731f31f96be | 253 | int i = 0, deviceFound = -1; |
mehatfie | 1:5731f31f96be | 254 | for (i = 0; i < currNumDevices; i++){ |
mehatfie | 1:5731f31f96be | 255 | if (strncmp(lineData.word[0], devices[i].name, strlen(devices[i].name)) == 0) |
mehatfie | 1:5731f31f96be | 256 | deviceFound = i; |
mehatfie | 1:5731f31f96be | 257 | } |
mehatfie | 1:5731f31f96be | 258 | |
mehatfie | 1:5731f31f96be | 259 | //no device was found that matched the local name, and this is also the last error check, meaning it can match no other potential keywords |
mehatfie | 1:5731f31f96be | 260 | if (deviceFound == -1){ |
mehatfie | 1:5731f31f96be | 261 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 262 | lcd.printf("Final ERROR!"); |
mehatfie | 1:5731f31f96be | 263 | wait(10); |
mehatfie | 1:5731f31f96be | 264 | } |
mehatfie | 1:5731f31f96be | 265 | |
mehatfie | 1:5731f31f96be | 266 | //Local Name matches a device, send line to that device in order to process the functionality |
mehatfie | 1:5731f31f96be | 267 | else |
mehatfie | 1:5731f31f96be | 268 | addDevice(deviceFound);//devices[deviceFound].interpret(); |
mehatfie | 1:5731f31f96be | 269 | } |
mehatfie | 1:5731f31f96be | 270 | |
mehatfie | 1:5731f31f96be | 271 | return -1; |
mehatfie | 1:5731f31f96be | 272 | } |
mehatfie | 1:5731f31f96be | 273 | |
mehatfie | 1:5731f31f96be | 274 | |
mehatfie | 1:5731f31f96be | 275 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 276 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 277 | /****************************** <FUNCTION: main> ********************************/ |
mehatfie | 1:5731f31f96be | 278 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 279 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 280 | |
mehatfie | 0:22618cf06f45 | 281 | int main() { |
mehatfie | 0:22618cf06f45 | 282 | |
mehatfie | 0:22618cf06f45 | 283 | fullInit(); //Initialize anything that's required to run the code (LCD) |
mehatfie | 0:22618cf06f45 | 284 | |
mehatfie | 0:22618cf06f45 | 285 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 286 | /*** <Get all the Potential Programs> ***/ |
mehatfie | 0:22618cf06f45 | 287 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 288 | int numTextFiles = 0; |
mehatfie | 0:22618cf06f45 | 289 | string tempTextFiles[25]; //Assuming Maximum of 25 txt files will be on the SD Card |
mehatfie | 0:22618cf06f45 | 290 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 291 | |
mehatfie | 0:22618cf06f45 | 292 | vector<string> filenames = readFileNames("/sd"); |
mehatfie | 0:22618cf06f45 | 293 | numTextFiles = getFileNamesWithoutExt(tempTextFiles, filenames); |
mehatfie | 0:22618cf06f45 | 294 | string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array |
mehatfie | 0:22618cf06f45 | 295 | |
mehatfie | 1:5731f31f96be | 296 | //delete[] tempTextFiles; //free previous array |
mehatfie | 0:22618cf06f45 | 297 | |
mehatfie | 0:22618cf06f45 | 298 | |
mehatfie | 0:22618cf06f45 | 299 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 300 | /*** <Select the Program txt File> ***/ |
mehatfie | 0:22618cf06f45 | 301 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 302 | int fileSelected = 0, selectedFileIndex = 0; |
mehatfie | 0:22618cf06f45 | 303 | |
mehatfie | 0:22618cf06f45 | 304 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 305 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 306 | lcd.printf("Select Your Program"); |
mehatfie | 0:22618cf06f45 | 307 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 308 | lcd.printf("Num Programs = %d", numTextFiles); |
mehatfie | 0:22618cf06f45 | 309 | |
mehatfie | 0:22618cf06f45 | 310 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 311 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 0:22618cf06f45 | 312 | |
mehatfie | 0:22618cf06f45 | 313 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, -1); //Initialize the first file to the screen |
mehatfie | 0:22618cf06f45 | 314 | while(!fileSelected) { |
mehatfie | 0:22618cf06f45 | 315 | |
mehatfie | 0:22618cf06f45 | 316 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 317 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 318 | lastButState = curButState; |
mehatfie | 0:22618cf06f45 | 319 | if(buttons.readRight()) |
mehatfie | 0:22618cf06f45 | 320 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 1); |
mehatfie | 0:22618cf06f45 | 321 | else if(buttons.readLeft()) |
mehatfie | 0:22618cf06f45 | 322 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 0); |
mehatfie | 0:22618cf06f45 | 323 | else if(buttons.readSel()) |
mehatfie | 0:22618cf06f45 | 324 | fileSelected = 1; |
mehatfie | 0:22618cf06f45 | 325 | } |
mehatfie | 0:22618cf06f45 | 326 | } |
mehatfie | 0:22618cf06f45 | 327 | |
mehatfie | 0:22618cf06f45 | 328 | char selectedFileName[50]; |
mehatfie | 0:22618cf06f45 | 329 | strcpy(selectedFileName, textFiles[selectedFileIndex].c_str()); |
mehatfie | 0:22618cf06f45 | 330 | |
mehatfie | 0:22618cf06f45 | 331 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 332 | /*** <Open the Program txt File> ***/ |
mehatfie | 0:22618cf06f45 | 333 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 334 | |
mehatfie | 0:22618cf06f45 | 335 | //Create the string of the full directory and path to the program txt file |
mehatfie | 0:22618cf06f45 | 336 | char selectedFileFullName[100] = "/sd/"; //Assuming that no directory and file name will be longer than 100 characters |
mehatfie | 0:22618cf06f45 | 337 | strcat(selectedFileFullName, selectedFileName); |
mehatfie | 0:22618cf06f45 | 338 | strcat(selectedFileFullName, ".txt"); |
mehatfie | 0:22618cf06f45 | 339 | |
mehatfie | 0:22618cf06f45 | 340 | FILE *selectedFile = fopen(selectedFileFullName, "r"); |
mehatfie | 0:22618cf06f45 | 341 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 342 | |
mehatfie | 0:22618cf06f45 | 343 | if(selectedFile == NULL) { |
mehatfie | 0:22618cf06f45 | 344 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 345 | lcd.printf("Invalid"); |
mehatfie | 0:22618cf06f45 | 346 | wait(10); |
mehatfie | 0:22618cf06f45 | 347 | } |
mehatfie | 0:22618cf06f45 | 348 | |
mehatfie | 0:22618cf06f45 | 349 | |
mehatfie | 0:22618cf06f45 | 350 | while(1){ |
mehatfie | 0:22618cf06f45 | 351 | |
mehatfie | 0:22618cf06f45 | 352 | resetLineData(); |
mehatfie | 0:22618cf06f45 | 353 | |
mehatfie | 0:22618cf06f45 | 354 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 355 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 356 | lcd.printf("Program: %s", selectedFileName); |
mehatfie | 0:22618cf06f45 | 357 | |
mehatfie | 0:22618cf06f45 | 358 | |
mehatfie | 0:22618cf06f45 | 359 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 360 | /*** <Start Running through the Program txt File Lines> ***/ |
mehatfie | 0:22618cf06f45 | 361 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 362 | |
mehatfie | 0:22618cf06f45 | 363 | int endOfFile = 0; |
mehatfie | 0:22618cf06f45 | 364 | |
mehatfie | 0:22618cf06f45 | 365 | while (!endOfFile){ |
mehatfie | 0:22618cf06f45 | 366 | |
mehatfie | 0:22618cf06f45 | 367 | getNextLine(selectedFile); |
mehatfie | 1:5731f31f96be | 368 | int checkEnd = interpretCommand(selectedFile); |
mehatfie | 0:22618cf06f45 | 369 | |
mehatfie | 1:5731f31f96be | 370 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 371 | lcd.printf("TEST3 "); |
mehatfie | 1:5731f31f96be | 372 | |
mehatfie | 1:5731f31f96be | 373 | if (checkEnd == 0) |
mehatfie | 1:5731f31f96be | 374 | endOfFile = 1; |
mehatfie | 0:22618cf06f45 | 375 | } |
mehatfie | 0:22618cf06f45 | 376 | |
mehatfie | 0:22618cf06f45 | 377 | |
mehatfie | 0:22618cf06f45 | 378 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 379 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 380 | lcd.printf("END OF PROGRAM"); |
mehatfie | 0:22618cf06f45 | 381 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 382 | lcd.printf("To Restart..."); |
mehatfie | 0:22618cf06f45 | 383 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 384 | lcd.printf("Press BACK"); |
mehatfie | 0:22618cf06f45 | 385 | |
mehatfie | 0:22618cf06f45 | 386 | while(!buttons.readBack()); |
mehatfie | 0:22618cf06f45 | 387 | |
mehatfie | 0:22618cf06f45 | 388 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 389 | rewind(selectedFile); |
mehatfie | 0:22618cf06f45 | 390 | } |
mehatfie | 0:22618cf06f45 | 391 | |
mehatfie | 0:22618cf06f45 | 392 | |
mehatfie | 0:22618cf06f45 | 393 | /***** Cycle through txt lines and remember last lines ******/ |
mehatfie | 0:22618cf06f45 | 394 | /* |
mehatfie | 0:22618cf06f45 | 395 | int running = 0, selectedFile = 0; |
mehatfie | 0:22618cf06f45 | 396 | int locCount = 0, tempSpot = 0; |
mehatfie | 0:22618cf06f45 | 397 | int loc[4]; |
mehatfie | 0:22618cf06f45 | 398 | char line[32]; |
mehatfie | 0:22618cf06f45 | 399 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 400 | |
mehatfie | 0:22618cf06f45 | 401 | |
mehatfie | 0:22618cf06f45 | 402 | while(1){ |
mehatfie | 0:22618cf06f45 | 403 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 0:22618cf06f45 | 404 | while(!running) { |
mehatfie | 0:22618cf06f45 | 405 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 406 | |
mehatfie | 0:22618cf06f45 | 407 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 408 | switch(lastButState = curButState){ |
mehatfie | 0:22618cf06f45 | 409 | case 0x1F: //right |
mehatfie | 0:22618cf06f45 | 410 | |
mehatfie | 0:22618cf06f45 | 411 | loc[locCount] = ftell(fp); |
mehatfie | 0:22618cf06f45 | 412 | |
mehatfie | 0:22618cf06f45 | 413 | if (locCount >= 3) |
mehatfie | 0:22618cf06f45 | 414 | locCount = 0; |
mehatfie | 0:22618cf06f45 | 415 | else |
mehatfie | 0:22618cf06f45 | 416 | locCount++; |
mehatfie | 0:22618cf06f45 | 417 | |
mehatfie | 0:22618cf06f45 | 418 | //tempSpot = ftell(fp); |
mehatfie | 0:22618cf06f45 | 419 | fgets(line, 32, fp); |
mehatfie | 0:22618cf06f45 | 420 | |
mehatfie | 0:22618cf06f45 | 421 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 422 | lcd.printf("L: %s", line); |
mehatfie | 0:22618cf06f45 | 423 | wait(0.2); |
mehatfie | 0:22618cf06f45 | 424 | break; |
mehatfie | 0:22618cf06f45 | 425 | case 0x2F: //left |
mehatfie | 0:22618cf06f45 | 426 | |
mehatfie | 0:22618cf06f45 | 427 | if (locCount == 0) { |
mehatfie | 0:22618cf06f45 | 428 | locCount = 3; |
mehatfie | 0:22618cf06f45 | 429 | fseek(fp, loc[locCount], SEEK_SET); |
mehatfie | 0:22618cf06f45 | 430 | } |
mehatfie | 0:22618cf06f45 | 431 | else { |
mehatfie | 0:22618cf06f45 | 432 | fseek(fp, loc[locCount - 1], SEEK_SET); |
mehatfie | 0:22618cf06f45 | 433 | locCount--; |
mehatfie | 0:22618cf06f45 | 434 | } |
mehatfie | 0:22618cf06f45 | 435 | fgets(line, 32, fp); |
mehatfie | 0:22618cf06f45 | 436 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 437 | lcd.printf("L: %s", line); |
mehatfie | 0:22618cf06f45 | 438 | wait(0.2); |
mehatfie | 0:22618cf06f45 | 439 | break; |
mehatfie | 0:22618cf06f45 | 440 | } |
mehatfie | 0:22618cf06f45 | 441 | } |
mehatfie | 0:22618cf06f45 | 442 | } |
mehatfie | 0:22618cf06f45 | 443 | } |
mehatfie | 0:22618cf06f45 | 444 | */ |
mehatfie | 0:22618cf06f45 | 445 | |
mehatfie | 0:22618cf06f45 | 446 | |
mehatfie | 0:22618cf06f45 | 447 | |
mehatfie | 0:22618cf06f45 | 448 | |
mehatfie | 0:22618cf06f45 | 449 | |
mehatfie | 0:22618cf06f45 | 450 | /******* Select the Program txt File ***********/ |
mehatfie | 0:22618cf06f45 | 451 | /* |
mehatfie | 0:22618cf06f45 | 452 | int numTextFiles = 0; |
mehatfie | 0:22618cf06f45 | 453 | string tempTextFiles[25]; //Assuming Maximum of 25 txt files will be on the SD Card |
mehatfie | 0:22618cf06f45 | 454 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 455 | readFileNames("/sd"); |
mehatfie | 0:22618cf06f45 | 456 | numTextFiles = getFileNamesWithoutExt(tempTextFiles); |
mehatfie | 0:22618cf06f45 | 457 | |
mehatfie | 0:22618cf06f45 | 458 | string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array |
mehatfie | 0:22618cf06f45 | 459 | //delete [] tempTextFiles; //free previous array |
mehatfie | 0:22618cf06f45 | 460 | |
mehatfie | 0:22618cf06f45 | 461 | |
mehatfie | 0:22618cf06f45 | 462 | int running = 0, selectedFile = 0; |
mehatfie | 0:22618cf06f45 | 463 | |
mehatfie | 0:22618cf06f45 | 464 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 465 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 466 | lcd.printf("Select Your Program"); |
mehatfie | 0:22618cf06f45 | 467 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 468 | lcd.printf("Num Programs = %d", numTextFiles); |
mehatfie | 0:22618cf06f45 | 469 | |
mehatfie | 0:22618cf06f45 | 470 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 471 | while(1){ |
mehatfie | 0:22618cf06f45 | 472 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 0:22618cf06f45 | 473 | while(!running) { |
mehatfie | 0:22618cf06f45 | 474 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 475 | |
mehatfie | 0:22618cf06f45 | 476 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 477 | switch(lastButState = curButState){ |
mehatfie | 0:22618cf06f45 | 478 | case 0x1F: //right |
mehatfie | 0:22618cf06f45 | 479 | selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 1); |
mehatfie | 0:22618cf06f45 | 480 | break; |
mehatfie | 0:22618cf06f45 | 481 | case 0x2F: //left |
mehatfie | 0:22618cf06f45 | 482 | selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 0); |
mehatfie | 0:22618cf06f45 | 483 | break; |
mehatfie | 0:22618cf06f45 | 484 | } |
mehatfie | 0:22618cf06f45 | 485 | } |
mehatfie | 0:22618cf06f45 | 486 | } |
mehatfie | 0:22618cf06f45 | 487 | } |
mehatfie | 0:22618cf06f45 | 488 | |
mehatfie | 0:22618cf06f45 | 489 | */ |
mehatfie | 0:22618cf06f45 | 490 | |
mehatfie | 0:22618cf06f45 | 491 | |
mehatfie | 0:22618cf06f45 | 492 | |
mehatfie | 0:22618cf06f45 | 493 | |
mehatfie | 0:22618cf06f45 | 494 | } |
mehatfie | 0:22618cf06f45 | 495 | |
mehatfie | 0:22618cf06f45 | 496 | |
mehatfie | 0:22618cf06f45 | 497 | |
mehatfie | 0:22618cf06f45 | 498 | |
mehatfie | 0:22618cf06f45 | 499 | |
mehatfie | 0:22618cf06f45 | 500 | |
mehatfie | 0:22618cf06f45 | 501 | |
mehatfie | 0:22618cf06f45 | 502 | |
mehatfie | 0:22618cf06f45 | 503 | |
mehatfie | 0:22618cf06f45 | 504 | /*float speed = 0.5; |
mehatfie | 0:22618cf06f45 | 505 | while(1){ |
mehatfie | 0:22618cf06f45 | 506 | bridges.drive(1, -1*speed); |
mehatfie | 0:22618cf06f45 | 507 | wait(2); |
mehatfie | 0:22618cf06f45 | 508 | bridges.drive(1, speed); |
mehatfie | 0:22618cf06f45 | 509 | wait(2); |
mehatfie | 0:22618cf06f45 | 510 | }*/ |
mehatfie | 0:22618cf06f45 | 511 | |
mehatfie | 0:22618cf06f45 | 512 | //BridgeDriver::MOTOR_A |