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:
Mon Aug 11 16:30:38 2014 -0700
Revision:
8:1fad4ca6c6a4
Parent:
7:41d456a65f14
Child:
11:ea484e1b7fc4
fixed bug in QueuedCommand

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:ea85c4bb5e1f 1 /*
dan_ackme 0:ea85c4bb5e1f 2 * Copyright 2014, ACKme Networks
dan_ackme 0:ea85c4bb5e1f 3 * All Rights Reserved.
dan_ackme 0:ea85c4bb5e1f 4 *
dan_ackme 0:ea85c4bb5e1f 5 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
dan_ackme 0:ea85c4bb5e1f 6 * the contents of this file may not be disclosed to third parties, copied
dan_ackme 0:ea85c4bb5e1f 7 * or duplicated in any form, in whole or in part, without the prior
dan_ackme 0:ea85c4bb5e1f 8 * written permission of ACKme Networks.
dan_ackme 0:ea85c4bb5e1f 9 */
dan_ackme 0:ea85c4bb5e1f 10
dan_ackme 0:ea85c4bb5e1f 11 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 12 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 13
dan_ackme 0:ea85c4bb5e1f 14
dan_ackme 0:ea85c4bb5e1f 15
dan_ackme 0:ea85c4bb5e1f 16 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 17 WiconnectResult NetworkInterface::startWebSetup(const char *ssid, const char *password, const Callback &completeHandler_)
dan_ackme 0:ea85c4bb5e1f 18 {
dan_ackme 5:8d91a87ebba2 19 WiconnectResult result = WICONNECT_ERROR;;
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21 enum
dan_ackme 0:ea85c4bb5e1f 22 {
dan_ackme 0:ea85c4bb5e1f 23 FS_SET_SSID,
dan_ackme 0:ea85c4bb5e1f 24 FS_SET_PASSWORD,
dan_ackme 0:ea85c4bb5e1f 25 FS_NETWORK_UP
dan_ackme 0:ea85c4bb5e1f 26 };
dan_ackme 0:ea85c4bb5e1f 27
dan_ackme 0:ea85c4bb5e1f 28 CHECK_CALLBACK_AVAILABLE(completeHandler_);
dan_ackme 0:ea85c4bb5e1f 29 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 30
dan_ackme 0:ea85c4bb5e1f 31 if(wiconnect->internalProcessingState == FS_SET_SSID)
dan_ackme 0:ea85c4bb5e1f 32 {
dan_ackme 0:ea85c4bb5e1f 33 if(ssid == NULL ||
dan_ackme 0:ea85c4bb5e1f 34 WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("set setup.web.ssid %s", ssid)))
dan_ackme 0:ea85c4bb5e1f 35 {
dan_ackme 0:ea85c4bb5e1f 36 wiconnect->internalProcessingState = FS_SET_PASSWORD;
dan_ackme 0:ea85c4bb5e1f 37 }
dan_ackme 0:ea85c4bb5e1f 38 }
dan_ackme 0:ea85c4bb5e1f 39
dan_ackme 0:ea85c4bb5e1f 40 if(wiconnect->internalProcessingState == FS_SET_PASSWORD)
dan_ackme 0:ea85c4bb5e1f 41 {
dan_ackme 0:ea85c4bb5e1f 42 if(password == NULL ||
dan_ackme 0:ea85c4bb5e1f 43 WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("set setup.web.passkey %s", password)))
dan_ackme 0:ea85c4bb5e1f 44 {
dan_ackme 0:ea85c4bb5e1f 45 wiconnect->internalProcessingState = FS_NETWORK_UP;
dan_ackme 0:ea85c4bb5e1f 46 }
dan_ackme 0:ea85c4bb5e1f 47 }
dan_ackme 0:ea85c4bb5e1f 48
dan_ackme 0:ea85c4bb5e1f 49 if(wiconnect->internalProcessingState == FS_NETWORK_UP)
dan_ackme 0:ea85c4bb5e1f 50 {
dan_ackme 0:ea85c4bb5e1f 51 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("setup web")))
dan_ackme 0:ea85c4bb5e1f 52 {
dan_ackme 0:ea85c4bb5e1f 53 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 54 if(completeHandler_.isValid())
dan_ackme 0:ea85c4bb5e1f 55 {
dan_ackme 0:ea85c4bb5e1f 56 if(monitorTimer.isRunning())
dan_ackme 0:ea85c4bb5e1f 57 {
dan_ackme 0:ea85c4bb5e1f 58 result = WICONNECT_MONITOR_NOT_AVAILABLE;
dan_ackme 0:ea85c4bb5e1f 59 }
dan_ackme 0:ea85c4bb5e1f 60 else
dan_ackme 0:ea85c4bb5e1f 61 {
dan_ackme 0:ea85c4bb5e1f 62 completeHandler = completeHandler_;
dan_ackme 0:ea85c4bb5e1f 63 monitorTimer.start(this, &NetworkInterface::webSetupStatusMonitor, 1000);
dan_ackme 0:ea85c4bb5e1f 64 }
dan_ackme 0:ea85c4bb5e1f 65 }
dan_ackme 0:ea85c4bb5e1f 66 #endif
dan_ackme 0:ea85c4bb5e1f 67 }
dan_ackme 0:ea85c4bb5e1f 68 }
dan_ackme 0:ea85c4bb5e1f 69
dan_ackme 0:ea85c4bb5e1f 70 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 71
dan_ackme 0:ea85c4bb5e1f 72 return result;
dan_ackme 0:ea85c4bb5e1f 73 }
dan_ackme 0:ea85c4bb5e1f 74
dan_ackme 0:ea85c4bb5e1f 75 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 76 WiconnectResult NetworkInterface::stopWebSetup()
dan_ackme 0:ea85c4bb5e1f 77 {
dan_ackme 0:ea85c4bb5e1f 78 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 79
dan_ackme 0:ea85c4bb5e1f 80 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 81
dan_ackme 0:ea85c4bb5e1f 82 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 83 monitorTimer.stop();
dan_ackme 0:ea85c4bb5e1f 84 #endif
dan_ackme 0:ea85c4bb5e1f 85 result = wiconnect->sendCommand("setup stop");
dan_ackme 0:ea85c4bb5e1f 86
dan_ackme 0:ea85c4bb5e1f 87 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 88
dan_ackme 0:ea85c4bb5e1f 89 return result;
dan_ackme 0:ea85c4bb5e1f 90 }
dan_ackme 0:ea85c4bb5e1f 91
dan_ackme 0:ea85c4bb5e1f 92
dan_ackme 0:ea85c4bb5e1f 93 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 94 WiconnectResult NetworkInterface::isWebSetupRunning(bool *isRunningPtr)
dan_ackme 0:ea85c4bb5e1f 95 {
dan_ackme 0:ea85c4bb5e1f 96 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 97
dan_ackme 0:ea85c4bb5e1f 98 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 99
dan_ackme 0:ea85c4bb5e1f 100 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("setup status")))
dan_ackme 0:ea85c4bb5e1f 101 {
dan_ackme 0:ea85c4bb5e1f 102 int32_t status;
dan_ackme 0:ea85c4bb5e1f 103 if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&status)))
dan_ackme 0:ea85c4bb5e1f 104 {
dan_ackme 0:ea85c4bb5e1f 105 *isRunningPtr = (bool)status;
dan_ackme 0:ea85c4bb5e1f 106 }
dan_ackme 0:ea85c4bb5e1f 107 }
dan_ackme 0:ea85c4bb5e1f 108
dan_ackme 0:ea85c4bb5e1f 109 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 110
dan_ackme 0:ea85c4bb5e1f 111 return result;
dan_ackme 0:ea85c4bb5e1f 112 }
dan_ackme 0:ea85c4bb5e1f 113
dan_ackme 0:ea85c4bb5e1f 114
dan_ackme 0:ea85c4bb5e1f 115 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 116
dan_ackme 0:ea85c4bb5e1f 117 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 118 void NetworkInterface::webSetupStatusMonitor()
dan_ackme 0:ea85c4bb5e1f 119 {
dan_ackme 8:1fad4ca6c6a4 120 static char responseBuffer[4];
dan_ackme 8:1fad4ca6c6a4 121 static uint8_t cmdBuffer[sizeof(QueuedCommand)];
dan_ackme 8:1fad4ca6c6a4 122 QueuedCommand *cmd = (QueuedCommand*)cmdBuffer;
dan_ackme 6:8a87a59d0d21 123
dan_ackme 0:ea85c4bb5e1f 124 monitorTimer.stop();
dan_ackme 6:8a87a59d0d21 125
dan_ackme 8:1fad4ca6c6a4 126 *cmd = QueuedCommand(sizeof(responseBuffer), responseBuffer, "setup status");
dan_ackme 6:8a87a59d0d21 127
dan_ackme 6:8a87a59d0d21 128 wiconnect->enqueueCommand(cmd, Callback(this, &NetworkInterface::webSetupStatusCheckCallback));
dan_ackme 0:ea85c4bb5e1f 129 }
dan_ackme 0:ea85c4bb5e1f 130
dan_ackme 0:ea85c4bb5e1f 131 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 132 void NetworkInterface::webSetupStatusCheckCallback(WiconnectResult result, void *arg1, void *arg2)
dan_ackme 0:ea85c4bb5e1f 133 {
dan_ackme 0:ea85c4bb5e1f 134 bool isComplete = true;
dan_ackme 0:ea85c4bb5e1f 135
dan_ackme 0:ea85c4bb5e1f 136 QueuedCommand *cmd = (QueuedCommand*)arg1;
dan_ackme 0:ea85c4bb5e1f 137
dan_ackme 0:ea85c4bb5e1f 138 if(result == WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 139 {
dan_ackme 0:ea85c4bb5e1f 140 int32_t status;
dan_ackme 0:ea85c4bb5e1f 141 if(!StringUtil::strToInt32(cmd->responseBuffer, &status))
dan_ackme 0:ea85c4bb5e1f 142 {
dan_ackme 0:ea85c4bb5e1f 143 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 144 }
dan_ackme 0:ea85c4bb5e1f 145 else if(status > 0)
dan_ackme 0:ea85c4bb5e1f 146 {
dan_ackme 0:ea85c4bb5e1f 147 isComplete = false;
dan_ackme 0:ea85c4bb5e1f 148 }
dan_ackme 0:ea85c4bb5e1f 149 }
dan_ackme 0:ea85c4bb5e1f 150
dan_ackme 0:ea85c4bb5e1f 151 if(isComplete)
dan_ackme 0:ea85c4bb5e1f 152 {
dan_ackme 0:ea85c4bb5e1f 153 completeHandler.call(result, NULL, NULL);
dan_ackme 0:ea85c4bb5e1f 154 }
dan_ackme 0:ea85c4bb5e1f 155 else
dan_ackme 0:ea85c4bb5e1f 156 {
dan_ackme 0:ea85c4bb5e1f 157 monitorTimer.start(this, &NetworkInterface::webSetupStatusMonitor, 1000);
dan_ackme 0:ea85c4bb5e1f 158 }
dan_ackme 0:ea85c4bb5e1f 159 }
dan_ackme 0:ea85c4bb5e1f 160
dan_ackme 0:ea85c4bb5e1f 161 #endif