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 17:53:36 2015 +0000
Revision:
14:cf2f255b5560
Parent:
13:4f24da6e2f8e
Child:
15:777390eb5afd
Changed sorting algorithm for colour sensor next to top beam.
Added filled some commands rather than just printing.

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