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:
vwochnik
Date:
Sat Dec 06 19:47:23 2014 +0000
Revision:
68:0dc778a16d0d
Parent:
66:31c754c36ed7
Child:
77:f6717e4eccc4
configuration for interval

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 62:86a04c5bda18 1 #include "OperationExecutor.h"
vwochnik 62:86a04c5bda18 2 #include "ComposedRecord.h"
vwochnik 62:86a04c5bda18 3 #include "CharValue.h"
vwochnik 62:86a04c5bda18 4 #include "IntegerValue.h"
vwochnik 64:31a640c32399 5 #include <string.h>
vwochnik 63:010bbbb4732a 6 #include <stdio.h>
vwochnik 62:86a04c5bda18 7
vwochnik 66:31c754c36ed7 8 #define FOUND_RELAY 1
vwochnik 66:31c754c36ed7 9 #define FOUND_MESSAGE 2
vwochnik 68:0dc778a16d0d 10 #define FOUND_CONFIGURATION 3
vwochnik 66:31c754c36ed7 11
vwochnik 68:0dc778a16d0d 12 OperationExecutor::OperationExecutor(AbstractSmartRest& client, SmartRestTemplate& tpl, long& deviceId, ConfigurationSynchronization& configurationSynchronization, DeviceIO& io) :
vwochnik 62:86a04c5bda18 13 _client(client),
vwochnik 62:86a04c5bda18 14 _tpl(tpl),
vwochnik 68:0dc778a16d0d 15 _configurationSynchronization(configurationSynchronization),
vwochnik 65:a62dbef2f924 16 _deviceId(deviceId),
vwochnik 65:a62dbef2f924 17 _io(io)
vwochnik 62:86a04c5bda18 18 {
vwochnik 62:86a04c5bda18 19 _init = false;
vwochnik 62:86a04c5bda18 20 }
vwochnik 62:86a04c5bda18 21
vwochnik 62:86a04c5bda18 22 bool OperationExecutor::init()
vwochnik 62:86a04c5bda18 23 {
vwochnik 62:86a04c5bda18 24 if (_init)
vwochnik 62:86a04c5bda18 25 return false;
vwochnik 62:86a04c5bda18 26
vwochnik 64:31a640c32399 27 // Get operation by id
vwochnik 64:31a640c32399 28 // USAGE: 112,<OPERATION/ID>
vwochnik 62:86a04c5bda18 29 if (!_tpl.add("10,112,GET,/devicecontrol/operations/%%,,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED,\r\n"))
vwochnik 62:86a04c5bda18 30 return false;
vwochnik 62:86a04c5bda18 31
vwochnik 64:31a640c32399 32 // Relay operation response
vwochnik 66:31c754c36ed7 33 // Response: 220,<OPERATION/ID>,<STATUS>
vwochnik 64:31a640c32399 34 if (!_tpl.add("11,220,,\"$.c8y_Relay\",\"$.id\",\"$.c8y_Relay.relayState\"\r\n"))
vwochnik 64:31a640c32399 35 return false;
vwochnik 64:31a640c32399 36
vwochnik 66:31c754c36ed7 37 // Message operation response
vwochnik 66:31c754c36ed7 38 // Response: 221,<OPERATION/ID>,<MESSAGE>
vwochnik 66:31c754c36ed7 39 if (!_tpl.add("11,221,,\"$.c8y_Message\",\"$.id\",\"$.c8y_Message.text\"\r\n"))
vwochnik 66:31c754c36ed7 40 return false;
vwochnik 66:31c754c36ed7 41
vwochnik 68:0dc778a16d0d 42 // Configuration operation response
vwochnik 68:0dc778a16d0d 43 // Response: 222,<OPERATION/ID>,<CONFIGURATION/STRING>
vwochnik 68:0dc778a16d0d 44 if (!_tpl.add("11,222,,\"$.c8y_Configuration\",\"$.id\",\"$.c8y_Configuration.config\"\r\n"))
vwochnik 68:0dc778a16d0d 45 return false;
vwochnik 68:0dc778a16d0d 46
vwochnik 62:86a04c5bda18 47 _init = true;
vwochnik 62:86a04c5bda18 48 return true;
vwochnik 62:86a04c5bda18 49 }
vwochnik 62:86a04c5bda18 50
vwochnik 62:86a04c5bda18 51 bool OperationExecutor::executeOperation(OperationStore::Operation& op)
vwochnik 62:86a04c5bda18 52 {
vwochnik 68:0dc778a16d0d 53 uint8_t ret; uint8_t found; bool relayState; char message[256];
vwochnik 64:31a640c32399 54 ComposedRecord record;
vwochnik 64:31a640c32399 55 ParsedRecord received;
vwochnik 64:31a640c32399 56
vwochnik 64:31a640c32399 57 IntegerValue msgId(112);
vwochnik 64:31a640c32399 58 IntegerValue operationId(op.identifier);
vwochnik 64:31a640c32399 59 if ((!record.add(msgId)) || (!record.add(operationId)))
vwochnik 64:31a640c32399 60 return false;
vwochnik 64:31a640c32399 61
vwochnik 64:31a640c32399 62 if (_client.send(record) != SMARTREST_SUCCESS) {
vwochnik 64:31a640c32399 63 _client.stop();
vwochnik 64:31a640c32399 64 return false;
vwochnik 64:31a640c32399 65 }
vwochnik 64:31a640c32399 66
vwochnik 66:31c754c36ed7 67 found = 0;
vwochnik 64:31a640c32399 68 while ((ret = _client.receive(received)) == SMARTREST_SUCCESS) {
vwochnik 64:31a640c32399 69 if ((received.values() == 4) &&
vwochnik 64:31a640c32399 70 (received.value(0).valueType() == VALUE_INTEGER) &&
vwochnik 64:31a640c32399 71 (received.value(0).integerValue() == 220) &&
vwochnik 64:31a640c32399 72 (received.value(2).valueType() == VALUE_INTEGER) &&
vwochnik 64:31a640c32399 73 (received.value(2).integerValue() == op.identifier) &&
vwochnik 64:31a640c32399 74 (received.value(3).valueType() == VALUE_CHARACTER)) {
vwochnik 64:31a640c32399 75 relayState = (strcmp("CLOSED", received.value(3).characterValue()) == 0);
vwochnik 66:31c754c36ed7 76 found = FOUND_RELAY;
vwochnik 66:31c754c36ed7 77 break;
vwochnik 66:31c754c36ed7 78 }
vwochnik 66:31c754c36ed7 79
vwochnik 66:31c754c36ed7 80 if ((received.values() == 4) &&
vwochnik 66:31c754c36ed7 81 (received.value(0).valueType() == VALUE_INTEGER) &&
vwochnik 66:31c754c36ed7 82 (received.value(0).integerValue() == 221) &&
vwochnik 66:31c754c36ed7 83 (received.value(2).valueType() == VALUE_INTEGER) &&
vwochnik 66:31c754c36ed7 84 (received.value(2).integerValue() == op.identifier) &&
vwochnik 66:31c754c36ed7 85 (received.value(3).valueType() == VALUE_CHARACTER)) {
vwochnik 66:31c754c36ed7 86 strncpy(message, received.value(3).characterValue(), 128);
vwochnik 66:31c754c36ed7 87 message[127] = '\0';
vwochnik 66:31c754c36ed7 88 found = FOUND_MESSAGE;
vwochnik 64:31a640c32399 89 break;
vwochnik 64:31a640c32399 90 }
vwochnik 68:0dc778a16d0d 91
vwochnik 68:0dc778a16d0d 92 if ((received.values() == 4) &&
vwochnik 68:0dc778a16d0d 93 (received.value(0).valueType() == VALUE_INTEGER) &&
vwochnik 68:0dc778a16d0d 94 (received.value(0).integerValue() == 222) &&
vwochnik 68:0dc778a16d0d 95 (received.value(2).valueType() == VALUE_INTEGER) &&
vwochnik 68:0dc778a16d0d 96 (received.value(2).integerValue() == op.identifier) &&
vwochnik 68:0dc778a16d0d 97 (received.value(3).valueType() == VALUE_CHARACTER)) {
vwochnik 68:0dc778a16d0d 98 strncpy(message, received.value(3).characterValue(), 256);
vwochnik 68:0dc778a16d0d 99 message[255] = '\0';
vwochnik 68:0dc778a16d0d 100 found = FOUND_CONFIGURATION;
vwochnik 68:0dc778a16d0d 101 break;
vwochnik 68:0dc778a16d0d 102 }
vwochnik 64:31a640c32399 103 }
vwochnik 64:31a640c32399 104 _client.stop();
vwochnik 64:31a640c32399 105
vwochnik 66:31c754c36ed7 106 switch (found) {
vwochnik 66:31c754c36ed7 107 case FOUND_RELAY:
vwochnik 66:31c754c36ed7 108 return executeRelayStateUpdate(relayState);
vwochnik 66:31c754c36ed7 109 case FOUND_MESSAGE:
vwochnik 66:31c754c36ed7 110 return executeMessageDisplay(message);
vwochnik 68:0dc778a16d0d 111 case FOUND_CONFIGURATION:
vwochnik 68:0dc778a16d0d 112 return executeUpdateConfiguration(message);
vwochnik 66:31c754c36ed7 113 default:
vwochnik 64:31a640c32399 114 return false;
vwochnik 66:31c754c36ed7 115 }
vwochnik 62:86a04c5bda18 116 }
vwochnik 64:31a640c32399 117
vwochnik 64:31a640c32399 118 bool OperationExecutor::executeRelayStateUpdate(bool relayState)
vwochnik 64:31a640c32399 119 {
vwochnik 64:31a640c32399 120 if (relayState)
vwochnik 65:a62dbef2f924 121 _io.deviceFeedback().closeRelay();
vwochnik 64:31a640c32399 122 else
vwochnik 65:a62dbef2f924 123 _io.deviceFeedback().openRelay();
vwochnik 64:31a640c32399 124 return true;
vwochnik 64:31a640c32399 125 }
vwochnik 66:31c754c36ed7 126
vwochnik 66:31c754c36ed7 127 bool OperationExecutor::executeMessageDisplay(const char *message)
vwochnik 66:31c754c36ed7 128 {
vwochnik 66:31c754c36ed7 129 _io.lcdPrint(message);
vwochnik 66:31c754c36ed7 130 return true;
vwochnik 66:31c754c36ed7 131 }
vwochnik 68:0dc778a16d0d 132
vwochnik 68:0dc778a16d0d 133 bool OperationExecutor::executeUpdateConfiguration(const char *config)
vwochnik 68:0dc778a16d0d 134 {
vwochnik 68:0dc778a16d0d 135 return _configurationSynchronization.updateConfiguration(config);
vwochnik 68:0dc778a16d0d 136 }