Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

internal/wiconnect/AsyncCommand.cpp

Committer:
dan_ackme
Date:
2014-08-11
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad

File content as of revision 0:ea85c4bb5e1f:

/*
 * Copyright 2014, ACKme Networks
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
 * the contents of this file may not be disclosed to third parties, copied
 * or duplicated in any form, in whole or in part, without the prior
 * written permission of ACKme Networks.
 */


#include "CommandCommon.h"

#ifdef WICONNECT_ASYNC_TIMER_ENABLED



/*************************************************************************************************/
WiconnectResult Wiconnect::enqueueCommand(QueuedCommand *command, const Callback &commandCompleteHandler)
{
    if(commandQueue.isFull())
    {
        return WICONNECT_OVERFLOW;
    }
    command->setCompletedCallback(commandCompleteHandler);
    DEBUG_INFO("Queuing command: %s", command->getCommand());
    commandQueue.push(command);
    processNextQueuedCommand();
    return WICONNECT_SUCCESS;
}

/*************************************************************************************************/
void Wiconnect::processNextQueuedCommand()
{
    if(commandQueue.isEmpty())
    {
        return;
    }
    else if(commandExecuting)
    {
        return;
    }

    WiconnectResult result = WICONNECT_SUCCESS;
    CommandContext *context = (CommandContext*)commandContext;
    CommandHeader *header = (CommandHeader*)commandHeaderBuffer;

    commandExecuting = true;
    currentQueuedCommand = commandQueue.pop();

    DEBUG_INFO("Processing next cmd in queue");

    strcpy(commandFormatBuffer, currentQueuedCommand->command);

    RESET_CMD_HEADER(header);

    memset(context, 0, sizeof(CommandContext));
    if(currentQueuedCommand->responseBufferLen > 0)
    {
        context->responseBuffer = currentQueuedCommand->responseBuffer;
        context->responseBufferLen = currentQueuedCommand->responseBufferLen;
    }
    else
    {
        context->responseBuffer = internalBuffer;
        context->responseBufferLen = internalBufferSize;
    }

    context->responseBufferPtr = context->responseBuffer;
    context->commandLen = strlen(commandFormatBuffer);
    context->commandPtr = commandFormatBuffer;
    context->reader = currentQueuedCommand->reader;
    context->user = currentQueuedCommand->userData;
    context->timeoutMs = currentQueuedCommand->timeoutMs;
    context->callback = currentQueuedCommand->completeCallback;
    context->nonBlocking = true;

    DEBUG_CMD_SEND(commandFormatBuffer);

    commandExecuting = true;
    timeoutTimer.reset();

    commandProcessorTimer.start(this, &Wiconnect::commandProcessingTimerHandler, commandProcessingPeriod);
}

/*************************************************************************************************/
void Wiconnect::setCommandProcessingPeriod(uint32_t periodMs)
{
    commandProcessingPeriod = periodMs;
}

/*************************************************************************************************/
void Wiconnect::commandProcessingTimerHandler()
{
    checkCurrentCommand();
}

#endif