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

Committer:
dreamselec
Date:
Sun Nov 22 20:29:08 2015 +0000
Revision:
15:777390eb5afd
Parent:
14:cf2f255b5560
Child:
16:4a41cb9e525f
For some reason cannot assign Commander's command and commandValue properties, to received string. The execution stop not that statement. Noticed using print statements.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreamselec 6:98fe30430194 1 //
dreamselec 6:98fe30430194 2 // commander.cpp
dreamselec 6:98fe30430194 3 // Created by Chandan Siyag on 14/11/2015.
dreamselec 6:98fe30430194 4 #include <iostream>
lordlycastle 5:6ef2d954fca3 5 #include <string>
dreamselec 2:7a55cb10259f 6 #include "commander.h"
dreamselec 2:7a55cb10259f 7
dreamselec 6:98fe30430194 8 using namespace std;
dreamselec 15:777390eb5afd 9 #define _DEBUG_
dreamselec 6:98fe30430194 10
dreamselec 9:dc8f155b71c8 11 //const int kCommandBufferSize = 40;
dreamselec 13:4f24da6e2f8e 12 const int kCommandValueBufferSize = 80;
dreamselec 8:e1da2ae62885 13 const int kObjectBufferSize = 20;
dreamselec 8:e1da2ae62885 14
dreamselec 13:4f24da6e2f8e 15 string CommandObjectValue [5] = { "mbed", "pc", "colour_sensor", "servos", "port" };
dreamselec 13:4f24da6e2f8e 16 string CommandObjectCommandsValue [5][kMaxCommandCount] = {
dreamselec 15:777390eb5afd 17 {"mbed", "haz-block", "read-current-block", "mode", "", "", "", "", "", ""},
dreamselec 15:777390eb5afd 18 {"pc", "connect", "disconnect", "", "", "", "", "", "reply-commands", "exit"},
dreamselec 15:777390eb5afd 19 {"colour_sensor", "i-time", "preview", "", "", "", "", "", "", ""},
dreamselec 15:777390eb5afd 20 {"servos", "test", "reset", "", "", "", "", "", "", ""},
dreamselec 15:777390eb5afd 21 {"port", "init", "b-rate", "parity", "", "", "", "", "", ""},
dreamselec 13:4f24da6e2f8e 22 };
dreamselec 8:e1da2ae62885 23
dreamselec 15:777390eb5afd 24 Commander::Commander()
dreamselec 15:777390eb5afd 25 {
dreamselec 15:777390eb5afd 26 replyCommands = false;
dreamselec 15:777390eb5afd 27 this->resetVariables();
dreamselec 6:98fe30430194 28 }
dreamselec 6:98fe30430194 29
dreamselec 15:777390eb5afd 30 Commander::~Commander()
dreamselec 15:777390eb5afd 31 {
dreamselec 12:f485796016f8 32
dreamselec 2:7a55cb10259f 33 }
dreamselec 2:7a55cb10259f 34
dreamselec 15:777390eb5afd 35 void Commander::decodeCommand(CommandTypeRaw type)
dreamselec 15:777390eb5afd 36 {
dreamselec 15:777390eb5afd 37 this->resetVariables();
dreamselec 15:777390eb5afd 38 this->typeRaw = type;
dreamselec 15:777390eb5afd 39 this->typeChar = CommandTypeValue[type];
dreamselec 14:cf2f255b5560 40
dreamselec 15:777390eb5afd 41 this->readCommandObject();
dreamselec 15:777390eb5afd 42 if (this->objectRaw == InvalidObject) {
dreamselec 15:777390eb5afd 43 pc.printf("Invalid command object.\n");
dreamselec 15:777390eb5afd 44 return;
dreamselec 15:777390eb5afd 45 }
dreamselec 6:98fe30430194 46
dreamselec 15:777390eb5afd 47 if (this->readCommand(this->objectRaw) == false) {
dreamselec 15:777390eb5afd 48 // this->description();
dreamselec 15:777390eb5afd 49 pc.printf("Invalid command.\n");
dreamselec 15:777390eb5afd 50 return;
dreamselec 15:777390eb5afd 51 }
dreamselec 15:777390eb5afd 52 else if (connectedToPC == true || (this->typeRaw == Set && this->objectRaw == PC && this->commandIndex[0] == 1)) {
dreamselec 15:777390eb5afd 53 this->executeCommand();
dreamselec 15:777390eb5afd 54 if (this->replyCommands) {
dreamselec 15:777390eb5afd 55 this->description();
dreamselec 15:777390eb5afd 56 }
dreamselec 15:777390eb5afd 57 return;
dreamselec 15:777390eb5afd 58 }
dreamselec 15:777390eb5afd 59
dreamselec 15:777390eb5afd 60 pc.printf("Not connected to PC. %i\n", this->commandIndex[0]);
dreamselec 8:e1da2ae62885 61 return;
dreamselec 8:e1da2ae62885 62 }
dreamselec 8:e1da2ae62885 63
dreamselec 15:777390eb5afd 64 std::string Commander::description()
dreamselec 15:777390eb5afd 65 {
dreamselec 15:777390eb5afd 66 string str;
dreamselec 15:777390eb5afd 67 str.append("Command type:\t");
dreamselec 15:777390eb5afd 68 str.append(&this->typeChar);
dreamselec 15:777390eb5afd 69 str.append("\nCommand object:\t" + this->object);
dreamselec 8:e1da2ae62885 70
dreamselec 15:777390eb5afd 71 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 72 if (this->command[i] == "") {
dreamselec 15:777390eb5afd 73 break;
dreamselec 15:777390eb5afd 74 }
dreamselec 15:777390eb5afd 75 str.append("Command:\t" + this->command[i] + "\nValue:\t" + this->commandValue[i].c_str() + " \n");
dreamselec 15:777390eb5afd 76 }
dreamselec 13:4f24da6e2f8e 77
dreamselec 15:777390eb5afd 78 return str;
dreamselec 15:777390eb5afd 79 }
dreamselec 15:777390eb5afd 80
dreamselec 15:777390eb5afd 81 void Commander::readCommandObject()
dreamselec 15:777390eb5afd 82 {
dreamselec 15:777390eb5afd 83 char objectInitiator = '<';
dreamselec 15:777390eb5afd 84 char objectTerminator = '>';
dreamselec 15:777390eb5afd 85
dreamselec 15:777390eb5afd 86 char nextChar = '\0';
dreamselec 13:4f24da6e2f8e 87
dreamselec 15:777390eb5afd 88 do {
dreamselec 15:777390eb5afd 89 nextChar = pc.getc();
dreamselec 15:777390eb5afd 90 } while (nextChar != objectInitiator);
dreamselec 13:4f24da6e2f8e 91
dreamselec 15:777390eb5afd 92 char objectCharArray [kObjectBufferSize] = "";
dreamselec 15:777390eb5afd 93 int i = 0;
dreamselec 15:777390eb5afd 94 while (i < kObjectBufferSize) {
dreamselec 15:777390eb5afd 95 nextChar = pc.getc();
dreamselec 15:777390eb5afd 96 if (nextChar == '\n' || nextChar == '\r' || nextChar == ' ') {
dreamselec 15:777390eb5afd 97 continue;
dreamselec 15:777390eb5afd 98 }
dreamselec 15:777390eb5afd 99 if (nextChar == objectTerminator)
dreamselec 15:777390eb5afd 100 break;
dreamselec 15:777390eb5afd 101 objectCharArray[i] = nextChar;
dreamselec 15:777390eb5afd 102 i++;
dreamselec 15:777390eb5afd 103 }
dreamselec 15:777390eb5afd 104 string tempStr(objectCharArray);
dreamselec 15:777390eb5afd 105 this->object = tempStr;
dreamselec 8:e1da2ae62885 106
dreamselec 15:777390eb5afd 107 for (int i = 0; i < (sizeof(CommandObjectValue)/sizeof(*CommandObjectValue)); i++) {
dreamselec 15:777390eb5afd 108 if (CommandObjectValue[i] == this->object) {
dreamselec 15:777390eb5afd 109 this->objectRaw = static_cast<CommandObjectRaw>(i);
dreamselec 15:777390eb5afd 110 return;
dreamselec 15:777390eb5afd 111 }
dreamselec 15:777390eb5afd 112 }
dreamselec 8:e1da2ae62885 113
dreamselec 15:777390eb5afd 114 this->objectRaw = InvalidObject;
dreamselec 15:777390eb5afd 115 return;
dreamselec 13:4f24da6e2f8e 116 }
dreamselec 2:7a55cb10259f 117
dreamselec 15:777390eb5afd 118 bool Commander::readCommand(CommandObjectRaw objectRaw)
dreamselec 15:777390eb5afd 119 {
dreamselec 15:777390eb5afd 120 char nextChar = '\0';
dreamselec 15:777390eb5afd 121 char commandCharArray [kMaxCommandCount - 1][kCommandValueBufferSize] = { '\0' };
dreamselec 15:777390eb5afd 122 char commandValueArray [kMaxCommandCount -1][kCommandValueBufferSize] = { '\0' };
dreamselec 15:777390eb5afd 123
dreamselec 15:777390eb5afd 124 int charIndex = 0;
dreamselec 15:777390eb5afd 125 int valueCharIndex = 0;
dreamselec 15:777390eb5afd 126 int commandValueIndex = 0;
dreamselec 15:777390eb5afd 127 bool commandComplete = false;
dreamselec 15:777390eb5afd 128 while (charIndex < kCommandValueBufferSize - 1 && valueCharIndex < kCommandValueBufferSize - 1) {
dreamselec 15:777390eb5afd 129 nextChar = pc.getc();
dreamselec 15:777390eb5afd 130
dreamselec 15:777390eb5afd 131 if (nextChar == '\n' || nextChar == '\r' || nextChar == ' ') {
dreamselec 15:777390eb5afd 132 continue;
dreamselec 15:777390eb5afd 133 } else if (nextChar == kCommandTerminator) {
dreamselec 15:777390eb5afd 134 break;
dreamselec 15:777390eb5afd 135 }else if (nextChar == '=') {
dreamselec 15:777390eb5afd 136 commandComplete = true;
dreamselec 15:777390eb5afd 137 } else if (nextChar == ',') {
dreamselec 15:777390eb5afd 138 commandComplete = false;
dreamselec 15:777390eb5afd 139 commandValueIndex++;
dreamselec 15:777390eb5afd 140 charIndex = 0;
dreamselec 15:777390eb5afd 141 valueCharIndex = 0;
dreamselec 15:777390eb5afd 142 }
dreamselec 15:777390eb5afd 143
dreamselec 15:777390eb5afd 144 if (commandComplete == false && nextChar != ',') {
dreamselec 15:777390eb5afd 145 commandCharArray[commandValueIndex][charIndex] = nextChar;
dreamselec 15:777390eb5afd 146 charIndex++;
dreamselec 15:777390eb5afd 147 } else if (commandComplete == true && nextChar != '=') {
dreamselec 15:777390eb5afd 148 commandValueArray[commandValueIndex][valueCharIndex] = nextChar;
dreamselec 15:777390eb5afd 149 valueCharIndex++;
dreamselec 15:777390eb5afd 150 }
dreamselec 15:777390eb5afd 151 }
dreamselec 15:777390eb5afd 152
dreamselec 15:777390eb5afd 153 for (int i = 0; i < kMaxCommandCount - 1; i++) {
dreamselec 15:777390eb5afd 154 pc.printf("i: %i\n", i);
dreamselec 15:777390eb5afd 155 if (commandCharArray[i][0] == '\0') { break; }
dreamselec 15:777390eb5afd 156 string tempCommandStr(commandCharArray[i]);
dreamselec 15:777390eb5afd 157 string tempValueStr(commandValueArray[i]);
dreamselec 15:777390eb5afd 158 pc.printf("%s\n", tempCommandStr.c_str());
dreamselec 15:777390eb5afd 159 int row = this->objectRaw;
dreamselec 15:777390eb5afd 160 pc.printf("Row: %i\n", this->objectRaw);
dreamselec 15:777390eb5afd 161 int column = 1;
dreamselec 15:777390eb5afd 162 pc.printf("Column: %i\n", column);
dreamselec 15:777390eb5afd 163 for (; column < kMaxCommandCount - 1; column++) {
dreamselec 15:777390eb5afd 164 pc.printf("%i\n", column);
dreamselec 15:777390eb5afd 165 if (CommandObjectCommandsValue[row][column] == tempCommandStr) {
dreamselec 15:777390eb5afd 166 pc.printf("Found matching command.\n");
dreamselec 15:777390eb5afd 167 //pc.printf("%s\n", this->command[i].c_str());
dreamselec 15:777390eb5afd 168
dreamselec 15:777390eb5afd 169 // pc.printf("%s\n", this->command[i].c_str());
dreamselec 15:777390eb5afd 170 this->commandIndex[i] = column;
dreamselec 15:777390eb5afd 171 pc.printf("%i\n", this->commandIndex[i]);
dreamselec 15:777390eb5afd 172 this->commandValue[i] = tempValueStr;
dreamselec 15:777390eb5afd 173 pc.printf("%s\n", this->commandValue[i].c_str());
dreamselec 15:777390eb5afd 174 // pc.printf("%s\n", this->description().c_str());
dreamselec 15:777390eb5afd 175 break;
dreamselec 15:777390eb5afd 176 }
dreamselec 15:777390eb5afd 177 }
dreamselec 15:777390eb5afd 178 if (this->commandIndex[i] == -1) {
dreamselec 15:777390eb5afd 179 pc.printf("index = -1\n");
dreamselec 15:777390eb5afd 180 return false;
dreamselec 15:777390eb5afd 181 }
dreamselec 15:777390eb5afd 182 }
dreamselec 15:777390eb5afd 183
dreamselec 15:777390eb5afd 184 pc.printf("Returning\n");
dreamselec 15:777390eb5afd 185 return true;
dreamselec 15:777390eb5afd 186 }
dreamselec 14:cf2f255b5560 187
dreamselec 15:777390eb5afd 188 void Commander::executeCommand()
dreamselec 15:777390eb5afd 189 {
dreamselec 15:777390eb5afd 190 switch (this->objectRaw) {
dreamselec 15:777390eb5afd 191 case MBED:
dreamselec 15:777390eb5afd 192 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 193 if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) {
dreamselec 15:777390eb5afd 194 break;
dreamselec 15:777390eb5afd 195 }
dreamselec 15:777390eb5afd 196 if (this->commandIndex[i] == 1) {
dreamselec 15:777390eb5afd 197 hazBlock(this->typeRaw);
dreamselec 15:777390eb5afd 198 } else if (this->commandIndex[i] == 2) {
dreamselec 15:777390eb5afd 199 getCurrentBlock(this->typeRaw);
dreamselec 15:777390eb5afd 200 } else if (this->commandIndex[i] == 3) {
dreamselec 15:777390eb5afd 201 if (this->commandValue[i] == "maintanence") {
dreamselec 15:777390eb5afd 202
dreamselec 15:777390eb5afd 203 }
dreamselec 15:777390eb5afd 204 }
dreamselec 15:777390eb5afd 205 }
dreamselec 15:777390eb5afd 206 break;
dreamselec 15:777390eb5afd 207 case PC:
dreamselec 15:777390eb5afd 208 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 209 if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) {
dreamselec 15:777390eb5afd 210 break;
dreamselec 15:777390eb5afd 211 }
dreamselec 15:777390eb5afd 212 if (this->commandIndex[i] == 1) {
dreamselec 15:777390eb5afd 213 connectToPC(this->typeRaw);
dreamselec 15:777390eb5afd 214 } else if (this->commandIndex[i] == 2) {
dreamselec 15:777390eb5afd 215 disconnectToPC(this->typeRaw);
dreamselec 15:777390eb5afd 216 } else if (this->commandIndex[i] == 8) {
dreamselec 15:777390eb5afd 217 if (this->commandValue[i] == "ON") {
dreamselec 15:777390eb5afd 218 this->replyCommands = true;
dreamselec 15:777390eb5afd 219 } else if (this->commandValue[i] == "OFF") this->replyCommands = false;
dreamselec 15:777390eb5afd 220 }
dreamselec 15:777390eb5afd 221 }
dreamselec 15:777390eb5afd 222 break;
dreamselec 15:777390eb5afd 223 case ColourSensor:
dreamselec 15:777390eb5afd 224 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 225 if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) {
dreamselec 15:777390eb5afd 226 break;
dreamselec 15:777390eb5afd 227 }
dreamselec 15:777390eb5afd 228 if (this->commandIndex[i] == 1) {
dreamselec 15:777390eb5afd 229 float integrationTime;
dreamselec 15:777390eb5afd 230 sscanf(this->commandValue[i].c_str(), "%f", &integrationTime);
dreamselec 15:777390eb5afd 231 if (integrationTime < 2.4 || integrationTime > 600) {
dreamselec 15:777390eb5afd 232 pc.printf("Integration Time invalid: %.3f", integrationTime);
dreamselec 15:777390eb5afd 233 continue;
dreamselec 15:777390eb5afd 234 }
dreamselec 15:777390eb5afd 235 setIntegrationTimeTo(integrationTime);
dreamselec 15:777390eb5afd 236 } else if (this->commandIndex[i] == 2) {
dreamselec 15:777390eb5afd 237 if (this->commandValue[i] == "ON") {
dreamselec 15:777390eb5afd 238 previewOnPC(true);
dreamselec 15:777390eb5afd 239 } else if (this->commandValue[i] == "OFF") {
dreamselec 15:777390eb5afd 240 previewOnPC(false);
dreamselec 15:777390eb5afd 241 }
dreamselec 15:777390eb5afd 242 } else if (this->commandIndex[i] == 3) {
dreamselec 15:777390eb5afd 243 readColourSensor();
dreamselec 15:777390eb5afd 244 }
dreamselec 15:777390eb5afd 245 }
dreamselec 15:777390eb5afd 246 break;
dreamselec 15:777390eb5afd 247 case Servos:
dreamselec 15:777390eb5afd 248 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 249 if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) {
dreamselec 15:777390eb5afd 250 break;
dreamselec 15:777390eb5afd 251 }
dreamselec 15:777390eb5afd 252 if (this->commandIndex[i] == 1) {
dreamselec 15:777390eb5afd 253 testServos();
dreamselec 15:777390eb5afd 254 } else if (this->commandIndex[i] == 2) {
dreamselec 15:777390eb5afd 255 resetServos();
dreamselec 15:777390eb5afd 256 }
dreamselec 15:777390eb5afd 257 }
dreamselec 15:777390eb5afd 258 break;
dreamselec 15:777390eb5afd 259 case Port:
dreamselec 15:777390eb5afd 260 for (int i = 0; i < sizeof(this->command)/sizeof(*this->command); i++) {
dreamselec 15:777390eb5afd 261 if (this->commandIndex[i] == -1 || this->commandIndex[i] == 0) {
dreamselec 15:777390eb5afd 262 break;
dreamselec 15:777390eb5afd 263 }
dreamselec 15:777390eb5afd 264 if (this->commandIndex[i] == 1) {
dreamselec 15:777390eb5afd 265 getPortInfo();
dreamselec 15:777390eb5afd 266 } else if (this->commandIndex[i] == 2) {
dreamselec 15:777390eb5afd 267 int baudRate;
dreamselec 15:777390eb5afd 268 sscanf(this->commandValue[i].c_str(), "%i", &baudRate);
dreamselec 15:777390eb5afd 269 setPortBaudRate(baudRate);
dreamselec 15:777390eb5afd 270 } else if (this->commandIndex[i] == 3) {
dreamselec 15:777390eb5afd 271 int parity = 0;
dreamselec 15:777390eb5afd 272 sscanf(this->commandValue[i].c_str(), "%i", &parity);
dreamselec 15:777390eb5afd 273 setPortParity(parity);
dreamselec 15:777390eb5afd 274 }
dreamselec 15:777390eb5afd 275 }
dreamselec 15:777390eb5afd 276 break;
dreamselec 15:777390eb5afd 277 default:
dreamselec 15:777390eb5afd 278 break;
dreamselec 15:777390eb5afd 279 }
dreamselec 15:777390eb5afd 280 }
dreamselec 8:e1da2ae62885 281
dreamselec 13:4f24da6e2f8e 282
dreamselec 15:777390eb5afd 283 void Commander::resetVariables()
dreamselec 15:777390eb5afd 284 {
dreamselec 15:777390eb5afd 285 this->object = "";
dreamselec 15:777390eb5afd 286 this->objectRaw = InvalidObject;
dreamselec 15:777390eb5afd 287 memset(this->command, 0, sizeof(this->command));
dreamselec 15:777390eb5afd 288 memset(this->commandValue, 0, sizeof(this->command));
dreamselec 15:777390eb5afd 289 memset(this->commandIndex, -1, sizeof(this->commandIndex));
dreamselec 15:777390eb5afd 290 this->typeRaw = InvalidType;
dreamselec 15:777390eb5afd 291 this->typeChar = '\0';
dreamselec 15:777390eb5afd 292 }