Own fork of MbedSmartRestMain
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
operation/OperationSupport.cpp@93:61d44636f020, 2015-04-20 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 20 15:04:23 2015 +0000
- Revision:
- 93:61d44636f020
- Parent:
- 92:0acd11870c6a
- Child:
- 99:47ea098f8a47
Integration of new device push code base.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xinlei | 77:f6717e4eccc4 | 1 | #include <string.h> |
vwochnik | 57:4af5f1bec3a6 | 2 | #include "OperationSupport.h" |
xinlei | 93:61d44636f020 | 3 | #include "ComposedRecord.h" |
xinlei | 93:61d44636f020 | 4 | #include "ParsedRecord.h" |
xinlei | 93:61d44636f020 | 5 | #include "IntegerValue.h" |
xinlei | 92:0acd11870c6a | 6 | #include "logging.h" |
xinlei | 92:0acd11870c6a | 7 | |
vwochnik | 57:4af5f1bec3a6 | 8 | bool OperationSupport::init() |
vwochnik | 57:4af5f1bec3a6 | 9 | { |
vwochnik | 57:4af5f1bec3a6 | 10 | if (_init) |
vwochnik | 57:4af5f1bec3a6 | 11 | return false; |
vwochnik | 57:4af5f1bec3a6 | 12 | |
vwochnik | 57:4af5f1bec3a6 | 13 | // Get pending operations |
vwochnik | 57:4af5f1bec3a6 | 14 | // USAGE: 110,<DEVICE/ID> |
vwochnik | 57:4af5f1bec3a6 | 15 | if (!_tpl.add("10,110,GET,/devicecontrol/operations?status=PENDING&deviceId=%%&pageSize=100,,application/vnd.com.nsn.cumulocity.operationCollection+json,%%,UNSIGNED,\r\n")) |
vwochnik | 57:4af5f1bec3a6 | 16 | return false; |
vwochnik | 57:4af5f1bec3a6 | 17 | |
vwochnik | 57:4af5f1bec3a6 | 18 | // Set operation state |
xinlei | 92:0acd11870c6a | 19 | // USAGE: 111,<OPERATION/ID>,<STATE> |
vwochnik | 58:4cc0ae5a7058 | 20 | if (!_tpl.add("10,111,PUT,/devicecontrol/operations/%%,application/vnd.com.nsn.cumulocity.operation+json,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED STRING,\"{\"\"status\"\":\"\"%%\"\"}\"\r\n")) |
vwochnik | 57:4af5f1bec3a6 | 21 | return false; |
vwochnik | 57:4af5f1bec3a6 | 22 | |
vwochnik | 57:4af5f1bec3a6 | 23 | // Get operations |
vwochnik | 57:4af5f1bec3a6 | 24 | // Response: 210,<OPERATION/ID>,<STATUS> |
vwochnik | 57:4af5f1bec3a6 | 25 | if (!_tpl.add("11,210,\"$.operations\",,\"$.id\",\"$.status\"\r\n")) |
vwochnik | 57:4af5f1bec3a6 | 26 | return false; |
vwochnik | 57:4af5f1bec3a6 | 27 | |
vwochnik | 57:4af5f1bec3a6 | 28 | // Get operation |
vwochnik | 57:4af5f1bec3a6 | 29 | // Response: 211,<OPERATION/ID>,<STATUS> |
vwochnik | 57:4af5f1bec3a6 | 30 | if (!_tpl.add("11,211,,\"$.deviceId\",\"$.id\",\"$.status\"\r\n")) |
vwochnik | 57:4af5f1bec3a6 | 31 | return false; |
vwochnik | 63:010bbbb4732a | 32 | |
xinlei | 93:61d44636f020 | 33 | // Get operation by id |
xinlei | 93:61d44636f020 | 34 | // USAGE: 112,<OPERATION/ID> |
xinlei | 93:61d44636f020 | 35 | if (!_tpl.add("10,112,GET,/devicecontrol/operations/%%,,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED,\r\n")) |
xinlei | 93:61d44636f020 | 36 | return false; |
xinlei | 93:61d44636f020 | 37 | |
xinlei | 93:61d44636f020 | 38 | // Relay operation response |
xinlei | 93:61d44636f020 | 39 | // Response: 220,<OPERATION/ID>,<STATUS> |
xinlei | 93:61d44636f020 | 40 | if (!_tpl.add("11,220,,\"$.c8y_Relay\",\"$.id\",\"$.c8y_Relay.relayState\"\r\n")) |
xinlei | 93:61d44636f020 | 41 | return false; |
xinlei | 93:61d44636f020 | 42 | |
xinlei | 93:61d44636f020 | 43 | // Message operation response |
xinlei | 93:61d44636f020 | 44 | // Response: 221,<OPERATION/ID>,<MESSAGE> |
xinlei | 93:61d44636f020 | 45 | if (!_tpl.add("11,221,,\"$.c8y_Message\",\"$.id\",\"$.c8y_Message.text\"\r\n")) |
xinlei | 93:61d44636f020 | 46 | return false; |
xinlei | 93:61d44636f020 | 47 | |
xinlei | 93:61d44636f020 | 48 | // Configuration operation response |
xinlei | 93:61d44636f020 | 49 | // Response: 222,<OPERATION/ID>,<CONFIGURATION/STRING> |
xinlei | 93:61d44636f020 | 50 | if (!_tpl.add("11,222,,\"$.c8y_Configuration\",\"$.id\",\"$.c8y_Configuration.config\"\r\n")) |
vwochnik | 63:010bbbb4732a | 51 | return false; |
vwochnik | 57:4af5f1bec3a6 | 52 | |
vwochnik | 57:4af5f1bec3a6 | 53 | _init = true; |
vwochnik | 57:4af5f1bec3a6 | 54 | return true; |
vwochnik | 57:4af5f1bec3a6 | 55 | } |
vwochnik | 57:4af5f1bec3a6 | 56 | |
vwochnik | 57:4af5f1bec3a6 | 57 | bool OperationSupport::run() |
vwochnik | 57:4af5f1bec3a6 | 58 | { |
vwochnik | 67:c360a2b2c948 | 59 | if (_firstRun) { |
vwochnik | 67:c360a2b2c948 | 60 | _firstRun = false; |
xinlei | 92:0acd11870c6a | 61 | bool b = requestPendingOperations(); |
xinlei | 92:0acd11870c6a | 62 | return b; |
xinlei | 92:0acd11870c6a | 63 | } else { |
xinlei | 92:0acd11870c6a | 64 | return true; |
xinlei | 92:0acd11870c6a | 65 | } |
xinlei | 92:0acd11870c6a | 66 | } |
xinlei | 92:0acd11870c6a | 67 | |
xinlei | 92:0acd11870c6a | 68 | bool OperationSupport::executePendingOperation(Operation& op) |
xinlei | 92:0acd11870c6a | 69 | { |
xinlei | 92:0acd11870c6a | 70 | ComposedRecord r; |
xinlei | 92:0acd11870c6a | 71 | if (!r.add(IntegerValue(112)) || !r.add(IntegerValue(op.identifier))) { |
xinlei | 92:0acd11870c6a | 72 | return false; |
xinlei | 92:0acd11870c6a | 73 | } else if (_client.send(r) != SMARTREST_SUCCESS) { |
xinlei | 92:0acd11870c6a | 74 | _client.stop(); |
xinlei | 92:0acd11870c6a | 75 | return false; |
vwochnik | 63:010bbbb4732a | 76 | } |
xinlei | 92:0acd11870c6a | 77 | ParsedRecord p; |
xinlei | 92:0acd11870c6a | 78 | bool b = true; |
xinlei | 92:0acd11870c6a | 79 | while (_client.receive(p) == SMARTREST_SUCCESS) { |
xinlei | 92:0acd11870c6a | 80 | if (p.values() >= 3 && |
xinlei | 92:0acd11870c6a | 81 | p.value(0).integerValue() >= 220 && |
xinlei | 92:0acd11870c6a | 82 | p.value(0).integerValue() <= 222 && |
xinlei | 92:0acd11870c6a | 83 | p.value(2).valueType() == VALUE_INTEGER) { |
xinlei | 92:0acd11870c6a | 84 | Operation* op1 = opool.alloc(); |
xinlei | 92:0acd11870c6a | 85 | op1->identifier = p.value(2).integerValue(); |
xinlei | 93:61d44636f020 | 86 | // bool ret = _executor.executeOperation(p); |
xinlei | 93:61d44636f020 | 87 | bool ret = true; |
xinlei | 92:0acd11870c6a | 88 | op1->state = ret ? OPERATION_SUCCESSFUL : OPERATION_FAILED; |
xinlei | 92:0acd11870c6a | 89 | opool.put(op1); |
xinlei | 92:0acd11870c6a | 90 | } |
xinlei | 92:0acd11870c6a | 91 | } |
xinlei | 92:0acd11870c6a | 92 | _client.stop(); |
xinlei | 92:0acd11870c6a | 93 | return b; |
vwochnik | 63:010bbbb4732a | 94 | } |
vwochnik | 63:010bbbb4732a | 95 | |
vwochnik | 63:010bbbb4732a | 96 | bool OperationSupport::requestPendingOperations() |
vwochnik | 63:010bbbb4732a | 97 | { |
vwochnik | 59:f96be79feccd | 98 | IntegerValue msgId(110); |
vwochnik | 59:f96be79feccd | 99 | IntegerValue deviceId(_deviceId); |
xinlei | 92:0acd11870c6a | 100 | ComposedRecord record; |
xinlei | 92:0acd11870c6a | 101 | |
vwochnik | 59:f96be79feccd | 102 | if ((!record.add(msgId)) || (!record.add(deviceId))) |
vwochnik | 59:f96be79feccd | 103 | return false; |
xinlei | 92:0acd11870c6a | 104 | else if (_client.send(record) != SMARTREST_SUCCESS) { |
vwochnik | 59:f96be79feccd | 105 | _client.stop(); |
vwochnik | 59:f96be79feccd | 106 | return false; |
vwochnik | 59:f96be79feccd | 107 | } |
xinlei | 92:0acd11870c6a | 108 | |
xinlei | 92:0acd11870c6a | 109 | uint8_t ret; |
xinlei | 92:0acd11870c6a | 110 | ParsedRecord received; |
xinlei | 92:0acd11870c6a | 111 | Operation opl[10]; |
xinlei | 92:0acd11870c6a | 112 | size_t c = 0; |
xinlei | 92:0acd11870c6a | 113 | while ((ret=_client.receive(received)) == SMARTREST_SUCCESS) { |
xinlei | 92:0acd11870c6a | 114 | if (c < 10 && operationFromRecord(received, opl[c])) { |
xinlei | 92:0acd11870c6a | 115 | ++c; |
xinlei | 92:0acd11870c6a | 116 | } else { |
xinlei | 92:0acd11870c6a | 117 | aWarning("Ignored pending operation after 10.\n"); |
vwochnik | 61:15719dbe8820 | 118 | break; |
vwochnik | 61:15719dbe8820 | 119 | } |
vwochnik | 59:f96be79feccd | 120 | } |
vwochnik | 59:f96be79feccd | 121 | _client.stop(); |
xinlei | 92:0acd11870c6a | 122 | |
xinlei | 92:0acd11870c6a | 123 | for (size_t i = 0; i < c; ++i) { |
xinlei | 92:0acd11870c6a | 124 | Operation* op = opool.alloc(); |
xinlei | 92:0acd11870c6a | 125 | op->identifier = opl[i].identifier; |
xinlei | 92:0acd11870c6a | 126 | op->state = OPERATION_EXECUTING; |
xinlei | 92:0acd11870c6a | 127 | opool.put(op); |
xinlei | 92:0acd11870c6a | 128 | executePendingOperation(opl[i]); |
xinlei | 92:0acd11870c6a | 129 | } |
xinlei | 92:0acd11870c6a | 130 | return (ret == SMARTREST_END_OF_RESPONSE || ret == SMARTREST_CONNECTION_CLOSED); |
vwochnik | 59:f96be79feccd | 131 | } |
vwochnik | 59:f96be79feccd | 132 | |
xinlei | 92:0acd11870c6a | 133 | bool OperationSupport::operationFromRecord(ParsedRecord& received, Operation& op) |
vwochnik | 59:f96be79feccd | 134 | { |
xinlei | 92:0acd11870c6a | 135 | if ((received.values() < 4) || |
xinlei | 92:0acd11870c6a | 136 | (received.value(0).valueType() != VALUE_INTEGER) || |
xinlei | 92:0acd11870c6a | 137 | // (received.value(0).integerValue() != 211) || |
xinlei | 92:0acd11870c6a | 138 | (received.value(2).valueType() != VALUE_INTEGER) || |
xinlei | 92:0acd11870c6a | 139 | (received.value(3).valueType() != VALUE_CHARACTER)) |
xinlei | 92:0acd11870c6a | 140 | return false; |
xinlei | 92:0acd11870c6a | 141 | |
xinlei | 92:0acd11870c6a | 142 | op.identifier = received.value(2).integerValue(); |
xinlei | 92:0acd11870c6a | 143 | const char *tmp = received.value(3).characterValue(); |
xinlei | 92:0acd11870c6a | 144 | if (strcmp(tmp, strExecuting) == 0) |
xinlei | 92:0acd11870c6a | 145 | op.state = OPERATION_EXECUTING; |
xinlei | 92:0acd11870c6a | 146 | else if (strcmp(tmp, strSuccessful) == 0) |
xinlei | 92:0acd11870c6a | 147 | op.state = OPERATION_SUCCESSFUL; |
xinlei | 92:0acd11870c6a | 148 | else if (strcmp(tmp, strFailed) == 0) |
xinlei | 92:0acd11870c6a | 149 | op.state = OPERATION_FAILED; |
xinlei | 92:0acd11870c6a | 150 | else if (strcmp(tmp, strPending) == 0) |
xinlei | 92:0acd11870c6a | 151 | op.state = OPERATION_PENDING; |
xinlei | 92:0acd11870c6a | 152 | else |
xinlei | 92:0acd11870c6a | 153 | return false; |
xinlei | 92:0acd11870c6a | 154 | return true; |
xinlei | 93:61d44636f020 | 155 | } |