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