Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
xinlei
Date:
Mon Apr 20 15:04:23 2015 +0000
Revision:
94:61d44636f020
Child:
95:010b0f7a0a1a
Integration of new device push code base.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 94:61d44636f020 1 #include <stdio.h>
xinlei 94:61d44636f020 2 #include <string.h>
xinlei 94:61d44636f020 3 #include "ControlParser.h"
xinlei 94:61d44636f020 4 #include "DeviceFeedback.h"
xinlei 94:61d44636f020 5 #include "logging.h"
xinlei 94:61d44636f020 6
xinlei 94:61d44636f020 7 void ControlParser::handleControlMessage(const char *buf)
xinlei 94:61d44636f020 8 {
xinlei 94:61d44636f020 9 if (buf == NULL) return;
xinlei 94:61d44636f020 10 const char *p = skipHTTPHeader(buf);
xinlei 94:61d44636f020 11 Token tok;
xinlei 94:61d44636f020 12 ptrPF = &ControlParser::parseGetOp;
xinlei 94:61d44636f020 13 do {
xinlei 94:61d44636f020 14 p = lex(p, tok);
xinlei 94:61d44636f020 15 (this->*ptrPF)(tok);
xinlei 94:61d44636f020 16 } while (*p);
xinlei 94:61d44636f020 17 }
xinlei 94:61d44636f020 18
xinlei 94:61d44636f020 19 void ControlParser::parseGetOp(Token& tok)
xinlei 94:61d44636f020 20 {
xinlei 94:61d44636f020 21 if (tok.type == Token::INT && strncmp("211", tok.p, tok.len)==0) {
xinlei 94:61d44636f020 22 opType = 211;
xinlei 94:61d44636f020 23 ptrPF = &ControlParser::parseDeviceId;
xinlei 94:61d44636f020 24 } else {
xinlei 94:61d44636f020 25 parseError(tok);
xinlei 94:61d44636f020 26 }
xinlei 94:61d44636f020 27 }
xinlei 94:61d44636f020 28
xinlei 94:61d44636f020 29 void ControlParser::parseDeviceId(Token& tok)
xinlei 94:61d44636f020 30 {
xinlei 94:61d44636f020 31 if (tok.type == Token::INT) {
xinlei 94:61d44636f020 32 ptrPF = &ControlParser::parseOpId;
xinlei 94:61d44636f020 33 } else {
xinlei 94:61d44636f020 34 parseError(tok);
xinlei 94:61d44636f020 35 }
xinlei 94:61d44636f020 36 }
xinlei 94:61d44636f020 37
xinlei 94:61d44636f020 38 void ControlParser::parseOpId(Token& tok)
xinlei 94:61d44636f020 39 {
xinlei 94:61d44636f020 40 if (tok.type == Token::INT) {
xinlei 94:61d44636f020 41 if (opType == 211) {
xinlei 94:61d44636f020 42 sscanf(tok.p, "%ld", &op.identifier);
xinlei 94:61d44636f020 43 ptrPF = &ControlParser::parseOpState;
xinlei 94:61d44636f020 44 } else if (opType >= 220 && opType <= 222){
xinlei 94:61d44636f020 45 ptrPF = &ControlParser::parseOpData;
xinlei 94:61d44636f020 46 } else {
xinlei 94:61d44636f020 47 parseError(tok);
xinlei 94:61d44636f020 48 }
xinlei 94:61d44636f020 49 } else {
xinlei 94:61d44636f020 50 parseError(tok);
xinlei 94:61d44636f020 51 }
xinlei 94:61d44636f020 52 }
xinlei 94:61d44636f020 53
xinlei 94:61d44636f020 54 void ControlParser::parseOpState(Token& tok)
xinlei 94:61d44636f020 55 {
xinlei 94:61d44636f020 56 if (tok.type == Token::STRING) {
xinlei 94:61d44636f020 57 if (strncmp(strPending, tok.p, tok.len)==0) {
xinlei 94:61d44636f020 58 Operation *p = opool.alloc();
xinlei 94:61d44636f020 59 p->identifier = op.identifier;
xinlei 94:61d44636f020 60 p->state = OPERATION_EXECUTING;
xinlei 94:61d44636f020 61 opool.put(p);
xinlei 94:61d44636f020 62 ptrPF = &ControlParser::parseOpType;
xinlei 94:61d44636f020 63 } else {
xinlei 94:61d44636f020 64 parseError(tok);
xinlei 94:61d44636f020 65 }
xinlei 94:61d44636f020 66 } else {
xinlei 94:61d44636f020 67 parseError(tok);
xinlei 94:61d44636f020 68 }
xinlei 94:61d44636f020 69 }
xinlei 94:61d44636f020 70
xinlei 94:61d44636f020 71 void ControlParser::parseOpType(Token& tok)
xinlei 94:61d44636f020 72 {
xinlei 94:61d44636f020 73 if (tok.type == Token::INT) {
xinlei 94:61d44636f020 74 sscanf(tok.p, "%u", &opType);
xinlei 94:61d44636f020 75 if (opType >= 220 && opType <= 222) {
xinlei 94:61d44636f020 76 ptrPF = &ControlParser::parseDeviceId;
xinlei 94:61d44636f020 77 } else {
xinlei 94:61d44636f020 78 parseError(tok);
xinlei 94:61d44636f020 79 }
xinlei 94:61d44636f020 80 } else {
xinlei 94:61d44636f020 81 parseError(tok);
xinlei 94:61d44636f020 82 }
xinlei 94:61d44636f020 83 }
xinlei 94:61d44636f020 84
xinlei 94:61d44636f020 85 void ControlParser::parseOpData(Token& tok)
xinlei 94:61d44636f020 86 {
xinlei 94:61d44636f020 87 bool ret = true;
xinlei 94:61d44636f020 88 if (opType == 220) {
xinlei 94:61d44636f020 89 if (strncmp("CLOSED", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 90 closeRelay();
xinlei 94:61d44636f020 91 } else if (strncmp("OPEN", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 92 openRelay();
xinlei 94:61d44636f020 93 } else {
xinlei 94:61d44636f020 94 aError("Relay op (%.*s)\n", (int)tok.len, tok.p);
xinlei 94:61d44636f020 95 ret = false;
xinlei 94:61d44636f020 96 }
xinlei 94:61d44636f020 97 } else if (opType == 221) {
xinlei 94:61d44636f020 98 char line[30] = {0};
xinlei 94:61d44636f020 99 size_t num = tok.len<30 ? tok.len : 30;
xinlei 94:61d44636f020 100 if (tok.type == Token::STRING)
xinlei 94:61d44636f020 101 strncpyEscape(line, tok.p, num);
xinlei 94:61d44636f020 102 else
xinlei 94:61d44636f020 103 strncpy(line, tok.p, num);
xinlei 94:61d44636f020 104 _lcdDisplay.setFirstLine(line);
xinlei 94:61d44636f020 105 } else if (opType == 222) {
xinlei 94:61d44636f020 106 char config[128];
xinlei 94:61d44636f020 107 size_t num = tok.len<128 ? tok.len : 128;
xinlei 94:61d44636f020 108 strncpy(config, tok.p, num);
xinlei 94:61d44636f020 109 ret = _configSync.updateConfiguration(config);
xinlei 94:61d44636f020 110 } else {
xinlei 94:61d44636f020 111 parseError(tok);
xinlei 94:61d44636f020 112 return;
xinlei 94:61d44636f020 113 }
xinlei 94:61d44636f020 114 Operation *p = opool.alloc();
xinlei 94:61d44636f020 115 p->identifier = op.identifier;
xinlei 94:61d44636f020 116 p->state = ret ? OPERATION_SUCCESSFUL : OPERATION_FAILED;
xinlei 94:61d44636f020 117 opool.put(p);
xinlei 94:61d44636f020 118 ptrPF = &ControlParser::parseGetOpOrBayeuxAdvice;
xinlei 94:61d44636f020 119 }
xinlei 94:61d44636f020 120
xinlei 94:61d44636f020 121 void ControlParser::parseGetOpOrBayeuxAdvice(Token& tok)
xinlei 94:61d44636f020 122 {
xinlei 94:61d44636f020 123 if (strncmp("211", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 124 parseGetOp(tok);
xinlei 94:61d44636f020 125 } else if (strncmp("86", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 126 parseBayeuxAdvice(tok);
xinlei 94:61d44636f020 127 } else {
xinlei 94:61d44636f020 128 parseError(tok);
xinlei 94:61d44636f020 129 }
xinlei 94:61d44636f020 130 }
xinlei 94:61d44636f020 131
xinlei 94:61d44636f020 132 void ControlParser::parseBayeuxAdvice(Token& tok)
xinlei 94:61d44636f020 133 {
xinlei 94:61d44636f020 134 if (strncmp("86", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 135 ptrPF = &ControlParser::parseAdviceTimeout;
xinlei 94:61d44636f020 136 } else {
xinlei 94:61d44636f020 137 parseError(tok);
xinlei 94:61d44636f020 138 }
xinlei 94:61d44636f020 139 }
xinlei 94:61d44636f020 140
xinlei 94:61d44636f020 141 void ControlParser::parseAdviceTimeout(Token& tok)
xinlei 94:61d44636f020 142 {
xinlei 94:61d44636f020 143 if (tok.type == Token::NONE) {
xinlei 94:61d44636f020 144 bayeuxTimeout = -1;
xinlei 94:61d44636f020 145 ptrPF = &ControlParser::parseAdviceInterval;
xinlei 94:61d44636f020 146 } else if (tok.type == Token::INT) {
xinlei 94:61d44636f020 147 sscanf(tok.p, "%d", &bayeuxTimeout);
xinlei 94:61d44636f020 148 ptrPF = &ControlParser::parseAdviceInterval;
xinlei 94:61d44636f020 149 } else {
xinlei 94:61d44636f020 150 parseError(tok);
xinlei 94:61d44636f020 151 }
xinlei 94:61d44636f020 152 }
xinlei 94:61d44636f020 153
xinlei 94:61d44636f020 154 void ControlParser::parseAdviceInterval(Token& tok)
xinlei 94:61d44636f020 155 {
xinlei 94:61d44636f020 156 if (tok.type == Token::NONE) {
xinlei 94:61d44636f020 157 bayeuxInterval = -1;
xinlei 94:61d44636f020 158 ptrPF = &ControlParser::parseUnknownInt;
xinlei 94:61d44636f020 159 } else if (tok.type == Token::INT) {
xinlei 94:61d44636f020 160 sscanf(tok.p, "%d", &bayeuxInterval);
xinlei 94:61d44636f020 161 ptrPF = &ControlParser::parseUnknownInt;
xinlei 94:61d44636f020 162 } else {
xinlei 94:61d44636f020 163 parseError(tok);
xinlei 94:61d44636f020 164 }
xinlei 94:61d44636f020 165 }
xinlei 94:61d44636f020 166
xinlei 94:61d44636f020 167 void ControlParser::parseUnknownInt(Token& tok)
xinlei 94:61d44636f020 168 {
xinlei 94:61d44636f020 169 if (tok.type == Token::INT) {
xinlei 94:61d44636f020 170 ptrPF = &ControlParser::parseAdvicePolicy;
xinlei 94:61d44636f020 171 } else {
xinlei 94:61d44636f020 172 parseError(tok);
xinlei 94:61d44636f020 173 }
xinlei 94:61d44636f020 174 }
xinlei 94:61d44636f020 175
xinlei 94:61d44636f020 176 void ControlParser::parseAdvicePolicy(Token& tok)
xinlei 94:61d44636f020 177 {
xinlei 94:61d44636f020 178 if (tok.type == Token::STRING) {
xinlei 94:61d44636f020 179 if (strncmp("retry", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 180 bayeuxAdvice = BA_RETRY;
xinlei 94:61d44636f020 181 } else if (strncmp("handshake", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 182 bayeuxAdvice = BA_HANDSHAKE;
xinlei 94:61d44636f020 183 } else if (strncmp("none", tok.p, tok.len) == 0) {
xinlei 94:61d44636f020 184 bayeuxAdvice = BA_NONE;
xinlei 94:61d44636f020 185 } else {
xinlei 94:61d44636f020 186 parseError(tok);
xinlei 94:61d44636f020 187 }
xinlei 94:61d44636f020 188 } else {
xinlei 94:61d44636f020 189 parseError(tok);
xinlei 94:61d44636f020 190 }
xinlei 94:61d44636f020 191 }
xinlei 94:61d44636f020 192
xinlei 94:61d44636f020 193 void ControlParser::parseError(Token& tok)
xinlei 94:61d44636f020 194 {
xinlei 94:61d44636f020 195 aError("(%d) %.*s\n", tok.type, (int)tok.len, tok.p);
xinlei 94:61d44636f020 196 ptrPF = &ControlParser::parseRecover;
xinlei 94:61d44636f020 197 }
xinlei 94:61d44636f020 198
xinlei 94:61d44636f020 199 void ControlParser::parseRecover(Token& tok)
xinlei 94:61d44636f020 200 {
xinlei 94:61d44636f020 201 if (tok.type == Token::INT) {
xinlei 94:61d44636f020 202 int i = 0;
xinlei 94:61d44636f020 203 sscanf(tok.p, "%d", &i);
xinlei 94:61d44636f020 204 if (i == 211) {
xinlei 94:61d44636f020 205 parseGetOp(tok);
xinlei 94:61d44636f020 206 } else if (i >= 220 && i <= 222) {
xinlei 94:61d44636f020 207 parseOpType(tok);
xinlei 94:61d44636f020 208 } else if (i == 86) {
xinlei 94:61d44636f020 209 parseBayeuxAdvice(tok);
xinlei 94:61d44636f020 210 } else {
xinlei 94:61d44636f020 211 ptrPF = &ControlParser::parseRecover;
xinlei 94:61d44636f020 212 }
xinlei 94:61d44636f020 213 } else {
xinlei 94:61d44636f020 214 ptrPF = &ControlParser::parseRecover;
xinlei 94:61d44636f020 215 }
xinlei 94:61d44636f020 216 }