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: mainFunctions.cpp
- Revision:
- 9:5a0c4c6e39c7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mainFunctions.cpp Wed Sep 24 22:23:00 2014 +0000 @@ -0,0 +1,431 @@ +//#include "mainFunctions.hpp" +// +///******************************************************************************/ +///*** <Function: cyclePrograms> ***/ +///******************************************************************************/ +// +//int cyclePrograms(vector<string> files, int SIZE, int currIndex, int direction){ +// +// int nextIndex = 0; +// switch(direction){ +// case 0: //Cycle Back one File +// if ((currIndex - 1) < 0) +// nextIndex = SIZE - 1; +// else +// nextIndex = currIndex - 1; +// break; +// case 1: //Cycle Forward one File +// if ((currIndex + 1) >= SIZE) +// nextIndex = 0; +// else +// nextIndex = currIndex + 1; +// break; +// case -1: //set the selectedFile to the currIndex (used for initialization) +// nextIndex = currIndex; +// break; +// } +// +// //Output file on Display +// lcd.setAddress(0,3); +// lcd.printf(" "); // Clear the Line using Spaces (Emptyness) - Note one line is 20 Characters +// wait(.2); +// lcd.setAddress(0,3); +// lcd.printf("%s", files[nextIndex]); +// +// return nextIndex; // Return the file index in the Array +//} +// +///******************************************************************************/ +///*** <Function: resetLineData> ***/ +///******************************************************************************/ +// +//void resetLineData(LineData &lineData){ +// +// lineData.lineNumber = 0; +// lineData.numWords = 0; +// lineData.lineAddress = 0; +//} +// +///******************************************************************************/ +///*** <Function: interpretCommand> ***/ +///******************************************************************************/ +// +//int interpretCommand(FILE *selectedFile, LineData &lineData){ +// +// if (lineData.word[0].compare("device") == 0){ +// +// int i = 0, deviceFound = -1; +// for (i = 0; i < numDevices; i++){ +// if (lineData.word[2].compare(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{ +// devices.push_back(Device::newDevice(deviceFound, lineData.word[1], lineData)); +// devices.back()->name = lineData.word[1]; +// } +// } +// +// else if (lineData.word[0].compare("delay") == 0){ +// string duration = lineData.word[1]; +// int durationValue = 0; +// sscanf(duration.c_str(), "%d", &durationValue); +// +// 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 (lineData.word[0].compare("loop") == 0){ +// int checkLoopEnd = loopCommand(selectedFile, lineData); +// if (checkLoopEnd == 1) +// return 1; +// } +// +// else if (lineData.word[0].compare("condition") == 0){ +// int checkLoopEnd = conditionCommand(selectedFile, lineData); +// if (checkLoopEnd == 1) +// return 2; +// } +// // end with custom return value for specific function +// else if (lineData.word[0].compare("end") == 0){ +// if (lineData.word[1].compare("program") == 0){ +// return 2; +// } +// else if (lineData.word[1].compare("loop") == 0){ +// return 3; +// } +// else if (lineData.word[1].compare("condition") == 0){ +// return 4; +// } +// } +// +// //not a keyword so check if it's a localName for a device +// else{ +// +// int i = 0, deviceFound = -1; +// for (i = 0; i < devices.size(); i++){ +// if (lineData.word[0].compare(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); +// return devices[deviceFound]->interpret(lineData); +// } +// } +// +// return -1; +//} +// +///******************************************************************************/ +///*** <Function: loopCommand> ***/ +///******************************************************************************/ +// +//int loopCommand(FILE *selectedFile, LineData &lineData){ +// +// //Get the Condition value for number of times to loop +// string loopCondition = lineData.word[1]; +// int loopConditionValue = 0; +// sscanf(loopCondition.c_str(), "%d", &loopConditionValue); +// +// int loopStartAddress = 0, loopLineNumber = 0, firstLineOfLoop = 1; +// +// lcd.setAddress(0,0); +// lcd.printf("Cycle 1 of %d", loopConditionValue); +// +// Timer cycleTimer; +// float totalLoopTime = 0; +// cycleTimer.reset(); +// cycleTimer.start(); +// +// int counter = 1, checkEnd = 0; +// while (counter <= loopConditionValue){ +// +// getNextLine(selectedFile, lineData); +// +// //Must get the address before entering the interpret command +// // if a Condition command is immediately after, and the condition fails, then +// // the interpret command will return the line at the "end condition" line, and therefore +// // set the loop's first line to be the "end condition" line, if interpretCommand is called BEFORE setting the first loop line address +// if (firstLineOfLoop){ +// loopStartAddress = lineData.lineAddress; //Save the Line Address +// loopLineNumber = lineData.lineNumber; //Save the Line Number +// firstLineOfLoop = 0; +// } +// +// checkEnd = interpretCommand(selectedFile, lineData); +// +// //Increase the loop counter and go back to the beginning of the loop +// if (checkEnd == 3){ +// +// //Output the Avg Cycle Time +// cycleTimer.stop(); +// totalLoopTime += cycleTimer.read(); +// +// lcd.setAddress(0,1); +// lcd.printf("Avg t(sec): %1.3f", (totalLoopTime / counter)); +// +// //Output Cycle Number +// counter++; +// lcd.setAddress(0,0); +// lcd.printf("Cycle %d of %d", counter, loopConditionValue); +// +// fseek(selectedFile, loopStartAddress, SEEK_SET); +// lineData.lineNumber = loopLineNumber - 2; +// checkEnd = 0; +// +// //Restart the timer for the next loop +// cycleTimer.reset(); +// cycleTimer.start(); +// } +// } +// +// return 1; +// } +// +///******************************************************************************/ +///*** <Function: conditionCommand> ***/ +///******************************************************************************/ +// +//int conditionCommand(FILE *selectedFile, LineData &lineData){ +// +// //Get the number of condition parameters +// string numConditionVals = lineData.word[1]; +// int numConditionValues = 0; +// sscanf(numConditionVals.c_str(), "%d", &numConditionValues); +// +// //LineData tempLineData; +// LineData param[15]; +// //vector<LineData> param; +// vector<ConditionOp> paramCondition; +// +// +// //Fill the param Vector with Line structs of each individual device, this way we can send the Line struct to the appropriate interpret function without modification within the function itself +// int i = 2, numParam = 0, paramNumWords = 0; +// for (i = 2; i < lineData.numWords; i++){ +// +// // if the word is not an AND or an OR, it must mean it's for the specific function +// // set the current parameter's next word to be equal to the current word we're checking +// // increase number of words that the parameter has +// if (lineData.word[i] != "AND" && lineData.word[i] != "xAND" && lineData.word[i] != "OR" && lineData.word[i] != "xOR"){ +// +// //tempLineData.word[paramNumWords] = lineData.word[i]; +// param[numParam].word[paramNumWords] = lineData.word[i]; +// paramNumWords++; +// +// //if this is the last word in the line.... +// if(i == (lineData.numWords - 1)){ +// param[numParam].numWords = paramNumWords; +// paramCondition[numParam].op = NONE; +// numParam++; +// } +// +// } +// +// // if the word is an AND or an OR, it must mean the last function has been completely identified +// // set the parameters number of Words value to the calculated value +// // increase the number of Parameters (the current parameter function we're filling) +// else if (lineData.word[i].compare("AND") == 0 || lineData.word[i].compare("xAND") == 0 || lineData.word[i].compare("OR") == 0 || lineData.word[i].compare("xOR") == 0){ +// +// //tempLineData.numWords = paramNumWords; +// param[numParam].numWords = paramNumWords; +// +// paramCondition.push_back(ConditionOp()); +// if (lineData.word[i].compare("AND") == 0) +// paramCondition[numParam].op = AND; +// else if (lineData.word[i].compare("xAND") == 0) +// paramCondition[numParam].op = xAND; +// else if (lineData.word[i].compare("OR") == 0) +// paramCondition[numParam].op = OR; +// else if (lineData.word[i].compare("xOR") == 0) +// paramCondition[numParam].op = xOR; +// +// //param.push_back(LineData()); +// //param[numParam] = tempLineData; +// //param.push_back(tempLineData); //add it to the vector list of parameters +// //tempLineData = LineData(); //reset +// numParam++; // increase the index of param +// paramNumWords = 0; // reset the number of words +// } +// } +// +// +// vector<ConditionOp> combinedCondition; +// ConditionOp tempCombinedCondition; +// int j = 0, k = 0; +// for (j = 0; j < numParam; j++){ +// paramCondition[j].value = interpretCommand(selectedFile, param[j]); +// } +// +// //create the combined Condition vector (take care of this xAND and xOR statements and combine them into one so that the whole vector is just AND's and OR's) +// //this should make the xAND's / xOR's into a single member of the combinedCondition vector +// enum ConditionType prevCondition = NONE; +// int first = 1, last = 0; +// for (k = 0; k < numParam; k++){ +// +// if (k == numParam - 1) +// last = 1; +// +// if (!last){ +// if (paramCondition[k].op != xAND && paramCondition[k].op != xOR && paramCondition[k + 1].op != xAND && paramCondition[k + 1].op != xOR){ +// //AND +// if (paramCondition[k].op == AND){ +// if (!first && prevCondition != xAND && prevCondition != xOR) +// combinedCondition.back().value = combinedCondition.back().value && paramCondition[k + 1].value; +// else if (first || prevCondition == xAND || prevCondition == xOR){ +// tempCombinedCondition.value = paramCondition[k].value && paramCondition[k + 1].value; +// combinedCondition.push_back(tempCombinedCondition); +// first = 0; +// } +// prevCondition = AND; +// } +// +// //OR +// else if (paramCondition[k].op == OR){ +// if (!first && prevCondition != xAND && prevCondition != xOR) +// combinedCondition.back().value = combinedCondition.back().value || paramCondition[k + 1].value; +// else if (first || prevCondition == xAND || prevCondition == xOR){ +// tempCombinedCondition.value = paramCondition[k].value || paramCondition[k + 1].value; +// combinedCondition.push_back(tempCombinedCondition); +// first = 0; +// } +// prevCondition = OR; +// } +// } +// +// // first value is something, not exclusive, but next values are exclusive +// else if (first && (paramCondition[k].op == AND || paramCondition[k].op == OR) && (paramCondition[k + 1].op == xAND || paramCondition[k + 1].op == xOR)){ +// tempCombinedCondition.value = paramCondition[k].value; +// tempCombinedCondition.op = paramCondition[k].op; +// combinedCondition.push_back(tempCombinedCondition); +// prevCondition = paramCondition[k].op; +// first = 0; +// } +// +// else{ +// //xAND +// if (paramCondition[k].op == xAND){ +// if (combinedCondition.size() == 0){ // No values so start a new combinedCondition +// tempCombinedCondition.value = paramCondition[k].value && paramCondition[k + 1].value; +// tempCombinedCondition.op = xAND; +// combinedCondition.push_back(tempCombinedCondition); +// prevCondition = xAND; +// } +// else{ +// if (combinedCondition.back().op == xAND){ // AND the value to the back most combinedCondition +// combinedCondition.back().value = combinedCondition.back().value && paramCondition[k + 1].value; +// prevCondition = xAND; +// } +// else if (combinedCondition.back().op != xAND){ // Start a new combinedCondition +// tempCombinedCondition.value = paramCondition[k].value && paramCondition[k + 1].value; +// tempCombinedCondition.op = xAND; +// combinedCondition.push_back(tempCombinedCondition); +// prevCondition = xAND; +// } +// } +// +// } +// +// //xOR +// else if (paramCondition[k].op == xOR){ +// if (combinedCondition.size() == 0){ // No values so start a new combinedCondition +// tempCombinedCondition.value = paramCondition[k].value || paramCondition[k + 1].value; +// tempCombinedCondition.op = xOR; +// combinedCondition.push_back(tempCombinedCondition); +// prevCondition = xOR; +// } +// else{ +// if (combinedCondition.back().op == xOR){ // OR the value to the back most combinedCondition +// combinedCondition.back().value = combinedCondition.back().value || paramCondition[k + 1].value; +// prevCondition = xOR; +// } +// else if (combinedCondition.back().op != xOR){ // Start a new combinedCondition +// tempCombinedCondition.value = paramCondition[k].value || paramCondition[k + 1].value; +// tempCombinedCondition.op = xOR; +// combinedCondition.push_back(tempCombinedCondition); +// prevCondition = xOR; +// } +// } +// +// } +// +// // Since the k + 1 value is included in the xAND or xOR exclusively, skip checking that value, and add the appropriate AND / OR as the +// // operator of this exclusive xAND / xOR set +// if ((paramCondition[k + 1].op == AND || paramCondition[k + 1].op == OR) && (prevCondition == xAND || prevCondition == xOR)){ +// combinedCondition.back().op = paramCondition[k + 1].op; +// k++; +// } +// +// } +// } +// +// +// // the last value was not included in any combination, since directly before the last value was an xAND / xOR set that +// // included the very last AND / OR as the set's operator, yet there is still another value that has not been combined, as it is supposed +// // to be AND /OR to the exclusive xAND / xOR set +// else if (last && (prevCondition == xAND || prevCondition == xOR) && (combinedCondition.back().op == AND || combinedCondition.back().op == OR)){ +// tempCombinedCondition.value = paramCondition[k].value; +// tempCombinedCondition.op = NONE; +// combinedCondition.push_back(tempCombinedCondition); +// } +// +// //reset the tempCombinedCondition variable +// tempCombinedCondition = ConditionOp(); +// } +// +// +// // run through all values in the combined Condition vector, AND'ing / OR'ing as appropriate +// // in the end, the last value in the array should be the final condition of the Condition statement... whether it was successful or failed +// for (i = 0; i < (combinedCondition.size() - 1); i++){ +// if (combinedCondition[i].op == AND) +// combinedCondition[i + 1].value = combinedCondition[i].value && combinedCondition[i + 1].value; +// else if (combinedCondition[i].op == OR) +// combinedCondition[i + 1].value = combinedCondition[i].value || combinedCondition[i + 1].value; +// } +// +// int conditionSuccess = combinedCondition.back().value; //value is the success(1) or failure(0) of the condition statement +// +// int checkEnd = 0; +// if (!conditionSuccess){ +// +// while (checkEnd != 4){ +// +// getNextLine(selectedFile, lineData); +// +// // check if the first word is an end command (avoids interpreting functions that perform actions) +// if (lineData.word[0].compare("end") == 0) +// checkEnd = interpretCommand(selectedFile, lineData); +// +// if (checkEnd == 4) // custom return value for this function +// return 0; +// } +// } +// +// // Return success as the function either met the condition and will continue from the next line, or +// // failed to meet the condition and ran through the lines inside the condition until "end condition" was found, therefore +// // the program will proceed from the line after the "end condition" line +// return 1; +//} \ No newline at end of file