Command class for communication. Commands have a command member and up to four arguments with variable types.

Committer:
williampeers
Date:
Wed Aug 09 01:08:06 2017 +0000
Revision:
0:90ca7dd67eb8
Working. Doesn't detect bad argument type though, just treats it like expected type without giving error.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
williampeers 0:90ca7dd67eb8 1 #include "commands.h"
williampeers 0:90ca7dd67eb8 2
williampeers 0:90ca7dd67eb8 3 Message::Message(){
williampeers 0:90ca7dd67eb8 4 cmd = VOID;
williampeers 0:90ca7dd67eb8 5 for (int i = 0; i < 4; i++) {
williampeers 0:90ca7dd67eb8 6 strcpy(arguments[i].characters, "");
williampeers 0:90ca7dd67eb8 7 arguments[i].type = BLANK;
williampeers 0:90ca7dd67eb8 8 }
williampeers 0:90ca7dd67eb8 9 }
williampeers 0:90ca7dd67eb8 10
williampeers 0:90ca7dd67eb8 11 Message::Message(char str[44]){
williampeers 0:90ca7dd67eb8 12 cmd = VOID;
williampeers 0:90ca7dd67eb8 13 for (int i = 0; i < 4; i++) {
williampeers 0:90ca7dd67eb8 14 strcpy(arguments[i].characters, "");
williampeers 0:90ca7dd67eb8 15 arguments[i].type = BLANK;
williampeers 0:90ca7dd67eb8 16 }
williampeers 0:90ca7dd67eb8 17 parse(str);
williampeers 0:90ca7dd67eb8 18 }
williampeers 0:90ca7dd67eb8 19
williampeers 0:90ca7dd67eb8 20 bool Message::parse(const char str[44]){
williampeers 0:90ca7dd67eb8 21 char args[5][8] = {};
williampeers 0:90ca7dd67eb8 22 int argIndex = 0, ind = 0;
williampeers 0:90ca7dd67eb8 23 for (int i = 0; i < 44; i++) {
williampeers 0:90ca7dd67eb8 24 if (str[i] == '$') {
williampeers 0:90ca7dd67eb8 25 args[argIndex][ind] = '\0';
williampeers 0:90ca7dd67eb8 26 argIndex++;
williampeers 0:90ca7dd67eb8 27 ind = 0;
williampeers 0:90ca7dd67eb8 28 }
williampeers 0:90ca7dd67eb8 29 else if (str[i] == '\0') {
williampeers 0:90ca7dd67eb8 30 args[argIndex][ind] = '\0';
williampeers 0:90ca7dd67eb8 31 break;
williampeers 0:90ca7dd67eb8 32 }
williampeers 0:90ca7dd67eb8 33 else {
williampeers 0:90ca7dd67eb8 34 if (ind > 7) {
williampeers 0:90ca7dd67eb8 35 return(false);
williampeers 0:90ca7dd67eb8 36 }
williampeers 0:90ca7dd67eb8 37 else {
williampeers 0:90ca7dd67eb8 38 args[argIndex][ind] = str[i];
williampeers 0:90ca7dd67eb8 39 ind++;
williampeers 0:90ca7dd67eb8 40 }
williampeers 0:90ca7dd67eb8 41 }
williampeers 0:90ca7dd67eb8 42 }
williampeers 0:90ca7dd67eb8 43 cmd = VOID;
williampeers 0:90ca7dd67eb8 44 for (int i = 0; i < TOTAL_COMMANDS; i++) {
williampeers 0:90ca7dd67eb8 45 if (strcmp(args[0], commandStrings[i]) == 0) {
williampeers 0:90ca7dd67eb8 46 cmd = (command)i;
williampeers 0:90ca7dd67eb8 47 }
williampeers 0:90ca7dd67eb8 48 }
williampeers 0:90ca7dd67eb8 49
williampeers 0:90ca7dd67eb8 50 for (int i = 0; i < 4; i++) {
williampeers 0:90ca7dd67eb8 51 switch(arguments[i].type = commandArgTypes[cmd][i]) {
williampeers 0:90ca7dd67eb8 52 case DECIMAL:
williampeers 0:90ca7dd67eb8 53 arguments[i].decimal = atof(args[i+1]);
williampeers 0:90ca7dd67eb8 54 break;
williampeers 0:90ca7dd67eb8 55 case INTEGER:
williampeers 0:90ca7dd67eb8 56 arguments[i].integer = atoi(args[i+1]);
williampeers 0:90ca7dd67eb8 57 break;
williampeers 0:90ca7dd67eb8 58 case CHARACTERS:
williampeers 0:90ca7dd67eb8 59 strcpy(arguments[i].characters, args[i+1]);
williampeers 0:90ca7dd67eb8 60 break;
williampeers 0:90ca7dd67eb8 61 }
williampeers 0:90ca7dd67eb8 62 }
williampeers 0:90ca7dd67eb8 63 return(true);
williampeers 0:90ca7dd67eb8 64 }
williampeers 0:90ca7dd67eb8 65
williampeers 0:90ca7dd67eb8 66 command Message::getCommand(){
williampeers 0:90ca7dd67eb8 67 return(cmd);
williampeers 0:90ca7dd67eb8 68 }
williampeers 0:90ca7dd67eb8 69
williampeers 0:90ca7dd67eb8 70 argument Message::getArg(int ind, argumentType expectedType){
williampeers 0:90ca7dd67eb8 71 if (expectedType == arguments[ind].type) {
williampeers 0:90ca7dd67eb8 72 return(arguments[ind]);
williampeers 0:90ca7dd67eb8 73 }
williampeers 0:90ca7dd67eb8 74 else {
williampeers 0:90ca7dd67eb8 75 argument blankArg;
williampeers 0:90ca7dd67eb8 76 blankArg.type = BLANK;
williampeers 0:90ca7dd67eb8 77 strcpy(blankArg.characters, "");
williampeers 0:90ca7dd67eb8 78 return(blankArg);
williampeers 0:90ca7dd67eb8 79 }
williampeers 0:90ca7dd67eb8 80 }