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/OperationSupport.cpp
- Committer:
- vwochnik
- Date:
- 2014-10-24
- Revision:
- 59:f96be79feccd
- Parent:
- 58:4cc0ae5a7058
- Child:
- 60:3c822f97fc73
File content as of revision 59:f96be79feccd:
#include "OperationSupport.h" #include <string.h> #include "ComposedRecord.h" #include "CharValue.h" #include "IntegerValue.h" CharValue aOperationStatePending("PENDING"); CharValue aOperationStateExecuting("EXECUTING"); CharValue aOperationStateSuccessful("SUCCESSFUL"); CharValue aOperationStateFailed("FAILED"); OperationSupport::OperationSupport(AbstractSmartRest& client, SmartRestTemplate& tpl, long& deviceId) : _client(client), _tpl(tpl), _deviceId(deviceId) { _init = false; } bool OperationSupport::init() { if (_init) return false; // Get pending operations // USAGE: 110,<DEVICE/ID> if (!_tpl.add("10,110,GET,/devicecontrol/operations?status=PENDING&deviceId=%%&pageSize=100,,application/vnd.com.nsn.cumulocity.operationCollection+json,%%,UNSIGNED,\r\n")) return false; // Set operation state // USAGE: 110,<OPERATION/ID>,<STATE> 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")) return false; // Get operations // Response: 210,<OPERATION/ID>,<STATUS> if (!_tpl.add("11,210,\"$.operations\",,\"$.id\",\"$.status\"\r\n")) return false; // Get operation // Response: 211,<OPERATION/ID>,<STATUS> if (!_tpl.add("11,211,,\"$.deviceId\",\"$.id\",\"$.status\"\r\n")) return false; _init = true; return true; } bool OperationSupport::run() { ComposedRecord record; ParsedRecord received; IntegerValue msgId(110); IntegerValue deviceId(_deviceId); if ((!record.add(msgId)) || (!record.add(deviceId))) return false; if (_client.send(record) != SMARTREST_SUCCESS) { _client.stop(); return false; } _client.stop(); } bool operationFromRecord(ParsedRecord& received, OperationStore::Operation& op) { const char *tmp; if ((received.values() < 4) || (received.value(0).valueType() != VALUE_INTEGER) || (received.value(0).integerValue() != 211) || (received.value(2).valueType() != VALUE_INTEGER) || (received.value(3).valueType() != VALUE_CHARACTER)) return false; tmp = received.value(3).characterValue(); op.identifier = received.value(2).integerValue(); if (strcmp(tmp, "EXECUTING") == 0) op.state = STATE_EXECUTING; else if (strcmp(tmp, "SUCCESSFUL") == 0) op.state = STATE_SUCCESSFUL; else if (strcmp(tmp, "FAILED") == 0) op.state = STATE_FAILED; else op.state = STATE_PENDING; return true; } bool OperationSupport::updateOperation(OperationStore::Operation& op) { ComposedRecord record; ParsedRecord received; IntegerValue msgId(111); IntegerValue operationId(op.identifier); if ((!record.add(msgId)) || (!record.add(operationId)) || (!record.add(operationStateValue(op)))) return false; if (_client.send(record) != SMARTREST_SUCCESS) { _client.stop(); return false; } if (_client.receive(received) != SMARTREST_SUCCESS) { _client.stop(); return false; } _client.stop(); //TODO: assertions return true; } CharValue& OperationSupport::operationStateValue(OperationStore::Operation& op) { switch (op.state) { case STATE_EXECUTING: return aOperationStateExecuting; case STATE_SUCCESSFUL: return aOperationStateSuccessful; case STATE_FAILED: return aOperationStateFailed; default: return aOperationStatePending; } }