@@ -78,8 +78,9 @@ typedef struct _wlan_obj_t {
7878 mp_obj_base_t base ;
7979 SlWlanMode_t mode ;
8080 uint32_t status ;
81- uint8_t macAddr [SL_MAC_ADDR_LEN ];
82- uint8_t ssid_name [33 ];
81+ uint8_t security ;
82+ uint8_t mac [SL_MAC_ADDR_LEN ];
83+ uint8_t ssid [33 ];
8384 uint8_t bssid [6 ];
8485
8586 // IPVv4 data
@@ -186,7 +187,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
186187 slWlanConnectAsyncResponse_t * pEventData = & pWlanEvent -> EventData .STAandP2PModeWlanConnected ;
187188
188189 // Copy new connection SSID and BSSID to global parameters
189- memcpy (wlan_obj .ssid_name , pEventData -> ssid_name , pEventData -> ssid_len );
190+ memcpy (wlan_obj .ssid , pEventData -> ssid_name , pEventData -> ssid_len );
190191 memcpy (wlan_obj .bssid , pEventData -> bssid , SL_BSSID_LENGTH );
191192 }
192193 break ;
@@ -207,7 +208,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
207208 else {
208209
209210 }
210- memset (wlan_obj .ssid_name , 0 , sizeof (wlan_obj .ssid_name ));
211+ memset (wlan_obj .ssid , 0 , sizeof (wlan_obj .ssid ));
211212 memset (wlan_obj .bssid , 0 , sizeof (wlan_obj .bssid ));
212213 }
213214 break ;
@@ -253,7 +254,7 @@ void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent)
253254 // Ip Acquired Event Data
254255 pEventData = & pNetAppEvent -> EventData .ipAcquiredV4 ;
255256
256- // Get the IP addresses
257+ // Get ip, gateway and dns
257258 wlan_obj .gateway = ntohl (pEventData -> gateway );
258259 wlan_obj .ip = ntohl (pEventData -> ip );
259260 wlan_obj .dns = ntohl (pEventData -> dns );
@@ -348,7 +349,7 @@ void wlan_init0 (void) {
348349 // Set the mode to an invalid one
349350 wlan_obj .mode = -1 ;
350351 wlan_obj .base .type = NULL ;
351- memset (wlan_obj .macAddr , 0 , SL_MAC_ADDR_LEN );
352+ memset (wlan_obj .mac , 0 , SL_MAC_ADDR_LEN );
352353 ASSERT (OSI_OK == sl_LockObjCreate (& wlan_LockObj , "WlanLock" ));
353354 wlan_initialize_data ();
354355}
@@ -398,6 +399,7 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
398399
399400 // clear wlan data after checking any of the status flags
400401 wlan_initialize_data ();
402+ wlan_obj .security = sec ;
401403
402404 // Set connection policy to Auto + SmartConfig (Device's default connection policy)
403405 ASSERT_ON_ERROR (sl_WlanPolicySet (SL_POLICY_CONNECTION , SL_CONNECTION_POLICY (1 , 0 , 0 , 0 , 1 ), NULL , 0 ));
@@ -434,7 +436,7 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
434436 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_GENERAL_PARAM_ID , WLAN_GENERAL_PARAM_OPT_AP_TX_POWER , sizeof (ucPower ),
435437 (unsigned char * )& ucPower ));
436438 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_AP_ID , WLAN_AP_OPT_SSID , ssid_len , (unsigned char * )ssid ));
437- memcpy (wlan_obj .ssid_name , (unsigned char * )ssid , ssid_len );
439+ memcpy (wlan_obj .ssid , (unsigned char * )ssid , ssid_len );
438440 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_AP_ID , WLAN_AP_OPT_SECURITY_TYPE , sizeof (uint8_t ), & sec ));
439441 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_AP_ID , WLAN_AP_OPT_PASSWORD , key_len , (unsigned char * )key ));
440442 _u8 * country = (_u8 * )"EU" ;
@@ -491,21 +493,31 @@ void wlan_update(void) {
491493#endif
492494}
493495
494- void wlan_sl_disable (void ) {
496+ // call this function to disable the complete WLAN subsystem in order to save power
497+ void wlan_stop (void ) {
495498 if (wlan_obj .mode >= 0 ) {
496499 sl_LockObjLock (& wlan_LockObj , SL_OS_WAIT_FOREVER );
497500 wlan_obj .mode = -1 ;
498501 sl_Stop (SL_STOP_TIMEOUT );
499502 }
500503}
501504
505+ // cal this function to reenable the WLAN susbsystem after a previous call to wlan_sl_disable()
506+ // WLAN will remain configured as it was before being disabled
507+ void wlan_start (void ) {
508+ if (wlan_obj .mode < 0 ) {
509+ wlan_obj .mode = sl_Start (0 , 0 , 0 );
510+ sl_LockObjUnlock (& wlan_LockObj );
511+ }
512+ }
513+
502514SlWlanMode_t wlan_get_mode (void ) {
503515 return wlan_obj .mode ;
504516}
505517
506518void wlan_get_mac (uint8_t * macAddress ) {
507519 if (macAddress ) {
508- memcpy (macAddress , wlan_obj .macAddr , SL_MAC_ADDR_LEN );
520+ memcpy (macAddress , wlan_obj .mac , SL_MAC_ADDR_LEN );
509521 }
510522}
511523
@@ -519,7 +531,7 @@ void wlan_set_pm_policy (uint8_t policy) {
519531 ASSERT_ON_ERROR (sl_WlanPolicySet (SL_POLICY_PM , policy , NULL , 0 ));
520532}
521533
522- void wlan_servers_stop (void ) {
534+ void wlan_stop_servers (void ) {
523535 servers_disable ();
524536 do {
525537 HAL_Delay (5 );
@@ -535,7 +547,8 @@ STATIC void wlan_initialize_data (void) {
535547 wlan_obj .dns = 0 ;
536548 wlan_obj .gateway = 0 ;
537549 wlan_obj .ip = 0 ;
538- memset (wlan_obj .ssid_name , 0 , sizeof (wlan_obj .ssid_name ));
550+ wlan_obj .security = SL_SEC_TYPE_OPEN ;
551+ memset (wlan_obj .ssid , 0 , sizeof (wlan_obj .ssid ));
539552 memset (wlan_obj .bssid , 0 , sizeof (wlan_obj .bssid ));
540553}
541554
@@ -549,8 +562,8 @@ STATIC void wlan_reenable (SlWlanMode_t mode) {
549562 ASSERT (wlan_obj .mode == mode );
550563}
551564
552- STATIC modwlan_Status_t wlan_do_connect (const char * ssid , uint32_t ssid_len , const char * bssid , uint8_t sec , const char * key , uint32_t key_len )
553- {
565+ STATIC modwlan_Status_t wlan_do_connect (const char * ssid , uint32_t ssid_len , const char * bssid , uint8_t sec ,
566+ const char * key , uint32_t key_len ) {
554567 SlSecParams_t secParams ;
555568
556569 secParams .Key = (_i8 * )key ;
@@ -580,7 +593,7 @@ STATIC modwlan_Status_t wlan_do_connect (const char* ssid, uint32_t ssid_len, co
580593STATIC void wlan_get_sl_mac (void ) {
581594 // Get the MAC address
582595 uint8_t macAddrLen = SL_MAC_ADDR_LEN ;
583- sl_NetCfgGet (SL_MAC_ADDRESS_GET ,NULL , & macAddrLen , wlan_obj .macAddr );
596+ sl_NetCfgGet (SL_MAC_ADDRESS_GET , NULL , & macAddrLen , wlan_obj .mac );
584597}
585598
586599/// \method init(mode, ssid=myWlan, security=wlan.WPA_WPA2, key=myWlanKey)
@@ -647,7 +660,7 @@ STATIC mp_obj_t wlan_make_new (mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_k
647660 // Stop all other processes using the wlan engine
648661 bool servers_enabled ;
649662 if ( (servers_enabled = servers_are_enabled ()) ) {
650- wlan_servers_stop ();
663+ wlan_stop_servers ();
651664 }
652665 if (mode == ROLE_AP ) {
653666 // start the peripheral
@@ -682,34 +695,17 @@ STATIC mp_obj_t wlan_make_new (mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_k
682695
683696STATIC void wlan_print (void (* print )(void * env , const char * fmt , ...), void * env , mp_obj_t self_in , mp_print_kind_t kind ) {
684697 wlan_obj_t * self = self_in ;
685- print (env , "wlan(mode=%u, status=%u" , self -> mode , self -> status );
686- print (env , ", mac=%02x:%02x:%02x:%02x:%02x:%02x" , self -> macAddr [0 ], self -> macAddr [1 ], self -> macAddr [2 ],
687- self -> macAddr [3 ], self -> macAddr [4 ], self -> macAddr [5 ]);
688-
689- // Only print the ssid if in station or ap mode
690- if (self -> mode == ROLE_STA || self -> mode == ROLE_AP ) {
691- print (env , ", ssid=%s" , self -> ssid_name );
692-
693- // Only print the bssid if in station mode
694- if (self -> mode == ROLE_STA ) {
695- print (env , ", bssid=%02x:%02x:%02x:%02x:%02x:%02x" , self -> bssid [0 ], self -> bssid [1 ], self -> bssid [2 ],
696- self -> bssid [3 ], self -> bssid [4 ], self -> bssid [5 ]);
697- }
698+ print (env , "<WLAN mode=%u" , self -> mode );
698699
699- char ip_str [IPV4_ADDR_STR_LEN_MAX ];
700- uint8_t * ip = (uint8_t * )& self -> ip ;
701- snprintf (ip_str , 16 , "%u.%u.%u.%u" , ip [0 ], ip [1 ], ip [2 ], ip [3 ]);
702- print (env , ", ip=%s" , ip_str );
703- ip = (uint8_t * )& self -> gateway ;
704- snprintf (ip_str , 16 , "%u.%u.%u.%u" , ip [0 ], ip [1 ], ip [2 ], ip [3 ]);
705- print (env , ", gateway=%s" , ip_str );
706- ip = (uint8_t * )& self -> dns ;
707- snprintf (ip_str , 16 , "%u.%u.%u.%u" , ip [0 ], ip [1 ], ip [2 ], ip [3 ]);
708- print (env , ", dns=%s)" , ip_str );
700+ // only print the bssid if in station mode
701+ if (self -> mode != ROLE_AP && GET_STATUS_BIT (self -> status , STATUS_BIT_CONNECTION )) {
702+ print (env , ", connected to: ssid=%s, bssid=%02x:%02x:%02x:%02x:%02x:%02x" , self -> ssid ,
703+ self -> bssid [0 ], self -> bssid [1 ], self -> bssid [2 ], self -> bssid [3 ], self -> bssid [4 ], self -> bssid [5 ]);
709704 }
710705 else {
711- print (env , ")" );
706+ print (env , ", ssid=%s" , self -> ssid );
712707 }
708+ print (env , ", security=%u>" , self -> security );
713709}
714710
715711/// \method mode()
@@ -803,6 +799,7 @@ STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
803799 else if (status == MODWLAN_ERROR_INVALID_PARAMS ) {
804800 nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , mpexception_value_invalid_arguments ));
805801 }
802+ wlan_obj .security = sec ;
806803
807804 return mp_const_none ;
808805}
@@ -829,20 +826,41 @@ STATIC mp_obj_t wlan_isconnected(mp_obj_t self_in) {
829826}
830827STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_isconnected_obj , wlan_isconnected );
831828
832- /// \method getip()
833- /// return the ip address or None if not connected
834- ///
835- STATIC mp_obj_t wlan_getip (mp_obj_t self_in ) {
836- uint32_t ip ;
837- wlan_get_ip (& ip );
838- if (ip ) {
839- return mod_network_format_ipv4_addr ((uint8_t * )& ip );
829+ STATIC mp_obj_t wlan_ifconfig (mp_obj_t self_in ) {
830+
831+ unsigned char len = sizeof (SlNetCfgIpV4Args_t );
832+ unsigned char dhcpIsOn ;
833+ SlNetCfgIpV4Args_t ipV4 ;
834+
835+ sl_NetCfgGet (SL_IPV4_STA_P2P_CL_GET_INFO , & dhcpIsOn , & len , (uint8_t * )& ipV4 );
836+ // shift byte order
837+ ipV4 .ipV4Mask = ntohl (ipV4 .ipV4Mask );
838+
839+ mp_obj_t ifconfig = mp_obj_new_dict (0 );
840+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("ip" , strlen ("ip" ), false), mod_network_format_ipv4_addr ((uint8_t * )& wlan_obj .ip ));
841+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("subnet" , strlen ("subnet" ), false), mod_network_format_ipv4_addr ((uint8_t * )& ipV4 .ipV4Mask ));
842+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("gateway" , strlen ("gateway" ), false), mod_network_format_ipv4_addr ((uint8_t * )& wlan_obj .gateway ));
843+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("dns" , strlen ("dns" ), false), mod_network_format_ipv4_addr ((uint8_t * )& wlan_obj .dns ));
844+ char mac_str [18 ];
845+ mp_uint_t mac_len = snprintf (mac_str , sizeof (mac_str ), "%02x:%02x:%02x:%02x:%02x:%02x" , wlan_obj .mac [0 ], wlan_obj .mac [1 ], wlan_obj .mac [2 ],
846+ wlan_obj .mac [3 ], wlan_obj .mac [4 ], wlan_obj .mac [5 ]);
847+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("mac" , strlen ("mac" ), false), mp_obj_new_str (mac_str , mac_len , false));
848+ char * mode_str ;
849+ if (wlan_obj .mode == ROLE_STA ) {
850+ mode_str = "station" ;
851+ }
852+ else if (wlan_obj .mode == ROLE_AP ) {
853+ mode_str = "ap" ;
840854 }
841855 else {
842- return mp_const_none ;
856+ mode_str = "p2p" ;
843857 }
858+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("mode" , strlen ("mode" ), false), mp_obj_new_str (mode_str , strlen (mode_str ), false));
859+ mp_obj_dict_store (ifconfig , mp_obj_new_str ("ssid" , strlen ("ssid" ), false), mp_obj_new_str ((const char * )wlan_obj .ssid , strlen ((const char * )wlan_obj .ssid ), false));
860+
861+ return ifconfig ;
844862}
845- STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_getip_obj , wlan_getip );
863+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_ifconfig_obj , wlan_ifconfig );
846864
847865STATIC mp_obj_t wlan_urn (uint n_args , const mp_obj_t * args ) {
848866 char urn [MAX_DEVICE_URN_LEN ];
@@ -917,15 +935,15 @@ STATIC mp_obj_t wlan_serversstart(mp_obj_t self_in) {
917935STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_serversstart_obj , wlan_serversstart );
918936
919937STATIC mp_obj_t wlan_serversstop (mp_obj_t self_in ) {
920- wlan_servers_stop ();
938+ wlan_stop_servers ();
921939 return mp_const_none ;
922940}
923941STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_serversstop_obj , wlan_serversstop );
924942
925- STATIC mp_obj_t wlan_areserversenabled (mp_obj_t self_in ) {
943+ STATIC mp_obj_t wlan_serversenabled (mp_obj_t self_in ) {
926944 return MP_BOOL (servers_are_enabled ());
927945}
928- STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_areserversenabled_obj , wlan_areserversenabled );
946+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (wlan_serversenabled_obj , wlan_serversenabled );
929947
930948STATIC mp_obj_t wlan_serversuserpass (mp_obj_t self_in , mp_obj_t user , mp_obj_t pass ) {
931949 const char * _user = mp_obj_str_get_str (user );
@@ -937,16 +955,16 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(wlan_serversuserpass_obj, wlan_serversuserpass)
937955
938956STATIC const mp_map_elem_t wlan_locals_dict_table [] = {
939957 { MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& wlan_connect_obj },
940- { MP_OBJ_NEW_QSTR (MP_QSTR_get_mode ), (mp_obj_t )& wlan_getmode_obj },
941- { MP_OBJ_NEW_QSTR (MP_QSTR_set_pm ), (mp_obj_t )& wlan_setpm_obj },
958+ { MP_OBJ_NEW_QSTR (MP_QSTR_getmode ), (mp_obj_t )& wlan_getmode_obj },
959+ { MP_OBJ_NEW_QSTR (MP_QSTR_setpm ), (mp_obj_t )& wlan_setpm_obj },
942960 { MP_OBJ_NEW_QSTR (MP_QSTR_scan ), (mp_obj_t )& wlan_scan_obj },
943961 { MP_OBJ_NEW_QSTR (MP_QSTR_disconnect ), (mp_obj_t )& wlan_disconnect_obj },
944- { MP_OBJ_NEW_QSTR (MP_QSTR_is_connected ), (mp_obj_t )& wlan_isconnected_obj },
945- { MP_OBJ_NEW_QSTR (MP_QSTR_get_ip ), (mp_obj_t )& wlan_getip_obj },
962+ { MP_OBJ_NEW_QSTR (MP_QSTR_isconnected ), (mp_obj_t )& wlan_isconnected_obj },
963+ { MP_OBJ_NEW_QSTR (MP_QSTR_ifconfig ), (mp_obj_t )& wlan_ifconfig_obj },
946964 { MP_OBJ_NEW_QSTR (MP_QSTR_urn ), (mp_obj_t )& wlan_urn_obj },
947965 { MP_OBJ_NEW_QSTR (MP_QSTR_start_servers ), (mp_obj_t )& wlan_serversstart_obj },
948966 { MP_OBJ_NEW_QSTR (MP_QSTR_stop_servers ), (mp_obj_t )& wlan_serversstop_obj },
949- { MP_OBJ_NEW_QSTR (MP_QSTR_are_servers_enabled ), (mp_obj_t )& wlan_areserversenabled_obj },
967+ { MP_OBJ_NEW_QSTR (MP_QSTR_servers_enabled ), (mp_obj_t )& wlan_serversenabled_obj },
950968 { MP_OBJ_NEW_QSTR (MP_QSTR_servers_userpass ), (mp_obj_t )& wlan_serversuserpass_obj },
951969
952970 // class constants
0 commit comments