Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Jun 24 09:54:16 2015 +0000
Revision:
0:50cedd586816
Child:
15:5433f9d94cd7
First commit work in progress

Who changed what in which revision?

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