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
mainFunctions.cpp
- Committer:
- mehatfie
- Date:
- 2014-09-24
- Revision:
- 9:5a0c4c6e39c7
File content as of revision 9:5a0c4c6e39c7:
//#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;
//}