SimpleLink CC31xx/CC32xx Host Driver  Version 3.0.1.71
Simplifies the implementation of Internet connectivity
eventreg.c
1 /*
2  * eventreg.c - CC31xx/CC32xx Host Driver Implementation
3  *
4  * Copyright (C) 2017 Texas Instruments Incorporated - https://www.ti.com/
5  *
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the
17  * distribution.
18  *
19  * Neither the name of Texas Instruments Incorporated nor the names of
20  * its contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35 */
36 
37 /*****************************************************************************/
38 /* Include files */
39 /*****************************************************************************/
40 #include <ti/drivers/net/wifi/simplelink.h>
41 #include <ti/drivers/net/wifi/eventreg.h>
42 
43 
44 typedef void (*_pSlDeviceFatalErrorEvtHdlr_t)(SlDeviceFatal_t *pSlFatalErrorEvent);
45 typedef void (*_pSlDeviceGeneralEvtHdlr_t)(SlDeviceEvent_t *pSlDeviceEvent);
46 typedef void (*_pSlWlanEvtHdlr)(SlWlanEvent_t* pSlWlanEvent);
47 typedef void (*_pSlNetAppEvtHdlr)(SlNetAppEvent_t* pSlNetAppEvent);
48 typedef void (*_pSlSockEvtHdlr)(SlSockEvent_t* pSlSockEvent);
49 typedef void (*_pSlNetAppHttpServerHdlr)(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse);
50 typedef void (*_pSlNetAppRequestHdlr)(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse);
51 typedef void (*_pSlNetAppRequestMemFree)(_u8 *buffer);
52 typedef void (*_pSlSocketTriggerEventHandler)(SlSockTriggerEvent_t* pSlSockTriggerEvent);
53 
54 
55 typedef _i32 (*_pSlPropogationDeviceFatalErrorEvtHdlr_t)(SlDeviceFatal_t *pSlFatalErrorEvent);
56 typedef _i32 (*_pSlPropogationDeviceGeneralEvtHdlr_t)(SlDeviceEvent_t *pSlDeviceEvent);
57 typedef _i32 (*_pSlPropogationWlanEvtHdlr)(SlWlanEvent_t* pSlWlanEvent);
58 typedef _i32 (*_pSlPropogationNetAppEvtHdlr)(SlNetAppEvent_t* pSlNetAppEvent);
59 typedef _i32 (*_pSlPropogationSockEvtHdlr)(SlSockEvent_t* pSlSockEvent);
60 typedef _i32 (*_pSlPropogationNetAppHttpServerHdlr)(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse);
61 typedef _i32 (*_pSlPropogationNetAppRequestHdlr)(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse);
62 typedef _i32 (*_pSlPropogationNetAppRequestMemFree)(_u8 *buffer);
63 typedef _i32 (*_pSlPropogationSocketTriggerEventHandler)(SlSockTriggerEvent_t* pSlSockTriggerEvent);
64 
65 #ifdef SL_RUNTIME_EVENT_REGISTERATION
66 
67 void* g_UserEvents[SL_NUM_OF_EVENT_TYPES] = {0};
68 SlEventsListNode_t* g_LibsEvents[SL_NUM_OF_EVENT_TYPES] = {0};
69 
70 #endif
71 
72 
73 _i32 _SlIsEventRegistered(SlEventHandler_e EventHandlerType)
74 {
75 #ifdef SL_RUNTIME_EVENT_REGISTERATION
76  if( (NULL != g_LibsEvents[EventHandlerType]) || (NULL != g_UserEvents[EventHandlerType]) )
77  {
78  return 1;
79  }
80 #endif
81  if(SL_EVENT_HDL_MEM_FREE == EventHandlerType)
82  {
83 #ifdef slcb_NetAppRequestMemFree
84  return 1;
85 #endif
86  }
87  if(SL_EVENT_HDL_SOCKET_TRIGGER == EventHandlerType)
88  {
89 #ifdef slcb_SocketTriggerEventHandler
90  return 1;
91 #endif
92  }
93 
94  return 0;
95 }
96 
97 #ifdef SL_RUNTIME_EVENT_REGISTERATION
98 
99 _i32 sl_RegisterEventHandler(SlEventHandler_e EventHandlerType , void* EventHandler)
100 {
101  g_UserEvents[EventHandlerType] = EventHandler;
102  return 0;
103 }
104 
105 _i32 sl_RegisterLibsEventHandler(SlEventHandler_e EventHandlerType , SlEventsListNode_t* EventHandlerNode)
106 {
107  EventHandlerNode->next = NULL;
108 
109  if(g_LibsEvents[EventHandlerType] == NULL)
110  {
111  g_LibsEvents[EventHandlerType] = EventHandlerNode;
112  }
113  else
114  {
115  SlEventsListNode_t* currentNode = g_LibsEvents[EventHandlerType];
116  while(currentNode->next != NULL)
117  {
118  currentNode = currentNode->next;
119  }
120 
121  currentNode->next = EventHandlerNode;
122  }
123  return 0;
124 }
125 
126 _i32 sl_UnregisterLibsEventHandler(SlEventHandler_e EventHandlerType , SlEventsListNode_t* EventHandlerNode)
127 {
128  SlEventsListNode_t* currentNode = g_LibsEvents[EventHandlerType];
129  SlEventsListNode_t* lastNode = g_LibsEvents[EventHandlerType];
130  int count = 0;
131  while(currentNode != NULL)
132  {
133  if(EventHandlerNode == currentNode)
134  {
135  if(count == 0)
136  {
137  g_LibsEvents[EventHandlerType] = g_LibsEvents[EventHandlerType]->next;
138  }
139  else
140  {
141  lastNode->next = currentNode->next;
142  }
143  return 0;
144  }
145 
146  if(count != 0)
147  {
148  lastNode = lastNode->next;
149  }
150  count++;
151  currentNode = currentNode->next;
152  }
153 
154  return SL_RET_CODE_EVENT_LINK_NOT_FOUND;
155 }
156 
157 
158 /* Event handlers section */
159 void _SlDeviceFatalErrorEvtHdlr(SlDeviceFatal_t *pSlFatalErrorEvent)
160 {
161  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_FATAL_ERROR];
162  while(currentNode != NULL)
163  {
164  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationDeviceFatalErrorEvtHdlr_t)(currentNode->event))(pSlFatalErrorEvent))
165  {
166  return;
167  }
168  currentNode = currentNode->next;
169  }
170 
171  if (NULL != g_UserEvents[SL_EVENT_HDL_FATAL_ERROR])
172  {
173  ((_pSlDeviceFatalErrorEvtHdlr_t)g_UserEvents[SL_EVENT_HDL_FATAL_ERROR])(pSlFatalErrorEvent);
174  }
175 
176 #ifdef slcb_DeviceFatalErrorEvtHdlr
177  else
178  {
179  slcb_DeviceFatalErrorEvtHdlr(pSlFatalErrorEvent);
180  }
181 #endif
182 }
183 
184 
185 void _SlDeviceGeneralEvtHdlr(SlDeviceEvent_t *pSlDeviceEvent)
186 {
187  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_DEVICE_GENERAL];
188  while(currentNode != NULL)
189  {
190  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationDeviceGeneralEvtHdlr_t)(currentNode->event))(pSlDeviceEvent))
191  {
192  return;
193  }
194  currentNode = currentNode->next;
195  }
196 
197  if (NULL != g_UserEvents[SL_EVENT_HDL_DEVICE_GENERAL])
198  {
199  ((_pSlDeviceGeneralEvtHdlr_t)g_UserEvents[SL_EVENT_HDL_DEVICE_GENERAL])(pSlDeviceEvent);
200  }
201 #ifdef slcb_DeviceGeneralEvtHdlr
202  else
203  {
204  slcb_DeviceGeneralEvtHdlr(pSlDeviceEvent);
205  }
206 #endif
207 }
208 
209 
210 void _SlWlanEvtHdlr(SlWlanEvent_t* pSlWlanEvent)
211 {
212  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_WLAN];
213  while(currentNode != NULL)
214  {
215  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationWlanEvtHdlr)(currentNode->event))(pSlWlanEvent))
216  {
217  return;
218  }
219  currentNode = currentNode->next;
220  }
221 
222  if (NULL != g_UserEvents[SL_EVENT_HDL_WLAN])
223  {
224  ((_pSlWlanEvtHdlr)g_UserEvents[SL_EVENT_HDL_WLAN])(pSlWlanEvent);
225  }
226 #ifdef slcb_WlanEvtHdlr
227  else
228  {
229  slcb_WlanEvtHdlr(pSlWlanEvent);
230  }
231 #endif
232 }
233 
234 
235 void _SlNetAppEvtHdlr(SlNetAppEvent_t* pSlNetAppEvent)
236 {
237  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_NETAPP];
238  while(currentNode != NULL)
239  {
240  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationNetAppEvtHdlr)(currentNode->event))(pSlNetAppEvent))
241  {
242  return;
243  }
244  currentNode = currentNode->next;
245  }
246  if (NULL != g_UserEvents[SL_EVENT_HDL_NETAPP])
247  {
248  ((_pSlNetAppEvtHdlr)g_UserEvents[SL_EVENT_HDL_NETAPP])(pSlNetAppEvent);
249  }
250 #ifdef slcb_NetAppEvtHdlr
251  else
252  {
253  slcb_NetAppEvtHdlr(pSlNetAppEvent);
254  }
255 #endif
256 }
257 
258 
259 void _SlSockEvtHdlr(SlSockEvent_t* pSlSockEvent)
260 {
261  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_SOCKET];
262  while(currentNode != NULL)
263  {
264  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationSockEvtHdlr)(currentNode->event))(pSlSockEvent))
265  {
266  return;
267  }
268  currentNode = currentNode->next;
269  }
270  if (NULL != g_UserEvents[SL_EVENT_HDL_SOCKET])
271  {
272  ((_pSlSockEvtHdlr)g_UserEvents[SL_EVENT_HDL_SOCKET])(pSlSockEvent);
273  }
274 
275 #ifdef slcb_SockEvtHdlr
276  else
277  {
278  slcb_SockEvtHdlr(pSlSockEvent);
279  }
280 #endif
281 }
282 
283 
284 void _SlNetAppHttpServerHdlr(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse)
285 {
286  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_HTTP_SERVER];
287  while(currentNode != NULL)
288  {
289  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationNetAppHttpServerHdlr)(currentNode->event))(pSlHttpServerEvent,pSlHttpServerResponse))
290  {
291  return;
292  }
293  currentNode = currentNode->next;
294  }
295  if (NULL != g_UserEvents[SL_EVENT_HDL_HTTP_SERVER])
296  {
297  ((_pSlNetAppHttpServerHdlr)g_UserEvents[SL_EVENT_HDL_HTTP_SERVER])(pSlHttpServerEvent,pSlHttpServerResponse);
298  }
299 #ifdef slcb_NetAppHttpServerHdlr
300  else
301  {
302  slcb_NetAppHttpServerHdlr(pSlHttpServerEvent,pSlHttpServerResponse);
303  }
304 #endif
305 }
306 
307 
308 
309 void _SlNetAppRequestHdlr(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse)
310 {
311  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_NETAPP_REQUEST];
312  while(currentNode != NULL)
313  {
314  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationNetAppRequestHdlr)(currentNode->event))(pNetAppRequest,pNetAppResponse))
315  {
316  return;
317  }
318  currentNode = currentNode->next;
319  }
320  if (NULL != g_UserEvents[SL_EVENT_HDL_NETAPP_REQUEST])
321  {
322  ((_pSlNetAppRequestHdlr)g_UserEvents[SL_EVENT_HDL_NETAPP_REQUEST])(pNetAppRequest,pNetAppResponse);
323  }
324 #ifdef slcb_NetAppRequestHdlr
325  else
326  {
327  slcb_NetAppRequestHdlr(pNetAppRequest,pNetAppResponse);
328  }
329 #endif
330 }
331 
332 
333 
334 void _SlNetAppRequestMemFree (_u8 *buffer)
335 {
336  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_MEM_FREE];
337  while(currentNode != NULL)
338  {
339  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationNetAppRequestMemFree)(currentNode->event))(buffer))
340  {
341  return;
342  }
343  currentNode = currentNode->next;
344  }
345  if (NULL != g_UserEvents[SL_EVENT_HDL_MEM_FREE])
346  {
347  ((_pSlNetAppRequestMemFree)g_UserEvents[SL_EVENT_HDL_MEM_FREE])(buffer);
348  }
349 #ifdef slcb_NetAppRequestMemFree
350  else
351  {
353  }
354 #endif
355 }
356 
357 
358 void _SlSocketTriggerEventHandler(SlSockTriggerEvent_t* pSlSockTriggerEvent)
359 {
360  SlEventsListNode_t* currentNode = g_LibsEvents[SL_EVENT_HDL_SOCKET_TRIGGER];
361  while(currentNode != NULL)
362  {
363  if(EVENT_PROPAGATION_BLOCK == ((_pSlPropogationSocketTriggerEventHandler)(currentNode->event))(pSlSockTriggerEvent))
364  {
365  return;
366  }
367  currentNode = currentNode->next;
368  }
369  if (NULL != g_UserEvents[SL_EVENT_HDL_SOCKET_TRIGGER])
370  {
371  ((_pSlSocketTriggerEventHandler)g_UserEvents[SL_EVENT_HDL_SOCKET_TRIGGER])(pSlSockTriggerEvent);
372  }
373 #ifdef slcb_SocketTriggerEventHandler
374  else
375  {
376  slcb_SocketTriggerEventHandler(pSlSockTriggerEvent);
377  }
378 #endif
379 }
380 
381 #endif /* SL_RUNTIME_EVENT_REGISTERATION */
void slcb_NetAppRequestMemFree(_u8 *buffer)
A handler for freeing the memory of the NetApp response.
void slcb_NetAppRequestHdlr(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse)
General netapp async event.
void slcb_SocketTriggerEventHandler(SlSockTriggerEvent_t *pSlSockTriggerEvent)
Socket trigger routine. This routine will notify the application that a netwrok activity has been com...
void slcb_DeviceFatalErrorEvtHdlr(SlDeviceFatal_t *pSlFatalErrorEvent)
Fatal Error event for inspecting fatal error.
void slcb_SockEvtHdlr(SlSockEvent_t *pSlSockEvent)
Socket Async event handler.
void slcb_WlanEvtHdlr(SlWlanEvent_t *pSlWlanEvent)
WLAN Async event handler.
void slcb_NetAppEvtHdlr(SlNetAppEvent_t *pSlNetAppEvent)
NETAPP Async event handler.
void slcb_NetAppHttpServerHdlr(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse)
HTTP server async event.
_i32 sl_RegisterEventHandler(SlEventHandler_e EventHandlerType, void *EventHandler)
register events in runtime
Definition: eventreg.c:99
void slcb_DeviceGeneralEvtHdlr(SlDeviceEvent_t *pSlDeviceEvent)
General async event for inspecting general events.