Control requests

Handler using JSONValue - Control requests

To support older versions of Device OS, you can also use JSONValue and JSONWriter.

void ctrl_request_custom_handler(ctrl_request *req) {
    int result = SYSTEM_ERROR_NOT_SUPPORTED;

    JSONValue outerObj = JSONValue::parseCopy(req->request_data, req->request_size);

    memset(responseBuffer, 0, sizeof(responseBuffer));

    String op;

    {
        JSONObjectIterator iter(outerObj);
        while(iter.next()) {
            if (iter.name() == "op") {
                op = (const char *)iter.value().toString();
                break;
            }
        }
    }

    Log.info("USB request received op=%s", op.c_str());
    if (op == "test") {
        JSONBufferWriter writer(responseBuffer, sizeof(responseBuffer) - 1);
        writer.beginObject();
        {
            writer.name("counter").value(++counter);
            writer.name("result").value(0);        
        }
        writer.endObject();
        result = SYSTEM_ERROR_NONE;
    }

    size_t size = strlen(responseBuffer);
    if (size > 0) {
        if (system_ctrl_alloc_reply_data(req, size, nullptr) == 0) {
            memcpy(req->reply_data, responseBuffer, size);
        } else {
            result = SYSTEM_ERROR_NO_MEMORY;
        }        
    }

    system_ctrl_set_result(req, result, nullptr, nullptr, nullptr);
}