21
21
#include " wland_types.h"
22
22
#include " rda_sys_wrapper.h"
23
23
24
+ typedef enum {
25
+ WIFI_CONNECTED,
26
+ WIFI_DISCONNECTED,
27
+ }WIFI_STATE;
28
+
29
+ static WIFI_STATE wifi_state = WIFI_DISCONNECTED;
30
+
31
+ void daemon (void *para)
32
+ {
33
+ void *main_msgQ = NULL ;
34
+ rda_msg msg;
35
+ int ret;
36
+ RDAWiFiInterface *wifi = (RDAWiFiInterface *)para;
37
+ main_msgQ = rda_mail_create (10 , sizeof (unsigned int )*4 );
38
+ wifi->set_msg_queue (main_msgQ);
39
+ while (1 ){
40
+ rda_mail_get (main_msgQ, (void *)&msg, osWaitForever);
41
+ switch (msg.type )
42
+ {
43
+ case MAIN_RECONNECT:
44
+ printf (" wifi disconnect!\r\n " );
45
+ ret = wifi->disconnect ();
46
+ if (ret != 0 ){
47
+ printf (" disconnect failed!\r\n " );
48
+ break ;
49
+ }
50
+ ret = wifi->reconnect ();
51
+ while (ret != 0 ){
52
+ osDelay (5 *1000 );
53
+ ret = wifi->reconnect ();
54
+ };
55
+ break ;
56
+ default :
57
+ printf (" unknown msg\r\n " );
58
+ break ;
59
+ }
60
+ }
61
+ }
62
+
24
63
nsapi_error_t RDAWiFiInterface::set_channel (uint8_t channel)
25
64
{
26
65
int ret= 0 ;
@@ -52,14 +91,15 @@ nsapi_error_t RDAWiFiInterface::init()
52
91
{
53
92
if (!_interface) {
54
93
if (!_emac.power_up ()) {
55
- LWIP_DEBUGF (NETIF_DEBUG," power up failed!\n " );
94
+ LWIP_DEBUGF (NETIF_DEBUG,( " power up failed!\n " ) );
56
95
}
57
96
nsapi_error_t err = _stack.add_ethernet_interface (_emac, true , &_interface);
58
97
if (err != NSAPI_ERROR_OK) {
59
98
_interface = NULL ;
60
99
return err;
61
100
}
62
101
_interface->attach (_connection_status_cb);
102
+ // rda_thread_new("daemon", daemon, this, DEFAULT_THREAD_STACKSIZE*4, osPriorityNormal);
63
103
}
64
104
return NSAPI_ERROR_OK;
65
105
}
@@ -93,12 +133,22 @@ nsapi_error_t RDAWiFiInterface::connect(const char *ssid, const char *pass,
93
133
rda5981_scan_result bss;
94
134
int ret = 0 ;
95
135
136
+ if (wifi_state == WIFI_CONNECTED) {
137
+ return NSAPI_ERROR_IS_CONNECTED;
138
+ }
139
+
96
140
if (ssid == NULL || ssid[0 ] == 0 ) {
97
141
return NSAPI_ERROR_PARAMETER;
98
142
}
99
-
143
+
144
+ set_credentials (ssid, pass, security);
145
+ set_channel (channel);
146
+
100
147
init ();
101
148
149
+ // reset all scan result to avoid any previous stored SSID/PW/CHANNEL
150
+ rda5981_del_scan_all_result ();
151
+ rda5981_scan (NULL ,0 ,0 );
102
152
if (rda5981_check_scan_result_name (ssid) != 0 ) {
103
153
for (i = 0 ; i< 5 ; i++) {
104
154
rda5981_scan (NULL , 0 , 0 );
@@ -112,13 +162,13 @@ nsapi_error_t RDAWiFiInterface::connect(const char *ssid, const char *pass,
112
162
}
113
163
114
164
if (find == false ) {
115
- LWIP_DEBUGF (NETIF_DEBUG," can not find the ap.\r\n " );
116
- return NSAPI_ERROR_CONNECTION_TIMEOUT ;
165
+ LWIP_DEBUGF (NETIF_DEBUG,( " can not find the ap.\r\n " ) );
166
+ return NSAPI_ERROR_NO_SSID ;
117
167
}
118
168
bss.channel = 15 ;
119
169
rda5981_get_scan_result_name (&bss, ssid);
120
170
if ((channel !=0 ) && (bss.channel != channel)) {
121
- LWIP_DEBUGF (NETIF_DEBUG, " invalid channel\r\n " );
171
+ LWIP_DEBUGF (NETIF_DEBUG, ( " invalid channel\r\n " ) );
122
172
return NSAPI_ERROR_CONNECTION_TIMEOUT;
123
173
}
124
174
@@ -135,13 +185,23 @@ nsapi_error_t RDAWiFiInterface::connect(const char *ssid, const char *pass,
135
185
if (ret) {
136
186
return NSAPI_ERROR_CONNECTION_TIMEOUT;
137
187
}
188
+
189
+ wifi_state = WIFI_CONNECTED;
138
190
139
191
ret = _interface->bringup (_dhcp,
140
192
_ip_address[0 ] ? _ip_address : 0 ,
141
193
_netmask[0 ] ? _netmask : 0 ,
142
194
_gateway[0 ] ? _gateway : 0 ,
143
195
DEFAULT_STACK,
144
196
_blocking);
197
+ LWIP_DEBUGF (NETIF_DEBUG,(" Interface bringup up status:%d\r\n " ,ret));
198
+
199
+ if ( ret == NSAPI_ERROR_OK || ret == NSAPI_ERROR_IS_CONNECTED ) {
200
+ ret = NSAPI_ERROR_OK;
201
+ }
202
+ else if ( ret == NSAPI_ERROR_DHCP_FAILURE) {
203
+ disconnect ();
204
+ }
145
205
146
206
return ret;
147
207
}
@@ -156,9 +216,10 @@ nsapi_error_t RDAWiFiInterface::disconnect()
156
216
{
157
217
rda_msg msg;
158
218
159
- if (sta_state < 2 ) {
219
+ if (wifi_state == WIFI_DISCONNECTED ) {
160
220
return NSAPI_ERROR_NO_CONNECTION;
161
221
}
222
+ wifi_state = WIFI_DISCONNECTED;
162
223
void * wifi_disconnect_sem = rda_sem_create (0 );
163
224
msg.type = WLAND_DISCONNECT;
164
225
msg.arg1 = (unsigned int )wifi_disconnect_sem;
@@ -172,6 +233,81 @@ nsapi_error_t RDAWiFiInterface::disconnect()
172
233
return NSAPI_ERROR_NO_CONNECTION;
173
234
}
174
235
236
+ nsapi_error_t RDAWiFiInterface::reconnect ()
237
+ {
238
+ rda_msg msg;
239
+ bool find = false ;
240
+ int i = 0 ;
241
+ rda5981_scan_result bss;
242
+ int ret = 0 ;
243
+
244
+ if (_ssid == NULL || _ssid[0 ] == 0 ) {
245
+ return NSAPI_ERROR_PARAMETER;
246
+ }
247
+
248
+ rda5981_del_scan_all_result ();
249
+ if (rda5981_check_scan_result_name (_ssid) != 0 ) {
250
+ for (i = 0 ; i< 5 ; i++) {
251
+ rda5981_scan (NULL , 0 , 0 );
252
+ if (rda5981_check_scan_result_name (_ssid) == 0 ) {
253
+ find = true ;
254
+ break ;
255
+ }
256
+ }
257
+ } else {
258
+ find = true ;
259
+ }
260
+
261
+ if (find == false ) {
262
+ LWIP_DEBUGF (NETIF_DEBUG," can not find the ap.\r\n " );
263
+ return NSAPI_ERROR_CONNECTION_TIMEOUT;
264
+ }
265
+ bss.channel = 15 ;
266
+ rda5981_get_scan_result_name (&bss, _ssid);
267
+ if ((_channel !=0 ) && (bss.channel != _channel)) {
268
+ LWIP_DEBUGF (NETIF_DEBUG, " invalid channel\r\n " );
269
+ return NSAPI_ERROR_CONNECTION_TIMEOUT;
270
+ }
271
+
272
+ memcpy (gssid, _ssid, strlen (_ssid));
273
+ if (_pass[0 ] != 0 ) {
274
+ memcpy (gpass, _pass, strlen (_pass));
275
+ }
276
+ memset (gbssid, 0 , NSAPI_MAC_BYTES);
277
+ gssid[strlen (_ssid)] = gpass[strlen (_pass)] = ' \0 ' ;
278
+
279
+ msg.type = WLAND_CONNECT;
280
+ rda_mail_put (wland_msgQ, (void *)&msg, osWaitForever);
281
+ ret = rda_sem_wait (wifi_auth_sem, 10000 );
282
+ if (ret) {
283
+ return NSAPI_ERROR_CONNECTION_TIMEOUT;
284
+ }
285
+
286
+ if (_dhcp) {
287
+ memset (_ip_address, 0 , sizeof (_ip_address));
288
+ memset (_netmask, 0 , sizeof (_netmask));
289
+ memset (_gateway, 0 , sizeof (_gateway));
290
+ }
291
+
292
+ ret = _interface->bringup (_dhcp,
293
+ _ip_address[0 ] ? _ip_address : 0 ,
294
+ _netmask[0 ] ? _netmask : 0 ,
295
+ _gateway[0 ] ? _gateway : 0 ,
296
+ DEFAULT_STACK,
297
+ _blocking);
298
+ LWIP_DEBUGF (NETIF_DEBUG,(" Interface bringup up status:%d\r\n " ,ret));
299
+
300
+ if ( ret == NSAPI_ERROR_OK || ret == NSAPI_ERROR_IS_CONNECTED ) {
301
+ ret = NSAPI_ERROR_OK;
302
+ wifi_state = WIFI_CONNECTED;
303
+ }
304
+ else if ( ret == NSAPI_ERROR_DHCP_FAILURE) {
305
+ disconnect ();
306
+ }
307
+ return ret;
308
+ }
309
+
310
+
175
311
nsapi_size_or_error_t RDAWiFiInterface::scan (WiFiAccessPoint *res, nsapi_size_t count)
176
312
{
177
313
int bss_num = 0 , i;
@@ -219,3 +355,10 @@ WiFiInterface *WiFiInterface::get_default_instance() {
219
355
static RDAWiFiInterface wifinet;
220
356
return &wifinet;
221
357
}
358
+
359
+ nsapi_size_or_error_t RDAWiFiInterface::set_msg_queue (void *queue)
360
+ {
361
+ // TO_DO: No need for 1st stage since application already control the logic.
362
+ // rda5981_set_main_queue(queue);
363
+ return 0 ;
364
+ }
0 commit comments