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@2:3e7baa3e3fec, 2014-09-18 (annotated)
- Committer:
- mehatfie
- Date:
- Thu Sep 18 23:38:11 2014 +0000
- Revision:
- 2:3e7baa3e3fec
- Parent:
- 1:5731f31f96be
- Child:
- 3:078e9a1e8be3
- Revamped whole system and now works without stalling or freezing mid program; - now Object Oriented Based in terms of Devices (inheritance of functions)
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 | 2:3e7baa3e3fec | 10 | //#include "Device.hpp" |
mehatfie | 2:3e7baa3e3fec | 11 | #include "Motor.hpp" |
mehatfie | 2:3e7baa3e3fec | 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 <fstream> |
mehatfie | 0:22618cf06f45 | 18 | #include <vector> |
mehatfie | 0:22618cf06f45 | 19 | using std::string; |
mehatfie | 0:22618cf06f45 | 20 | |
mehatfie | 0:22618cf06f45 | 21 | //const int MAX_LINE_LENGTH = 100; |
mehatfie | 2:3e7baa3e3fec | 22 | //struct Line lineData; |
mehatfie | 2:3e7baa3e3fec | 23 | |
mehatfie | 2:3e7baa3e3fec | 24 | |
mehatfie | 2:3e7baa3e3fec | 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 | 2:3e7baa3e3fec | 39 | int interpretCommand(FILE *, Line &); |
mehatfie | 2:3e7baa3e3fec | 40 | int loopCommand(FILE *, Line &); |
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 | 2:3e7baa3e3fec | 47 | void resetLineData(Line &lineData){ |
mehatfie | 0:22618cf06f45 | 48 | |
mehatfie | 2:3e7baa3e3fec | 49 | //lineData.fullLine.clear(); |
mehatfie | 0:22618cf06f45 | 50 | lineData.lineNumber = 0; |
mehatfie | 0:22618cf06f45 | 51 | lineData.numWords = 0; |
mehatfie | 2:3e7baa3e3fec | 52 | lineData.lineAddress = 0; |
mehatfie | 0:22618cf06f45 | 53 | } |
mehatfie | 0:22618cf06f45 | 54 | |
mehatfie | 0:22618cf06f45 | 55 | |
mehatfie | 0:22618cf06f45 | 56 | |
mehatfie | 1:5731f31f96be | 57 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 58 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 59 | /************************ <FUNCTION: cyclePrograms> *****************************/ |
mehatfie | 1:5731f31f96be | 60 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 61 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 62 | |
mehatfie | 2:3e7baa3e3fec | 63 | int cyclePrograms(vector<string> files, int SIZE, int currIndex, int direction){ |
mehatfie | 0:22618cf06f45 | 64 | |
mehatfie | 0:22618cf06f45 | 65 | int nextIndex = 0; |
mehatfie | 0:22618cf06f45 | 66 | switch(direction){ |
mehatfie | 0:22618cf06f45 | 67 | case 0: //Cycle Back one File |
mehatfie | 0:22618cf06f45 | 68 | if ((currIndex - 1) < 0) |
mehatfie | 0:22618cf06f45 | 69 | nextIndex = SIZE - 1; |
mehatfie | 0:22618cf06f45 | 70 | else |
mehatfie | 0:22618cf06f45 | 71 | nextIndex = currIndex - 1; |
mehatfie | 0:22618cf06f45 | 72 | break; |
mehatfie | 0:22618cf06f45 | 73 | case 1: //Cycle Forward one File |
mehatfie | 0:22618cf06f45 | 74 | if ((currIndex + 1) >= SIZE) |
mehatfie | 0:22618cf06f45 | 75 | nextIndex = 0; |
mehatfie | 0:22618cf06f45 | 76 | else |
mehatfie | 0:22618cf06f45 | 77 | nextIndex = currIndex + 1; |
mehatfie | 0:22618cf06f45 | 78 | break; |
mehatfie | 0:22618cf06f45 | 79 | case -1: //set the selectedFile to the currIndex (used for initialization) |
mehatfie | 0:22618cf06f45 | 80 | nextIndex = currIndex; |
mehatfie | 0:22618cf06f45 | 81 | break; |
mehatfie | 0:22618cf06f45 | 82 | } |
mehatfie | 0:22618cf06f45 | 83 | |
mehatfie | 0:22618cf06f45 | 84 | //Output file on Display |
mehatfie | 0:22618cf06f45 | 85 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 86 | lcd.printf(" "); // Clear the Line using Spaces (Emptyness) - Note one line is 20 Characters |
mehatfie | 0:22618cf06f45 | 87 | wait(.2); |
mehatfie | 0:22618cf06f45 | 88 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 89 | lcd.printf("%s",files[nextIndex]); |
mehatfie | 0:22618cf06f45 | 90 | |
mehatfie | 0:22618cf06f45 | 91 | return nextIndex; // Return the file index in the Array |
mehatfie | 0:22618cf06f45 | 92 | } |
mehatfie | 0:22618cf06f45 | 93 | |
mehatfie | 1:5731f31f96be | 94 | |
mehatfie | 1:5731f31f96be | 95 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 96 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 97 | /************************** <FUNCTION: resize_StringArr> ************************/ |
mehatfie | 1:5731f31f96be | 98 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 99 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 100 | |
mehatfie | 0:22618cf06f45 | 101 | string* resize_StringArr(string oldArr[], int newSize) { |
mehatfie | 0:22618cf06f45 | 102 | |
mehatfie | 0:22618cf06f45 | 103 | string newArr[newSize]; |
mehatfie | 0:22618cf06f45 | 104 | memcpy(newArr, oldArr, newSize * sizeof(string)); |
mehatfie | 0:22618cf06f45 | 105 | |
mehatfie | 0:22618cf06f45 | 106 | return newArr; |
mehatfie | 0:22618cf06f45 | 107 | } |
mehatfie | 0:22618cf06f45 | 108 | |
mehatfie | 0:22618cf06f45 | 109 | |
mehatfie | 1:5731f31f96be | 110 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 111 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 112 | /************************** <FUNCTION: loopCommand> *****************************/ |
mehatfie | 1:5731f31f96be | 113 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 114 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 115 | |
mehatfie | 2:3e7baa3e3fec | 116 | int loopCommand(FILE *selectedFile, Line &lineData){ |
mehatfie | 1:5731f31f96be | 117 | |
mehatfie | 2:3e7baa3e3fec | 118 | //Get the Condition value for number of times to loop |
mehatfie | 2:3e7baa3e3fec | 119 | string loopCondition = lineData.word[1]; |
mehatfie | 2:3e7baa3e3fec | 120 | int loopConditionValue = 0; |
mehatfie | 2:3e7baa3e3fec | 121 | sscanf(loopCondition.c_str(), "%d", &loopConditionValue); |
mehatfie | 1:5731f31f96be | 122 | |
mehatfie | 2:3e7baa3e3fec | 123 | int loopStartAddress = 0, loopLineNumber = 0, firstLineOfLoop = 1; |
mehatfie | 2:3e7baa3e3fec | 124 | |
mehatfie | 2:3e7baa3e3fec | 125 | int counter = 0, checkEnd = 0; |
mehatfie | 1:5731f31f96be | 126 | while (counter < loopConditionValue){ |
mehatfie | 1:5731f31f96be | 127 | |
mehatfie | 2:3e7baa3e3fec | 128 | getNextLine(selectedFile, lineData); |
mehatfie | 2:3e7baa3e3fec | 129 | checkEnd = interpretCommand(selectedFile, lineData); |
mehatfie | 1:5731f31f96be | 130 | |
mehatfie | 1:5731f31f96be | 131 | if (firstLineOfLoop){ |
mehatfie | 1:5731f31f96be | 132 | loopStartAddress = lineData.lineAddress; //Save the Line Address |
mehatfie | 1:5731f31f96be | 133 | loopLineNumber = lineData.lineNumber; //Save the Line Number |
mehatfie | 1:5731f31f96be | 134 | firstLineOfLoop = 0; |
mehatfie | 1:5731f31f96be | 135 | } |
mehatfie | 1:5731f31f96be | 136 | |
mehatfie | 1:5731f31f96be | 137 | //Increase the loop counter and go back to the beginning of the loop |
mehatfie | 1:5731f31f96be | 138 | if (checkEnd == 1){ |
mehatfie | 2:3e7baa3e3fec | 139 | counter++; |
mehatfie | 2:3e7baa3e3fec | 140 | |
mehatfie | 1:5731f31f96be | 141 | lcd.setAddress(0,2); |
mehatfie | 2:3e7baa3e3fec | 142 | lcd.printf("Loop Cycle %d of %d", counter, loopConditionValue); |
mehatfie | 2:3e7baa3e3fec | 143 | |
mehatfie | 1:5731f31f96be | 144 | fseek(selectedFile, loopStartAddress, SEEK_SET); |
mehatfie | 2:3e7baa3e3fec | 145 | lineData.lineNumber = loopLineNumber - 2; |
mehatfie | 1:5731f31f96be | 146 | } |
mehatfie | 1:5731f31f96be | 147 | } |
mehatfie | 2:3e7baa3e3fec | 148 | |
mehatfie | 1:5731f31f96be | 149 | return 1; |
mehatfie | 1:5731f31f96be | 150 | } |
mehatfie | 1:5731f31f96be | 151 | |
mehatfie | 1:5731f31f96be | 152 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 153 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 154 | /************************* <FUNCTION: interpretCommand> *************************/ |
mehatfie | 1:5731f31f96be | 155 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 156 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 157 | |
mehatfie | 2:3e7baa3e3fec | 158 | int interpretCommand(FILE *selectedFile, Line &lineData){ |
mehatfie | 2:3e7baa3e3fec | 159 | |
mehatfie | 2:3e7baa3e3fec | 160 | if (lineData.word[0].compare("device") == 0){ |
mehatfie | 2:3e7baa3e3fec | 161 | |
mehatfie | 1:5731f31f96be | 162 | int i = 0, deviceFound = -1; |
mehatfie | 2:3e7baa3e3fec | 163 | for (i = 0; i < numDevices; i++){ |
mehatfie | 2:3e7baa3e3fec | 164 | if (lineData.word[2].compare(DeviceNames[i])) |
mehatfie | 1:5731f31f96be | 165 | deviceFound = i; |
mehatfie | 2:3e7baa3e3fec | 166 | } |
mehatfie | 1:5731f31f96be | 167 | |
mehatfie | 1:5731f31f96be | 168 | //if the device type does not match any known type, error out |
mehatfie | 1:5731f31f96be | 169 | if (deviceFound == -1){ |
mehatfie | 1:5731f31f96be | 170 | //Error Out since the device Name was not matched with anything ************************* |
mehatfie | 1:5731f31f96be | 171 | } |
mehatfie | 1:5731f31f96be | 172 | |
mehatfie | 1:5731f31f96be | 173 | //Add device to the array of devices and initialize it |
mehatfie | 2:3e7baa3e3fec | 174 | else{ |
mehatfie | 2:3e7baa3e3fec | 175 | //For some reason the enum is indexed weirdly, device-- to send correct value |
mehatfie | 2:3e7baa3e3fec | 176 | deviceFound--; |
mehatfie | 2:3e7baa3e3fec | 177 | devices.push_back(Device::newDevice(deviceFound, lineData.word[1], lineData)); |
mehatfie | 2:3e7baa3e3fec | 178 | devices.back()->name = lineData.word[1]; |
mehatfie | 2:3e7baa3e3fec | 179 | } |
mehatfie | 1:5731f31f96be | 180 | } |
mehatfie | 1:5731f31f96be | 181 | |
mehatfie | 2:3e7baa3e3fec | 182 | else if (lineData.word[0].compare("delay") == 0){ |
mehatfie | 2:3e7baa3e3fec | 183 | string duration = lineData.word[1]; |
mehatfie | 2:3e7baa3e3fec | 184 | int durationValue = 0; |
mehatfie | 2:3e7baa3e3fec | 185 | sscanf(duration.c_str(), "%d", &durationValue); |
mehatfie | 1:5731f31f96be | 186 | |
mehatfie | 1:5731f31f96be | 187 | if (durationValue){ |
mehatfie | 1:5731f31f96be | 188 | timer.reset(); |
mehatfie | 1:5731f31f96be | 189 | timer.start(); |
mehatfie | 1:5731f31f96be | 190 | while (timer.read_ms() < durationValue); //Do Nothing while the timer has not reached the duration |
mehatfie | 1:5731f31f96be | 191 | timer.stop(); //Stop the Timer |
mehatfie | 1:5731f31f96be | 192 | } |
mehatfie | 1:5731f31f96be | 193 | else{ |
mehatfie | 1:5731f31f96be | 194 | //Error Out |
mehatfie | 1:5731f31f96be | 195 | return -1; |
mehatfie | 1:5731f31f96be | 196 | } |
mehatfie | 1:5731f31f96be | 197 | } |
mehatfie | 1:5731f31f96be | 198 | |
mehatfie | 2:3e7baa3e3fec | 199 | else if (lineData.word[0].compare("loop") == 0){ |
mehatfie | 2:3e7baa3e3fec | 200 | int checkLoopEnd = loopCommand(selectedFile, lineData); |
mehatfie | 1:5731f31f96be | 201 | if (checkLoopEnd == 1) |
mehatfie | 1:5731f31f96be | 202 | return 1; |
mehatfie | 1:5731f31f96be | 203 | } |
mehatfie | 1:5731f31f96be | 204 | |
mehatfie | 2:3e7baa3e3fec | 205 | else if (lineData.word[0].compare("end") == 0){ |
mehatfie | 2:3e7baa3e3fec | 206 | if (lineData.word[1].compare("program") == 0){ |
mehatfie | 1:5731f31f96be | 207 | return 0; |
mehatfie | 2:3e7baa3e3fec | 208 | } |
mehatfie | 2:3e7baa3e3fec | 209 | else if (lineData.word[1].compare("loop") == 0){ |
mehatfie | 1:5731f31f96be | 210 | return 1; |
mehatfie | 2:3e7baa3e3fec | 211 | } |
mehatfie | 1:5731f31f96be | 212 | } |
mehatfie | 1:5731f31f96be | 213 | |
mehatfie | 1:5731f31f96be | 214 | //not a keyword so check if it's a localName for a device |
mehatfie | 1:5731f31f96be | 215 | else{ |
mehatfie | 1:5731f31f96be | 216 | |
mehatfie | 1:5731f31f96be | 217 | int i = 0, deviceFound = -1; |
mehatfie | 2:3e7baa3e3fec | 218 | for (i = 0; i < devices.size(); i++){ |
mehatfie | 2:3e7baa3e3fec | 219 | if (lineData.word[0].compare(devices[i]->name) == 0) |
mehatfie | 1:5731f31f96be | 220 | deviceFound = i; |
mehatfie | 1:5731f31f96be | 221 | } |
mehatfie | 1:5731f31f96be | 222 | |
mehatfie | 1:5731f31f96be | 223 | //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 | 224 | if (deviceFound == -1){ |
mehatfie | 1:5731f31f96be | 225 | lcd.setAddress(0,3); |
mehatfie | 1:5731f31f96be | 226 | lcd.printf("Final ERROR!"); |
mehatfie | 1:5731f31f96be | 227 | wait(10); |
mehatfie | 1:5731f31f96be | 228 | } |
mehatfie | 1:5731f31f96be | 229 | |
mehatfie | 1:5731f31f96be | 230 | //Local Name matches a device, send line to that device in order to process the functionality |
mehatfie | 2:3e7baa3e3fec | 231 | else{ |
mehatfie | 2:3e7baa3e3fec | 232 | //addDevice(deviceFound); |
mehatfie | 2:3e7baa3e3fec | 233 | devices[deviceFound]->interpret(lineData); |
mehatfie | 2:3e7baa3e3fec | 234 | } |
mehatfie | 1:5731f31f96be | 235 | } |
mehatfie | 1:5731f31f96be | 236 | |
mehatfie | 1:5731f31f96be | 237 | return -1; |
mehatfie | 1:5731f31f96be | 238 | } |
mehatfie | 1:5731f31f96be | 239 | |
mehatfie | 1:5731f31f96be | 240 | |
mehatfie | 1:5731f31f96be | 241 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 242 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 243 | /****************************** <FUNCTION: main> ********************************/ |
mehatfie | 1:5731f31f96be | 244 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 245 | /**********************************************************************************************************************************/ |
mehatfie | 1:5731f31f96be | 246 | |
mehatfie | 0:22618cf06f45 | 247 | int main() { |
mehatfie | 0:22618cf06f45 | 248 | |
mehatfie | 0:22618cf06f45 | 249 | fullInit(); //Initialize anything that's required to run the code (LCD) |
mehatfie | 0:22618cf06f45 | 250 | |
mehatfie | 2:3e7baa3e3fec | 251 | struct Line lineData; |
mehatfie | 2:3e7baa3e3fec | 252 | resetLineData(lineData); |
mehatfie | 2:3e7baa3e3fec | 253 | |
mehatfie | 0:22618cf06f45 | 254 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 255 | /*** <Get all the Potential Programs> ***/ |
mehatfie | 0:22618cf06f45 | 256 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 257 | int numTextFiles = 0; |
mehatfie | 2:3e7baa3e3fec | 258 | vector<string> textFiles; //Assuming Maximum of 25 txt files will be on the SD Card |
mehatfie | 2:3e7baa3e3fec | 259 | vector<string> filenames = readFileNames("/sd"); |
mehatfie | 2:3e7baa3e3fec | 260 | numTextFiles = getFileNamesWithoutExt(textFiles, filenames); |
mehatfie | 0:22618cf06f45 | 261 | |
mehatfie | 0:22618cf06f45 | 262 | |
mehatfie | 0:22618cf06f45 | 263 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 264 | /*** <Select the Program txt File> ***/ |
mehatfie | 0:22618cf06f45 | 265 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 266 | int fileSelected = 0, selectedFileIndex = 0; |
mehatfie | 0:22618cf06f45 | 267 | |
mehatfie | 0:22618cf06f45 | 268 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 269 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 270 | lcd.printf("Select Your Program"); |
mehatfie | 0:22618cf06f45 | 271 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 272 | lcd.printf("Num Programs = %d", numTextFiles); |
mehatfie | 0:22618cf06f45 | 273 | |
mehatfie | 0:22618cf06f45 | 274 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 275 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 2:3e7baa3e3fec | 276 | |
mehatfie | 0:22618cf06f45 | 277 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, -1); //Initialize the first file to the screen |
mehatfie | 0:22618cf06f45 | 278 | while(!fileSelected) { |
mehatfie | 0:22618cf06f45 | 279 | |
mehatfie | 0:22618cf06f45 | 280 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 281 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 282 | lastButState = curButState; |
mehatfie | 0:22618cf06f45 | 283 | if(buttons.readRight()) |
mehatfie | 0:22618cf06f45 | 284 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 1); |
mehatfie | 0:22618cf06f45 | 285 | else if(buttons.readLeft()) |
mehatfie | 0:22618cf06f45 | 286 | selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 0); |
mehatfie | 0:22618cf06f45 | 287 | else if(buttons.readSel()) |
mehatfie | 0:22618cf06f45 | 288 | fileSelected = 1; |
mehatfie | 0:22618cf06f45 | 289 | } |
mehatfie | 0:22618cf06f45 | 290 | } |
mehatfie | 0:22618cf06f45 | 291 | |
mehatfie | 0:22618cf06f45 | 292 | char selectedFileName[50]; |
mehatfie | 0:22618cf06f45 | 293 | strcpy(selectedFileName, textFiles[selectedFileIndex].c_str()); |
mehatfie | 0:22618cf06f45 | 294 | |
mehatfie | 0:22618cf06f45 | 295 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 296 | /*** <Open the Program txt File> ***/ |
mehatfie | 0:22618cf06f45 | 297 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 298 | |
mehatfie | 0:22618cf06f45 | 299 | //Create the string of the full directory and path to the program txt file |
mehatfie | 0:22618cf06f45 | 300 | char selectedFileFullName[100] = "/sd/"; //Assuming that no directory and file name will be longer than 100 characters |
mehatfie | 0:22618cf06f45 | 301 | strcat(selectedFileFullName, selectedFileName); |
mehatfie | 0:22618cf06f45 | 302 | strcat(selectedFileFullName, ".txt"); |
mehatfie | 0:22618cf06f45 | 303 | |
mehatfie | 0:22618cf06f45 | 304 | FILE *selectedFile = fopen(selectedFileFullName, "r"); |
mehatfie | 2:3e7baa3e3fec | 305 | |
mehatfie | 0:22618cf06f45 | 306 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 307 | |
mehatfie | 0:22618cf06f45 | 308 | if(selectedFile == NULL) { |
mehatfie | 0:22618cf06f45 | 309 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 310 | lcd.printf("Invalid"); |
mehatfie | 0:22618cf06f45 | 311 | wait(10); |
mehatfie | 0:22618cf06f45 | 312 | } |
mehatfie | 0:22618cf06f45 | 313 | |
mehatfie | 0:22618cf06f45 | 314 | |
mehatfie | 0:22618cf06f45 | 315 | while(1){ |
mehatfie | 0:22618cf06f45 | 316 | |
mehatfie | 2:3e7baa3e3fec | 317 | resetLineData(lineData); |
mehatfie | 0:22618cf06f45 | 318 | |
mehatfie | 0:22618cf06f45 | 319 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 320 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 321 | lcd.printf("Program: %s", selectedFileName); |
mehatfie | 0:22618cf06f45 | 322 | |
mehatfie | 0:22618cf06f45 | 323 | |
mehatfie | 0:22618cf06f45 | 324 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 325 | /*** <Start Running through the Program txt File Lines> ***/ |
mehatfie | 0:22618cf06f45 | 326 | /******************************************************************************/ |
mehatfie | 0:22618cf06f45 | 327 | |
mehatfie | 0:22618cf06f45 | 328 | int endOfFile = 0; |
mehatfie | 0:22618cf06f45 | 329 | |
mehatfie | 0:22618cf06f45 | 330 | while (!endOfFile){ |
mehatfie | 0:22618cf06f45 | 331 | |
mehatfie | 2:3e7baa3e3fec | 332 | getNextLine(selectedFile, lineData); |
mehatfie | 2:3e7baa3e3fec | 333 | int checkEnd = interpretCommand(selectedFile, lineData); |
mehatfie | 2:3e7baa3e3fec | 334 | |
mehatfie | 1:5731f31f96be | 335 | if (checkEnd == 0) |
mehatfie | 1:5731f31f96be | 336 | endOfFile = 1; |
mehatfie | 0:22618cf06f45 | 337 | } |
mehatfie | 0:22618cf06f45 | 338 | |
mehatfie | 0:22618cf06f45 | 339 | |
mehatfie | 0:22618cf06f45 | 340 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 341 | lcd.setAddress(0,0); |
mehatfie | 0:22618cf06f45 | 342 | lcd.printf("END OF PROGRAM"); |
mehatfie | 0:22618cf06f45 | 343 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 344 | lcd.printf("To Restart..."); |
mehatfie | 0:22618cf06f45 | 345 | lcd.setAddress(0,3); |
mehatfie | 0:22618cf06f45 | 346 | lcd.printf("Press BACK"); |
mehatfie | 0:22618cf06f45 | 347 | |
mehatfie | 0:22618cf06f45 | 348 | while(!buttons.readBack()); |
mehatfie | 0:22618cf06f45 | 349 | |
mehatfie | 0:22618cf06f45 | 350 | lcd.setAddress(0,1); |
mehatfie | 2:3e7baa3e3fec | 351 | //rewind(selectedFile); |
mehatfie | 0:22618cf06f45 | 352 | } |
mehatfie | 0:22618cf06f45 | 353 | |
mehatfie | 2:3e7baa3e3fec | 354 | } |
mehatfie | 2:3e7baa3e3fec | 355 | |
mehatfie | 2:3e7baa3e3fec | 356 | |
mehatfie | 2:3e7baa3e3fec | 357 | |
mehatfie | 2:3e7baa3e3fec | 358 | |
mehatfie | 2:3e7baa3e3fec | 359 | |
mehatfie | 2:3e7baa3e3fec | 360 | |
mehatfie | 2:3e7baa3e3fec | 361 | |
mehatfie | 2:3e7baa3e3fec | 362 | |
mehatfie | 2:3e7baa3e3fec | 363 | |
mehatfie | 2:3e7baa3e3fec | 364 | |
mehatfie | 2:3e7baa3e3fec | 365 | |
mehatfie | 2:3e7baa3e3fec | 366 | |
mehatfie | 2:3e7baa3e3fec | 367 | |
mehatfie | 2:3e7baa3e3fec | 368 | |
mehatfie | 2:3e7baa3e3fec | 369 | |
mehatfie | 2:3e7baa3e3fec | 370 | |
mehatfie | 2:3e7baa3e3fec | 371 | |
mehatfie | 2:3e7baa3e3fec | 372 | |
mehatfie | 2:3e7baa3e3fec | 373 | |
mehatfie | 2:3e7baa3e3fec | 374 | |
mehatfie | 0:22618cf06f45 | 375 | /***** Cycle through txt lines and remember last lines ******/ |
mehatfie | 0:22618cf06f45 | 376 | /* |
mehatfie | 0:22618cf06f45 | 377 | int running = 0, selectedFile = 0; |
mehatfie | 0:22618cf06f45 | 378 | int locCount = 0, tempSpot = 0; |
mehatfie | 0:22618cf06f45 | 379 | int loc[4]; |
mehatfie | 0:22618cf06f45 | 380 | char line[32]; |
mehatfie | 0:22618cf06f45 | 381 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 382 | |
mehatfie | 0:22618cf06f45 | 383 | |
mehatfie | 0:22618cf06f45 | 384 | while(1){ |
mehatfie | 0:22618cf06f45 | 385 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 0:22618cf06f45 | 386 | while(!running) { |
mehatfie | 0:22618cf06f45 | 387 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 388 | |
mehatfie | 0:22618cf06f45 | 389 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 390 | switch(lastButState = curButState){ |
mehatfie | 0:22618cf06f45 | 391 | case 0x1F: //right |
mehatfie | 0:22618cf06f45 | 392 | |
mehatfie | 0:22618cf06f45 | 393 | loc[locCount] = ftell(fp); |
mehatfie | 0:22618cf06f45 | 394 | |
mehatfie | 0:22618cf06f45 | 395 | if (locCount >= 3) |
mehatfie | 0:22618cf06f45 | 396 | locCount = 0; |
mehatfie | 0:22618cf06f45 | 397 | else |
mehatfie | 0:22618cf06f45 | 398 | locCount++; |
mehatfie | 0:22618cf06f45 | 399 | |
mehatfie | 0:22618cf06f45 | 400 | //tempSpot = ftell(fp); |
mehatfie | 0:22618cf06f45 | 401 | fgets(line, 32, fp); |
mehatfie | 0:22618cf06f45 | 402 | |
mehatfie | 0:22618cf06f45 | 403 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 404 | lcd.printf("L: %s", line); |
mehatfie | 0:22618cf06f45 | 405 | wait(0.2); |
mehatfie | 0:22618cf06f45 | 406 | break; |
mehatfie | 0:22618cf06f45 | 407 | case 0x2F: //left |
mehatfie | 0:22618cf06f45 | 408 | |
mehatfie | 0:22618cf06f45 | 409 | if (locCount == 0) { |
mehatfie | 0:22618cf06f45 | 410 | locCount = 3; |
mehatfie | 0:22618cf06f45 | 411 | fseek(fp, loc[locCount], SEEK_SET); |
mehatfie | 0:22618cf06f45 | 412 | } |
mehatfie | 0:22618cf06f45 | 413 | else { |
mehatfie | 0:22618cf06f45 | 414 | fseek(fp, loc[locCount - 1], SEEK_SET); |
mehatfie | 0:22618cf06f45 | 415 | locCount--; |
mehatfie | 0:22618cf06f45 | 416 | } |
mehatfie | 0:22618cf06f45 | 417 | fgets(line, 32, fp); |
mehatfie | 0:22618cf06f45 | 418 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 419 | lcd.printf("L: %s", line); |
mehatfie | 0:22618cf06f45 | 420 | wait(0.2); |
mehatfie | 0:22618cf06f45 | 421 | break; |
mehatfie | 0:22618cf06f45 | 422 | } |
mehatfie | 0:22618cf06f45 | 423 | } |
mehatfie | 0:22618cf06f45 | 424 | } |
mehatfie | 0:22618cf06f45 | 425 | } |
mehatfie | 0:22618cf06f45 | 426 | */ |
mehatfie | 2:3e7baa3e3fec | 427 | |
mehatfie | 0:22618cf06f45 | 428 | |
mehatfie | 0:22618cf06f45 | 429 | |
mehatfie | 0:22618cf06f45 | 430 | /******* Select the Program txt File ***********/ |
mehatfie | 0:22618cf06f45 | 431 | /* |
mehatfie | 0:22618cf06f45 | 432 | int numTextFiles = 0; |
mehatfie | 0:22618cf06f45 | 433 | string tempTextFiles[25]; //Assuming Maximum of 25 txt files will be on the SD Card |
mehatfie | 0:22618cf06f45 | 434 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 435 | readFileNames("/sd"); |
mehatfie | 0:22618cf06f45 | 436 | numTextFiles = getFileNamesWithoutExt(tempTextFiles); |
mehatfie | 0:22618cf06f45 | 437 | |
mehatfie | 0:22618cf06f45 | 438 | string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array |
mehatfie | 0:22618cf06f45 | 439 | //delete [] tempTextFiles; //free previous array |
mehatfie | 0:22618cf06f45 | 440 | |
mehatfie | 0:22618cf06f45 | 441 | |
mehatfie | 0:22618cf06f45 | 442 | int running = 0, selectedFile = 0; |
mehatfie | 0:22618cf06f45 | 443 | |
mehatfie | 0:22618cf06f45 | 444 | lcd.cls(); //clear the display |
mehatfie | 0:22618cf06f45 | 445 | lcd.setAddress(0,1); |
mehatfie | 0:22618cf06f45 | 446 | lcd.printf("Select Your Program"); |
mehatfie | 0:22618cf06f45 | 447 | lcd.setAddress(0,2); |
mehatfie | 0:22618cf06f45 | 448 | lcd.printf("Num Programs = %d", numTextFiles); |
mehatfie | 0:22618cf06f45 | 449 | |
mehatfie | 0:22618cf06f45 | 450 | uint8_t lastButState; |
mehatfie | 0:22618cf06f45 | 451 | while(1){ |
mehatfie | 0:22618cf06f45 | 452 | lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on |
mehatfie | 0:22618cf06f45 | 453 | while(!running) { |
mehatfie | 0:22618cf06f45 | 454 | uint8_t curButState = buttons.readBus(); |
mehatfie | 0:22618cf06f45 | 455 | |
mehatfie | 0:22618cf06f45 | 456 | if(curButState != lastButState){ |
mehatfie | 0:22618cf06f45 | 457 | switch(lastButState = curButState){ |
mehatfie | 0:22618cf06f45 | 458 | case 0x1F: //right |
mehatfie | 0:22618cf06f45 | 459 | selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 1); |
mehatfie | 0:22618cf06f45 | 460 | break; |
mehatfie | 0:22618cf06f45 | 461 | case 0x2F: //left |
mehatfie | 0:22618cf06f45 | 462 | selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 0); |
mehatfie | 0:22618cf06f45 | 463 | break; |
mehatfie | 0:22618cf06f45 | 464 | } |
mehatfie | 0:22618cf06f45 | 465 | } |
mehatfie | 0:22618cf06f45 | 466 | } |
mehatfie | 0:22618cf06f45 | 467 | } |
mehatfie | 0:22618cf06f45 | 468 | |
mehatfie | 0:22618cf06f45 | 469 | */ |
mehatfie | 0:22618cf06f45 | 470 | |
mehatfie | 0:22618cf06f45 | 471 | /*float speed = 0.5; |
mehatfie | 0:22618cf06f45 | 472 | while(1){ |
mehatfie | 0:22618cf06f45 | 473 | bridges.drive(1, -1*speed); |
mehatfie | 0:22618cf06f45 | 474 | wait(2); |
mehatfie | 0:22618cf06f45 | 475 | bridges.drive(1, speed); |
mehatfie | 0:22618cf06f45 | 476 | wait(2); |
mehatfie | 0:22618cf06f45 | 477 | }*/ |
mehatfie | 0:22618cf06f45 | 478 | |
mehatfie | 0:22618cf06f45 | 479 | //BridgeDriver::MOTOR_A |