Command class for communication. Commands have a command member and up to four arguments with variable types.
commands.cpp@0:90ca7dd67eb8, 2017-08-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |