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:
Tue Aug 12 02:34:46 2014 -0700
Revision:
11:ea484e1b7fc4
Parent:
8:1fad4ca6c6a4
Child:
13:2b51f5267c92
updated documnetation

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 WiconnectResult NetworkInterface::join(const char* ssid, const char *password, const Callback &completeHandler_)
dan_ackme 0:ea85c4bb5e1f 16 {
dan_ackme 2:05e20e184e7e 17 WiconnectResult result = WICONNECT_ERROR;
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19 enum
dan_ackme 0:ea85c4bb5e1f 20 {
dan_ackme 0:ea85c4bb5e1f 21 FS_SET_SSID,
dan_ackme 0:ea85c4bb5e1f 22 FS_SET_PASSWORD,
dan_ackme 0:ea85c4bb5e1f 23 FS_NETWORK_UP
dan_ackme 0:ea85c4bb5e1f 24 };
dan_ackme 0:ea85c4bb5e1f 25
dan_ackme 0:ea85c4bb5e1f 26 CHECK_CALLBACK_AVAILABLE(completeHandler_);
dan_ackme 0:ea85c4bb5e1f 27 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 28
dan_ackme 0:ea85c4bb5e1f 29 if(wiconnect->internalProcessingState == FS_SET_SSID)
dan_ackme 0:ea85c4bb5e1f 30 {
dan_ackme 0:ea85c4bb5e1f 31 if(ssid == NULL ||
dan_ackme 0:ea85c4bb5e1f 32 WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("set wlan.ssid %s", ssid)))
dan_ackme 0:ea85c4bb5e1f 33 {
dan_ackme 0:ea85c4bb5e1f 34 wiconnect->internalProcessingState = FS_SET_PASSWORD;
dan_ackme 0:ea85c4bb5e1f 35 }
dan_ackme 0:ea85c4bb5e1f 36 }
dan_ackme 0:ea85c4bb5e1f 37
dan_ackme 0:ea85c4bb5e1f 38 if(wiconnect->internalProcessingState == FS_SET_PASSWORD)
dan_ackme 0:ea85c4bb5e1f 39 {
dan_ackme 0:ea85c4bb5e1f 40 if(password == NULL ||
dan_ackme 0:ea85c4bb5e1f 41 WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("set wlan.passkey %s", password)))
dan_ackme 0:ea85c4bb5e1f 42 {
dan_ackme 0:ea85c4bb5e1f 43 wiconnect->internalProcessingState = FS_NETWORK_UP;
dan_ackme 0:ea85c4bb5e1f 44 }
dan_ackme 0:ea85c4bb5e1f 45 }
dan_ackme 0:ea85c4bb5e1f 46
dan_ackme 0:ea85c4bb5e1f 47 if(wiconnect->internalProcessingState == FS_NETWORK_UP)
dan_ackme 0:ea85c4bb5e1f 48 {
dan_ackme 0:ea85c4bb5e1f 49 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("network_up")))
dan_ackme 0:ea85c4bb5e1f 50 {
dan_ackme 0:ea85c4bb5e1f 51 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 52 if(completeHandler_.isValid())
dan_ackme 0:ea85c4bb5e1f 53 {
dan_ackme 11:ea484e1b7fc4 54 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 11:ea484e1b7fc4 55 monitorTimer.stop();
dan_ackme 11:ea484e1b7fc4 56 #endif
dan_ackme 11:ea484e1b7fc4 57 completeHandler = completeHandler_;
dan_ackme 11:ea484e1b7fc4 58 monitorTimer.start(this, &NetworkInterface::joinStatusMonitor, 1000);
dan_ackme 0:ea85c4bb5e1f 59 }
dan_ackme 0:ea85c4bb5e1f 60 #endif
dan_ackme 0:ea85c4bb5e1f 61 }
dan_ackme 0:ea85c4bb5e1f 62 }
dan_ackme 0:ea85c4bb5e1f 63
dan_ackme 0:ea85c4bb5e1f 64 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 65
dan_ackme 0:ea85c4bb5e1f 66 return result;
dan_ackme 0:ea85c4bb5e1f 67 }
dan_ackme 0:ea85c4bb5e1f 68
dan_ackme 0:ea85c4bb5e1f 69
dan_ackme 0:ea85c4bb5e1f 70
dan_ackme 0:ea85c4bb5e1f 71 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 72 WiconnectResult NetworkInterface::leave()
dan_ackme 0:ea85c4bb5e1f 73 {
dan_ackme 0:ea85c4bb5e1f 74 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 75
dan_ackme 0:ea85c4bb5e1f 76 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 77
dan_ackme 0:ea85c4bb5e1f 78 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 79 monitorTimer.stop();
dan_ackme 0:ea85c4bb5e1f 80 #endif
dan_ackme 0:ea85c4bb5e1f 81 result = wiconnect->sendCommand("network_down");
dan_ackme 0:ea85c4bb5e1f 82
dan_ackme 0:ea85c4bb5e1f 83 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 84
dan_ackme 0:ea85c4bb5e1f 85 return result;
dan_ackme 0:ea85c4bb5e1f 86 }
dan_ackme 0:ea85c4bb5e1f 87
dan_ackme 0:ea85c4bb5e1f 88
dan_ackme 0:ea85c4bb5e1f 89 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 90 WiconnectResult NetworkInterface::getNetworkStatus(NetworkStatus *statusPtr)
dan_ackme 0:ea85c4bb5e1f 91 {
dan_ackme 0:ea85c4bb5e1f 92 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 93
dan_ackme 0:ea85c4bb5e1f 94 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 95
dan_ackme 0:ea85c4bb5e1f 96 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("get network.status")))
dan_ackme 0:ea85c4bb5e1f 97 {
dan_ackme 0:ea85c4bb5e1f 98 int32_t status;
dan_ackme 0:ea85c4bb5e1f 99 if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&status)))
dan_ackme 0:ea85c4bb5e1f 100 {
dan_ackme 0:ea85c4bb5e1f 101 *statusPtr = (NetworkStatus)status;
dan_ackme 0:ea85c4bb5e1f 102 }
dan_ackme 0:ea85c4bb5e1f 103 }
dan_ackme 0:ea85c4bb5e1f 104
dan_ackme 0:ea85c4bb5e1f 105 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 106
dan_ackme 0:ea85c4bb5e1f 107 return result;
dan_ackme 0:ea85c4bb5e1f 108 }
dan_ackme 0:ea85c4bb5e1f 109
dan_ackme 0:ea85c4bb5e1f 110
dan_ackme 0:ea85c4bb5e1f 111 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 112
dan_ackme 7:41d456a65f14 113
dan_ackme 0:ea85c4bb5e1f 114 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 115 // this is called every 1s by the monitorTimer
dan_ackme 0:ea85c4bb5e1f 116 void NetworkInterface::joinStatusMonitor()
dan_ackme 0:ea85c4bb5e1f 117 {
dan_ackme 8:1fad4ca6c6a4 118 static char responseBuffer[4];
dan_ackme 8:1fad4ca6c6a4 119 static uint8_t cmdBuffer[sizeof(QueuedCommand)];
dan_ackme 8:1fad4ca6c6a4 120 QueuedCommand *cmd = (QueuedCommand*)cmdBuffer;
dan_ackme 6:8a87a59d0d21 121
dan_ackme 0:ea85c4bb5e1f 122 monitorTimer.stop();
dan_ackme 6:8a87a59d0d21 123
dan_ackme 8:1fad4ca6c6a4 124 *cmd = QueuedCommand(sizeof(responseBuffer), responseBuffer, "get network.status");
dan_ackme 6:8a87a59d0d21 125
dan_ackme 6:8a87a59d0d21 126 wiconnect->enqueueCommand(cmd, Callback(this, &NetworkInterface::joinStatusCheckCallback));
dan_ackme 0:ea85c4bb5e1f 127 }
dan_ackme 0:ea85c4bb5e1f 128
dan_ackme 0:ea85c4bb5e1f 129 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 130 // this is called on the completion of the 'get'network.status' command above
dan_ackme 0:ea85c4bb5e1f 131 void NetworkInterface::joinStatusCheckCallback(WiconnectResult result, void *arg1, void *arg2)
dan_ackme 0:ea85c4bb5e1f 132 {
dan_ackme 0:ea85c4bb5e1f 133 bool isComplete = true;
dan_ackme 0:ea85c4bb5e1f 134
dan_ackme 0:ea85c4bb5e1f 135 QueuedCommand *cmd = (QueuedCommand*)arg1;
dan_ackme 0:ea85c4bb5e1f 136
dan_ackme 0:ea85c4bb5e1f 137 if(result == WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 138 {
dan_ackme 0:ea85c4bb5e1f 139 int32_t status;
dan_ackme 0:ea85c4bb5e1f 140 if(!StringUtil::strToInt32(cmd->responseBuffer, &status))
dan_ackme 0:ea85c4bb5e1f 141 {
dan_ackme 0:ea85c4bb5e1f 142 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 143 }
dan_ackme 0:ea85c4bb5e1f 144 else if(status == 0)
dan_ackme 0:ea85c4bb5e1f 145 {
dan_ackme 0:ea85c4bb5e1f 146 isComplete = false;
dan_ackme 0:ea85c4bb5e1f 147 }
dan_ackme 0:ea85c4bb5e1f 148 }
dan_ackme 0:ea85c4bb5e1f 149
dan_ackme 0:ea85c4bb5e1f 150 if(isComplete)
dan_ackme 0:ea85c4bb5e1f 151 {
dan_ackme 0:ea85c4bb5e1f 152 completeHandler.call(result, NULL, NULL);
dan_ackme 0:ea85c4bb5e1f 153 }
dan_ackme 0:ea85c4bb5e1f 154 else
dan_ackme 0:ea85c4bb5e1f 155 {
dan_ackme 0:ea85c4bb5e1f 156 monitorTimer.start(this, &NetworkInterface::joinStatusMonitor, 1000);
dan_ackme 0:ea85c4bb5e1f 157 }
dan_ackme 0:ea85c4bb5e1f 158 }
dan_ackme 0:ea85c4bb5e1f 159
dan_ackme 0:ea85c4bb5e1f 160 #endif