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
operation/OperationExecutor.cpp@68:0dc778a16d0d, 2014-12-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |