@@ -130,6 +130,8 @@ typedef struct _wlan_obj_t {
130130#define WLAN_MAX_RX_SIZE 16000
131131#define WLAN_MAX_TX_SIZE 1476
132132
133+ #define MODWLAN_IP_MODE_DYNAMIC 0
134+ #define MODWLAN_IP_MODE_STATIC 1
133135
134136#define MAKE_SOCKADDR (addr , ip , port ) sockaddr addr; \
135137 addr.sa_family = AF_INET; \
@@ -176,6 +178,8 @@ OsiLockObj_t wlan_LockObj;
176178 ******************************************************************************/
177179STATIC void wlan_initialize_data (void );
178180STATIC void wlan_reenable (SlWlanMode_t mode );
181+ STATIC void wlan_servers_start (void );
182+ STATIC void wlan_servers_stop (void );
179183STATIC void wlan_get_sl_mac (void );
180184STATIC modwlan_Status_t wlan_do_connect (const char * ssid , uint32_t ssid_len , const char * bssid , uint8_t sec ,
181185 const char * key , uint32_t key_len );
@@ -265,9 +269,9 @@ void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) {
265269 pEventData = & pNetAppEvent -> EventData .ipAcquiredV4 ;
266270
267271 // Get ip, gateway and dns
268- wlan_obj .gateway = ntohl ( pEventData -> gateway ) ;
269- wlan_obj .ip = ntohl ( pEventData -> ip ) ;
270- wlan_obj .dns = ntohl ( pEventData -> dns ) ;
272+ wlan_obj .gateway = pEventData -> gateway ;
273+ wlan_obj .ip = pEventData -> ip ;
274+ wlan_obj .dns = pEventData -> dns ;
271275 }
272276 break ;
273277 case SL_NETAPP_IPV6_IPACQUIRED_EVENT :
@@ -321,8 +325,6 @@ void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent) {
321325 if (!pDevEvent ) {
322326 return ;
323327 }
324-
325- ASSERT (false);
326328}
327329
328330
@@ -392,14 +394,10 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
392394 const char * key , uint8_t key_len , uint8_t channel ) {
393395
394396 if (mode == ROLE_STA || mode == ROLE_AP || mode == ROLE_P2P ) {
395- #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
396- // Stop all other processes using the wlan engine
397- if ((wlan_obj .servers_enabled = servers_are_enabled ())) {
398- servers_stop ();
399- }
400- #endif
397+ // stop the servers
398+ wlan_servers_stop ();
401399
402- // do a basic start fisrt
400+ // do a basic start
403401 wlan_first_start ();
404402
405403 // Device in station-mode. Disconnect previous connection if any
@@ -408,10 +406,8 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
408406 // other return-codes
409407 if (0 == sl_WlanDisconnect ()) {
410408 while (IS_CONNECTED (wlan_obj .status )) {
411- #ifndef SL_PLATFORM_MULTI_THREADED
412- _SlTaskEntry ();
413- #endif
414409 HAL_Delay (5 );
410+ wlan_update ();
415411 }
416412 }
417413
@@ -454,10 +450,21 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
454450 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_GENERAL_PARAM_ID , WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE , 2 , country ));
455451 ASSERT_ON_ERROR (sl_WlanSet (SL_WLAN_CFG_AP_ID , WLAN_AP_OPT_CHANNEL , 1 , (_u8 * )& channel ));
456452
457- // Stop and start again
453+ // stop and start again
458454 wlan_reenable (mode );
459455 ASSERT (wlan_obj .mode == mode );
460456
457+ SlNetCfgIpV4Args_t ipV4 ;
458+ ipV4 .ipV4 = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 IP address
459+ ipV4 .ipV4Mask = (_u32 )SL_IPV4_VAL (255 ,255 ,255 ,0 ); // _u32 Subnet mask for this AP
460+ ipV4 .ipV4Gateway = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 Default gateway address
461+ ipV4 .ipV4DnsServer = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 DNS server address
462+ ASSERT_ON_ERROR (sl_NetCfgSet (SL_IPV4_AP_P2P_GO_STATIC_ENABLE , IPCONFIG_MODE_ENABLE_IPV4 ,
463+ sizeof (SlNetCfgIpV4Args_t ), (_u8 * )& ipV4 ));
464+
465+ // stop and start again
466+ wlan_reenable (mode );
467+
461468 SlNetAppDhcpServerBasicOpt_t dhcpParams ;
462469 dhcpParams .lease_time = 4096 ; // lease time (in seconds) of the IP Address
463470 dhcpParams .ipv4_addr_start = SL_IPV4_VAL (192 ,168 ,1 ,2 ); // first IP Address for allocation.
@@ -467,16 +474,9 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
467474 sizeof (SlNetAppDhcpServerBasicOpt_t ), (_u8 * )& dhcpParams )); // set parameters
468475 ASSERT_ON_ERROR (sl_NetAppStart (SL_NET_APP_DHCP_SERVER_ID )); // Start DHCP server with new settings
469476
470- SlNetCfgIpV4Args_t ipV4 ;
471- ipV4 .ipV4 = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 IP address
472- ipV4 .ipV4Mask = (_u32 )SL_IPV4_VAL (255 ,255 ,255 ,0 ); // _u32 Subnet mask for this AP
473- ipV4 .ipV4Gateway = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 Default gateway address
474- ipV4 .ipV4DnsServer = (_u32 )SL_IPV4_VAL (192 ,168 ,1 ,1 ); // _u32 DNS server address
475- ASSERT_ON_ERROR (sl_NetCfgSet (SL_IPV4_AP_P2P_GO_STATIC_ENABLE , IPCONFIG_MODE_ENABLE_IPV4 ,
476- sizeof (SlNetCfgIpV4Args_t ), (_u8 * )& ipV4 ));
477-
478- // Stop and start again
477+ // stop and start again
479478 wlan_reenable (mode );
479+
480480 // save the security type
481481 wlan_obj .security = sec ;
482482 }
@@ -487,15 +487,11 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
487487 ASSERT_ON_ERROR (sl_WlanSetMode (mode ));
488488 // stop and start again
489489 wlan_reenable (mode );
490- // set connection policy to Auto + SmartConfig (Device's default connection policy )
491- ASSERT_ON_ERROR (sl_WlanPolicySet (SL_POLICY_CONNECTION , SL_CONNECTION_POLICY (1 , 0 , 0 , 0 , 1 ), NULL , 0 ));
490+ // set connection policy to Auto + Fast (tries to connect to the last connected AP )
491+ ASSERT_ON_ERROR (sl_WlanPolicySet (SL_POLICY_CONNECTION ,SL_CONNECTION_POLICY (1 , 1 , 0 , 0 , 0 ), NULL , 0 ));
492492 }
493- #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
494- // Start the servers again
495- if (wlan_obj .servers_enabled ) {
496- servers_start ();
497- }
498- #endif
493+ // start the servers before returning
494+ wlan_servers_start ();
499495 return MODWLAN_OK ;
500496 }
501497 return MODWLAN_ERROR_INVALID_PARAMS ;
@@ -508,12 +504,7 @@ void wlan_update(void) {
508504}
509505
510506void wlan_stop (uint32_t timeout ) {
511- #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
512- // Stop all other processes using the wlan engine
513- if ((wlan_obj .servers_enabled = servers_are_enabled ())) {
514- servers_stop ();
515- }
516- #endif
507+ wlan_servers_stop ();
517508 sl_LockObjLock (& wlan_LockObj , SL_OS_WAIT_FOREVER );
518509 sl_Stop (timeout );
519510 wlan_obj .mode = -1 ;
@@ -522,12 +513,7 @@ void wlan_stop (uint32_t timeout) {
522513void wlan_start (void ) {
523514 wlan_obj .mode = sl_Start (0 , 0 , 0 );
524515 sl_LockObjUnlock (& wlan_LockObj );
525- #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
526- // start the servers if they were enabled before
527- if (wlan_obj .servers_enabled ) {
528- servers_start ();
529- }
530- #endif
516+ wlan_servers_start ();
531517}
532518
533519void wlan_get_mac (uint8_t * macAddress ) {
@@ -565,6 +551,24 @@ STATIC void wlan_reenable (SlWlanMode_t mode) {
565551 ASSERT (wlan_obj .mode == mode );
566552}
567553
554+ STATIC void wlan_servers_start (void ) {
555+ #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
556+ // start the servers if they were enabled before
557+ if (wlan_obj .servers_enabled ) {
558+ servers_start ();
559+ }
560+ #endif
561+ }
562+
563+ STATIC void wlan_servers_stop (void ) {
564+ #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
565+ // Stop all other processes using the wlan engine
566+ if ((wlan_obj .servers_enabled = servers_are_enabled ())) {
567+ servers_stop ();
568+ }
569+ #endif
570+ }
571+
568572STATIC modwlan_Status_t wlan_do_connect (const char * ssid , uint32_t ssid_len , const char * bssid , uint8_t sec ,
569573 const char * key , uint32_t key_len ) {
570574 SlSecParams_t secParams ;
@@ -576,10 +580,8 @@ STATIC modwlan_Status_t wlan_do_connect (const char* ssid, uint32_t ssid_len, co
576580 // Wait for the WLAN Event
577581 uint32_t waitForConnectionMs = 0 ;
578582 while (!IS_CONNECTED (wlan_obj .status )) {
579- #ifndef SL_PLATFORM_MULTI_THREADED
580- _SlTaskEntry ();
581- #endif
582583 HAL_Delay (5 );
584+ wlan_update ();
583585 if (++ waitForConnectionMs >= MODWLAN_TIMEOUT_MS ) {
584586 return MODWLAN_ERROR_TIMEOUT ;
585587 }
@@ -756,10 +758,8 @@ STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
756758 if (GET_STATUS_BIT (wlan_obj .status , STATUS_BIT_CONNECTION )) {
757759 if (0 == sl_WlanDisconnect ()) {
758760 while (IS_CONNECTED (wlan_obj .status )) {
759- #ifndef SL_PLATFORM_MULTI_THREADED
760- _SlTaskEntry ();
761- #endif
762761 HAL_Delay (5 );
762+ wlan_update ();
763763 }
764764 }
765765 }
@@ -804,8 +804,6 @@ STATIC mp_obj_t wlan_ifconfig (mp_obj_t self_in) {
804804 SlNetCfgIpV4Args_t ipV4 ;
805805
806806 sl_NetCfgGet (SL_IPV4_STA_P2P_CL_GET_INFO , & dhcpIsOn , & len , (uint8_t * )& ipV4 );
807- // shift byte order
808- ipV4 .ipV4Mask = ntohl (ipV4 .ipV4Mask );
809807
810808 mp_obj_t ifconfig = mp_obj_new_dict (0 );
811809 mp_obj_dict_store (ifconfig , mp_obj_new_str ("ip" , strlen ("ip" ), false), mod_network_format_ipv4_addr ((uint8_t * )& wlan_obj .ip ));
@@ -933,6 +931,76 @@ STATIC mp_obj_t wlan_callback (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
933931}
934932STATIC MP_DEFINE_CONST_FUN_OBJ_KW (wlan_callback_obj , 1 , wlan_callback );
935933
934+ /// \method config_ip(mode, *, ip='192.168.1.1', subnet='255.255.255.0', gateway='192.168.1.1', dns='8.8.8.8')
935+ STATIC mp_obj_t wlan_config_ip (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
936+ STATIC const mp_arg_t allowed_args [] = {
937+ { MP_QSTR_mode , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = MODWLAN_IP_MODE_DYNAMIC } },
938+ { MP_QSTR_ip , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
939+ { MP_QSTR_subnet , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
940+ { MP_QSTR_gateway , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
941+ { MP_QSTR_dns , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
942+ };
943+
944+ // parse args
945+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
946+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
947+
948+ if (args [0 ].u_int == MODWLAN_IP_MODE_DYNAMIC ) {
949+ // only mode must be given
950+ if (args [1 ].u_obj || args [2 ].u_obj || args [3 ].u_obj || args [4 ].u_obj ) {
951+ nlr_raise (mp_obj_new_exception_msg (& mp_type_TypeError , mpexception_num_type_invalid_arguments ));
952+ }
953+
954+ wlan_servers_stop ();
955+
956+ // nothing to do if we are an access point
957+ if (wlan_obj .mode != ROLE_AP ) {
958+ _u8 val = 1 ;
959+ sl_NetCfgSet (SL_IPV4_STA_P2P_CL_DHCP_ENABLE , IPCONFIG_MODE_ENABLE_IPV4 , 1 , & val );
960+ wlan_reenable (wlan_obj .mode );
961+ }
962+ }
963+ else {
964+ // we need all arguments at this point
965+ if (!args [1 ].u_obj || !args [2 ].u_obj || !args [3 ].u_obj || !args [4 ].u_obj ) {
966+ nlr_raise (mp_obj_new_exception_msg (& mp_type_TypeError , mpexception_num_type_invalid_arguments ));
967+ }
968+
969+ SlNetCfgIpV4Args_t ipV4 ;
970+ mod_network_parse_ipv4_addr (args [1 ].u_obj , (uint8_t * )& ipV4 .ipV4 );
971+ mod_network_parse_ipv4_addr (args [2 ].u_obj , (uint8_t * )& ipV4 .ipV4Mask );
972+ mod_network_parse_ipv4_addr (args [3 ].u_obj , (uint8_t * )& ipV4 .ipV4Gateway );
973+ mod_network_parse_ipv4_addr (args [4 ].u_obj , (uint8_t * )& ipV4 .ipV4DnsServer );
974+
975+ wlan_servers_stop ();
976+
977+ if (wlan_obj .mode == ROLE_AP ) {
978+ ASSERT_ON_ERROR (sl_NetCfgSet (SL_IPV4_AP_P2P_GO_STATIC_ENABLE , IPCONFIG_MODE_ENABLE_IPV4 , sizeof (SlNetCfgIpV4Args_t ), (_u8 * )& ipV4 ));
979+
980+ // stop and start again
981+ wlan_reenable (wlan_obj .mode );
982+
983+ SlNetAppDhcpServerBasicOpt_t dhcpParams ;
984+ dhcpParams .lease_time = 4096 ; // lease time (in seconds) of the IP Address
985+ dhcpParams .ipv4_addr_start = ipV4 .ipV4 + 1 ; // first IP Address for allocation.
986+ dhcpParams .ipv4_addr_last = (ipV4 .ipV4 & 0xFFFFFF00 ) + 254 ; // last IP Address for allocation.
987+ ASSERT_ON_ERROR (sl_NetAppStop (SL_NET_APP_DHCP_SERVER_ID )); // stop DHCP server before settings
988+ ASSERT_ON_ERROR (sl_NetAppSet (SL_NET_APP_DHCP_SERVER_ID , NETAPP_SET_DHCP_SRV_BASIC_OPT ,
989+ sizeof (SlNetAppDhcpServerBasicOpt_t ), (_u8 * )& dhcpParams )); // set parameters
990+ ASSERT_ON_ERROR (sl_NetAppStart (SL_NET_APP_DHCP_SERVER_ID )); // start DHCP server with new settings
991+ }
992+ else {
993+ ASSERT_ON_ERROR (sl_NetCfgSet (SL_IPV4_STA_P2P_CL_STATIC_ENABLE , IPCONFIG_MODE_ENABLE_IPV4 , sizeof (SlNetCfgIpV4Args_t ), (_u8 * )& ipV4 ));
994+ }
995+ wlan_reenable (wlan_obj .mode );
996+ }
997+
998+ wlan_servers_start ();
999+
1000+ return mp_const_none ;
1001+ }
1002+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (wlan_config_ip_obj , 1 , wlan_config_ip );
1003+
9361004STATIC const mp_map_elem_t wlan_locals_dict_table [] = {
9371005 { MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& wlan_connect_obj },
9381006 { MP_OBJ_NEW_QSTR (MP_QSTR_scan ), (mp_obj_t )& wlan_scan_obj },
@@ -941,6 +1009,7 @@ STATIC const mp_map_elem_t wlan_locals_dict_table[] = {
9411009 { MP_OBJ_NEW_QSTR (MP_QSTR_ifconfig ), (mp_obj_t )& wlan_ifconfig_obj },
9421010 { MP_OBJ_NEW_QSTR (MP_QSTR_urn ), (mp_obj_t )& wlan_urn_obj },
9431011 { MP_OBJ_NEW_QSTR (MP_QSTR_callback ), (mp_obj_t )& wlan_callback_obj },
1012+ { MP_OBJ_NEW_QSTR (MP_QSTR_config_ip ), (mp_obj_t )& wlan_config_ip_obj },
9441013
9451014 // class constants
9461015 { MP_OBJ_NEW_QSTR (MP_QSTR_OPEN ), MP_OBJ_NEW_SMALL_INT (SL_SEC_TYPE_OPEN ) },
@@ -952,6 +1021,8 @@ STATIC const mp_map_elem_t wlan_locals_dict_table[] = {
9521021 { MP_OBJ_NEW_QSTR (MP_QSTR_STA ), MP_OBJ_NEW_SMALL_INT (ROLE_STA ) },
9531022 { MP_OBJ_NEW_QSTR (MP_QSTR_AP ), MP_OBJ_NEW_SMALL_INT (ROLE_AP ) },
9541023 { MP_OBJ_NEW_QSTR (MP_QSTR_P2P ), MP_OBJ_NEW_SMALL_INT (ROLE_P2P ) },
1024+ { MP_OBJ_NEW_QSTR (MP_QSTR_DYNAMIC ), MP_OBJ_NEW_SMALL_INT (MODWLAN_IP_MODE_DYNAMIC ) },
1025+ { MP_OBJ_NEW_QSTR (MP_QSTR_STATIC ), MP_OBJ_NEW_SMALL_INT (MODWLAN_IP_MODE_STATIC ) },
9551026};
9561027STATIC MP_DEFINE_CONST_DICT (wlan_locals_dict , wlan_locals_dict_table );
9571028
@@ -968,10 +1039,10 @@ STATIC int wlan_gethostbyname(mp_obj_t nic, const char *name, mp_uint_t len, uin
9681039 uint32_t ip ;
9691040 int result = sl_NetAppDnsGetHostByName ((_i8 * )name , (_u16 )len , (_u32 * )& ip , (_u8 )family );
9701041
971- out_ip [0 ] = ip >> 24 ;
972- out_ip [1 ] = ip >> 16 ;
973- out_ip [2 ] = ip >> 8 ;
974- out_ip [3 ] = ip ;
1042+ out_ip [0 ] = ip ;
1043+ out_ip [1 ] = ip >> 8 ;
1044+ out_ip [2 ] = ip >> 16 ;
1045+ out_ip [3 ] = ip >> 24 ;
9751046
9761047 return result ;
9771048}
0 commit comments