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:
- 0:22618cf06f45
- Child:
- 1:5731f31f96be
diff -r 000000000000 -r 22618cf06f45 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Sep 16 15:28:59 2014 +0000 @@ -0,0 +1,401 @@ + +#include "mbed.h" +#include "LocalPinNames.h" +#include "BridgeDriver.h" +#include "FrontPanelButtons.h" +#include "TextLCD.h" +#include "SDFileSystem.h" +#include "Initialization.hpp" +//#include "DeviceClasses.h" +#include "Device.hpp" +//#include "Motor.hpp" +//#include "VoltageDriver.hpp" +#include "TextFile.h" +#include <stdio.h> +#include <string> +#include <stdlib.h> +#include <iostream> +#include <fstream> +#include <vector> +using std::string; + +//const int MAX_LINE_LENGTH = 100; +struct Line lineData; +//Device devices[15]; +DeviceData devices[15]; + +//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 +http://stackoverflow.com/questions/12475915/rewind-stream-pointer-to-the-line-back + +recurrsive +*/ + +void resetLineData(){ + + lineData.fullLine = NULL; + lineData.lineNumber = 0; + 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 + + + */ + + + +int cyclePrograms(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 +} + + +string* resize_StringArr(string oldArr[], int newSize) { + + string newArr[newSize]; + memcpy(newArr, oldArr, newSize * sizeof(string)); + + return newArr; +} + + +int main() { + + fullInit(); //Initialize anything that's required to run the code (LCD) + + /******************************************************************************/ + /*** <Get all the Potential Programs> ***/ + /******************************************************************************/ + int numTextFiles = 0; + string tempTextFiles[25]; //Assuming Maximum of 25 txt files will be on the SD Card + lcd.cls(); //clear the display + + vector<string> filenames = readFileNames("/sd"); + numTextFiles = getFileNamesWithoutExt(tempTextFiles, filenames); + string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array + + //delete [] tempTextFiles; //free previous array + + + /******************************************************************************/ + /*** <Select the Program txt File> ***/ + /******************************************************************************/ + int fileSelected = 0, selectedFileIndex = 0; + + lcd.cls(); //clear the display + lcd.setAddress(0,1); + lcd.printf("Select Your Program"); + lcd.setAddress(0,2); + lcd.printf("Num Programs = %d", numTextFiles); + + uint8_t lastButState; + lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on + + selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, -1); //Initialize the first file to the screen + while(!fileSelected) { + + uint8_t curButState = buttons.readBus(); + if(curButState != lastButState){ + lastButState = curButState; + if(buttons.readRight()) + selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 1); + else if(buttons.readLeft()) + selectedFileIndex = cyclePrograms(textFiles, numTextFiles, selectedFileIndex, 0); + else if(buttons.readSel()) + fileSelected = 1; + } + } + + char selectedFileName[50]; + strcpy(selectedFileName, textFiles[selectedFileIndex].c_str()); + + /******************************************************************************/ + /*** <Open the Program txt File> ***/ + /******************************************************************************/ + + //Create the string of the full directory and path to the program txt file + char selectedFileFullName[100] = "/sd/"; //Assuming that no directory and file name will be longer than 100 characters + strcat(selectedFileFullName, selectedFileName); + strcat(selectedFileFullName, ".txt"); + + FILE *selectedFile = fopen(selectedFileFullName, "r"); + lcd.cls(); //clear the display + + if(selectedFile == NULL) { + lcd.setAddress(0,0); + lcd.printf("Invalid"); + wait(10); + } + + + while(1){ + + resetLineData(); + + lcd.cls(); //clear the display + lcd.setAddress(0,0); + lcd.printf("Program: %s", selectedFileName); + + + /******************************************************************************/ + /*** <Start Running through the Program txt File Lines> ***/ + /******************************************************************************/ + + int endOfFile = 0; + + 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); + } + + 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.cls(); //clear the display + lcd.setAddress(0,0); + lcd.printf("END OF PROGRAM"); + lcd.setAddress(0,2); + lcd.printf("To Restart..."); + lcd.setAddress(0,3); + lcd.printf("Press BACK"); + + while(!buttons.readBack()); + + lcd.setAddress(0,1); + rewind(selectedFile); + } + + + /***** Cycle through txt lines and remember last lines ******/ + /* + int running = 0, selectedFile = 0; + int locCount = 0, tempSpot = 0; + int loc[4]; + char line[32]; + uint8_t lastButState; + + + while(1){ + lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on + while(!running) { + uint8_t curButState = buttons.readBus(); + + if(curButState != lastButState){ + switch(lastButState = curButState){ + case 0x1F: //right + + loc[locCount] = ftell(fp); + + if (locCount >= 3) + locCount = 0; + else + locCount++; + + //tempSpot = ftell(fp); + fgets(line, 32, fp); + + lcd.setAddress(0,1); + lcd.printf("L: %s", line); + wait(0.2); + break; + case 0x2F: //left + + if (locCount == 0) { + locCount = 3; + fseek(fp, loc[locCount], SEEK_SET); + } + else { + fseek(fp, loc[locCount - 1], SEEK_SET); + locCount--; + } + fgets(line, 32, fp); + lcd.setAddress(0,1); + lcd.printf("L: %s", line); + wait(0.2); + break; + } + } + } + } + */ + + + + + + /******* Select the Program txt File ***********/ + /* + int numTextFiles = 0; + string tempTextFiles[25]; //Assuming Maximum of 25 txt files will be on the SD Card + lcd.cls(); //clear the display + readFileNames("/sd"); + numTextFiles = getFileNamesWithoutExt(tempTextFiles); + + string *textFiles = resize_StringArr(tempTextFiles, numTextFiles); //Resize Array + //delete [] tempTextFiles; //free previous array + + + int running = 0, selectedFile = 0; + + lcd.cls(); //clear the display + lcd.setAddress(0,1); + lcd.printf("Select Your Program"); + lcd.setAddress(0,2); + lcd.printf("Num Programs = %d", numTextFiles); + + uint8_t lastButState; + while(1){ + lcd.setCursor(TextLCD::CurOn_BlkOn); //turn blinking cursor on + while(!running) { + uint8_t curButState = buttons.readBus(); + + if(curButState != lastButState){ + switch(lastButState = curButState){ + case 0x1F: //right + selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 1); + break; + case 0x2F: //left + selectedFile = cyclePrograms(textFiles, numTextFiles, selectedFile, 0); + break; + } + } + } + } + + */ + + + + + } + + + + + + + + + + /*float speed = 0.5; + while(1){ + bridges.drive(1, -1*speed); + wait(2); + bridges.drive(1, speed); + wait(2); + }*/ + +//BridgeDriver::MOTOR_A \ No newline at end of file