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
- Committer:
- mehatfie
- Date:
- 2014-09-16
- Revision:
- 1:5731f31f96be
- Parent:
- 0:22618cf06f45
- Child:
- 2:3e7baa3e3fec
File content as of revision 1:5731f31f96be:
#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];
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
http://stackoverflow.com/questions/12475915/rewind-stream-pointer-to-the-line-back
recurrsive
*/
int interpretCommand(FILE *);
int loopCommand(FILE *);
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
/*************************** <FUNCTION: resetLineData> **************************/
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
void resetLineData(){
lineData.fullLine = NULL;
lineData.lineNumber = 0;
lineData.numWords = 0;
}
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
/************************ <FUNCTION: cyclePrograms> *****************************/
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
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
}
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
/************************** <FUNCTION: resize_StringArr> ************************/
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
string* resize_StringArr(string oldArr[], int newSize) {
string newArr[newSize];
memcpy(newArr, oldArr, newSize * sizeof(string));
return newArr;
}
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
/************************** <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)
/******************************************************************************/
/*** <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);
int checkEnd = interpretCommand(selectedFile);
lcd.setAddress(0,3);
lcd.printf("TEST3 ");
if (checkEnd == 0)
endOfFile = 1;
}
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