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

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;
    }
}