2929
3030#include "py/mpstate.h"
3131#include MICROPY_HAL_H
32+ #include "py/obj.h"
33+ #include "py/nlr.h"
34+ #include "py/runtime.h"
3235#include "modnetwork.h"
3336#include "mpexception.h"
3437#include "serverstask.h"
3538#include "simplelink.h"
3639
3740
41+ /******************************************************************************
42+ DEFINE TYPES
43+ ******************************************************************************/
44+ typedef struct {
45+ mp_obj_base_t base ;
46+ } network_server_obj_t ;
47+
48+ /******************************************************************************
49+ DECLARE PRIVATE DATA
50+ ******************************************************************************/
51+ STATIC network_server_obj_t network_server_obj ;
52+ STATIC const mp_obj_type_t network_server_type ;
53+
3854/// \module network - network configuration
3955///
4056/// This module provides network drivers and server configuration.
@@ -43,58 +59,100 @@ void mod_network_init0(void) {
4359}
4460
4561#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
46- STATIC mp_obj_t network_server_running (mp_uint_t n_args , const mp_obj_t * args ) {
47- if (n_args > 0 ) {
48- // set
49- if (mp_obj_is_true (args [0 ])) {
50- servers_start ();
51- } else {
52- servers_stop ();
53- }
54- return mp_const_none ;
55- } else {
56- // get
57- return mp_obj_new_bool (servers_are_enabled ());
62+ STATIC mp_obj_t network_server_init_helper (mp_obj_t self , const mp_arg_val_t * args ) {
63+ const char * user = SERVERS_DEF_USER ;
64+ const char * pass = SERVERS_DEF_PASS ;
65+ if (args [0 ].u_obj != MP_OBJ_NULL ) {
66+ mp_obj_t * login ;
67+ mp_obj_get_array_fixed_n (args [0 ].u_obj , 2 , & login );
68+ user = mp_obj_str_get_str (login [0 ]);
69+ pass = mp_obj_str_get_str (login [1 ]);
5870 }
59- }
60- STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (network_server_running_obj , 0 , 1 , network_server_running );
6171
62- STATIC mp_obj_t network_server_login (mp_obj_t user , mp_obj_t pass ) {
63- const char * _user = mp_obj_str_get_str (user );
64- const char * _pass = mp_obj_str_get_str (pass );
65- if (strlen (user ) > SERVERS_USER_PASS_LEN_MAX || strlen (pass ) > SERVERS_USER_PASS_LEN_MAX ) {
66- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , mpexception_value_invalid_arguments ));
72+ uint32_t timeout = SERVERS_DEF_TIMEOUT_MS / 1000 ;
73+ if (args [1 ].u_obj != MP_OBJ_NULL ) {
74+ timeout = mp_obj_get_int (args [1 ].u_obj );
6775 }
68- servers_set_login ((char * )_user , (char * )_pass );
76+
77+ // configure the new login
78+ servers_set_login ((char * )user , (char * )pass );
79+
80+ // configure the timeout
81+ servers_set_timeout (timeout * 1000 );
82+
83+ // start the servers
84+ servers_start ();
85+
6986 return mp_const_none ;
7087}
71- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (network_server_login_obj , network_server_login );
88+
89+ STATIC const mp_arg_t network_server_args [] = {
90+ { MP_QSTR_id , MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
91+ { MP_QSTR_login , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
92+ { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
93+ };
94+ STATIC mp_obj_t network_server_new (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
95+ // parse args
96+ mp_arg_val_t args [MP_ARRAY_SIZE (network_server_args )];
97+ mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (args ), network_server_args , args );
98+
99+ // check the server id
100+ if (args [0 ].u_obj != MP_OBJ_NULL ) {
101+ if (mp_obj_get_int (args [0 ].u_obj ) != 0 ) {
102+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_resource_not_avaliable ));
103+ }
104+ }
105+
106+ // setup the object and initialize it
107+ network_server_obj_t * self = & network_server_obj ;
108+ self -> base .type = & network_server_type ;
109+ network_server_init_helper (self , & args [1 ]);
110+
111+ return self ;
112+ }
113+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (network_server_new_obj , 0 , network_server_new );
114+
115+ STATIC mp_obj_t network_server_init (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
116+ // parse args
117+ mp_arg_val_t args [MP_ARRAY_SIZE (network_server_args ) - 1 ];
118+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (args ), & network_server_args [1 ], args );
119+ return network_server_init_helper (pos_args [0 ], args );
120+ }
121+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (network_server_init_obj , 1 , network_server_init );
72122
73123// timeout value given in seconds
74124STATIC mp_obj_t network_server_timeout (mp_uint_t n_args , const mp_obj_t * args ) {
75- if (n_args > 0 ) {
76- uint32_t _timeout = mp_obj_get_int (args [0 ]);
77- if (!servers_set_timeout (_timeout * 1000 )) {
78- // timeout is too low
79- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , mpexception_value_invalid_arguments ));
80- }
125+ if (n_args > 1 ) {
126+ uint32_t timeout = mp_obj_get_int (args [1 ]);
127+ servers_set_timeout (timeout * 1000 );
81128 return mp_const_none ;
82129 } else {
83130 // get
84131 return mp_obj_new_int (servers_get_timeout () / 1000 );
85132 }
86133}
87- STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (network_server_timeout_obj , 0 , 1 , network_server_timeout );
134+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (network_server_timeout_obj , 1 , 2 , network_server_timeout );
135+
136+ STATIC mp_obj_t network_server_running (mp_obj_t self_in ) {
137+ // get
138+ return mp_obj_new_bool (servers_are_enabled ());
139+ }
140+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (network_server_running_obj , network_server_running );
141+
142+ STATIC mp_obj_t network_server_deinit (mp_obj_t self_in ) {
143+ // simply stop the servers
144+ servers_stop ();
145+ return mp_const_none ;
146+ }
147+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (network_server_deinit_obj , network_server_deinit );
88148#endif
89149
90150STATIC const mp_map_elem_t mp_module_network_globals_table [] = {
91151 { MP_OBJ_NEW_QSTR (MP_QSTR___name__ ), MP_OBJ_NEW_QSTR (MP_QSTR_network ) },
92152 { MP_OBJ_NEW_QSTR (MP_QSTR_WLAN ), (mp_obj_t )& mod_network_nic_type_wlan },
93153
94154#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
95- { MP_OBJ_NEW_QSTR (MP_QSTR_server_running ), (mp_obj_t )& network_server_running_obj },
96- { MP_OBJ_NEW_QSTR (MP_QSTR_server_login ), (mp_obj_t )& network_server_login_obj },
97- { MP_OBJ_NEW_QSTR (MP_QSTR_server_timeout ), (mp_obj_t )& network_server_timeout_obj },
155+ { MP_OBJ_NEW_QSTR (MP_QSTR_server ), (mp_obj_t )& network_server_new_obj },
98156#endif
99157};
100158
@@ -105,3 +163,20 @@ const mp_obj_module_t mp_module_network = {
105163 .name = MP_QSTR_network ,
106164 .globals = (mp_obj_dict_t * )& mp_module_network_globals ,
107165};
166+
167+ #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP )
168+ STATIC const mp_map_elem_t network_server_locals_dict_table [] = {
169+ { MP_OBJ_NEW_QSTR (MP_QSTR_init ), (mp_obj_t )& network_server_init_obj },
170+ { MP_OBJ_NEW_QSTR (MP_QSTR_deinit ), (mp_obj_t )& network_server_deinit_obj },
171+ { MP_OBJ_NEW_QSTR (MP_QSTR_timeout ), (mp_obj_t )& network_server_timeout_obj },
172+ { MP_OBJ_NEW_QSTR (MP_QSTR_running ), (mp_obj_t )& network_server_running_obj },
173+ };
174+
175+ STATIC MP_DEFINE_CONST_DICT (network_server_locals_dict , network_server_locals_dict_table );
176+
177+ STATIC const mp_obj_type_t network_server_type = {
178+ { & mp_type_type },
179+ .name = MP_QSTR_server ,
180+ .locals_dict = (mp_obj_t )& network_server_locals_dict ,
181+ };
182+ #endif
0 commit comments