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 09:58:24 2014 +0000
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
initial check-in

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
dan_ackme 0:ea85c4bb5e1f 12 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 13 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 14 #include "StringUtil.h"
dan_ackme 0:ea85c4bb5e1f 15
dan_ackme 0:ea85c4bb5e1f 16 #include "types/SocketIrqHandlerMap.h"
dan_ackme 0:ea85c4bb5e1f 17
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 22 SocketInterface::SocketInterface(Wiconnect *wiconnect_)
dan_ackme 0:ea85c4bb5e1f 23 {
dan_ackme 0:ea85c4bb5e1f 24 wiconnect = wiconnect_;
dan_ackme 0:ea85c4bb5e1f 25 }
dan_ackme 0:ea85c4bb5e1f 26
dan_ackme 0:ea85c4bb5e1f 27 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 28 SocketInterface::~SocketInterface()
dan_ackme 0:ea85c4bb5e1f 29 {
dan_ackme 0:ea85c4bb5e1f 30 }
dan_ackme 0:ea85c4bb5e1f 31
dan_ackme 0:ea85c4bb5e1f 32 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 33 WiconnectResult SocketInterface::connect(Socket &socket, SocketType type, const char *host, uint16_t remortPort, uint16_t localPort, const void *args, Pin irqPin)
dan_ackme 0:ea85c4bb5e1f 34 {
dan_ackme 0:ea85c4bb5e1f 35 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 36 int32_t handle;
dan_ackme 0:ea85c4bb5e1f 37 char cmdBuffer[WICONNECT_MAX_CMD_SIZE];
dan_ackme 0:ea85c4bb5e1f 38
dan_ackme 0:ea85c4bb5e1f 39 if(WICONNECT_IS_IDLE())
dan_ackme 0:ea85c4bb5e1f 40 {
dan_ackme 0:ea85c4bb5e1f 41 char gpioOption[8] = "";
dan_ackme 0:ea85c4bb5e1f 42
dan_ackme 0:ea85c4bb5e1f 43 if(irqPin != NC)
dan_ackme 0:ea85c4bb5e1f 44 {
dan_ackme 0:ea85c4bb5e1f 45 PinToGpioMapper mapper = wiconnect->pinToGpioMapper;
dan_ackme 0:ea85c4bb5e1f 46 if(mapper == NULL)
dan_ackme 0:ea85c4bb5e1f 47 {
dan_ackme 0:ea85c4bb5e1f 48 return WICONNECT_PINNAME_TO_GPIO_MAPPER_NULL;
dan_ackme 0:ea85c4bb5e1f 49 }
dan_ackme 0:ea85c4bb5e1f 50 int8_t gpio = mapper(irqPin);
dan_ackme 0:ea85c4bb5e1f 51 if(gpio == -1)
dan_ackme 0:ea85c4bb5e1f 52 {
dan_ackme 0:ea85c4bb5e1f 53 return WICONNECT_PINNAME_TO_GPIO_NO_MAPPING;
dan_ackme 0:ea85c4bb5e1f 54 }
dan_ackme 0:ea85c4bb5e1f 55 else if(!irqHandlers.pinIsRegistered(irqPin))
dan_ackme 0:ea85c4bb5e1f 56 {
dan_ackme 0:ea85c4bb5e1f 57 return WICONNECT_NOT_FOUND;
dan_ackme 0:ea85c4bb5e1f 58 }
dan_ackme 0:ea85c4bb5e1f 59
dan_ackme 0:ea85c4bb5e1f 60 sprintf(gpioOption, "-g %d ", gpio);
dan_ackme 0:ea85c4bb5e1f 61 }
dan_ackme 0:ea85c4bb5e1f 62
dan_ackme 0:ea85c4bb5e1f 63
dan_ackme 0:ea85c4bb5e1f 64 switch(type)
dan_ackme 0:ea85c4bb5e1f 65 {
dan_ackme 0:ea85c4bb5e1f 66 case SOCKET_TYPE_TCP:
dan_ackme 0:ea85c4bb5e1f 67 sprintf(cmdBuffer, "tcpc %s%s %d", gpioOption, host, remortPort);
dan_ackme 0:ea85c4bb5e1f 68 break;
dan_ackme 0:ea85c4bb5e1f 69
dan_ackme 0:ea85c4bb5e1f 70 case SOCKET_TYPE_UDP: {
dan_ackme 0:ea85c4bb5e1f 71 char tmp[16];
dan_ackme 0:ea85c4bb5e1f 72 sprintf(cmdBuffer, "udpc %s%s %d %s", gpioOption, host, remortPort,
dan_ackme 0:ea85c4bb5e1f 73 (localPort != SOCKET_ANY_PORT) ? StringUtil::uint32ToStr(tmp, localPort) : "");
dan_ackme 0:ea85c4bb5e1f 74 } break;
dan_ackme 0:ea85c4bb5e1f 75
dan_ackme 0:ea85c4bb5e1f 76 case SOCKET_TYPE_TLS:
dan_ackme 0:ea85c4bb5e1f 77 sprintf(cmdBuffer, "tlsc %s%s %d %s", gpioOption, host, remortPort,
dan_ackme 0:ea85c4bb5e1f 78 (args != NULL) ? (char*)args : "");
dan_ackme 0:ea85c4bb5e1f 79 break;
dan_ackme 0:ea85c4bb5e1f 80
dan_ackme 0:ea85c4bb5e1f 81 case SOCKET_TYPE_HTTP: {
dan_ackme 0:ea85c4bb5e1f 82 const HttpSocketArgs *httpArgs = (const HttpSocketArgs*)args;
dan_ackme 0:ea85c4bb5e1f 83 switch(httpArgs->type)
dan_ackme 0:ea85c4bb5e1f 84 {
dan_ackme 0:ea85c4bb5e1f 85 case SOCKET_HTTP_GET:
dan_ackme 0:ea85c4bb5e1f 86 sprintf(cmdBuffer, "http_get %s%s %s", httpArgs->openOnly ? "-o " : "",
dan_ackme 0:ea85c4bb5e1f 87 host,
dan_ackme 0:ea85c4bb5e1f 88 (httpArgs->certName != NULL) ? httpArgs->certName : "");
dan_ackme 0:ea85c4bb5e1f 89 break;
dan_ackme 0:ea85c4bb5e1f 90
dan_ackme 0:ea85c4bb5e1f 91 case SOCKET_HTTP_HEAD:
dan_ackme 0:ea85c4bb5e1f 92 sprintf(cmdBuffer, "http_head %s%s %s", httpArgs->openOnly ? "-o " : "",
dan_ackme 0:ea85c4bb5e1f 93 host,
dan_ackme 0:ea85c4bb5e1f 94 (httpArgs->certName != NULL) ? httpArgs->certName : "");
dan_ackme 0:ea85c4bb5e1f 95 break;
dan_ackme 0:ea85c4bb5e1f 96
dan_ackme 0:ea85c4bb5e1f 97 case SOCKET_HTTP_POST:
dan_ackme 0:ea85c4bb5e1f 98 sprintf(cmdBuffer, "http_post %s%s %s %s", httpArgs->openOnly ? "-o " : "",
dan_ackme 0:ea85c4bb5e1f 99 host,
dan_ackme 0:ea85c4bb5e1f 100 httpArgs->contextType,
dan_ackme 0:ea85c4bb5e1f 101 (httpArgs->certName != NULL) ? httpArgs->certName : "");
dan_ackme 0:ea85c4bb5e1f 102 break;
dan_ackme 0:ea85c4bb5e1f 103
dan_ackme 0:ea85c4bb5e1f 104 default:
dan_ackme 0:ea85c4bb5e1f 105 return WICONNECT_BAD_ARG;
dan_ackme 0:ea85c4bb5e1f 106 }
dan_ackme 0:ea85c4bb5e1f 107
dan_ackme 0:ea85c4bb5e1f 108 } break;
dan_ackme 0:ea85c4bb5e1f 109 default:
dan_ackme 0:ea85c4bb5e1f 110 return WICONNECT_BAD_ARG;
dan_ackme 0:ea85c4bb5e1f 111 }
dan_ackme 0:ea85c4bb5e1f 112 }
dan_ackme 0:ea85c4bb5e1f 113
dan_ackme 0:ea85c4bb5e1f 114 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 115
dan_ackme 0:ea85c4bb5e1f 116 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(cmdBuffer)))
dan_ackme 0:ea85c4bb5e1f 117 {
dan_ackme 0:ea85c4bb5e1f 118 if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&handle)))
dan_ackme 0:ea85c4bb5e1f 119 {
dan_ackme 0:ea85c4bb5e1f 120 socket.init(handle, type, host, remortPort, localPort);
dan_ackme 0:ea85c4bb5e1f 121 }
dan_ackme 0:ea85c4bb5e1f 122 }
dan_ackme 0:ea85c4bb5e1f 123
dan_ackme 0:ea85c4bb5e1f 124 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 125
dan_ackme 0:ea85c4bb5e1f 126 return result;
dan_ackme 0:ea85c4bb5e1f 127 }
dan_ackme 0:ea85c4bb5e1f 128
dan_ackme 0:ea85c4bb5e1f 129 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 130 WiconnectResult SocketInterface::tcpConnect(Socket &socket, const char *host, uint16_t remortPort, Pin irqPin)
dan_ackme 0:ea85c4bb5e1f 131 {
dan_ackme 0:ea85c4bb5e1f 132 return connect(socket, SOCKET_TYPE_TCP, host, remortPort, SOCKET_ANY_PORT, NULL, irqPin);
dan_ackme 0:ea85c4bb5e1f 133 }
dan_ackme 0:ea85c4bb5e1f 134
dan_ackme 0:ea85c4bb5e1f 135 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 136 WiconnectResult SocketInterface::tlsConnect(Socket &socket, const char *host, uint16_t remortPort, const char *certFilename, Pin irqPin)
dan_ackme 0:ea85c4bb5e1f 137 {
dan_ackme 0:ea85c4bb5e1f 138 return connect(socket, SOCKET_TYPE_TLS, host, remortPort, SOCKET_ANY_PORT, certFilename, irqPin);
dan_ackme 0:ea85c4bb5e1f 139 }
dan_ackme 0:ea85c4bb5e1f 140
dan_ackme 0:ea85c4bb5e1f 141 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 142 WiconnectResult SocketInterface::udpConnect(Socket &socket, const char *host, uint16_t remortPort, uint16_t localPort, Pin irqPin)
dan_ackme 0:ea85c4bb5e1f 143 {
dan_ackme 0:ea85c4bb5e1f 144 return connect(socket, SOCKET_TYPE_UDP, host, remortPort, localPort, NULL, irqPin);
dan_ackme 0:ea85c4bb5e1f 145 }
dan_ackme 0:ea85c4bb5e1f 146
dan_ackme 0:ea85c4bb5e1f 147 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 148 WiconnectResult SocketInterface::httpConnect(Socket &socket, const char *url, const HttpSocketArgs *args)
dan_ackme 0:ea85c4bb5e1f 149 {
dan_ackme 0:ea85c4bb5e1f 150 return connect(socket, SOCKET_TYPE_HTTP, url, SOCKET_ANY_PORT, SOCKET_ANY_PORT, args, NC);
dan_ackme 0:ea85c4bb5e1f 151 }
dan_ackme 0:ea85c4bb5e1f 152
dan_ackme 0:ea85c4bb5e1f 153 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 154 WiconnectResult SocketInterface::httpGet(Socket &socket, const char *url, bool openOnly, const char *certFilename)
dan_ackme 0:ea85c4bb5e1f 155 {
dan_ackme 0:ea85c4bb5e1f 156 const HttpSocketArgs args
dan_ackme 0:ea85c4bb5e1f 157 {
dan_ackme 0:ea85c4bb5e1f 158 NULL,
dan_ackme 0:ea85c4bb5e1f 159 certFilename,
dan_ackme 0:ea85c4bb5e1f 160 openOnly,
dan_ackme 0:ea85c4bb5e1f 161 SOCKET_HTTP_GET
dan_ackme 0:ea85c4bb5e1f 162 };
dan_ackme 0:ea85c4bb5e1f 163 return httpConnect(socket, url, &args);
dan_ackme 0:ea85c4bb5e1f 164 }
dan_ackme 0:ea85c4bb5e1f 165
dan_ackme 0:ea85c4bb5e1f 166 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 167 WiconnectResult SocketInterface::httpPost(Socket &socket, const char *url, const char *contextType, bool openOnly, const char *certFilename)
dan_ackme 0:ea85c4bb5e1f 168 {
dan_ackme 0:ea85c4bb5e1f 169 const HttpSocketArgs args
dan_ackme 0:ea85c4bb5e1f 170 {
dan_ackme 0:ea85c4bb5e1f 171 contextType,
dan_ackme 0:ea85c4bb5e1f 172 certFilename,
dan_ackme 0:ea85c4bb5e1f 173 openOnly,
dan_ackme 0:ea85c4bb5e1f 174 SOCKET_HTTP_POST
dan_ackme 0:ea85c4bb5e1f 175 };
dan_ackme 0:ea85c4bb5e1f 176 return httpConnect(socket, url, &args);
dan_ackme 0:ea85c4bb5e1f 177 }
dan_ackme 0:ea85c4bb5e1f 178
dan_ackme 0:ea85c4bb5e1f 179 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 180 WiconnectResult SocketInterface::httpHead(Socket &socket, const char *url, const char *certFilename)
dan_ackme 0:ea85c4bb5e1f 181 {
dan_ackme 0:ea85c4bb5e1f 182 const HttpSocketArgs args
dan_ackme 0:ea85c4bb5e1f 183 {
dan_ackme 0:ea85c4bb5e1f 184 NULL,
dan_ackme 0:ea85c4bb5e1f 185 certFilename,
dan_ackme 0:ea85c4bb5e1f 186 false,
dan_ackme 0:ea85c4bb5e1f 187 SOCKET_HTTP_HEAD
dan_ackme 0:ea85c4bb5e1f 188 };
dan_ackme 0:ea85c4bb5e1f 189 return httpConnect(socket, url, &args);
dan_ackme 0:ea85c4bb5e1f 190 }
dan_ackme 0:ea85c4bb5e1f 191
dan_ackme 0:ea85c4bb5e1f 192 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 193 WiconnectResult SocketInterface::httpAddHeader(Socket &socket, const char *key, const char *value)
dan_ackme 0:ea85c4bb5e1f 194 {
dan_ackme 0:ea85c4bb5e1f 195 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 196 char cmdBuffer[WICONNECT_MAX_CMD_SIZE];
dan_ackme 0:ea85c4bb5e1f 197
dan_ackme 0:ea85c4bb5e1f 198 if(WICONNECT_IS_IDLE())
dan_ackme 0:ea85c4bb5e1f 199 {
dan_ackme 0:ea85c4bb5e1f 200 sprintf(cmdBuffer, "http_add_header %d %s %s", socket.getHandle(), key, value);
dan_ackme 0:ea85c4bb5e1f 201 }
dan_ackme 0:ea85c4bb5e1f 202
dan_ackme 0:ea85c4bb5e1f 203 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 204
dan_ackme 0:ea85c4bb5e1f 205 result = wiconnect->sendCommand(cmdBuffer);
dan_ackme 0:ea85c4bb5e1f 206
dan_ackme 0:ea85c4bb5e1f 207 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 208
dan_ackme 0:ea85c4bb5e1f 209 return result;
dan_ackme 0:ea85c4bb5e1f 210 }
dan_ackme 0:ea85c4bb5e1f 211
dan_ackme 0:ea85c4bb5e1f 212 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 213 WiconnectResult SocketInterface::httpGetStatus(Socket &socket, uint32_t *statusCodePtr)
dan_ackme 0:ea85c4bb5e1f 214 {
dan_ackme 0:ea85c4bb5e1f 215 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 216
dan_ackme 0:ea85c4bb5e1f 217 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 218
dan_ackme 0:ea85c4bb5e1f 219 result = wiconnect->sendCommand("http_read_status %d", socket.getHandle());
dan_ackme 0:ea85c4bb5e1f 220
dan_ackme 0:ea85c4bb5e1f 221 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 222
dan_ackme 0:ea85c4bb5e1f 223 return result;
dan_ackme 0:ea85c4bb5e1f 224 }
dan_ackme 0:ea85c4bb5e1f 225
dan_ackme 0:ea85c4bb5e1f 226 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 227 WiconnectResult SocketInterface::closeAllSockets()
dan_ackme 0:ea85c4bb5e1f 228 {
dan_ackme 0:ea85c4bb5e1f 229 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 230
dan_ackme 0:ea85c4bb5e1f 231 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 232
dan_ackme 0:ea85c4bb5e1f 233 result = wiconnect->sendCommand("close all");
dan_ackme 0:ea85c4bb5e1f 234
dan_ackme 0:ea85c4bb5e1f 235 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 236
dan_ackme 0:ea85c4bb5e1f 237 return result;
dan_ackme 0:ea85c4bb5e1f 238 }
dan_ackme 0:ea85c4bb5e1f 239
dan_ackme 0:ea85c4bb5e1f 240
dan_ackme 0:ea85c4bb5e1f 241 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 242 WiconnectResult SocketInterface::registerSocketIrqHandler(Pin irqPin, const Callback &handler)
dan_ackme 0:ea85c4bb5e1f 243 {
dan_ackme 0:ea85c4bb5e1f 244 PinToGpioMapper mapper = wiconnect->pinToGpioMapper;
dan_ackme 0:ea85c4bb5e1f 245 if(irqHandlers.pinIsRegistered(irqPin))
dan_ackme 0:ea85c4bb5e1f 246 {
dan_ackme 0:ea85c4bb5e1f 247 return WICONNECT_DUPLICATE;
dan_ackme 0:ea85c4bb5e1f 248 }
dan_ackme 0:ea85c4bb5e1f 249 else if(mapper == NULL)
dan_ackme 0:ea85c4bb5e1f 250 {
dan_ackme 0:ea85c4bb5e1f 251 return WICONNECT_PINNAME_TO_GPIO_MAPPER_NULL;
dan_ackme 0:ea85c4bb5e1f 252 }
dan_ackme 0:ea85c4bb5e1f 253 int8_t gpio = mapper(irqPin);
dan_ackme 0:ea85c4bb5e1f 254 if(gpio == -1)
dan_ackme 0:ea85c4bb5e1f 255 {
dan_ackme 0:ea85c4bb5e1f 256 return WICONNECT_PINNAME_TO_GPIO_NO_MAPPING;
dan_ackme 0:ea85c4bb5e1f 257 }
dan_ackme 0:ea85c4bb5e1f 258
dan_ackme 0:ea85c4bb5e1f 259 return irqHandlers.registerHandler(irqPin, handler);
dan_ackme 0:ea85c4bb5e1f 260 }
dan_ackme 0:ea85c4bb5e1f 261
dan_ackme 0:ea85c4bb5e1f 262 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 263 WiconnectResult SocketInterface::unregisterSocketIrqHandler(Pin irqPin)
dan_ackme 0:ea85c4bb5e1f 264 {
dan_ackme 0:ea85c4bb5e1f 265 return irqHandlers.unregisterHandler(irqPin);
dan_ackme 0:ea85c4bb5e1f 266 }
dan_ackme 0:ea85c4bb5e1f 267