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/network/NetworkScan.cpp

Committer:
dan_ackme
Date:
2014-08-11
Revision:
1:6ec9998427ad
Parent:
0:ea85c4bb5e1f
Child:
16:7f1d6d359787

File content as of revision 1:6ec9998427ad:

/*
 * 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 "Wiconnect.h"
#include "internal/common.h"


#define SCAN_TIMEOUT 15000




/*************************************************************************************************/
WiconnectResult NetworkInterface::scan(ScanResultList &resultList, const uint8_t *channelList, const char* ssid)
{
    WiconnectResult result;
    char cmdBuffer[WICONNECT_MAX_CMD_SIZE];

    CHECK_CALLBACK_AVAILABLE(completeHandler_);

    if(WICONNECT_IS_IDLE())
    {
#define SCAN_CMD "scan -v "
        char *cmdBufferPtr = cmdBuffer + sizeof(SCAN_CMD)-1;

        strcpy(cmdBuffer, SCAN_CMD);

        if(channelList != NULL)
        {
            for(const uint8_t *ch = (const uint8_t *)channelList; *ch != 0; ++ch)
            {
                cmdBufferPtr += sprintf(cmdBufferPtr, "%d,", *ch);
            }
            *(cmdBufferPtr-1) = ' ';
        }
        else
        {
            strcat(cmdBufferPtr, "all ");
            cmdBufferPtr += 4;
        }

        if(ssid != NULL)
        {
            strcpy(cmdBufferPtr, ssid);
        }
    }

    CHECK_OTHER_COMMAND_EXECUTING();

    //if(!completeHandler_.isValid())
    {
        if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(SCAN_TIMEOUT, cmdBuffer)))
        {
            result = processScanResults(wiconnect->internalBuffer, resultList);
        }
    }
//#ifdef WICONNECT_ASYNC_TIMER_ENABLED
//    else
//    {
//        QueuedCommand *cmd = new QueuedCommand(NULL, 4096, SCAN_TIMEOUT, cmdBuffer);
//        cmd->userData = (void*)resultList;
//        completeHandler = completeHandler_;
//        if(WICONNECT_FAILED(result, wiconnect->enqueueCommand(cmd, Callback(this, &NetworkInterface::scanCompleteCallback))))
//        {
//            delete cmd;
//        }
//        else
//        {
//            result = WICONNECT_PROCESSING;
//        }
//    }
//#endif

    CHECK_CLEANUP_COMMAND();

    return result;
}





/*************************************************************************************************/
WiconnectResult NetworkInterface::processScanResults(char *resultStr, ScanResultList &resultList)
{
    WiconnectResult result = WICONNECT_SUCCESS;
    char *line, *savedLine;

    for(savedLine = resultStr; (line = StringUtil::strtok_r(savedLine, "\r\n", &savedLine)) != NULL;)
    {
        char *toks[9], *savedTok;

        if(*line != '#')
        {
            continue;
        }
        savedTok = line + 2;

        for(int i = 0; i < 8 && (toks[i] = StringUtil::strtok_r(savedTok, " ", &savedTok)) != NULL; ++i)
        {
            if(toks[i] == NULL)
            {
                result = WICONNECT_RESPONSE_PARSE_ERROR;
                goto exit;
            }
        }

        if(WICONNECT_FAILED(result, resultList.add(toks[1], toks[2], toks[3], toks[4], toks[5], savedTok)))
        {
            goto exit;
        }
    }

    exit:
    return result;
}

//#ifdef WICONNECT_ASYNC_TIMER_ENABLED
//
/*************************************************************************************************/
//void NetworkInterface::scanCompleteCallback(WiconnectResult result, void *arg1, void *arg2)
//{
//    QueuedCommand *cmd = (QueuedCommand*)arg1;
//    ScanResultList *listPtr = (ScanResultList*)cmd->userData;
//
//    if(result == WICONNECT_SUCCESS)
//    {
//        result = processScanResults(cmd->responseBuffer, listPtr);
//    }
//    delete cmd;
//
//    completeHandler.call(result, listPtr, NULL);
//}
//
//#endif