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:
Sat Nov 21 20:24:08 2015 +0000
Revision:
13:4f24da6e2f8e
Parent:
12:f485796016f8
Child:
14:cf2f255b5560
Building without errors.

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