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