3rd year group project. Electronic and Electrical Engineering. Heriot-Watt University. This is the code for the mbed for the Automatic Little Object Organiser (ALOO).

Dependencies:   MCP23017 TCS3472_I2C WattBob_TextLCD mbed

Revision:
13:4f24da6e2f8e
Parent:
12:f485796016f8
Child:
14:cf2f255b5560
--- a/commander.cpp	Sat Nov 21 20:19:54 2015 +0000
+++ b/commander.cpp	Sat Nov 21 20:24:08 2015 +0000
@@ -8,17 +8,17 @@
 using namespace std;
 
 //const int kCommandBufferSize = 40;
-const int kCommandValueBufferSize = 40;
+const int kCommandValueBufferSize = 80;
 const int kObjectBufferSize = 20;
 
-string CommandObjectValue [5] = { "mbed", "pc", "colour_sensor", "servos", "port" };
-string CommandObjectCommandsValue [5][kMaxCommandCount] = {
-		{"mbed", "haz-block", "read-current-block", "", "", "", "", "", "", ""},
-		{"pc", "connect", "disconnect", "", "", "", "", "", "", "exit"},
-		{"colour_sensor", "i-time", "preview", "", "", "", "", "", "", ""},
-		{"servos", "test", "reset", "", "", "", "", "", "", ""},
-		{"port", "init", "b-rate", "parity", "stopbit", "", "", "", "", ""},
-};
+string CommandObjectValue [5] = { "mbed", "pc", "colour_sensor", "servos", "port" };
+string CommandObjectCommandsValue [5][kMaxCommandCount] = {
+		{"mbed", "haz-block", "read-current-block", "", "", "", "", "", "", ""},
+		{"pc", "connect", "disconnect", "", "", "", "", "", "", "exit"},
+		{"colour_sensor", "i-time", "preview", "", "", "", "", "", "", ""},
+		{"servos", "test", "reset", "", "", "", "", "", "", ""},
+		{"port", "init", "b-rate", "parity", "stopbit", "", "", "", "", ""},
+};
 
 Commander::Commander() {
 	this->resetVariables();
@@ -29,29 +29,29 @@
 }
 
 void Commander::decodeCommand(CommandTypeRaw type){
-	this->resetVariables();
+	this->resetVariables();
 	this->typeRaw = type;
 	this->typeChar = CommandTypeValue[type];
 
 	this->readCommandObject();
 	if (this->objectRaw == InvalidObject) { return; }
-
-	if (this->readCommand(this->objectRaw) == false) { return; }
+
+	if (this->readCommand(this->objectRaw) == false) { return; }
 	//	else if ((connectedToPC == false) && (this->typeRaw != Set || this->objectRaw != PC || this->commandIndex[0] != 1)) { return; }
 	else if (connectedToPC == true || (this->typeRaw == Set && this->objectRaw == PC && this->commandIndex[0] == 1)) { this->executeCommand(); }
-	else { return; }
-}
-
-std::string Commander::description(){
-	string str;
-	str.append("Command type:\t");
-	str.append(&this->typeChar);
-	str.append("\nCommand object:\t" + this->object);
-	
-	for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-		if (this->command[i] == "") { break; }
-	str.append("Command:\t" + this->command[i].c_str() + "\nValue:\t" + this->commandValue[i].c_str() + " \n");
-	}
+	else { return; }
+}
+
+std::string Commander::description(){
+	string str;
+	str.append("Command type:\t");
+	str.append(&this->typeChar);
+	str.append("\nCommand object:\t" + this->object);
+	
+	for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
+		if (this->command[i] == "") { break; }
+	str.append("Command:\t" + this->command[i] + "\nValue:\t" + this->commandValue[i].c_str() + " \n");
+	}
 
 	return str;
 }
@@ -90,96 +90,95 @@
 	return;
 }
 
