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:
- 2:3e7baa3e3fec
- Parent:
- 1:5731f31f96be
- Child:
- 3:078e9a1e8be3
--- a/main.cpp Tue Sep 16 18:27:41 2014 +0000
+++ b/main.cpp Thu Sep 18 23:38:11 2014 +0000
@@ -7,22 +7,22 @@
#include "SDFileSystem.h"
#include "Initialization.hpp"
//#include "DeviceClasses.h"
-#include "Device.hpp"
-//#include "Motor.hpp"
-//#include "VoltageDriver.hpp"
+//#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];
+//struct Line lineData;
+
+
+//DeviceData devices[15];
FrontPanelButtons buttons(&i2c);
@@ -36,19 +36,20 @@
-int interpretCommand(FILE *);
-int loopCommand(FILE *);
+int interpretCommand(FILE *, Line &);
+int loopCommand(FILE *, Line &);
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
/*************************** <FUNCTION: resetLineData> **************************/
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
-void resetLineData(){
+void resetLineData(Line &lineData){
- lineData.fullLine = NULL;
+ //lineData.fullLine.clear();
lineData.lineNumber = 0;
lineData.numWords = 0;
+ lineData.lineAddress = 0;
}
@@ -59,7 +60,7 @@
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
-int cyclePrograms(string files[], int SIZE, int currIndex, int direction){
+int cyclePrograms(vector<string> files, int SIZE, int currIndex, int direction){
int nextIndex = 0;
switch(direction){
@@ -112,84 +113,41 @@
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
-int loopCommand(FILE *selectedFile){
+int loopCommand(FILE *selectedFile, Line &lineData){
- char *loopCondition = lineData.word[1];
- int loopConditionValue = atoi(loopCondition);
- int loopStartAddress = 0, loopLineNumber = 0;
- int firstLineOfLoop = 1;
+ //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 counter = 0;
+ int loopStartAddress = 0, loopLineNumber = 0, firstLineOfLoop = 1;
+
+ int counter = 0, checkEnd = 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);*/
+ getNextLine(selectedFile, lineData);
+ checkEnd = interpretCommand(selectedFile, lineData);
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){
+ counter++;
+
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++;
+ lcd.printf("Loop Cycle %d of %d", counter, loopConditionValue);
+
fseek(selectedFile, loopStartAddress, SEEK_SET);
- lineData.lineNumber = loopLineNumber - 1;
+ lineData.lineNumber = loopLineNumber - 2;
}
}
-
- 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
-
-
- */
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
@@ -197,14 +155,15 @@
/**********************************************************************************************************************************/
/**********************************************************************************************************************************/
-int interpretCommand(FILE *selectedFile){
-
- if (strncmp(lineData.word[0],"device", 6) == 0){
-
+int interpretCommand(FILE *selectedFile, Line &lineData){
+
+ if (lineData.word[0].compare("device") == 0){
+
int i = 0, deviceFound = -1;
- for (i = 0; i < numDevices; i++)
- if (strncmp(lineData.word[2], DeviceNames[i], strlen(DeviceNames[i])) == 0)
+ for (i = 0; i < numDevices; i++){
+ if (lineData.word[2].compare(DeviceNames[i]))
deviceFound = i;
+ }
//if the device type does not match any known type, error out
if (deviceFound == -1){
@@ -212,13 +171,18 @@
}
//Add device to the array of devices and initialize it
- else
- addDevice(deviceFound);
+ else{
+ //For some reason the enum is indexed weirdly, device-- to send correct value
+ deviceFound--;
+ devices.push_back(Device::newDevice(deviceFound, lineData.word[1], lineData));
+ devices.back()->name = lineData.word[1];
+ }
}
- else if (strncmp(lineData.word[0],"delay", 5) == 0){
- char *duration = lineData.word[1];
- int durationValue = atoi(duration);
+ 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();
@@ -232,27 +196,27 @@
}
}
- else if (strncmp(lineData.word[0],"loop", 4) == 0){
- int checkLoopEnd = loopCommand(selectedFile);
- lcd.setAddress(0,3);
- lcd.printf("TEST2 ");
+ else if (lineData.word[0].compare("loop") == 0){
+ int checkLoopEnd = loopCommand(selectedFile, lineData);
if (checkLoopEnd == 1)
return 1;
}
- else if (strncmp(lineData.word[0],"end", 3) == 0){
- if (strncmp(lineData.word[1],"program", 7) == 0)
+ else if (lineData.word[0].compare("end") == 0){
+ if (lineData.word[1].compare("program") == 0){
return 0;
- else if (strncmp(lineData.word[1],"loop", 4) == 0)
+ }
+ else if (lineData.word[1].compare("loop") == 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)
+ for (i = 0; i < devices.size(); i++){
+ if (lineData.word[0].compare(devices[i]->name) == 0)
deviceFound = i;
}
@@ -264,8 +228,10 @@
}
//Local Name matches a device, send line to that device in order to process the functionality
- else
- addDevice(deviceFound);//devices[deviceFound].interpret();
+ else{
+ //addDevice(deviceFound);
+ devices[deviceFound]->interpret(lineData);
+ }
}
return -1;
@@ -282,18 +248,16 @@
fullInit(); //Initialize anything that's required to run the code (LCD)
+ struct Line lineData;
+ resetLineData(lineData);
+
/******************************************************************************/
/*** <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
+ vector<string> textFiles; //Assuming Maximum of 25 txt files will be on the SD Card
+ vector<string> filenames = readFileNames("/sd");
+ numTextFiles = getFileNamesWithoutExt(textFiles, filenames);
/******************************************************************************/
@@ -309,7 +273,7 @@
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) {
@@ -338,6 +302,7 @@
strcat(selectedFileFullName, ".txt");
FILE *selectedFile = fopen(selectedFileFullName, "r");
+
lcd.cls(); //clear the display
if(selectedFile == NULL) {
@@ -349,7 +314,7 @@
while(1){
- resetLineData();
+ resetLineData(lineData);
lcd.cls(); //clear the display
lcd.setAddress(0,0);
@@ -364,12 +329,9 @@
while (!endOfFile){
- getNextLine(selectedFile);
- int checkEnd = interpretCommand(selectedFile);
-
- lcd.setAddress(0,3);
- lcd.printf("TEST3 ");
-
+ getNextLine(selectedFile, lineData);
+ int checkEnd = interpretCommand(selectedFile, lineData);
+
if (checkEnd == 0)
endOfFile = 1;
}
@@ -386,10 +348,30 @@
while(!buttons.readBack());
lcd.setAddress(0,1);
- rewind(selectedFile);
+ //rewind(selectedFile);
}
-
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/***** Cycle through txt lines and remember last lines ******/
/*
int running = 0, selectedFile = 0;
@@ -442,9 +424,7 @@
}
}
*/
-
-
-
+
/******* Select the Program txt File ***********/
@@ -487,19 +467,6 @@
}
*/
-
-
-
-
- }
-
-
-
-
-
-
-
-
/*float speed = 0.5;
while(1){