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
Diff: commander.cpp
- 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'; + }