-bool Commander::readCommand(CommandObjectRaw objectRaw){
-	char nextChar = '\0';
-	char commandCharArray [kMaxCommandCount - 1][79] = { "" };
-	char commandValue [kMaxCommandCount -1][79] = { "" };
+bool Commander::readCommand(CommandObjectRaw objectRaw){
+	char nextChar = '\0';
+	char commandCharArray [kMaxCommandCount - 1][79] = { "" };
+	char commandValue [kMaxCommandCount -1][79] = { "" };
 
 	int charIndex = 0;
-	int valueCharIndex = 0;
-	int commandValueIndex = 0;
-	bool commandComplete = false;
-	while (charIndex < 79 && valueCharIndex < 79) {
-		scanf("%1c", &nextChar);
-		if (nextChar == '\n' || nextChar == '\r' || nextChar == ' ') { continue; }
-		else if (nextChar == kCommandTerminator) { break; }
+	int valueCharIndex = 0;
+	int commandValueIndex = 0;
+	bool commandComplete = false;
+	while (charIndex < kCommandValueBufferSize && valueCharIndex < kCommandValueBufferSize) {
+		scanf("%1c", &nextChar);
+		if (nextChar == '\n' || nextChar == '\r' || nextChar == ' ') { continue; }
+		else if (nextChar == kCommandTerminator) { break; }
+
+		else if (nextChar == '=') { commandComplete = true; }
+		else if (nextChar == ',') {
+			commandComplete = false;
+			commandValueIndex++;
+			charIndex = 0;
+			valueCharIndex = 0;
+		}
+
+		if (commandComplete == false && nextChar != ',') {
+			commandCharArray[commandValueIndex][charIndex] = nextChar;
+			charIndex++;
+		}else if (commandComplete == true && nextChar != '='){
+			commandValue[commandValueIndex][valueCharIndex] = nextChar;
+			valueCharIndex++;
+		}
 
-		else if (nextChar == '=') { commandComplete = true; }
-		else if (nextChar == ',') {
-			commandComplete = false;
-			commandValueIndex++;
-			charIndex = 0;
-			valueCharIndex = 0;
-		}
-
-		if (commandComplete == false && nextChar != ',') {
-			commandCharArray[commandValueIndex][charIndex] = nextChar;
-			charIndex++;
-		}else if (commandComplete == true && nextChar != '='){
-			commandValue[commandValueIndex][valueCharIndex] = nextChar;
-			valueCharIndex++;
-		}
-
-	}
+	}
+
+	for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
+		if (strcmp(commandCharArray[i], "")) { break; }
+		
+		string tempCommandStr(commandCharArray[i]);
+		string tempValueStr(commandValue[i]);
 
-	for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-		string tempCommandStr(commandCharArray[i]);
+		int row = objectRaw;
+		int column = 1;
+		for (;column < kMaxCommandCount; column++){
+			if (CommandObjectCommandsValue[row][column] == tempCommandStr) {
+				this->command[i] = tempCommandStr;
+				this->commandIndex[i] = column;
+				this->commandValue[i] = tempValueStr;
+				break;
+			}
+		}
+		if (this->commandIndex[i] == -1) { return false; }
+	}
 
-		string tempCommandStr(commandCharArray);
-		if (tempCommandStr == "") { break; }
-		string tempValueStr(commandValue[i]);
-
-		int row = objectRaw;
-		int column = 1;
-		for (;column < kMaxCommandCount; column++){
-			if (CommandObjectCommandsValue[row][column] == tempCommandStr) {
-				this->command[i] = tempCommandStr;
-				this->commandIndex[i] = column;
-				this->commandValue[i] = tempValueStr;
-				break;
-			}
-		}
-		if (this->commandIndex[i] == -1) { return false; }
-	}
-
-	return true;
-}
+	return true;
+}
 
 void Commander::executeCommand(){
 	switch (this->objectRaw) {
 	case MBED:
 		for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
-			if (this->commandIndex[i] == 1) {
-				hazBlock(this->typeRaw);
-			}else if (this->commandIndex[i] == 2){
-				getCurrentBlock(this->typeRaw);
-			}
+			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
+			if (this->commandIndex[i] == 1) {
+				hazBlock(this->typeRaw);
+			}else if (this->commandIndex[i] == 2){
+				getCurrentBlock(this->typeRaw);
+			}
 		}
 		break;
 	case PC:
 		for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
-			if (this->commandIndex[i] == 1){
-				connectToPC(this->typeRaw);
-			}else if (this->commandIndex[i] == 2){
-				disconnectToPC(this->typeRaw);
-			}
+			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
+			if (this->commandIndex[i] == 1){
+				connectToPC(this->typeRaw);
+			}else if (this->commandIndex[i] == 2){
+				disconnectToPC(this->typeRaw);
+			}
 		}
 		break;
 	case ColourSensor:
 		for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
-			if (this->commandIndex[i] == 1) {
-				int integrationTime;
-				sscanf(this->commandValue[i].c_str(), "%i", &integrationTime);
-				setIntegrationTime(integrationTime);
-			}else if (this->commandIndex[i] == 2){
-				if (this->commandValue[i] == "ON"){
-					previewOnPC(true);
-				}else if (this->commandValue[i] == "OFF"){
-					previewOnPC(false);
-				}
+			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
+			if (this->commandIndex[i] == 1) {
+				int integrationTime;
+				sscanf(this->commandValue[i].c_str(), "%i", &integrationTime);
+				setIntegrationTime(integrationTime);
+			}else if (this->commandIndex[i] == 2){
+				if (this->commandValue[i] == "ON"){
+					previewOnPC(true);
+				}else if (this->commandValue[i] == "OFF"){
+					previewOnPC(false);
+				}
 			}else if (this->commandIndex[i] == 3){
 				readColourSensor();
 			}
@@ -187,24 +186,24 @@
 			break;
 	case Servos:
 		for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
-			if (this->commandIndex[i] == 1){
-				testServos();
-			}else if (this->commandIndex[i] == 2){
-				resetServos();
-			}
+			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
+			if (this->commandIndex[i] == 1){
+				testServos();
+			}else if (this->commandIndex[i] == 2){
+				resetServos();
+			}
 		}
 		break;
 	case Port:
 		for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
-			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
-			if (this->commandIndex[i] == 1) {
-				getPortInfo();
-			}else if (this->commandIndex[i] == 2){
-				float baudRate;
-				sscanf(this->commandValue[i].c_str(), "%f", &baudRate);
-				setPortBaudRate(baudRate);
-			}
+			if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) { break; }
+			if (this->commandIndex[i] == 1) {
+				getPortInfo();
+			}else if (this->commandIndex[i] == 2){
+				float baudRate;
+				sscanf(this->commandValue[i].c_str(), "%f", &baudRate);
+				setPortBaudRate(baudRate);
+			}
 		}
 		break;
 	default:
@@ -212,13 +211,13 @@
 		}
 	}
 
-
-	void Commander::resetVariables(){
-		this->object = "";
-		this->objectRaw = InvalidObject;
-		memset(this->command, 0, sizeof(this->command));
-		memset(this->commandValue, 0, sizeof(this->command));
-		memset(this->commandIndex, 0, sizeof(this->commandIndex));
-		this->typeRaw = InvalidType;
-		this->typeChar = '\0';
-	}
+
+	void Commander::resetVariables(){
+		this->object = "";
+		this->objectRaw = InvalidObject;
+		memset(this->command, 0, sizeof(this->command));
+		memset(this->commandValue, 0, sizeof(this->command));
+		memset(this->commandIndex, 0, sizeof(this->commandIndex));
+		this->typeRaw = InvalidType;
+		this->typeChar = '\0';
+	}