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

commander.cpp

Committer:
dreamselec
Date:
2015-11-22
Revision:
14:cf2f255b5560
Parent:
13:4f24da6e2f8e
Child:
15:777390eb5afd

File content as of revision 14:cf2f255b5560:

//
// commander.cpp
// Created by Chandan Siyag on 14/11/2015.
#include <iostream>
#include <string>
#include "commander.h"

using namespace std;

//const int kCommandBufferSize = 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", "mode", "", "", "", "", "", ""},
		{"pc", "connect", "disconnect", "", "", "", "", "", "reply-commands", "exit"},
		{"colour_sensor", "i-time", "preview", "", "", "", "", "", "", ""},
		{"servos", "test", "reset", "", "", "", "", "", "", ""},
		{"port", "init", "b-rate", "parity", "", "", "", "", "", ""},
};

Commander::Commander() {
	replyCommands = false;
	this->resetVariables();
}

Commander::~Commander() {

}

void Commander::decodeCommand(CommandTypeRaw type){
	this->resetVariables();
	this->typeRaw = type;
	this->typeChar = CommandTypeValue[type];

	this->readCommandObject();
	if (this->objectRaw == InvalidObject) { 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(); }

	if (this->replyCommands) { this->description(); }
}

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;
}

void Commander::readCommandObject(){
	char objectInitiator = '<';
	char objectTerminator = '>';

	char nextChar = '\0';

	do {
		nextChar = pc.getc();
	} while (nextChar != objectInitiator);

	char objectCharArray [kObjectBufferSize] = "";
	int i = 0;
	while (i < kObjectBufferSize) {
		nextChar = pc.getc();
		if (nextChar == '\n' || nextChar == '\r' || nextChar == ' ') { continue; }
		if (nextChar == objectTerminator)
			break;
		objectCharArray[i] = nextChar;
		i++;
	}
	string tempStr(objectCharArray);
	this->object = tempStr;

	for (int i = 0; i < (sizeof(CommandObjectValue)/sizeof(*CommandObjectValue)); i++) {
		if (CommandObjectValue[i] == this->object){
			this->objectRaw = static_cast<CommandObjectRaw>(i);
			return;
		}
	}

	this->objectRaw = InvalidObject;
	return;
}

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 < 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++;
		}

	}

	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]);

		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;
}

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);
			}else if (this->commandIndex[i] == 3){
				if (this->commandValue[i] == "maintanence"){

				}
			}
		}
		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);
			}else if (this->commandIndex[i] == 8){
				if (this->commandValue[i] == "ON") { this->replyCommands = true; }
				else if (this->commandValue[i] == "OFF") this->replyCommands = false; }
			}
		}
		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) {
				float integrationTime;
				sscanf(this->commandValue[i].c_str(), "%f", &integrationTime);
				if (integrationTime < 2.4 || integrationTime > 600) {
					pc.printf("Integration Time invalid: %.3f", integrationTime);
					continue;
				}
				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();
			}
		}
			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();
			}
		}
		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){
				int baudRate;
				sscanf(this->commandValue[i].c_str(), "%i", &baudRate);
				setPortBaudRate(baudRate);
			}else if (this->commandIndex[i] == 3){
				int parity = 0;
				sscanf(this->commandValue[i].c_str(), "%i", &parity);
				setPortParity(parity);
			}
		}
		break;
	default:
		break;
		}
	}


	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';
	}