Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
operation/OperationSupport.cpp
- Committer:
- xinlei
- Date:
- 2015-05-07
- Revision:
- 100:47ea098f8a47
- Parent:
- 94:61d44636f020
- Child:
- 101:dbcd3bc51758
File content as of revision 100:47ea098f8a47:
#include <string.h>
#include "OperationSupport.h"
#include "ComposedRecord.h"
#include "ParsedRecord.h"
#include "IntegerValue.h"
#include "logging.h"
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: 111,<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;
// Get operation by id
// USAGE: 112,<OPERATION/ID>
if (!_tpl.add("10,112,GET,/devicecontrol/operations/%%,,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED,\r\n"))
return false;
// Relay operation response
// Response: 220,<OPERATION/ID>,<STATUS>
if (!_tpl.add("11,220,,\"$.c8y_Relay\",\"$.id\",\"$.c8y_Relay.relayState\"\r\n"))
return false;
// Message operation response
// Response: 221,<OPERATION/ID>,<MESSAGE>
if (!_tpl.add("11,221,,\"$.c8y_Message\",\"$.id\",\"$.c8y_Message.text\"\r\n"))
return false;
// Configuration operation response
// Response: 222,<OPERATION/ID>,<CONFIGURATION/STRING>
if (!_tpl.add("11,222,,\"$.c8y_Configuration\",\"$.id\",\"$.c8y_Configuration.config\"\r\n"))
return false;
_init = true;
return true;
}
bool OperationSupport::run()
{
if (_firstRun) {
_firstRun = false;
bool b = requestPendingOperations();
return b;
} else {
return true;
}
}
bool OperationSupport::executePendingOperation(Operation& op)
{
ComposedRecord r;
if (!r.add(IntegerValue(112)) || !r.add(IntegerValue(op.identifier))) {
return false;
} else if (_client.send(r) != SMARTREST_SUCCESS) {
_client.stop();
return false;
}
ParsedRecord p;
bool b = true;
while (_client.receive(p) == SMARTREST_SUCCESS) {
if (p.values() >= 3 &&
p.value(0).integerValue() >= 220 &&
p.value(0).integerValue() <= 222 &&
p.value(2).valueType() == VALUE_INTEGER) {
Operation* op1 = opool.alloc();
op1->identifier = p.value(2).integerValue();
// bool ret = _executor.executeOperation(p);
bool ret = true;
op1->state = ret ? OPERATION_SUCCESSFUL : OPERATION_FAILED;
opool.put(op1);
}
}
_client.stop();
return b;
}
bool OperationSupport::requestPendingOperations()
{
IntegerValue msgId(110);
ComposedRecord record;
if (!record.add(msgId) || !record.add(IntegerValue(deviceID)))
return false;
else if (_client.send(record) != SMARTREST_SUCCESS) {
_client.stop();
return false;
}
uint8_t ret;
ParsedRecord received;
Operation opl[10];
size_t c = 0;
while ((ret=_client.receive(received)) == SMARTREST_SUCCESS) {
if (c < 10 && operationFromRecord(received, opl[c])) {
++c;
} else {
aWarning("Ignored pending operation after 10.\n");
break;
}
}
_client.stop();
for (size_t i = 0; i < c; ++i) {
Operation* op = opool.alloc();
op->identifier = opl[i].identifier;
op->state = OPERATION_EXECUTING;
opool.put(op);
executePendingOperation(opl[i]);
}
return (ret == SMARTREST_END_OF_RESPONSE || ret == SMARTREST_CONNECTION_CLOSED);
}
bool OperationSupport::operationFromRecord(ParsedRecord& received, Operation& op)
{
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;
op.identifier = received.value(2).integerValue();
const char *tmp = received.value(3).characterValue();
if (strcmp(tmp, strExecuting) == 0)
op.state = OPERATION_EXECUTING;
else if (strcmp(tmp, strSuccessful) == 0)
op.state = OPERATION_SUCCESSFUL;
else if (strcmp(tmp, strFailed) == 0)
op.state = OPERATION_FAILED;
else if (strcmp(tmp, strPending) == 0)
op.state = OPERATION_PENDING;
else
return false;
return true;
}

Cumulocity