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
Diff: main.cpp
- Revision:
- 1:5731f31f96be
- Parent:
- 0:22618cf06f45
- Child:
- 2:3e7baa3e3fec
--- a/main.cpp Tue Sep 16 15:28:59 2014 +0000 +++ b/main.cpp Tue Sep 16 18:27:41 2014 +0000 @@ -24,6 +24,8 @@ //Device devices[15]; DeviceData devices[15]; +FrontPanelButtons buttons(&i2c); + //extern "C" void mbed_reset(); //enable software reset of code /* http://stackoverflow.com/questions/3081289/how-to-read-a-line-from-a-text-file-in-c-c @@ -32,6 +34,16 @@ recurrsive */ + + +int interpretCommand(FILE *); +int loopCommand(FILE *); + +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/*************************** <FUNCTION: resetLineData> **************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ void resetLineData(){ lineData.fullLine = NULL; @@ -39,38 +51,14 @@ lineData.numWords = 0; } -FrontPanelButtons buttons(&i2c); - - -/* - Make LOOP function - - All you need to do is remember (val = ftell(fp)) the beginning of the line you're currently reading. - - 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. - - - func LOOP (FILE *fp, int loopStart){ - - string conditions; - fseek(fp, loopStart, SEEK_SET); - fgets(conditions, MAX_LINE_LENGTH, fp); - - int numCycles = interpretLoopCondtions(); - - int i = 0; - int checkEndLoop = 0; - while (i < numCycles) { - - checkEndLoop = interpretLine(fp); //if end Loop return ____ (1?), return 0 on success - if (checkEndLoop) //if it's not the end of the loop, the counter will not increase and we'll just interpret the next line - i++; - } - } //loop conditions met, return to main code - - - */ - +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/************************ <FUNCTION: cyclePrograms> *****************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ + int cyclePrograms(string files[], int SIZE, int currIndex, int direction){ int nextIndex = 0; @@ -102,7 +90,13 @@ return nextIndex; // Return the file index in the Array } - + +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/************************** <FUNCTION: resize_StringArr> ************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ + string* resize_StringArr(string oldArr[], int newSize) { string newArr[newSize]; @@ -112,6 +106,178 @@ } +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/************************** <FUNCTION: loopCommand> *****************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ + +int loopCommand(FILE *selectedFile){ + + char *loopCondition = lineData.word[1]; + int loopConditionValue = atoi(loopCondition); + int loopStartAddress = 0, loopLineNumber = 0; + int firstLineOfLoop = 1; + + int counter = 0; + while (counter < loopConditionValue){ + + getNextLine(selectedFile); + /*lcd.setAddress(0,2); + lcd.printf("wrd1: %s", lineData.word[0]); + lcd.setAddress(0,3); + lcd.printf("TEST012 ");*/ + + int checkEnd = interpretCommand(selectedFile); + /*lcd.setAddress(0,3); + lcd.printf("TEST022 "); + wait(2);*/ + + if (firstLineOfLoop){ + loopStartAddress = lineData.lineAddress; //Save the Line Address + loopLineNumber = lineData.lineNumber; //Save the Line Number + firstLineOfLoop = 0; + /* lcd.setAddress(0,2); + lcd.printf("ldLN: %d, ldLA: %d", lineData.lineNumber, lineData.lineAddress); + lcd.setAddress(0,3); + lcd.printf("lln: %d, lsa: %d", loopLineNumber, loopStartAddress); + wait(3);*/ + } + + //Increase the loop counter and go back to the beginning of the loop + if (checkEnd == 1){ + lcd.setAddress(0,2); + lcd.printf("%dldLN: %d, ldLA: %d", counter, lineData.lineNumber, lineData.lineAddress); + lcd.setAddress(0,3); + lcd.printf("%dlln: %d, lsa: %d", counter, loopLineNumber, loopStartAddress); + wait(3); + + counter++; + fseek(selectedFile, loopStartAddress, SEEK_SET); + lineData.lineNumber = loopLineNumber - 1; + } + } + + lcd.setAddress(0,3); + lcd.printf("TEST1 "); + + return 1; + } + + /* + Make LOOP function + - All you need to do is remember (val = ftell(fp)) the beginning of the line you're currently reading. + - 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. + + + func LOOP (FILE *fp, int loopStart){ + + string conditions; + fseek(fp, loopStart, SEEK_SET); + fgets(conditions, MAX_LINE_LENGTH, fp); + + int numCycles = interpretLoopCondtions(); + + int i = 0; + int checkEndLoop = 0; + while (i < numCycles) { + + checkEndLoop = interpretLine(fp); //if end Loop return ____ (1?), return 0 on success + if (checkEndLoop) //if it's not the end of the loop, the counter will not increase and we'll just interpret the next line + i++; + } + } //loop conditions met, return to main code + + + */ + +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/************************* <FUNCTION: interpretCommand> *************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ + +int interpretCommand(FILE *selectedFile){ + + if (strncmp(lineData.word[0],"device", 6) == 0){ + + int i = 0, deviceFound = -1; + for (i = 0; i < numDevices; i++) + if (strncmp(lineData.word[2], DeviceNames[i], strlen(DeviceNames[i])) == 0) + deviceFound = i; + + //if the device type does not match any known type, error out + if (deviceFound == -1){ + //Error Out since the device Name was not matched with anything ************************* + } + + //Add device to the array of devices and initialize it + else + addDevice(deviceFound); + } + + else if (strncmp(lineData.word[0],"delay", 5) == 0){ + char *duration = lineData.word[1]; + int durationValue = atoi(duration); + + if (durationValue){ + timer.reset(); + timer.start(); + while (timer.read_ms() < durationValue); //Do Nothing while the timer has not reached the duration + timer.stop(); //Stop the Timer + } + else{ + //Error Out + return -1; + } + } + + else if (strncmp(lineData.word[0],"loop", 4) == 0){ + int checkLoopEnd = loopCommand(selectedFile); + lcd.setAddress(0,3); + lcd.printf("TEST2 "); + if (checkLoopEnd == 1) + return 1; + } + + else if (strncmp(lineData.word[0],"end", 3) == 0){ + if (strncmp(lineData.word[1],"program", 7) == 0) + return 0; + else if (strncmp(lineData.word[1],"loop", 4) == 0) + return 1; + } + + //not a keyword so check if it's a localName for a device + else{ + + int i = 0, deviceFound = -1; + for (i = 0; i < currNumDevices; i++){ + if (strncmp(lineData.word[0], devices[i].name, strlen(devices[i].name)) == 0) + deviceFound = i; + } + + //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 + if (deviceFound == -1){ + lcd.setAddress(0,3); + lcd.printf("Final ERROR!"); + wait(10); + } + + //Local Name matches a device, send line to that device in order to process the functionality + else + addDevice(deviceFound);//devices[deviceFound].interpret(); + } + + return -1; +} + + +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ +/****************************** <FUNCTION: main> ********************************/ +/**********************************************************************************************************************************/ +/**********************************************************************************************************************************/ + int main() { fullInit(); //Initialize anything that's required to run the code (LCD) @@ -127,7 +293,7 @@ numTextFiles = getFileNamesWithoutExt(tempTextFiles, filenames); string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array - //delete [] tempTextFiles; //free previous array + //delete[] tempTextFiles; //free previous array /******************************************************************************/ @@ -199,68 +365,13 @@ while (!endOfFile){ getNextLine(selectedFile); - - if (strncmp(lineData.word[0],"device", 6) == 0){ - - int i = 0, deviceFound = -1; - for (i = 0; i < numDevices; i++) - if (strncmp(lineData.word[2], DeviceNames[i], strlen(DeviceNames[i])) == 0) - deviceFound = i; - - //if the device type does not match any known type, error out - if (deviceFound == -1){ - //Error Out since the device Name was not matched with anything ************************* - } - - //Add device to the array of devices and initialize it - else - addDevice(deviceFound); - } + int checkEnd = interpretCommand(selectedFile); - else if (strncmp(lineData.word[0],"delay", 5) == 0){ - char *duration = lineData.word[1]; - int durationValue = atoi(duration); - - if (durationValue){ - timer.reset(); - timer.start(); - while (timer.read_ms() < durationValue); //Do Nothing while the timer has not reached the duration - timer.stop(); //Stop the Timer - } - else{ - //Error Out - } - } - - else if (strncmp(lineData.word[0],"loop", 4) == 0){ - //Do something for looping - } - - else if (strncmp(lineData.word[0],"end", 3) == 0){ - if (strncmp(lineData.word[1],"program", 7) == 0) - endOfFile = 1; - } - - //not a keyword so check if it's a localName for a device - else{ - - int i = 0, deviceFound = -1; - for (i = 0; i < currNumDevices; i++){ - if (strncmp(lineData.word[0], devices[i].name, strlen(devices[i].name)) == 0) - deviceFound = i; - } - - //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 - if (deviceFound == -1){ - lcd.setAddress(0,3); - lcd.printf("Final ERROR!"); - wait(10); - } - - //Local Name matches a device, send line to that device in order to process the functionality - else - addDevice(deviceFound);//devices[deviceFound].interpret(); - } + lcd.setAddress(0,3); + lcd.printf("TEST3 "); + + if (checkEnd == 0) + endOfFile = 1; }