TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Sep 11 15:38:33 2015 +0000
Revision:
1:e448e81c416f
Parent:
0:400d8e75a8d0
Removed some debud.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:400d8e75a8d0 1 /*
dflet 0:400d8e75a8d0 2 * - CC31xx/CC32xx Host Driver Implementation
dflet 0:400d8e75a8d0 3 *
dflet 0:400d8e75a8d0 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:400d8e75a8d0 5 *
dflet 0:400d8e75a8d0 6 *
dflet 0:400d8e75a8d0 7 * Redistribution and use in source and binary forms, with or without
dflet 0:400d8e75a8d0 8 * modification, are permitted provided that the following conditions
dflet 0:400d8e75a8d0 9 * are met:
dflet 0:400d8e75a8d0 10 *
dflet 0:400d8e75a8d0 11 * Redistributions of source code must retain the above copyright
dflet 0:400d8e75a8d0 12 * notice, this list of conditions and the following disclaimer.
dflet 0:400d8e75a8d0 13 *
dflet 0:400d8e75a8d0 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:400d8e75a8d0 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:400d8e75a8d0 16 * documentation and/or other materials provided with the
dflet 0:400d8e75a8d0 17 * distribution.
dflet 0:400d8e75a8d0 18 *
dflet 0:400d8e75a8d0 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:400d8e75a8d0 20 * its contributors may be used to endorse or promote products derived
dflet 0:400d8e75a8d0 21 * from this software without specific prior written permission.
dflet 0:400d8e75a8d0 22 *
dflet 0:400d8e75a8d0 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:400d8e75a8d0 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:400d8e75a8d0 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:400d8e75a8d0 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:400d8e75a8d0 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:400d8e75a8d0 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:400d8e75a8d0 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:400d8e75a8d0 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:400d8e75a8d0 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:400d8e75a8d0 34 *
dflet 0:400d8e75a8d0 35 */
dflet 0:400d8e75a8d0 36
dflet 0:400d8e75a8d0 37 #include "simplelink/cc3100_simplelink.h"
dflet 0:400d8e75a8d0 38
dflet 0:400d8e75a8d0 39 #include "simplelink/cc3100.h"
dflet 0:400d8e75a8d0 40 #include "simplelink/cc3100_driver.h"
dflet 0:400d8e75a8d0 41 #include "simplelink/G_functions/fPtr_func.h"
dflet 0:400d8e75a8d0 42 #include "simplelink/cc3100_nonos.h"
dflet 0:400d8e75a8d0 43 #include "cli_uart.h"
dflet 0:400d8e75a8d0 44 #include "Led_config.h"
dflet 0:400d8e75a8d0 45
dflet 0:400d8e75a8d0 46 #include "cc3100_trace.h"
dflet 0:400d8e75a8d0 47 #include "myBoardInit.h"
dflet 0:400d8e75a8d0 48
dflet 0:400d8e75a8d0 49 using namespace mbed_cc3100;
dflet 0:400d8e75a8d0 50
dflet 0:400d8e75a8d0 51 cc3100 _cc3100_(NC, NC, p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck
dflet 0:400d8e75a8d0 52
dflet 0:400d8e75a8d0 53 #ifdef __cplusplus
dflet 0:400d8e75a8d0 54 extern "C" {
dflet 0:400d8e75a8d0 55 #endif
dflet 0:400d8e75a8d0 56
dflet 0:400d8e75a8d0 57 unsigned char POST_token[] = "__SL_P_ULD";
dflet 0:400d8e75a8d0 58 unsigned char GET_token[] = "__SL_G_ULD";
dflet 0:400d8e75a8d0 59
dflet 0:400d8e75a8d0 60
dflet 0:400d8e75a8d0 61 #define PRINT_BUF_LEN 128
dflet 0:400d8e75a8d0 62 extern int8_t print_buf[PRINT_BUF_LEN];
dflet 0:400d8e75a8d0 63
dflet 0:400d8e75a8d0 64 #define LED_STRING "LED"
dflet 0:400d8e75a8d0 65 #define LED1_STRING "LED1_"
dflet 0:400d8e75a8d0 66 #define LED2_STRING ",LED2_"
dflet 0:400d8e75a8d0 67 #define LED_ON_STRING "ON"
dflet 0:400d8e75a8d0 68 #define LED_OFF_STRING "OFF"
dflet 0:400d8e75a8d0 69
dflet 0:400d8e75a8d0 70 /* General Events handling*/
dflet 0:400d8e75a8d0 71 #if defined (EXT_LIB_REGISTERED_GENERAL_EVENTS)
dflet 0:400d8e75a8d0 72
dflet 0:400d8e75a8d0 73 typedef _SlEventPropogationStatus_e (*general_callback) (SlDeviceEvent_t *);
dflet 0:400d8e75a8d0 74
dflet 0:400d8e75a8d0 75 static const general_callback general_callbacks[] =
dflet 0:400d8e75a8d0 76 {
dflet 0:400d8e75a8d0 77 #ifdef SlExtLib1GeneralEventHandler
dflet 0:400d8e75a8d0 78 SlExtLib1GeneralEventHandler,
dflet 0:400d8e75a8d0 79 #endif
dflet 0:400d8e75a8d0 80
dflet 0:400d8e75a8d0 81 #ifdef SlExtLib2GeneralEventHandler
dflet 0:400d8e75a8d0 82 SlExtLib2GeneralEventHandler,
dflet 0:400d8e75a8d0 83 #endif
dflet 0:400d8e75a8d0 84
dflet 0:400d8e75a8d0 85 #ifdef SlExtLib3GeneralEventHandler
dflet 0:400d8e75a8d0 86 SlExtLib3GeneralEventHandler,
dflet 0:400d8e75a8d0 87 #endif
dflet 0:400d8e75a8d0 88
dflet 0:400d8e75a8d0 89 #ifdef SlExtLib4GeneralEventHandler
dflet 0:400d8e75a8d0 90 SlExtLib4GeneralEventHandler,
dflet 0:400d8e75a8d0 91 #endif
dflet 0:400d8e75a8d0 92
dflet 0:400d8e75a8d0 93 #ifdef SlExtLib5GeneralEventHandler
dflet 0:400d8e75a8d0 94 SlExtLib5GeneralEventHandler,
dflet 0:400d8e75a8d0 95 #endif
dflet 0:400d8e75a8d0 96 };
dflet 0:400d8e75a8d0 97
dflet 0:400d8e75a8d0 98 #undef _SlDrvHandleGeneralEvents
dflet 0:400d8e75a8d0 99
dflet 0:400d8e75a8d0 100 /********************************************************************
dflet 0:400d8e75a8d0 101 _SlDrvHandleGeneralEvents
dflet 0:400d8e75a8d0 102 Iterates through all the general(device) event handlers which are
dflet 0:400d8e75a8d0 103 registered by the external libs/user application.
dflet 0:400d8e75a8d0 104 *********************************************************************/
dflet 0:400d8e75a8d0 105 void _SlDrvHandleGeneralEvents(SlDeviceEvent_t *slGeneralEvent)
dflet 0:400d8e75a8d0 106 {
dflet 0:400d8e75a8d0 107 uint8_t i;
dflet 0:400d8e75a8d0 108
dflet 0:400d8e75a8d0 109 /* Iterate over all the extenal libs handlers */
dflet 0:400d8e75a8d0 110 for ( i = 0 ; i < sizeof(general_callbacks)/sizeof(general_callbacks[0]) ; i++ )
dflet 0:400d8e75a8d0 111 {
dflet 0:400d8e75a8d0 112 if (EVENT_PROPAGATION_BLOCK == general_callbacks[i](slGeneralEvent) )
dflet 0:400d8e75a8d0 113 {
dflet 0:400d8e75a8d0 114 /* exit immediately and do not call the user specific handler as well */
dflet 0:400d8e75a8d0 115 return;
dflet 0:400d8e75a8d0 116 }
dflet 0:400d8e75a8d0 117 }
dflet 0:400d8e75a8d0 118
dflet 0:400d8e75a8d0 119 /* At last call the Application specific handler if registered */
dflet 0:400d8e75a8d0 120 #ifdef sl_GeneralEvtHdlr
dflet 0:400d8e75a8d0 121 sl_GeneralEvtHdlr(slGeneralEvent);
dflet 0:400d8e75a8d0 122 #endif
dflet 0:400d8e75a8d0 123
dflet 0:400d8e75a8d0 124 }
dflet 0:400d8e75a8d0 125 #endif
dflet 0:400d8e75a8d0 126
dflet 0:400d8e75a8d0 127
dflet 0:400d8e75a8d0 128
dflet 0:400d8e75a8d0 129 /* WLAN Events handling*/
dflet 0:400d8e75a8d0 130
dflet 0:400d8e75a8d0 131 #if defined (EXT_LIB_REGISTERED_WLAN_EVENTS)
dflet 0:400d8e75a8d0 132
dflet 0:400d8e75a8d0 133 typedef _SlEventPropogationStatus_e (*wlan_callback) (SlWlanEvent_t *);
dflet 0:400d8e75a8d0 134
dflet 0:400d8e75a8d0 135 static wlan_callback wlan_callbacks[] =
dflet 0:400d8e75a8d0 136 {
dflet 0:400d8e75a8d0 137 #ifdef SlExtLib1WlanEventHandler
dflet 0:400d8e75a8d0 138 SlExtLib1WlanEventHandler,
dflet 0:400d8e75a8d0 139 #endif
dflet 0:400d8e75a8d0 140
dflet 0:400d8e75a8d0 141 #ifdef SlExtLib2WlanEventHandler
dflet 0:400d8e75a8d0 142 SlExtLib2WlanEventHandler,
dflet 0:400d8e75a8d0 143 #endif
dflet 0:400d8e75a8d0 144
dflet 0:400d8e75a8d0 145 #ifdef SlExtLib3WlanEventHandler
dflet 0:400d8e75a8d0 146 SlExtLib3WlanEventHandler,
dflet 0:400d8e75a8d0 147 #endif
dflet 0:400d8e75a8d0 148
dflet 0:400d8e75a8d0 149 #ifdef SlExtLib4WlanEventHandler
dflet 0:400d8e75a8d0 150 SlExtLib4WlanEventHandler,
dflet 0:400d8e75a8d0 151 #endif
dflet 0:400d8e75a8d0 152
dflet 0:400d8e75a8d0 153 #ifdef SlExtLib5WlanEventHandler
dflet 0:400d8e75a8d0 154 SlExtLib5WlanEventHandler,
dflet 0:400d8e75a8d0 155 #endif
dflet 0:400d8e75a8d0 156 };
dflet 0:400d8e75a8d0 157
dflet 0:400d8e75a8d0 158 #undef _SlDrvHandleWlanEvents
dflet 0:400d8e75a8d0 159
dflet 0:400d8e75a8d0 160 /***********************************************************
dflet 0:400d8e75a8d0 161 _SlDrvHandleWlanEvents
dflet 0:400d8e75a8d0 162 Iterates through all the wlan event handlers which are
dflet 0:400d8e75a8d0 163 registered by the external libs/user application.
dflet 0:400d8e75a8d0 164 ************************************************************/
dflet 0:400d8e75a8d0 165 void _SlDrvHandleWlanEvents(SlWlanEvent_t *slWlanEvent)
dflet 0:400d8e75a8d0 166 {
dflet 0:400d8e75a8d0 167 uint8_t i;
dflet 0:400d8e75a8d0 168
dflet 0:400d8e75a8d0 169 /* Iterate over all the extenal libs handlers */
dflet 0:400d8e75a8d0 170 for ( i = 0 ; i < sizeof(wlan_callbacks)/sizeof(wlan_callbacks[0]) ; i++ )
dflet 0:400d8e75a8d0 171 {
dflet 0:400d8e75a8d0 172 if ( EVENT_PROPAGATION_BLOCK == wlan_callbacks[i](slWlanEvent) )
dflet 0:400d8e75a8d0 173 {
dflet 0:400d8e75a8d0 174 /* exit immediately and do not call the user specific handler as well */
dflet 0:400d8e75a8d0 175 return;
dflet 0:400d8e75a8d0 176 }
dflet 0:400d8e75a8d0 177 }
dflet 0:400d8e75a8d0 178
dflet 0:400d8e75a8d0 179 /* At last call the Application specific handler if registered */
dflet 0:400d8e75a8d0 180 #ifdef sl_WlanEvtHdlr
dflet 0:400d8e75a8d0 181 sl_WlanEvtHdlr(slWlanEvent);
dflet 0:400d8e75a8d0 182 #endif
dflet 0:400d8e75a8d0 183
dflet 0:400d8e75a8d0 184 }
dflet 0:400d8e75a8d0 185 #endif
dflet 0:400d8e75a8d0 186
dflet 0:400d8e75a8d0 187
dflet 0:400d8e75a8d0 188 /* NetApp Events handling */
dflet 0:400d8e75a8d0 189 #if defined (EXT_LIB_REGISTERED_NETAPP_EVENTS)
dflet 0:400d8e75a8d0 190
dflet 0:400d8e75a8d0 191 typedef _SlEventPropogationStatus_e (*netApp_callback) (SlNetAppEvent_t *);
dflet 0:400d8e75a8d0 192
dflet 0:400d8e75a8d0 193 static const netApp_callback netApp_callbacks[] =
dflet 0:400d8e75a8d0 194 {
dflet 0:400d8e75a8d0 195 #ifdef SlExtLib1NetAppEventHandler
dflet 0:400d8e75a8d0 196 SlExtLib1NetAppEventHandler,
dflet 0:400d8e75a8d0 197 #endif
dflet 0:400d8e75a8d0 198
dflet 0:400d8e75a8d0 199 #ifdef SlExtLib2NetAppEventHandler
dflet 0:400d8e75a8d0 200 SlExtLib2NetAppEventHandler,
dflet 0:400d8e75a8d0 201 #endif
dflet 0:400d8e75a8d0 202
dflet 0:400d8e75a8d0 203 #ifdef SlExtLib3NetAppEventHandler
dflet 0:400d8e75a8d0 204 SlExtLib3NetAppEventHandler,
dflet 0:400d8e75a8d0 205 #endif
dflet 0:400d8e75a8d0 206
dflet 0:400d8e75a8d0 207 #ifdef SlExtLib4NetAppEventHandler
dflet 0:400d8e75a8d0 208 SlExtLib4NetAppEventHandler,
dflet 0:400d8e75a8d0 209 #endif
dflet 0:400d8e75a8d0 210
dflet 0:400d8e75a8d0 211 #ifdef SlExtLib5NetAppEventHandler
dflet 0:400d8e75a8d0 212 SlExtLib5NetAppEventHandler,
dflet 0:400d8e75a8d0 213 #endif
dflet 0:400d8e75a8d0 214 };
dflet 0:400d8e75a8d0 215
dflet 0:400d8e75a8d0 216 #undef _SlDrvHandleNetAppEvents
dflet 0:400d8e75a8d0 217
dflet 0:400d8e75a8d0 218 /************************************************************
dflet 0:400d8e75a8d0 219 _SlDrvHandleNetAppEvents
dflet 0:400d8e75a8d0 220 Iterates through all the net app event handlers which are
dflet 0:400d8e75a8d0 221 registered by the external libs/user application.
dflet 0:400d8e75a8d0 222 ************************************************************/
dflet 0:400d8e75a8d0 223 void _SlDrvHandleNetAppEvents(SlNetAppEvent_t *slNetAppEvent)
dflet 0:400d8e75a8d0 224 {
dflet 0:400d8e75a8d0 225 uint8_t i;
dflet 0:400d8e75a8d0 226
dflet 0:400d8e75a8d0 227 /* Iterate over all the extenal libs handlers */
dflet 0:400d8e75a8d0 228 for ( i = 0 ; i < sizeof(netApp_callbacks)/sizeof(netApp_callbacks[0]) ; i++ )
dflet 0:400d8e75a8d0 229 {
dflet 0:400d8e75a8d0 230 if (EVENT_PROPAGATION_BLOCK == netApp_callbacks[i](slNetAppEvent) )
dflet 0:400d8e75a8d0 231 {
dflet 0:400d8e75a8d0 232 /* exit immediately and do not call the user specific handler as well */
dflet 0:400d8e75a8d0 233 return;
dflet 0:400d8e75a8d0 234 }
dflet 0:400d8e75a8d0 235 }
dflet 0:400d8e75a8d0 236
dflet 0:400d8e75a8d0 237 /* At last call the Application specific handler if registered */
dflet 0:400d8e75a8d0 238 #ifdef sl_NetAppEvtHdlr
dflet 0:400d8e75a8d0 239 sl_NetAppEvtHdlr(slNetAppEvent);
dflet 0:400d8e75a8d0 240 #endif
dflet 0:400d8e75a8d0 241
dflet 0:400d8e75a8d0 242 }
dflet 0:400d8e75a8d0 243 #endif
dflet 0:400d8e75a8d0 244
dflet 0:400d8e75a8d0 245
dflet 0:400d8e75a8d0 246 /* Http Server Events handling */
dflet 0:400d8e75a8d0 247 #if defined (EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
dflet 0:400d8e75a8d0 248
dflet 0:400d8e75a8d0 249 typedef _SlEventPropogationStatus_e (*httpServer_callback) (SlHttpServerEvent_t*, SlHttpServerResponse_t*);
dflet 0:400d8e75a8d0 250
dflet 0:400d8e75a8d0 251 static const httpServer_callback httpServer_callbacks[] =
dflet 0:400d8e75a8d0 252 {
dflet 0:400d8e75a8d0 253 #ifdef SlExtLib1HttpServerEventHandler
dflet 0:400d8e75a8d0 254 SlExtLib1HttpServerEventHandler,
dflet 0:400d8e75a8d0 255 #endif
dflet 0:400d8e75a8d0 256
dflet 0:400d8e75a8d0 257 #ifdef SlExtLib2HttpServerEventHandler
dflet 0:400d8e75a8d0 258 SlExtLib2HttpServerEventHandler,
dflet 0:400d8e75a8d0 259 #endif
dflet 0:400d8e75a8d0 260
dflet 0:400d8e75a8d0 261 #ifdef SlExtLib3HttpServerEventHandler
dflet 0:400d8e75a8d0 262 SlExtLib3HttpServerEventHandler,
dflet 0:400d8e75a8d0 263 #endif
dflet 0:400d8e75a8d0 264
dflet 0:400d8e75a8d0 265 #ifdef SlExtLib4HttpServerEventHandler
dflet 0:400d8e75a8d0 266 SlExtLib4HttpServerEventHandler,
dflet 0:400d8e75a8d0 267 #endif
dflet 0:400d8e75a8d0 268
dflet 0:400d8e75a8d0 269 #ifdef SlExtLib5HttpServerEventHandler
dflet 0:400d8e75a8d0 270 SlExtLib5HttpServerEventHandler,
dflet 0:400d8e75a8d0 271 #endif
dflet 0:400d8e75a8d0 272 };
dflet 0:400d8e75a8d0 273
dflet 0:400d8e75a8d0 274 #undef _SlDrvHandleHttpServerEvents
dflet 0:400d8e75a8d0 275
dflet 0:400d8e75a8d0 276 /*******************************************************************
dflet 0:400d8e75a8d0 277 _SlDrvHandleHttpServerEvents
dflet 0:400d8e75a8d0 278 Iterates through all the http server event handlers which are
dflet 0:400d8e75a8d0 279 registered by the external libs/user application.
dflet 0:400d8e75a8d0 280 ********************************************************************/
dflet 0:400d8e75a8d0 281 void _SlDrvHandleHttpServerEvents(SlHttpServerEvent_t *slHttpServerEvent, SlHttpServerResponse_t *slHttpServerResponse)
dflet 0:400d8e75a8d0 282 {
dflet 0:400d8e75a8d0 283 _u8 i;
dflet 0:400d8e75a8d0 284
dflet 0:400d8e75a8d0 285 /* Iterate over all the external libs handlers */
dflet 0:400d8e75a8d0 286 for ( i = 0 ; i < sizeof(httpServer_callbacks)/sizeof(httpServer_callbacks[0]) ; i++ )
dflet 0:400d8e75a8d0 287 {
dflet 0:400d8e75a8d0 288 if ( EVENT_PROPAGATION_BLOCK == httpServer_callbacks[i](slHttpServerEvent, slHttpServerResponse) )
dflet 0:400d8e75a8d0 289 {
dflet 0:400d8e75a8d0 290 /* exit immediately and do not call the user specific handler as well */
dflet 0:400d8e75a8d0 291 return;
dflet 0:400d8e75a8d0 292 }
dflet 0:400d8e75a8d0 293 }
dflet 0:400d8e75a8d0 294
dflet 0:400d8e75a8d0 295 /* At last call the Application specific handler if registered */
dflet 0:400d8e75a8d0 296 #ifdef sl_HttpServerCallback
dflet 0:400d8e75a8d0 297 sl_HttpServerCallback(slHttpServerEvent, slHttpServerResponse);
dflet 0:400d8e75a8d0 298 #endif
dflet 0:400d8e75a8d0 299
dflet 0:400d8e75a8d0 300 }
dflet 0:400d8e75a8d0 301 #endif
dflet 0:400d8e75a8d0 302
dflet 0:400d8e75a8d0 303
dflet 0:400d8e75a8d0 304 /* Socket Events */
dflet 0:400d8e75a8d0 305 #if defined (EXT_LIB_REGISTERED_SOCK_EVENTS)
dflet 0:400d8e75a8d0 306
dflet 0:400d8e75a8d0 307 typedef _SlEventPropogationStatus_e (*sock_callback) (SlSockEvent_t *);
dflet 0:400d8e75a8d0 308
dflet 0:400d8e75a8d0 309 static const sock_callback sock_callbacks[] =
dflet 0:400d8e75a8d0 310 {
dflet 0:400d8e75a8d0 311 #ifdef SlExtLib1SockEventHandler
dflet 0:400d8e75a8d0 312 SlExtLib1SockEventHandler,
dflet 0:400d8e75a8d0 313 #endif
dflet 0:400d8e75a8d0 314
dflet 0:400d8e75a8d0 315 #ifdef SlExtLib2SockEventHandler
dflet 0:400d8e75a8d0 316 SlExtLib2SockEventHandler,
dflet 0:400d8e75a8d0 317 #endif
dflet 0:400d8e75a8d0 318
dflet 0:400d8e75a8d0 319 #ifdef SlExtLib3SockEventHandler
dflet 0:400d8e75a8d0 320 SlExtLib3SockEventHandler,
dflet 0:400d8e75a8d0 321 #endif
dflet 0:400d8e75a8d0 322
dflet 0:400d8e75a8d0 323 #ifdef SlExtLib4SockEventHandler
dflet 0:400d8e75a8d0 324 SlExtLib4SockEventHandler,
dflet 0:400d8e75a8d0 325 #endif
dflet 0:400d8e75a8d0 326
dflet 0:400d8e75a8d0 327 #ifdef SlExtLib5SockEventHandler
dflet 0:400d8e75a8d0 328 SlExtLib5SockEventHandler,
dflet 0:400d8e75a8d0 329 #endif
dflet 0:400d8e75a8d0 330 };
dflet 0:400d8e75a8d0 331
dflet 0:400d8e75a8d0 332 /*************************************************************
dflet 0:400d8e75a8d0 333 _SlDrvHandleSockEvents
dflet 0:400d8e75a8d0 334 Iterates through all the socket event handlers which are
dflet 0:400d8e75a8d0 335 registered by the external libs/user application.
dflet 0:400d8e75a8d0 336 **************************************************************/
dflet 0:400d8e75a8d0 337 void _SlDrvHandleSockEvents(SlSockEvent_t *slSockEvent)
dflet 0:400d8e75a8d0 338 {
dflet 0:400d8e75a8d0 339 uint8_t i;
dflet 0:400d8e75a8d0 340
dflet 0:400d8e75a8d0 341 /* Iterate over all the external libs handlers */
dflet 0:400d8e75a8d0 342 for ( i = 0 ; i < sizeof(sock_callbacks)/sizeof(sock_callbacks[0]) ; i++ )
dflet 0:400d8e75a8d0 343 {
dflet 0:400d8e75a8d0 344 if ( EVENT_PROPAGATION_BLOCK == sock_callbacks[i](slSockEvent) )
dflet 0:400d8e75a8d0 345 {
dflet 0:400d8e75a8d0 346 /* exit immediately and do not call the user specific handler as well */
dflet 0:400d8e75a8d0 347 return;
dflet 0:400d8e75a8d0 348 }
dflet 0:400d8e75a8d0 349 }
dflet 0:400d8e75a8d0 350
dflet 0:400d8e75a8d0 351 /* At last call the Application specific handler if registered */
dflet 0:400d8e75a8d0 352 #ifdef sl_SockEvtHdlr
dflet 0:400d8e75a8d0 353 sl_SockEvtHdlr(slSockEvent);
dflet 0:400d8e75a8d0 354 #endif
dflet 0:400d8e75a8d0 355
dflet 0:400d8e75a8d0 356 }
dflet 0:400d8e75a8d0 357
dflet 0:400d8e75a8d0 358 #endif
dflet 0:400d8e75a8d0 359
dflet 0:400d8e75a8d0 360 /*!
dflet 0:400d8e75a8d0 361 \brief This function handles ping report events
dflet 0:400d8e75a8d0 362
dflet 0:400d8e75a8d0 363 \param[in] pPingReport holds the ping report statistics
dflet 0:400d8e75a8d0 364
dflet 0:400d8e75a8d0 365 \return None
dflet 0:400d8e75a8d0 366
dflet 0:400d8e75a8d0 367 \note
dflet 0:400d8e75a8d0 368
dflet 0:400d8e75a8d0 369 \warning
dflet 0:400d8e75a8d0 370 */
dflet 0:400d8e75a8d0 371 void SimpleLinkPingReport(SlPingReport_t *pPingReport)
dflet 0:400d8e75a8d0 372 {
dflet 0:400d8e75a8d0 373 _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:400d8e75a8d0 374
dflet 0:400d8e75a8d0 375 if(pPingReport == NULL)
dflet 0:400d8e75a8d0 376 Uart_Write((uint8_t *)" [PING REPORT] NULL Pointer Error\r\n");
dflet 0:400d8e75a8d0 377
dflet 0:400d8e75a8d0 378 g_PingPacketsRecv = pPingReport->PacketsReceived;
dflet 0:400d8e75a8d0 379 }
dflet 0:400d8e75a8d0 380
dflet 0:400d8e75a8d0 381
dflet 0:400d8e75a8d0 382 /*******************************************************************************/
dflet 0:400d8e75a8d0 383 /* _sl_HandleAsync_Accept */
dflet 0:400d8e75a8d0 384 /*******************************************************************************/
dflet 0:400d8e75a8d0 385 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 386 void _sl_HandleAsync_Accept(void *pVoidBuf)
dflet 0:400d8e75a8d0 387 {
dflet 0:400d8e75a8d0 388 _SocketAddrResponse_u *pMsgArgs = (_SocketAddrResponse_u *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 389
dflet 0:400d8e75a8d0 390 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 391
dflet 0:400d8e75a8d0 392 VERIFY_PROTOCOL(( pMsgArgs->IpV4.sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
dflet 0:400d8e75a8d0 393 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
dflet 0:400d8e75a8d0 394
dflet 0:400d8e75a8d0 395 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,sizeof(_SocketAddrResponse_u));
dflet 0:400d8e75a8d0 396 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 397
dflet 0:400d8e75a8d0 398 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 399 return;
dflet 0:400d8e75a8d0 400 }
dflet 0:400d8e75a8d0 401
dflet 0:400d8e75a8d0 402 /*******************************************************************************/
dflet 0:400d8e75a8d0 403 /* _sl_HandleAsync_Connect */
dflet 0:400d8e75a8d0 404 /*******************************************************************************/
dflet 0:400d8e75a8d0 405 void _sl_HandleAsync_Connect(void *pVoidBuf)
dflet 0:400d8e75a8d0 406 {
dflet 0:400d8e75a8d0 407 _SocketResponse_t *pMsgArgs = (_SocketResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 408
dflet 0:400d8e75a8d0 409 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 410
dflet 0:400d8e75a8d0 411 VERIFY_PROTOCOL((pMsgArgs->sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
dflet 0:400d8e75a8d0 412 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
dflet 0:400d8e75a8d0 413
dflet 0:400d8e75a8d0 414 ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->sd = pMsgArgs->sd;
dflet 0:400d8e75a8d0 415 ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->statusOrLen = pMsgArgs->statusOrLen;
dflet 0:400d8e75a8d0 416
dflet 0:400d8e75a8d0 417 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 418 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 419 return;
dflet 0:400d8e75a8d0 420 }
dflet 0:400d8e75a8d0 421
dflet 0:400d8e75a8d0 422 /*******************************************************************************/
dflet 0:400d8e75a8d0 423 /* _sl_HandleAsync_Select */
dflet 0:400d8e75a8d0 424 /*******************************************************************************/
dflet 0:400d8e75a8d0 425 void _sl_HandleAsync_Select(void *pVoidBuf)
dflet 0:400d8e75a8d0 426 {
dflet 0:400d8e75a8d0 427 _SelectAsyncResponse_t *pMsgArgs = (_SelectAsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 428
dflet 0:400d8e75a8d0 429 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 430
dflet 0:400d8e75a8d0 431 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
dflet 0:400d8e75a8d0 432
dflet 0:400d8e75a8d0 433 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_SelectAsyncResponse_t));
dflet 0:400d8e75a8d0 434
dflet 0:400d8e75a8d0 435 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 436 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 437
dflet 0:400d8e75a8d0 438 return;
dflet 0:400d8e75a8d0 439 }
dflet 0:400d8e75a8d0 440
dflet 0:400d8e75a8d0 441 #endif
dflet 0:400d8e75a8d0 442
dflet 0:400d8e75a8d0 443 /******************************************************************************/
dflet 0:400d8e75a8d0 444 /* _sl_HandleAsync_DnsGetHostByName */
dflet 0:400d8e75a8d0 445 /******************************************************************************/
dflet 0:400d8e75a8d0 446 void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf)
dflet 0:400d8e75a8d0 447 {
dflet 0:400d8e75a8d0 448 _GetHostByNameIPv4AsyncResponse_t *pMsgArgs = (_GetHostByNameIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 449
dflet 0:400d8e75a8d0 450 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 451
dflet 0:400d8e75a8d0 452 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
dflet 0:400d8e75a8d0 453
dflet 0:400d8e75a8d0 454 /*IPv6 */
dflet 0:400d8e75a8d0 455 if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) {
dflet 0:400d8e75a8d0 456 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv6AsyncResponse_t));
dflet 0:400d8e75a8d0 457 }
dflet 0:400d8e75a8d0 458 /*IPv4 */
dflet 0:400d8e75a8d0 459 else
dflet 0:400d8e75a8d0 460 {
dflet 0:400d8e75a8d0 461 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv4AsyncResponse_t));
dflet 0:400d8e75a8d0 462 }
dflet 0:400d8e75a8d0 463
dflet 0:400d8e75a8d0 464 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 465 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 466
dflet 0:400d8e75a8d0 467 return;
dflet 0:400d8e75a8d0 468 }
dflet 0:400d8e75a8d0 469
dflet 0:400d8e75a8d0 470 /******************************************************************************/
dflet 0:400d8e75a8d0 471
dflet 0:400d8e75a8d0 472 /******************************************************************************
dflet 0:400d8e75a8d0 473 _sl_HandleAsync_DnsGetHostByService
dflet 0:400d8e75a8d0 474
dflet 0:400d8e75a8d0 475 CALLER NWP - Async event on sl_DnsGetHostByService with IPv4 Family
dflet 0:400d8e75a8d0 476
dflet 0:400d8e75a8d0 477
dflet 0:400d8e75a8d0 478 DESCRIPTION:
dflet 0:400d8e75a8d0 479
dflet 0:400d8e75a8d0 480 Async event on sl_DnsGetHostByService command with IPv4 Family.
dflet 0:400d8e75a8d0 481 Return service attributes like IP address, port and text according to service name.
dflet 0:400d8e75a8d0 482 The user sets a service name Full/Part (see example below), and should get the:
dflet 0:400d8e75a8d0 483 1. IP of the service
dflet 0:400d8e75a8d0 484 2. The port of service.
dflet 0:400d8e75a8d0 485 3. The text of service.
dflet 0:400d8e75a8d0 486
dflet 0:400d8e75a8d0 487 Hence it can make a connection to the specific service and use it.
dflet 0:400d8e75a8d0 488 It is similar to get host by name method.
dflet 0:400d8e75a8d0 489
dflet 0:400d8e75a8d0 490 It is done by a single shot query with PTR type on the service name.
dflet 0:400d8e75a8d0 491
dflet 0:400d8e75a8d0 492
dflet 0:400d8e75a8d0 493
dflet 0:400d8e75a8d0 494 Note:
dflet 0:400d8e75a8d0 495 1. The return's attributes are belonged to first service that is found.
dflet 0:400d8e75a8d0 496 It can be other services with the same service name will response to
dflet 0:400d8e75a8d0 497 the query. The results of these responses are saved in the peer cache of the NWP, and
dflet 0:400d8e75a8d0 498 should be read by another API.
dflet 0:400d8e75a8d0 499
dflet 0:400d8e75a8d0 500
dflet 0:400d8e75a8d0 501 PARAMETERS:
dflet 0:400d8e75a8d0 502
dflet 0:400d8e75a8d0 503 pVoidBuf - is point to opcode of the event.
dflet 0:400d8e75a8d0 504 it contains the outputs that are given to the user
dflet 0:400d8e75a8d0 505
dflet 0:400d8e75a8d0 506 outputs description:
dflet 0:400d8e75a8d0 507
dflet 0:400d8e75a8d0 508 1.out_pAddr[] - output: Contain the IP address of the service.
dflet 0:400d8e75a8d0 509 2.out_pPort - output: Contain the port of the service.
dflet 0:400d8e75a8d0 510 3.inout_TextLen - Input: Contain the max length of the text that the user wants to get.
dflet 0:400d8e75a8d0 511 it means that if the test of service is bigger that its value than
dflet 0:400d8e75a8d0 512 the text is cut to inout_TextLen value.
dflet 0:400d8e75a8d0 513 Output: Contain the length of the text that is returned. Can be full text or part
dflet 0:400d8e75a8d0 514 of the text (see above).
dflet 0:400d8e75a8d0 515
dflet 0:400d8e75a8d0 516 4.out_pText - Contain the text of the service (full or part see above- inout_TextLen description).
dflet 0:400d8e75a8d0 517
dflet 0:400d8e75a8d0 518 *
dflet 0:400d8e75a8d0 519
dflet 0:400d8e75a8d0 520
dflet 0:400d8e75a8d0 521 RETURNS: success or fail.
dflet 0:400d8e75a8d0 522
dflet 0:400d8e75a8d0 523 ******************************************************************************/
dflet 0:400d8e75a8d0 524 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 525 void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf)
dflet 0:400d8e75a8d0 526 {
dflet 0:400d8e75a8d0 527 _GetHostByServiceAsyncResponse_t* Res;
dflet 0:400d8e75a8d0 528 uint16_t TextLen;
dflet 0:400d8e75a8d0 529 uint16_t UserTextLen;
dflet 0:400d8e75a8d0 530
dflet 0:400d8e75a8d0 531 /*pVoidBuf - is point to opcode of the event.*/
dflet 0:400d8e75a8d0 532
dflet 0:400d8e75a8d0 533 /*set pMsgArgs to point to the attribute of the event.*/
dflet 0:400d8e75a8d0 534 _GetHostByServiceIPv4AsyncResponse_t *pMsgArgs = (_GetHostByServiceIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 535
dflet 0:400d8e75a8d0 536 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
dflet 0:400d8e75a8d0 537
dflet 0:400d8e75a8d0 538 /*IPv6*/
dflet 0:400d8e75a8d0 539 if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) {
dflet 0:400d8e75a8d0 540 return;
dflet 0:400d8e75a8d0 541 }
dflet 0:400d8e75a8d0 542 /*IPv4*/
dflet 0:400d8e75a8d0 543 else {
dflet 0:400d8e75a8d0 544 /*************************************************************************************************
dflet 0:400d8e75a8d0 545
dflet 0:400d8e75a8d0 546 1. Copy the attribute part of the evnt to the attribute part of the response
dflet 0:400d8e75a8d0 547 memcpy(g_pCB->GetHostByServiceCB.pAsyncRsp, pMsgArgs, sizeof(_GetHostByServiceIPv4AsyncResponse_t));
dflet 0:400d8e75a8d0 548
dflet 0:400d8e75a8d0 549 set to TextLen the text length of the service.*/
dflet 0:400d8e75a8d0 550 TextLen = pMsgArgs->TextLen;
dflet 0:400d8e75a8d0 551
dflet 0:400d8e75a8d0 552 /*Res pointed to mDNS global object struct */
dflet 0:400d8e75a8d0 553 Res = (_GetHostByServiceAsyncResponse_t*)g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs;
dflet 0:400d8e75a8d0 554
dflet 0:400d8e75a8d0 555
dflet 0:400d8e75a8d0 556
dflet 0:400d8e75a8d0 557 /*It is 4 bytes so we avoid from memcpy*/
dflet 0:400d8e75a8d0 558 Res->out_pAddr[0] = pMsgArgs->Address;
dflet 0:400d8e75a8d0 559 Res->out_pPort[0] = pMsgArgs->Port;
dflet 0:400d8e75a8d0 560 Res->Status = pMsgArgs->Status;
dflet 0:400d8e75a8d0 561
dflet 0:400d8e75a8d0 562 /*set to TextLen the text length of the user (input fromthe user).*/
dflet 0:400d8e75a8d0 563 UserTextLen = Res->inout_TextLen[0];
dflet 0:400d8e75a8d0 564
dflet 0:400d8e75a8d0 565 /*Cut the service text if the user requested for smaller text.*/
dflet 0:400d8e75a8d0 566 UserTextLen = (TextLen <= UserTextLen) ? TextLen : UserTextLen;
dflet 0:400d8e75a8d0 567 Res->inout_TextLen[0] = UserTextLen ;
dflet 0:400d8e75a8d0 568
dflet 0:400d8e75a8d0 569 /**************************************************************************************************
dflet 0:400d8e75a8d0 570
dflet 0:400d8e75a8d0 571 2. Copy the payload part of the evnt (the text) to the payload part of the response
dflet 0:400d8e75a8d0 572 the lenght of the copy is according to the text length in the attribute part. */
dflet 0:400d8e75a8d0 573
dflet 0:400d8e75a8d0 574
dflet 0:400d8e75a8d0 575 memcpy(Res->out_pText,
dflet 0:400d8e75a8d0 576 (int8_t *)(& pMsgArgs[1]), /* & pMsgArgs[1] -> 1st byte after the fixed header = 1st byte of variable text.*/
dflet 0:400d8e75a8d0 577 UserTextLen);
dflet 0:400d8e75a8d0 578
dflet 0:400d8e75a8d0 579
dflet 0:400d8e75a8d0 580 /**************************************************************************************************/
dflet 0:400d8e75a8d0 581 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 582 return;
dflet 0:400d8e75a8d0 583 }
dflet 0:400d8e75a8d0 584 }
dflet 0:400d8e75a8d0 585 #endif
dflet 0:400d8e75a8d0 586
dflet 0:400d8e75a8d0 587 /*****************************************************************************/
dflet 0:400d8e75a8d0 588 /* _sl_HandleAsync_PingResponse */
dflet 0:400d8e75a8d0 589 /*****************************************************************************/
dflet 0:400d8e75a8d0 590 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 591 void _sl_HandleAsync_PingResponse(void *pVoidBuf)
dflet 0:400d8e75a8d0 592 {
dflet 0:400d8e75a8d0 593 _PingReportResponse_t *pMsgArgs = (_PingReportResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 594 SlPingReport_t pingReport;
dflet 0:400d8e75a8d0 595
dflet 0:400d8e75a8d0 596 if(pPingCallBackFunc) {
dflet 0:400d8e75a8d0 597 _cc3100_._netapp.CopyPingResultsToReport(pMsgArgs,&pingReport);
dflet 0:400d8e75a8d0 598 pPingCallBackFunc(&pingReport);
dflet 0:400d8e75a8d0 599 } else {
dflet 0:400d8e75a8d0 600
dflet 0:400d8e75a8d0 601 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 602 VERIFY_SOCKET_CB(NULL != g_pCB->PingCB.PingAsync.pAsyncRsp);
dflet 0:400d8e75a8d0 603
dflet 0:400d8e75a8d0 604 if (NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs) {
dflet 0:400d8e75a8d0 605 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_PingReportResponse_t));
dflet 0:400d8e75a8d0 606 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 607 }
dflet 0:400d8e75a8d0 608 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 609 }
dflet 0:400d8e75a8d0 610 return;
dflet 0:400d8e75a8d0 611 }
dflet 0:400d8e75a8d0 612 #endif
dflet 0:400d8e75a8d0 613
dflet 0:400d8e75a8d0 614 /* ******************************************************************************/
dflet 0:400d8e75a8d0 615 /* _SlDrvMsgReadSpawnCtx */
dflet 0:400d8e75a8d0 616 /* ******************************************************************************/
dflet 0:400d8e75a8d0 617 _SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue)
dflet 0:400d8e75a8d0 618 {
dflet 0:400d8e75a8d0 619
dflet 0:400d8e75a8d0 620 #ifdef SL_POLLING_MODE_USED
dflet 0:400d8e75a8d0 621 int16_t retCode = OSI_OK;
dflet 0:400d8e75a8d0 622 /* for polling based systems */
dflet 0:400d8e75a8d0 623 do {
dflet 0:400d8e75a8d0 624 retCode = _cc3100_._nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, 0);
dflet 0:400d8e75a8d0 625 if ( OSI_OK != retCode ) {
dflet 0:400d8e75a8d0 626 if (TRUE == g_pCB->IsCmdRespWaited) {
dflet 0:400d8e75a8d0 627 OSI_RET_OK_CHECK( _cc3100_._nonos.sl_SyncObjSignal(&g_pCB->CmdSyncObj) );
dflet 0:400d8e75a8d0 628 return SL_RET_CODE_OK;
dflet 0:400d8e75a8d0 629 }
dflet 0:400d8e75a8d0 630 }
dflet 0:400d8e75a8d0 631
dflet 0:400d8e75a8d0 632 } while (OSI_OK != retCode);
dflet 0:400d8e75a8d0 633
dflet 0:400d8e75a8d0 634 #else
dflet 0:400d8e75a8d0 635 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 636 _cc3100_._driver._SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj);
dflet 0:400d8e75a8d0 637 // OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, SL_OS_WAIT_FOREVER) );
dflet 0:400d8e75a8d0 638 #else
dflet 0:400d8e75a8d0 639 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->GlobalLockObj, SL_OS_WAIT_FOREVER) );
dflet 0:400d8e75a8d0 640 #endif
dflet 0:400d8e75a8d0 641 #endif
dflet 0:400d8e75a8d0 642 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;/* buffer must be allocated by _SlDrvMsgRead */
dflet 0:400d8e75a8d0 643 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL;
dflet 0:400d8e75a8d0 644 g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS;/* init to illegal value and verify it's overwritten with the valid one */
dflet 0:400d8e75a8d0 645
dflet 0:400d8e75a8d0 646 /* Messages might have been read by CmdResp context. Therefore after */
dflet 0:400d8e75a8d0 647 /* getting LockObj, check again where the Pending Rx Msg is still present. */
dflet 0:400d8e75a8d0 648 if(FALSE == (_cc3100_._driver._SL_PENDING_RX_MSG(g_pCB))) {
dflet 0:400d8e75a8d0 649 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 650 _cc3100_._driver._SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:400d8e75a8d0 651 // OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj));
dflet 0:400d8e75a8d0 652 #else
dflet 0:400d8e75a8d0 653 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->GlobalLockObj));
dflet 0:400d8e75a8d0 654 #endif
dflet 0:400d8e75a8d0 655 return SL_RET_CODE_OK;
dflet 0:400d8e75a8d0 656 }
dflet 0:400d8e75a8d0 657
dflet 0:400d8e75a8d0 658 VERIFY_RET_OK(_cc3100_._driver._SlDrvMsgRead());
dflet 0:400d8e75a8d0 659
dflet 0:400d8e75a8d0 660 g_pCB->RxDoneCnt++;
dflet 0:400d8e75a8d0 661
dflet 0:400d8e75a8d0 662 switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) {
dflet 0:400d8e75a8d0 663 case ASYNC_EVT_CLASS:
dflet 0:400d8e75a8d0 664 /* If got here and protected by LockObj a message is waiting */
dflet 0:400d8e75a8d0 665 /* to be read */
dflet 0:400d8e75a8d0 666 VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:400d8e75a8d0 667
dflet 0:400d8e75a8d0 668 _cc3100_._driver._SlAsyncEventGenericHandler();
dflet 0:400d8e75a8d0 669
dflet 0:400d8e75a8d0 670 #if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC)
dflet 0:400d8e75a8d0 671 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
dflet 0:400d8e75a8d0 672 #else
dflet 0:400d8e75a8d0 673 free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:400d8e75a8d0 674 #endif
dflet 0:400d8e75a8d0 675 break;
dflet 0:400d8e75a8d0 676 case DUMMY_MSG_CLASS:
dflet 0:400d8e75a8d0 677 case RECV_RESP_CLASS:
dflet 0:400d8e75a8d0 678 /* These types are legal in this context. Do nothing */
dflet 0:400d8e75a8d0 679 break;
dflet 0:400d8e75a8d0 680 case CMD_RESP_CLASS:
dflet 0:400d8e75a8d0 681 /* Command response is illegal in this context. */
dflet 0:400d8e75a8d0 682 /* No 'break' here: Assert! */
dflet 0:400d8e75a8d0 683 default:
dflet 0:400d8e75a8d0 684 VERIFY_PROTOCOL(0);
dflet 0:400d8e75a8d0 685 }
dflet 0:400d8e75a8d0 686 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 687 _cc3100_._driver._SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:400d8e75a8d0 688 // OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj));
dflet 0:400d8e75a8d0 689 #else
dflet 0:400d8e75a8d0 690 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->GlobalLockObj));
dflet 0:400d8e75a8d0 691 #endif
dflet 0:400d8e75a8d0 692 return(SL_RET_CODE_OK);
dflet 0:400d8e75a8d0 693
dflet 0:400d8e75a8d0 694 }
dflet 0:400d8e75a8d0 695
dflet 0:400d8e75a8d0 696 /***************************************************************************
dflet 0:400d8e75a8d0 697 _sl_HandleAsync_Stop - handles stop signalling to
dflet 0:400d8e75a8d0 698 a waiting object
dflet 0:400d8e75a8d0 699 ****************************************************************************/
dflet 0:400d8e75a8d0 700 void _sl_HandleAsync_Stop(void *pVoidBuf)
dflet 0:400d8e75a8d0 701 {
dflet 0:400d8e75a8d0 702 _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:400d8e75a8d0 703
dflet 0:400d8e75a8d0 704 VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp);
dflet 0:400d8e75a8d0 705
dflet 0:400d8e75a8d0 706 _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
dflet 0:400d8e75a8d0 707
dflet 0:400d8e75a8d0 708 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_BasicResponse_t));
dflet 0:400d8e75a8d0 709 _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:400d8e75a8d0 710 _cc3100_._driver._SlDrvProtectionObjUnLock();
dflet 0:400d8e75a8d0 711 return;
dflet 0:400d8e75a8d0 712 }
dflet 0:400d8e75a8d0 713
dflet 0:400d8e75a8d0 714 /******************************************************************************
dflet 0:400d8e75a8d0 715 _SlDrvDeviceEventHandler - handles internally device async events
dflet 0:400d8e75a8d0 716 ******************************************************************************/
dflet 0:400d8e75a8d0 717 void _SlDrvDeviceEventHandler(void *pArgs)
dflet 0:400d8e75a8d0 718 {
dflet 0:400d8e75a8d0 719 _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs;
dflet 0:400d8e75a8d0 720
dflet 0:400d8e75a8d0 721 switch(pHdr->GenHeader.Opcode) {
dflet 0:400d8e75a8d0 722 case SL_OPCODE_DEVICE_INITCOMPLETE:
dflet 0:400d8e75a8d0 723 _cc3100_._sl_HandleAsync_InitComplete(pHdr);
dflet 0:400d8e75a8d0 724
dflet 0:400d8e75a8d0 725 break;
dflet 0:400d8e75a8d0 726 case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE:
dflet 0:400d8e75a8d0 727 _sl_HandleAsync_Stop(pHdr);
dflet 0:400d8e75a8d0 728
dflet 0:400d8e75a8d0 729 break;
dflet 0:400d8e75a8d0 730
dflet 0:400d8e75a8d0 731
dflet 0:400d8e75a8d0 732 case SL_OPCODE_DEVICE_ABORT:
dflet 0:400d8e75a8d0 733 {
dflet 0:400d8e75a8d0 734 #if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS)
dflet 0:400d8e75a8d0 735 SlDeviceEvent_t devHandler;
dflet 0:400d8e75a8d0 736 devHandler.Event = SL_DEVICE_ABORT_ERROR_EVENT;
dflet 0:400d8e75a8d0 737 devHandler.EventData.deviceReport.AbortType = *((uint32_t*)pArgs + 2);
dflet 0:400d8e75a8d0 738 devHandler.EventData.deviceReport.AbortData = *((uint32_t*)pArgs + 3);
dflet 0:400d8e75a8d0 739 _SlDrvHandleGeneralEvents(&devHandler);
dflet 0:400d8e75a8d0 740 #endif
dflet 0:400d8e75a8d0 741 }
dflet 0:400d8e75a8d0 742 break;
dflet 0:400d8e75a8d0 743 case SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR:
dflet 0:400d8e75a8d0 744 #if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS)
dflet 0:400d8e75a8d0 745 {
dflet 0:400d8e75a8d0 746 _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pHdr);
dflet 0:400d8e75a8d0 747 SlDeviceEvent_t devHandler;
dflet 0:400d8e75a8d0 748 devHandler.Event = SL_DEVICE_FATAL_ERROR_EVENT;
dflet 0:400d8e75a8d0 749 devHandler.EventData.deviceEvent.status = pMsgArgs->status & 0xFF;
dflet 0:400d8e75a8d0 750 devHandler.EventData.deviceEvent.sender = (SlErrorSender_e)((pMsgArgs->status >> 8) & 0xFF);
dflet 0:400d8e75a8d0 751 _SlDrvHandleGeneralEvents(&devHandler);
dflet 0:400d8e75a8d0 752 }
dflet 0:400d8e75a8d0 753 #endif
dflet 0:400d8e75a8d0 754 break;
dflet 0:400d8e75a8d0 755 default:
dflet 0:400d8e75a8d0 756 SL_ERROR_TRACE2(MSG_306, "ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
dflet 0:400d8e75a8d0 757 //printf("ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
dflet 0:400d8e75a8d0 758
dflet 0:400d8e75a8d0 759 }
dflet 0:400d8e75a8d0 760 }
dflet 0:400d8e75a8d0 761
dflet 0:400d8e75a8d0 762 /*****************************************************************************/
dflet 0:400d8e75a8d0 763 /* _SlDrvNetAppEventHandler */
dflet 0:400d8e75a8d0 764 /*****************************************************************************/
dflet 0:400d8e75a8d0 765 void _SlDrvNetAppEventHandler(void *pArgs)
dflet 0:400d8e75a8d0 766 {
dflet 0:400d8e75a8d0 767 _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs;
dflet 0:400d8e75a8d0 768 #if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
dflet 0:400d8e75a8d0 769 SlHttpServerEvent_t httpServerEvent;
dflet 0:400d8e75a8d0 770 SlHttpServerResponse_t httpServerResponse;
dflet 0:400d8e75a8d0 771 #endif
dflet 0:400d8e75a8d0 772 switch(pHdr->GenHeader.Opcode) {
dflet 0:400d8e75a8d0 773 case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE:
dflet 0:400d8e75a8d0 774 case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE_V6:
dflet 0:400d8e75a8d0 775 _sl_HandleAsync_DnsGetHostByName(pArgs);
dflet 0:400d8e75a8d0 776 break;
dflet 0:400d8e75a8d0 777 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 778 case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE:
dflet 0:400d8e75a8d0 779 case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE_V6:
dflet 0:400d8e75a8d0 780 _sl_HandleAsync_DnsGetHostByService(pArgs);
dflet 0:400d8e75a8d0 781 break;
dflet 0:400d8e75a8d0 782 case SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE:
dflet 0:400d8e75a8d0 783 _sl_HandleAsync_PingResponse(pArgs);
dflet 0:400d8e75a8d0 784 break;
dflet 0:400d8e75a8d0 785 #endif
dflet 0:400d8e75a8d0 786
dflet 0:400d8e75a8d0 787 #if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
dflet 0:400d8e75a8d0 788 case SL_OPCODE_NETAPP_HTTPGETTOKENVALUE: {
dflet 0:400d8e75a8d0 789
dflet 0:400d8e75a8d0 790 uint8_t *pTokenName;
dflet 0:400d8e75a8d0 791 slHttpServerData_t Token_value;
dflet 0:400d8e75a8d0 792 sl_NetAppHttpServerGetToken_t *httpGetToken = (sl_NetAppHttpServerGetToken_t *)_SL_RESP_ARGS_START(pHdr);
dflet 0:400d8e75a8d0 793 pTokenName = (uint8_t *)((sl_NetAppHttpServerGetToken_t *)httpGetToken + 1);
dflet 0:400d8e75a8d0 794
dflet 0:400d8e75a8d0 795 httpServerResponse.Response = SL_NETAPP_HTTPSETTOKENVALUE;
dflet 0:400d8e75a8d0 796 httpServerResponse.ResponseData.token_value.len = MAX_TOKEN_VALUE_LEN;
dflet 0:400d8e75a8d0 797
dflet 0:400d8e75a8d0 798 /* Reuse the async buffer for getting the token value response from the user */
dflet 0:400d8e75a8d0 799 httpServerResponse.ResponseData.token_value.data = (uint8_t *)_SL_RESP_ARGS_START(pHdr) + MAX_TOKEN_NAME_LEN;
dflet 0:400d8e75a8d0 800 httpServerEvent.Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT;
dflet 0:400d8e75a8d0 801
dflet 0:400d8e75a8d0 802 httpServerEvent.EventData.httpTokenName.len = httpGetToken->token_name_len;
dflet 0:400d8e75a8d0 803 httpServerEvent.EventData.httpTokenName.data = pTokenName;
dflet 0:400d8e75a8d0 804
dflet 0:400d8e75a8d0 805 Token_value.token_name = pTokenName;
dflet 0:400d8e75a8d0 806
dflet 0:400d8e75a8d0 807 _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse);
dflet 0:400d8e75a8d0 808
dflet 0:400d8e75a8d0 809 Token_value.value_len = httpServerResponse.ResponseData.token_value.len;
dflet 0:400d8e75a8d0 810 Token_value.name_len = httpServerEvent.EventData.httpTokenName.len;
dflet 0:400d8e75a8d0 811
dflet 0:400d8e75a8d0 812 Token_value.token_value = httpServerResponse.ResponseData.token_value.data;
dflet 0:400d8e75a8d0 813
dflet 0:400d8e75a8d0 814
dflet 0:400d8e75a8d0 815 _cc3100_._netapp.sl_NetAppSendTokenValue(&Token_value);
dflet 0:400d8e75a8d0 816 #endif
dflet 0:400d8e75a8d0 817 }
dflet 0:400d8e75a8d0 818 break;
dflet 0:400d8e75a8d0 819
dflet 0:400d8e75a8d0 820 case SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE: {
dflet 0:400d8e75a8d0 821 #ifdef sl_HttpServerCallback
dflet 0:400d8e75a8d0 822 uint8_t *pPostParams;
dflet 0:400d8e75a8d0 823
dflet 0:400d8e75a8d0 824 sl_NetAppHttpServerPostToken_t *httpPostTokenArgs = (sl_NetAppHttpServerPostToken_t *)_SL_RESP_ARGS_START(pHdr);
dflet 0:400d8e75a8d0 825 pPostParams = (uint8_t *)((sl_NetAppHttpServerPostToken_t *)httpPostTokenArgs + 1);
dflet 0:400d8e75a8d0 826
dflet 0:400d8e75a8d0 827 httpServerEvent.Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT;
dflet 0:400d8e75a8d0 828
dflet 0:400d8e75a8d0 829 httpServerEvent.EventData.httpPostData.action.len = httpPostTokenArgs->post_action_len;
dflet 0:400d8e75a8d0 830 httpServerEvent.EventData.httpPostData.action.data = pPostParams;
dflet 0:400d8e75a8d0 831 pPostParams+=httpPostTokenArgs->post_action_len;
dflet 0:400d8e75a8d0 832
dflet 0:400d8e75a8d0 833 httpServerEvent.EventData.httpPostData.token_name.len = httpPostTokenArgs->token_name_len;
dflet 0:400d8e75a8d0 834 httpServerEvent.EventData.httpPostData.token_name.data = pPostParams;
dflet 0:400d8e75a8d0 835 pPostParams+=httpPostTokenArgs->token_name_len;
dflet 0:400d8e75a8d0 836
dflet 0:400d8e75a8d0 837 httpServerEvent.EventData.httpPostData.token_value.len = httpPostTokenArgs->token_value_len;
dflet 0:400d8e75a8d0 838 httpServerEvent.EventData.httpPostData.token_value.data = pPostParams;
dflet 0:400d8e75a8d0 839
dflet 0:400d8e75a8d0 840 httpServerResponse.Response = SL_NETAPP_RESPONSE_NONE;
dflet 0:400d8e75a8d0 841
dflet 0:400d8e75a8d0 842
dflet 0:400d8e75a8d0 843 _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse);
dflet 0:400d8e75a8d0 844 }
dflet 0:400d8e75a8d0 845 break;
dflet 0:400d8e75a8d0 846 #endif
dflet 0:400d8e75a8d0 847 default:
dflet 0:400d8e75a8d0 848 SL_ERROR_TRACE2(MSG_305, "ASSERT: _SlDrvNetAppEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
dflet 0:400d8e75a8d0 849 VERIFY_PROTOCOL(0);
dflet 0:400d8e75a8d0 850 }
dflet 0:400d8e75a8d0 851 }
dflet 0:400d8e75a8d0 852
dflet 0:400d8e75a8d0 853 /*
dflet 0:400d8e75a8d0 854 * ASYNCHRONOUS EVENT HANDLERS -- Start
dflet 0:400d8e75a8d0 855 */
dflet 0:400d8e75a8d0 856
dflet 0:400d8e75a8d0 857 /*!
dflet 0:400d8e75a8d0 858 \brief This function handles WLAN events
dflet 0:400d8e75a8d0 859
dflet 0:400d8e75a8d0 860 \param[in] pWlanEvent is the event passed to the handler
dflet 0:400d8e75a8d0 861
dflet 0:400d8e75a8d0 862 \return None
dflet 0:400d8e75a8d0 863
dflet 0:400d8e75a8d0 864 \note
dflet 0:400d8e75a8d0 865
dflet 0:400d8e75a8d0 866 \warning
dflet 0:400d8e75a8d0 867 */
dflet 0:400d8e75a8d0 868 #if (defined(sl_WlanEvtHdlr))
dflet 0:400d8e75a8d0 869 void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
dflet 0:400d8e75a8d0 870 {
dflet 0:400d8e75a8d0 871 unsigned char g_ucConnectionSSID[32+1]; //Connection SSID
dflet 0:400d8e75a8d0 872 unsigned char g_ucConnectionBSSID[6]; //Connection BSSID
dflet 0:400d8e75a8d0 873
dflet 0:400d8e75a8d0 874 if(pWlanEvent == NULL)
dflet 0:400d8e75a8d0 875 Uart_Write((uint8_t *)" [WLAN EVENT] NULL Pointer Error \n\r");
dflet 0:400d8e75a8d0 876
dflet 0:400d8e75a8d0 877 switch(pWlanEvent->Event) {
dflet 0:400d8e75a8d0 878 case SL_WLAN_CONNECT_EVENT: {
dflet 0:400d8e75a8d0 879 _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION);
dflet 0:400d8e75a8d0 880
dflet 0:400d8e75a8d0 881 // Copy new connection SSID and BSSID to global parameters
dflet 0:400d8e75a8d0 882 memcpy(g_ucConnectionSSID,pWlanEvent->EventData.
dflet 0:400d8e75a8d0 883 STAandP2PModeWlanConnected.ssid_name,
dflet 0:400d8e75a8d0 884 pWlanEvent->EventData.STAandP2PModeWlanConnected.ssid_len);
dflet 0:400d8e75a8d0 885 memcpy(g_ucConnectionBSSID,
dflet 0:400d8e75a8d0 886 pWlanEvent->EventData.STAandP2PModeWlanConnected.bssid,
dflet 0:400d8e75a8d0 887 SL_BSSID_LENGTH);
dflet 0:400d8e75a8d0 888 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 889 sprintf((char*) print_buf, "[WLAN EVENT] STA Connected to the AP: %s ,""BSSID: %x:%x:%x:%x:%x:%x\n\r",
dflet 0:400d8e75a8d0 890 g_ucConnectionSSID,g_ucConnectionBSSID[0],
dflet 0:400d8e75a8d0 891 g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
dflet 0:400d8e75a8d0 892 g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
dflet 0:400d8e75a8d0 893 g_ucConnectionBSSID[5]);
dflet 0:400d8e75a8d0 894 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 895 /*
dflet 0:400d8e75a8d0 896 * Information about the connected AP (like name, MAC etc) will be
dflet 0:400d8e75a8d0 897 * available in 'slWlanConnectAsyncResponse_t' - Applications
dflet 0:400d8e75a8d0 898 * can use it if required
dflet 0:400d8e75a8d0 899 *
dflet 0:400d8e75a8d0 900 * slWlanConnectAsyncResponse_t *pEventData = NULL;
dflet 0:400d8e75a8d0 901 * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
dflet 0:400d8e75a8d0 902 *
dflet 0:400d8e75a8d0 903 */
dflet 0:400d8e75a8d0 904 }
dflet 0:400d8e75a8d0 905 break;
dflet 0:400d8e75a8d0 906
dflet 0:400d8e75a8d0 907 case SL_WLAN_DISCONNECT_EVENT: {
dflet 0:400d8e75a8d0 908 slWlanConnectAsyncResponse_t* pEventData = NULL;
dflet 0:400d8e75a8d0 909
dflet 0:400d8e75a8d0 910 _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION);
dflet 0:400d8e75a8d0 911 _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
dflet 0:400d8e75a8d0 912
dflet 0:400d8e75a8d0 913 pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected;
dflet 0:400d8e75a8d0 914
dflet 0:400d8e75a8d0 915 /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */
dflet 0:400d8e75a8d0 916 if(SL_USER_INITIATED_DISCONNECTION == pEventData->reason_code) {
dflet 0:400d8e75a8d0 917 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 918 sprintf((char*) print_buf, "[WLAN EVENT]Device disconnected from the AP: %s,"
dflet 0:400d8e75a8d0 919 "BSSID: %x:%x:%x:%x:%x:%x on application's request \n\r",
dflet 0:400d8e75a8d0 920 g_ucConnectionSSID,g_ucConnectionBSSID[0],
dflet 0:400d8e75a8d0 921 g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
dflet 0:400d8e75a8d0 922 g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
dflet 0:400d8e75a8d0 923 g_ucConnectionBSSID[5]);
dflet 0:400d8e75a8d0 924 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 925 } else {
dflet 0:400d8e75a8d0 926 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 927 sprintf((char*) print_buf, "[WLAN ERROR]Device disconnected from the AP AP: %s,"
dflet 0:400d8e75a8d0 928 "BSSID: %x:%x:%x:%x:%x:%x on an ERROR..!! \n\r",
dflet 0:400d8e75a8d0 929 g_ucConnectionSSID,g_ucConnectionBSSID[0],
dflet 0:400d8e75a8d0 930 g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
dflet 0:400d8e75a8d0 931 g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
dflet 0:400d8e75a8d0 932 g_ucConnectionBSSID[5]);
dflet 0:400d8e75a8d0 933 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 934 }
dflet 0:400d8e75a8d0 935 memset(g_ucConnectionSSID,0,sizeof(g_ucConnectionSSID));
dflet 0:400d8e75a8d0 936 memset(g_ucConnectionBSSID,0,sizeof(g_ucConnectionBSSID));
dflet 0:400d8e75a8d0 937 }
dflet 0:400d8e75a8d0 938 break;
dflet 0:400d8e75a8d0 939
dflet 0:400d8e75a8d0 940 case SL_WLAN_STA_CONNECTED_EVENT: {
dflet 0:400d8e75a8d0 941 _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED);
dflet 0:400d8e75a8d0 942 }
dflet 0:400d8e75a8d0 943 break;
dflet 0:400d8e75a8d0 944
dflet 0:400d8e75a8d0 945 case SL_WLAN_STA_DISCONNECTED_EVENT: {
dflet 0:400d8e75a8d0 946 _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED);
dflet 0:400d8e75a8d0 947 _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED);
dflet 0:400d8e75a8d0 948 }
dflet 0:400d8e75a8d0 949 break;
dflet 0:400d8e75a8d0 950
dflet 0:400d8e75a8d0 951 default: {
dflet 0:400d8e75a8d0 952 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 953 sprintf((char*) print_buf, "[WLAN EVENT] Unexpected event [0x%x]\n\r",pWlanEvent->Event);
dflet 0:400d8e75a8d0 954 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 955 }
dflet 0:400d8e75a8d0 956 break;
dflet 0:400d8e75a8d0 957 }
dflet 0:400d8e75a8d0 958 }
dflet 0:400d8e75a8d0 959 #endif
dflet 0:400d8e75a8d0 960
dflet 0:400d8e75a8d0 961 /*!
dflet 0:400d8e75a8d0 962 \brief This function handles events for IP address acquisition via DHCP
dflet 0:400d8e75a8d0 963 indication
dflet 0:400d8e75a8d0 964
dflet 0:400d8e75a8d0 965 \param[in] pNetAppEvent is the event passed to the handler
dflet 0:400d8e75a8d0 966
dflet 0:400d8e75a8d0 967 \return None
dflet 0:400d8e75a8d0 968
dflet 0:400d8e75a8d0 969 \note
dflet 0:400d8e75a8d0 970
dflet 0:400d8e75a8d0 971 \warning
dflet 0:400d8e75a8d0 972 */
dflet 0:400d8e75a8d0 973 #if (defined(sl_NetAppEvtHdlr))
dflet 0:400d8e75a8d0 974 void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent)
dflet 0:400d8e75a8d0 975 {
dflet 0:400d8e75a8d0 976
dflet 0:400d8e75a8d0 977 if(pNetAppEvent == NULL){
dflet 0:400d8e75a8d0 978 Uart_Write((uint8_t *)" [NETAPP EVENT] NULL Pointer Error \n\r");
dflet 0:400d8e75a8d0 979 }
dflet 0:400d8e75a8d0 980
dflet 0:400d8e75a8d0 981 switch(pNetAppEvent->Event) {
dflet 0:400d8e75a8d0 982 case SL_NETAPP_IPV4_IPACQUIRED_EVENT: {
dflet 0:400d8e75a8d0 983 SlIpV4AcquiredAsync_t *pEventData = NULL;
dflet 0:400d8e75a8d0 984 _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
dflet 0:400d8e75a8d0 985 pEventData = &pNetAppEvent->EventData.ipAcquiredV4;
dflet 0:400d8e75a8d0 986 g_GatewayIP = pEventData->gateway;
dflet 0:400d8e75a8d0 987
dflet 0:400d8e75a8d0 988 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 989 sprintf((char*) print_buf, "[NETAPP EVENT] IP Acquired: IP=%d.%d.%d.%d , ""Gateway=%d.%d.%d.%d\n\r",
dflet 0:400d8e75a8d0 990 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,3),
dflet 0:400d8e75a8d0 991 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,2),
dflet 0:400d8e75a8d0 992 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,1),
dflet 0:400d8e75a8d0 993 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,0),
dflet 0:400d8e75a8d0 994 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,3),
dflet 0:400d8e75a8d0 995 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,2),
dflet 0:400d8e75a8d0 996 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,1),
dflet 0:400d8e75a8d0 997 _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,0));
dflet 0:400d8e75a8d0 998 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 999 }
dflet 0:400d8e75a8d0 1000 break;
dflet 0:400d8e75a8d0 1001
dflet 0:400d8e75a8d0 1002 case SL_NETAPP_IP_LEASED_EVENT: {
dflet 0:400d8e75a8d0 1003 g_StationIP = pNetAppEvent->EventData.ipLeased.ip_address;
dflet 0:400d8e75a8d0 1004 _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED);
dflet 0:400d8e75a8d0 1005
dflet 0:400d8e75a8d0 1006 }
dflet 0:400d8e75a8d0 1007 break;
dflet 0:400d8e75a8d0 1008
dflet 0:400d8e75a8d0 1009 default: {
dflet 0:400d8e75a8d0 1010 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 1011 sprintf((char*) print_buf, "[NETAPP EVENT] Unexpected event [0x%x] \n\r",pNetAppEvent->Event);
dflet 0:400d8e75a8d0 1012 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 1013 }
dflet 0:400d8e75a8d0 1014 break;
dflet 0:400d8e75a8d0 1015 }
dflet 0:400d8e75a8d0 1016 }
dflet 0:400d8e75a8d0 1017 #endif
dflet 0:400d8e75a8d0 1018
dflet 0:400d8e75a8d0 1019 /*!
dflet 0:400d8e75a8d0 1020 \brief This function handles socket events indication
dflet 0:400d8e75a8d0 1021
dflet 0:400d8e75a8d0 1022 \param[in] pSock is the event passed to the handler
dflet 0:400d8e75a8d0 1023
dflet 0:400d8e75a8d0 1024 \return None
dflet 0:400d8e75a8d0 1025 */
dflet 0:400d8e75a8d0 1026 #if (defined(sl_SockEvtHdlr))
dflet 0:400d8e75a8d0 1027 void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
dflet 0:400d8e75a8d0 1028 {
dflet 0:400d8e75a8d0 1029 if(pSock == NULL)
dflet 0:400d8e75a8d0 1030 Uart_Write((uint8_t *)" [SOCK EVENT] NULL Pointer Error \n\r");
dflet 0:400d8e75a8d0 1031
dflet 0:400d8e75a8d0 1032 switch( pSock->Event )
dflet 0:400d8e75a8d0 1033 {
dflet 0:400d8e75a8d0 1034 case SL_SOCKET_TX_FAILED_EVENT:
dflet 0:400d8e75a8d0 1035 /*
dflet 0:400d8e75a8d0 1036 * TX Failed
dflet 0:400d8e75a8d0 1037 *
dflet 0:400d8e75a8d0 1038 * Information about the socket descriptor and status will be
dflet 0:400d8e75a8d0 1039 * available in 'SlSockEventData_t' - Applications can use it if
dflet 0:400d8e75a8d0 1040 * required
dflet 0:400d8e75a8d0 1041 *
dflet 0:400d8e75a8d0 1042 * SlSockEventData_t *pEventData = NULL;
dflet 0:400d8e75a8d0 1043 * pEventData = & pSock->EventData;
dflet 0:400d8e75a8d0 1044 */
dflet 0:400d8e75a8d0 1045
dflet 0:400d8e75a8d0 1046 switch( pSock->socketAsyncEvent.SockTxFailData.status )
dflet 0:400d8e75a8d0 1047 {
dflet 0:400d8e75a8d0 1048 case SL_ECLOSE:
dflet 0:400d8e75a8d0 1049 Uart_Write((uint8_t *)" [SOCK EVENT] Close socket operation, failed to transmit all queued packets\n\r");
dflet 0:400d8e75a8d0 1050 break;
dflet 0:400d8e75a8d0 1051 default:
dflet 0:400d8e75a8d0 1052 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 1053 sprintf((char*) print_buf, "[SOCK ERROR] - TX FAILED : socket %d , reason""(%d) \n\n", pSock->socketAsyncEvent.SockTxFailData.sd, pSock->socketAsyncEvent.SockTxFailData.status);
dflet 0:400d8e75a8d0 1054 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 1055
dflet 0:400d8e75a8d0 1056 break;
dflet 0:400d8e75a8d0 1057 }
dflet 0:400d8e75a8d0 1058 break;
dflet 0:400d8e75a8d0 1059
dflet 0:400d8e75a8d0 1060 default:
dflet 0:400d8e75a8d0 1061 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 1062 sprintf((char*) print_buf, "[SOCK EVENT] - Unexpected Event [%x0x]\n\n",pSock->Event);
dflet 0:400d8e75a8d0 1063 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 1064 break;
dflet 0:400d8e75a8d0 1065 }
dflet 0:400d8e75a8d0 1066 }
dflet 0:400d8e75a8d0 1067 #endif
dflet 0:400d8e75a8d0 1068
dflet 0:400d8e75a8d0 1069 /*!
dflet 0:400d8e75a8d0 1070 \brief This function handles callback for the HTTP server events
dflet 0:400d8e75a8d0 1071
dflet 0:400d8e75a8d0 1072 \param[in] pHttpEvent - Contains the relevant event information
dflet 0:400d8e75a8d0 1073 \param[in] pHttpResponse - Should be filled by the user with the
dflet 0:400d8e75a8d0 1074 relevant response information
dflet 0:400d8e75a8d0 1075
dflet 0:400d8e75a8d0 1076 \return None
dflet 0:400d8e75a8d0 1077
dflet 0:400d8e75a8d0 1078 \note
dflet 0:400d8e75a8d0 1079
dflet 0:400d8e75a8d0 1080 \warning
dflet 0:400d8e75a8d0 1081 */
dflet 0:400d8e75a8d0 1082 #if (defined(sl_HttpServerCallback))
dflet 0:400d8e75a8d0 1083 void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pSlHttpServerEvent, SlHttpServerResponse_t *pSlHttpServerResponse)
dflet 0:400d8e75a8d0 1084 {
dflet 0:400d8e75a8d0 1085 unsigned char strLenVal = 0;
dflet 0:400d8e75a8d0 1086
dflet 0:400d8e75a8d0 1087 if(!pSlHttpServerEvent || !pSlHttpServerResponse)
dflet 0:400d8e75a8d0 1088 {
dflet 0:400d8e75a8d0 1089 return;
dflet 0:400d8e75a8d0 1090 }
dflet 0:400d8e75a8d0 1091
dflet 0:400d8e75a8d0 1092 switch (pSlHttpServerEvent->Event)
dflet 0:400d8e75a8d0 1093 {
dflet 0:400d8e75a8d0 1094 case SL_NETAPP_HTTPGETTOKENVALUE_EVENT:
dflet 0:400d8e75a8d0 1095 {
dflet 0:400d8e75a8d0 1096 unsigned char status, *ptr;
dflet 0:400d8e75a8d0 1097
dflet 0:400d8e75a8d0 1098 ptr = pSlHttpServerResponse->ResponseData.token_value.data;
dflet 0:400d8e75a8d0 1099 pSlHttpServerResponse->ResponseData.token_value.len = 0;
dflet 0:400d8e75a8d0 1100 if(memcmp(pSlHttpServerEvent->EventData.httpTokenName.data, GET_token,
dflet 0:400d8e75a8d0 1101 strlen((const char *)GET_token)) == 0)
dflet 0:400d8e75a8d0 1102 {
dflet 0:400d8e75a8d0 1103 status = GPIO_IF_LedStatus(MCU_RED_LED_GPIO);
dflet 0:400d8e75a8d0 1104 strLenVal = strlen(LED1_STRING);
dflet 0:400d8e75a8d0 1105 memcpy(ptr, LED1_STRING, strLenVal);
dflet 0:400d8e75a8d0 1106 ptr += strLenVal;
dflet 0:400d8e75a8d0 1107 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1108 if(status & 0x01)
dflet 0:400d8e75a8d0 1109 {
dflet 0:400d8e75a8d0 1110 strLenVal = strlen(LED_ON_STRING);
dflet 0:400d8e75a8d0 1111 memcpy(ptr, LED_ON_STRING, strLenVal);
dflet 0:400d8e75a8d0 1112 ptr += strLenVal;
dflet 0:400d8e75a8d0 1113 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1114 }
dflet 0:400d8e75a8d0 1115 else
dflet 0:400d8e75a8d0 1116 {
dflet 0:400d8e75a8d0 1117 strLenVal = strlen(LED_OFF_STRING);
dflet 0:400d8e75a8d0 1118 memcpy(ptr, LED_OFF_STRING, strLenVal);
dflet 0:400d8e75a8d0 1119 ptr += strLenVal;
dflet 0:400d8e75a8d0 1120 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1121 }
dflet 0:400d8e75a8d0 1122 status = GPIO_IF_LedStatus(MCU_GREEN_LED_GPIO);
dflet 0:400d8e75a8d0 1123 strLenVal = strlen(LED2_STRING);
dflet 0:400d8e75a8d0 1124 memcpy(ptr, LED2_STRING, strLenVal);
dflet 0:400d8e75a8d0 1125 ptr += strLenVal;
dflet 0:400d8e75a8d0 1126 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1127 if(status & 0x01)
dflet 0:400d8e75a8d0 1128 {
dflet 0:400d8e75a8d0 1129 strLenVal = strlen(LED_ON_STRING);
dflet 0:400d8e75a8d0 1130 memcpy(ptr, LED_ON_STRING, strLenVal);
dflet 0:400d8e75a8d0 1131 ptr += strLenVal;
dflet 0:400d8e75a8d0 1132 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1133 }
dflet 0:400d8e75a8d0 1134 else
dflet 0:400d8e75a8d0 1135 {
dflet 0:400d8e75a8d0 1136 strLenVal = strlen(LED_OFF_STRING);
dflet 0:400d8e75a8d0 1137 memcpy(ptr, LED_OFF_STRING, strLenVal);
dflet 0:400d8e75a8d0 1138 ptr += strLenVal;
dflet 0:400d8e75a8d0 1139 pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
dflet 0:400d8e75a8d0 1140 }
dflet 0:400d8e75a8d0 1141 *ptr = '\0';
dflet 0:400d8e75a8d0 1142 }
dflet 0:400d8e75a8d0 1143
dflet 0:400d8e75a8d0 1144 }
dflet 0:400d8e75a8d0 1145 break;
dflet 0:400d8e75a8d0 1146
dflet 0:400d8e75a8d0 1147 case SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT:
dflet 0:400d8e75a8d0 1148 {
dflet 0:400d8e75a8d0 1149 unsigned char led;
dflet 0:400d8e75a8d0 1150 unsigned char *ptr = pSlHttpServerEvent->EventData.httpPostData.token_name.data;
dflet 0:400d8e75a8d0 1151
dflet 0:400d8e75a8d0 1152 if(memcmp(ptr, POST_token, strlen((const char *)POST_token)) == 0)
dflet 0:400d8e75a8d0 1153 {
dflet 0:400d8e75a8d0 1154 ptr = pSlHttpServerEvent->EventData.httpPostData.token_value.data;
dflet 0:400d8e75a8d0 1155 strLenVal = strlen(LED_STRING);
dflet 0:400d8e75a8d0 1156 if(memcmp(ptr, LED_STRING, strLenVal) != 0)
dflet 0:400d8e75a8d0 1157 break;
dflet 0:400d8e75a8d0 1158 ptr += strLenVal;
dflet 0:400d8e75a8d0 1159 led = *ptr;
dflet 0:400d8e75a8d0 1160 strLenVal = strlen(LED_ON_STRING);
dflet 0:400d8e75a8d0 1161 ptr += strLenVal;
dflet 0:400d8e75a8d0 1162 if(led == '1')
dflet 0:400d8e75a8d0 1163 {
dflet 0:400d8e75a8d0 1164 if(memcmp(ptr, LED_ON_STRING, strLenVal) == 0)
dflet 0:400d8e75a8d0 1165 {
dflet 0:400d8e75a8d0 1166 GPIO_IF_LedOn(MCU_RED_LED_GPIO);
dflet 0:400d8e75a8d0 1167 }
dflet 0:400d8e75a8d0 1168 else
dflet 0:400d8e75a8d0 1169 {
dflet 0:400d8e75a8d0 1170 GPIO_IF_LedOff(MCU_RED_LED_GPIO);
dflet 0:400d8e75a8d0 1171 }
dflet 0:400d8e75a8d0 1172 }
dflet 0:400d8e75a8d0 1173 else if(led == '2')
dflet 0:400d8e75a8d0 1174 {
dflet 0:400d8e75a8d0 1175 if(memcmp(ptr, LED_ON_STRING, strLenVal) == 0)
dflet 0:400d8e75a8d0 1176 {
dflet 0:400d8e75a8d0 1177 GPIO_IF_LedOn(MCU_GREEN_LED_GPIO);
dflet 0:400d8e75a8d0 1178 }
dflet 0:400d8e75a8d0 1179 else
dflet 0:400d8e75a8d0 1180 {
dflet 0:400d8e75a8d0 1181 GPIO_IF_LedOff(MCU_GREEN_LED_GPIO);
dflet 0:400d8e75a8d0 1182 }
dflet 0:400d8e75a8d0 1183 }
dflet 0:400d8e75a8d0 1184
dflet 0:400d8e75a8d0 1185 }
dflet 0:400d8e75a8d0 1186 }
dflet 0:400d8e75a8d0 1187 break;
dflet 0:400d8e75a8d0 1188 default:
dflet 0:400d8e75a8d0 1189 break;
dflet 0:400d8e75a8d0 1190 }
dflet 0:400d8e75a8d0 1191 }
dflet 0:400d8e75a8d0 1192 #endif
dflet 0:400d8e75a8d0 1193 /*!
dflet 0:400d8e75a8d0 1194 \brief This function handles general error events indication
dflet 0:400d8e75a8d0 1195
dflet 0:400d8e75a8d0 1196 \param[in] pDevEvent is the event passed to the handler
dflet 0:400d8e75a8d0 1197
dflet 0:400d8e75a8d0 1198 \return None
dflet 0:400d8e75a8d0 1199 */
dflet 0:400d8e75a8d0 1200 #if (defined(sl_GeneralEvtHdlr))
dflet 0:400d8e75a8d0 1201 void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent)
dflet 0:400d8e75a8d0 1202 {
dflet 0:400d8e75a8d0 1203 /*
dflet 0:400d8e75a8d0 1204 * Most of the general errors are not FATAL are are to be handled
dflet 0:400d8e75a8d0 1205 * appropriately by the application
dflet 0:400d8e75a8d0 1206 */
dflet 0:400d8e75a8d0 1207 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:400d8e75a8d0 1208 sprintf((char*) print_buf, "[GENERAL EVENT] - ID=[%d] Sender=[%d]\n\n", pDevEvent->EventData.deviceEvent.status, pDevEvent->EventData.deviceEvent.sender);
dflet 0:400d8e75a8d0 1209 Uart_Write((uint8_t *) print_buf);
dflet 0:400d8e75a8d0 1210 }
dflet 0:400d8e75a8d0 1211 #endif
dflet 0:400d8e75a8d0 1212
dflet 0:400d8e75a8d0 1213 #ifdef __cplusplus
dflet 0:400d8e75a8d0 1214 }
dflet 0:400d8e75a8d0 1215 #endif /* __cplusplus */
dflet 0:400d8e75a8d0 1216
dflet 0:400d8e75a8d0 1217 //}//namespace