Skip to content

Commit 2e0cd20

Browse files
author
danicampora
committed
cc3200: Refactor network module to make the server a propper object.
1 parent 65f6324 commit 2e0cd20

File tree

7 files changed

+181
-53
lines changed

7 files changed

+181
-53
lines changed

cc3200/mods/modnetwork.c

Lines changed: 106 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,28 @@
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
74124
STATIC 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

90150
STATIC 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

cc3200/mods/pybadc.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(adc_deinit_obj, adc_deinit);
195195

196196
STATIC mp_obj_t adc_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
197197
STATIC const mp_arg_t pyb_adc_channel_args[] = {
198-
{ MP_QSTR_id, MP_ARG_OBJ, {.u_obj = mp_const_none} },
198+
{ MP_QSTR_id, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
199199
{ MP_QSTR_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
200200
};
201201

@@ -204,12 +204,11 @@ STATIC mp_obj_t adc_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
204204
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(args), pyb_adc_channel_args, args);
205205

206206
uint ch_id;
207-
if (args[0].u_obj != mp_const_none) {
207+
if (args[0].u_obj != MP_OBJ_NULL) {
208208
ch_id = mp_obj_get_int(args[0].u_obj);
209209
if (ch_id >= PYB_ADC_NUM_CHANNELS) {
210210
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_os_resource_not_avaliable));
211-
}
212-
else if (args[1].u_obj != mp_const_none) {
211+
} else if (args[1].u_obj != mp_const_none) {
213212
uint pin_ch_id = pin_find_peripheral_type (args[1].u_obj, PIN_FN_ADC, 0);
214213
if (ch_id != pin_ch_id) {
215214
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));

cc3200/qstrdefsport.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,16 +278,18 @@ Q(CERT_REQUIRED)
278278

279279
// for network class
280280
Q(network)
281-
Q(server_running)
282-
Q(server_login)
283-
Q(server_timeout)
281+
Q(server)
282+
Q(init)
283+
Q(deinit)
284+
Q(login)
285+
Q(timeout)
286+
Q(running)
284287

285288
// for WLAN class
286289
Q(WLAN)
287290
Q(id)
288291
Q(init)
289292
Q(mode)
290-
Q(key)
291293
Q(auth)
292294
Q(ssid)
293295
Q(bssid)

cc3200/serverstask.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,17 @@
3030
#include "py/mpconfig.h"
3131
#include MICROPY_HAL_H
3232
#include "py/misc.h"
33+
#include "py/nlr.h"
3334
#include "serverstask.h"
3435
#include "simplelink.h"
3536
#include "debug.h"
3637
#include "telnet.h"
3738
#include "ftp.h"
3839
#include "pybwdt.h"
3940
#include "modusocket.h"
41+
#include "mpexception.h"
4042

4143

42-
/******************************************************************************
43-
DECLARE PRIVATE DEFINITIONS
44-
******************************************************************************/
45-
46-
#define SERVERS_DEF_USER "micro"
47-
#define SERVERS_DEF_PASS "python"
48-
#define SERVERS_DEF_TIMEOUT_MS 300000 // 5 minutes
49-
#define SERVERS_MIN_TIMEOUT_MS 5000 // 5 seconds
50-
5144
/******************************************************************************
5245
DEFINE PRIVATE TYPES
5346
******************************************************************************/
@@ -177,16 +170,19 @@ void servers_close_socket (int16_t *sd) {
177170
}
178171

179172
void servers_set_login (char *user, char *pass) {
173+
if (strlen(user) > SERVERS_USER_PASS_LEN_MAX || strlen(pass) > SERVERS_USER_PASS_LEN_MAX) {
174+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
175+
}
180176
memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX);
181177
memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
182178
}
183179

184-
bool servers_set_timeout (uint32_t timeout) {
180+
void servers_set_timeout (uint32_t timeout) {
185181
if (timeout < SERVERS_MIN_TIMEOUT_MS) {
186-
return false;
182+
// timeout is too low
183+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
187184
}
188185
servers_data.timeout = timeout;
189-
return true;
190186
}
191187

192188
uint32_t servers_get_timeout (void) {

cc3200/serverstask.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,15 @@
3636
#define SERVERS_SSID_LEN_MAX 16
3737
#define SERVERS_KEY_LEN_MAX 16
3838

39-
#define SERVERS_USER_PASS_LEN_MAX 16
39+
#define SERVERS_USER_PASS_LEN_MAX 32
4040

4141
#define SERVERS_CYCLE_TIME_MS 2
4242

43+
#define SERVERS_DEF_USER "micro"
44+
#define SERVERS_DEF_PASS "python"
45+
#define SERVERS_DEF_TIMEOUT_MS 300000 // 5 minutes
46+
#define SERVERS_MIN_TIMEOUT_MS 5000 // 5 seconds
47+
4348
/******************************************************************************
4449
DEFINE TYPES
4550
******************************************************************************/
@@ -61,7 +66,7 @@ extern bool servers_are_enabled (void);
6166
extern void servers_close_socket (int16_t *sd);
6267
extern void servers_set_login (char *user, char *pass);
6368
extern void server_sleep_sockets (void);
64-
extern bool servers_set_timeout (uint32_t timeout);
69+
extern void servers_set_timeout (uint32_t timeout);
6570
extern uint32_t servers_get_timeout (void);
6671

6772
#endif /* SERVERSTASK_H_ */

tests/wipy/wlan/server.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'''
2+
network server test for the CC3200 based boards.
3+
'''
4+
5+
import os
6+
import network
7+
8+
mch = os.uname().machine
9+
if not 'LaunchPad' in mch and not'WiPy' in mch:
10+
raise Exception('Board not supported!')
11+
12+
server = network.server()
13+
14+
print(server.timeout() == 300)
15+
print(server.running() == True)
16+
server.deinit()
17+
print(server.running() == False)
18+
19+
server.init(login=('test-user', 'test-password'), timeout=60)
20+
print(server.running() == True)
21+
print(server.timeout() == 60)
22+
23+
server.deinit()
24+
print(server.running() == False)
25+
server.init()
26+
print(server.running() == True)
27+
28+
try:
29+
server.init(1)
30+
except:
31+
print('Exception')
32+
33+
try:
34+
server.init(0, login=('0000000000011111111111222222222222333333', 'abc'))
35+
except:
36+
print('Exception')
37+
38+
try:
39+
server.timeout(1)
40+
except:
41+
print('Exception')

tests/wipy/wlan/server.py.exp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
True
2+
True
3+
True
4+
True
5+
True
6+
True
7+
True
8+
Exception
9+
Exception
10+
Exception

0 commit comments

Comments
 (0)