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

Committer:
dan_ackme
Date:
Wed Aug 13 04:41:04 2014 -0700
Revision:
16:7f1d6d359787
Parent:
1:6ec9998427ad
Child:
24:e27e23297f02
updated documentation and copyright

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 16:7f1d6d359787 1 /**
dan_ackme 16:7f1d6d359787 2 * ACKme WiConnect Host Library is licensed under the BSD licence:
dan_ackme 16:7f1d6d359787 3 *
dan_ackme 16:7f1d6d359787 4 * Copyright (c)2014 ACKme Networks.
dan_ackme 16:7f1d6d359787 5 * All rights reserved.
dan_ackme 16:7f1d6d359787 6 *
dan_ackme 16:7f1d6d359787 7 * Redistribution and use in source and binary forms, with or without modification,
dan_ackme 16:7f1d6d359787 8 * are permitted provided that the following conditions are met:
dan_ackme 16:7f1d6d359787 9 *
dan_ackme 16:7f1d6d359787 10 * 1. Redistributions of source code must retain the above copyright notice,
dan_ackme 16:7f1d6d359787 11 * this list of conditions and the following disclaimer.
dan_ackme 16:7f1d6d359787 12 * 2. Redistributions in binary form must reproduce the above copyright notice,
dan_ackme 16:7f1d6d359787 13 * this list of conditions and the following disclaimer in the documentation
dan_ackme 16:7f1d6d359787 14 * and/or other materials provided with the distribution.
dan_ackme 16:7f1d6d359787 15 * 3. The name of the author may not be used to endorse or promote products
dan_ackme 16:7f1d6d359787 16 * derived from this software without specific prior written permission.
dan_ackme 16:7f1d6d359787 17 *
dan_ackme 16:7f1d6d359787 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED
dan_ackme 16:7f1d6d359787 19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
dan_ackme 16:7f1d6d359787 20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
dan_ackme 16:7f1d6d359787 21 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
dan_ackme 16:7f1d6d359787 22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
dan_ackme 16:7f1d6d359787 23 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
dan_ackme 16:7f1d6d359787 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
dan_ackme 16:7f1d6d359787 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
dan_ackme 16:7f1d6d359787 26 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
dan_ackme 16:7f1d6d359787 27 * OF SUCH DAMAGE.
dan_ackme 0:ea85c4bb5e1f 28 */
dan_ackme 0:ea85c4bb5e1f 29 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 30 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 31
dan_ackme 0:ea85c4bb5e1f 32
dan_ackme 0:ea85c4bb5e1f 33 #define SCAN_TIMEOUT 15000
dan_ackme 0:ea85c4bb5e1f 34
dan_ackme 0:ea85c4bb5e1f 35
dan_ackme 0:ea85c4bb5e1f 36
dan_ackme 0:ea85c4bb5e1f 37
dan_ackme 0:ea85c4bb5e1f 38 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 39 WiconnectResult NetworkInterface::scan(ScanResultList &resultList, const uint8_t *channelList, const char* ssid)
dan_ackme 0:ea85c4bb5e1f 40 {
dan_ackme 0:ea85c4bb5e1f 41 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 42 char cmdBuffer[WICONNECT_MAX_CMD_SIZE];
dan_ackme 0:ea85c4bb5e1f 43
dan_ackme 0:ea85c4bb5e1f 44 CHECK_CALLBACK_AVAILABLE(completeHandler_);
dan_ackme 0:ea85c4bb5e1f 45
dan_ackme 0:ea85c4bb5e1f 46 if(WICONNECT_IS_IDLE())
dan_ackme 0:ea85c4bb5e1f 47 {
dan_ackme 0:ea85c4bb5e1f 48 #define SCAN_CMD "scan -v "
dan_ackme 0:ea85c4bb5e1f 49 char *cmdBufferPtr = cmdBuffer + sizeof(SCAN_CMD)-1;
dan_ackme 0:ea85c4bb5e1f 50
dan_ackme 0:ea85c4bb5e1f 51 strcpy(cmdBuffer, SCAN_CMD);
dan_ackme 0:ea85c4bb5e1f 52
dan_ackme 0:ea85c4bb5e1f 53 if(channelList != NULL)
dan_ackme 0:ea85c4bb5e1f 54 {
dan_ackme 0:ea85c4bb5e1f 55 for(const uint8_t *ch = (const uint8_t *)channelList; *ch != 0; ++ch)
dan_ackme 0:ea85c4bb5e1f 56 {
dan_ackme 0:ea85c4bb5e1f 57 cmdBufferPtr += sprintf(cmdBufferPtr, "%d,", *ch);
dan_ackme 0:ea85c4bb5e1f 58 }
dan_ackme 0:ea85c4bb5e1f 59 *(cmdBufferPtr-1) = ' ';
dan_ackme 0:ea85c4bb5e1f 60 }
dan_ackme 0:ea85c4bb5e1f 61 else
dan_ackme 0:ea85c4bb5e1f 62 {
dan_ackme 0:ea85c4bb5e1f 63 strcat(cmdBufferPtr, "all ");
dan_ackme 0:ea85c4bb5e1f 64 cmdBufferPtr += 4;
dan_ackme 0:ea85c4bb5e1f 65 }
dan_ackme 0:ea85c4bb5e1f 66
dan_ackme 0:ea85c4bb5e1f 67 if(ssid != NULL)
dan_ackme 0:ea85c4bb5e1f 68 {
dan_ackme 0:ea85c4bb5e1f 69 strcpy(cmdBufferPtr, ssid);
dan_ackme 0:ea85c4bb5e1f 70 }
dan_ackme 0:ea85c4bb5e1f 71 }
dan_ackme 0:ea85c4bb5e1f 72
dan_ackme 0:ea85c4bb5e1f 73 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 74
dan_ackme 0:ea85c4bb5e1f 75 //if(!completeHandler_.isValid())
dan_ackme 0:ea85c4bb5e1f 76 {
dan_ackme 0:ea85c4bb5e1f 77 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(SCAN_TIMEOUT, cmdBuffer)))
dan_ackme 0:ea85c4bb5e1f 78 {
dan_ackme 0:ea85c4bb5e1f 79 result = processScanResults(wiconnect->internalBuffer, resultList);
dan_ackme 0:ea85c4bb5e1f 80 }
dan_ackme 0:ea85c4bb5e1f 81 }
dan_ackme 0:ea85c4bb5e1f 82 //#ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 83 // else
dan_ackme 0:ea85c4bb5e1f 84 // {
dan_ackme 0:ea85c4bb5e1f 85 // QueuedCommand *cmd = new QueuedCommand(NULL, 4096, SCAN_TIMEOUT, cmdBuffer);
dan_ackme 0:ea85c4bb5e1f 86 // cmd->userData = (void*)resultList;
dan_ackme 0:ea85c4bb5e1f 87 // completeHandler = completeHandler_;
dan_ackme 0:ea85c4bb5e1f 88 // if(WICONNECT_FAILED(result, wiconnect->enqueueCommand(cmd, Callback(this, &NetworkInterface::scanCompleteCallback))))
dan_ackme 0:ea85c4bb5e1f 89 // {
dan_ackme 0:ea85c4bb5e1f 90 // delete cmd;
dan_ackme 0:ea85c4bb5e1f 91 // }
dan_ackme 0:ea85c4bb5e1f 92 // else
dan_ackme 0:ea85c4bb5e1f 93 // {
dan_ackme 0:ea85c4bb5e1f 94 // result = WICONNECT_PROCESSING;
dan_ackme 0:ea85c4bb5e1f 95 // }
dan_ackme 0:ea85c4bb5e1f 96 // }
dan_ackme 0:ea85c4bb5e1f 97 //#endif
dan_ackme 0:ea85c4bb5e1f 98
dan_ackme 0:ea85c4bb5e1f 99 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 100
dan_ackme 0:ea85c4bb5e1f 101 return result;
dan_ackme 0:ea85c4bb5e1f 102 }
dan_ackme 0:ea85c4bb5e1f 103
dan_ackme 0:ea85c4bb5e1f 104
dan_ackme 0:ea85c4bb5e1f 105
dan_ackme 0:ea85c4bb5e1f 106
dan_ackme 0:ea85c4bb5e1f 107
dan_ackme 0:ea85c4bb5e1f 108 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 109 WiconnectResult NetworkInterface::processScanResults(char *resultStr, ScanResultList &resultList)
dan_ackme 0:ea85c4bb5e1f 110 {
dan_ackme 0:ea85c4bb5e1f 111 WiconnectResult result = WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 112 char *line, *savedLine;
dan_ackme 0:ea85c4bb5e1f 113
dan_ackme 0:ea85c4bb5e1f 114 for(savedLine = resultStr; (line = StringUtil::strtok_r(savedLine, "\r\n", &savedLine)) != NULL;)
dan_ackme 0:ea85c4bb5e1f 115 {
dan_ackme 0:ea85c4bb5e1f 116 char *toks[9], *savedTok;
dan_ackme 0:ea85c4bb5e1f 117
dan_ackme 0:ea85c4bb5e1f 118 if(*line != '#')
dan_ackme 0:ea85c4bb5e1f 119 {
dan_ackme 0:ea85c4bb5e1f 120 continue;
dan_ackme 0:ea85c4bb5e1f 121 }
dan_ackme 0:ea85c4bb5e1f 122 savedTok = line + 2;
dan_ackme 0:ea85c4bb5e1f 123
dan_ackme 0:ea85c4bb5e1f 124 for(int i = 0; i < 8 && (toks[i] = StringUtil::strtok_r(savedTok, " ", &savedTok)) != NULL; ++i)
dan_ackme 0:ea85c4bb5e1f 125 {
dan_ackme 0:ea85c4bb5e1f 126 if(toks[i] == NULL)
dan_ackme 0:ea85c4bb5e1f 127 {
dan_ackme 0:ea85c4bb5e1f 128 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 129 goto exit;
dan_ackme 0:ea85c4bb5e1f 130 }
dan_ackme 0:ea85c4bb5e1f 131 }
dan_ackme 0:ea85c4bb5e1f 132
dan_ackme 0:ea85c4bb5e1f 133 if(WICONNECT_FAILED(result, resultList.add(toks[1], toks[2], toks[3], toks[4], toks[5], savedTok)))
dan_ackme 0:ea85c4bb5e1f 134 {
dan_ackme 0:ea85c4bb5e1f 135 goto exit;
dan_ackme 0:ea85c4bb5e1f 136 }
dan_ackme 0:ea85c4bb5e1f 137 }
dan_ackme 0:ea85c4bb5e1f 138
dan_ackme 0:ea85c4bb5e1f 139 exit:
dan_ackme 0:ea85c4bb5e1f 140 return result;
dan_ackme 0:ea85c4bb5e1f 141 }
dan_ackme 0:ea85c4bb5e1f 142
dan_ackme 0:ea85c4bb5e1f 143 //#ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 144 //
dan_ackme 0:ea85c4bb5e1f 145 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 146 //void NetworkInterface::scanCompleteCallback(WiconnectResult result, void *arg1, void *arg2)
dan_ackme 0:ea85c4bb5e1f 147 //{
dan_ackme 0:ea85c4bb5e1f 148 // QueuedCommand *cmd = (QueuedCommand*)arg1;
dan_ackme 0:ea85c4bb5e1f 149 // ScanResultList *listPtr = (ScanResultList*)cmd->userData;
dan_ackme 0:ea85c4bb5e1f 150 //
dan_ackme 0:ea85c4bb5e1f 151 // if(result == WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 152 // {
dan_ackme 0:ea85c4bb5e1f 153 // result = processScanResults(cmd->responseBuffer, listPtr);
dan_ackme 0:ea85c4bb5e1f 154 // }
dan_ackme 0:ea85c4bb5e1f 155 // delete cmd;
dan_ackme 0:ea85c4bb5e1f 156 //
dan_ackme 0:ea85c4bb5e1f 157 // completeHandler.call(result, listPtr, NULL);
dan_ackme 0:ea85c4bb5e1f 158 //}
dan_ackme 0:ea85c4bb5e1f 159 //
dan_ackme 0:ea85c4bb5e1f 160 //#endif