blob: d44f75acae678196a7480f49779ab61d3aa8cdec [file] [log] [blame]
danicampora87856452015-02-06 15:35:48 +01001/*
2 * This file is part of the Micro Python project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 * Copyright (c) 2015 Daniel Campora
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 */
27
Damien George4a23a012015-02-21 18:58:43 +000028#include "py/mpstate.h"
danicampora2e0cd202015-10-19 11:41:29 +020029#include "py/obj.h"
30#include "py/nlr.h"
31#include "py/runtime.h"
Damien George22a63442017-02-22 12:36:23 +110032#include "py/mperrno.h"
Damien George731f3592015-10-30 23:03:58 +000033#include "py/mphal.h"
danicampora87856452015-02-06 15:35:48 +010034#include "modnetwork.h"
35#include "mpexception.h"
danicamporaf8ee88b2015-03-19 17:06:20 +010036#include "serverstask.h"
Daniel Camporaed56b0b2015-05-22 19:53:33 +020037#include "simplelink.h"
38
danicampora87856452015-02-06 15:35:48 +010039
danicampora2e0cd202015-10-19 11:41:29 +020040/******************************************************************************
41 DEFINE TYPES
42 ******************************************************************************/
43typedef struct {
44 mp_obj_base_t base;
45} network_server_obj_t;
46
47/******************************************************************************
48 DECLARE PRIVATE DATA
49 ******************************************************************************/
50STATIC network_server_obj_t network_server_obj;
51STATIC const mp_obj_type_t network_server_type;
52
danicampora87856452015-02-06 15:35:48 +010053/// \module network - network configuration
54///
Daniel Camporacc204822015-06-03 17:28:03 +020055/// This module provides network drivers and server configuration.
danicampora87856452015-02-06 15:35:48 +010056
danicamporad226dd22015-02-27 16:50:06 +010057void mod_network_init0(void) {
danicampora87856452015-02-06 15:35:48 +010058}
59
danicamporaf8ee88b2015-03-19 17:06:20 +010060#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
danicampora2e0cd202015-10-19 11:41:29 +020061STATIC mp_obj_t network_server_init_helper(mp_obj_t self, const mp_arg_val_t *args) {
62 const char *user = SERVERS_DEF_USER;
63 const char *pass = SERVERS_DEF_PASS;
64 if (args[0].u_obj != MP_OBJ_NULL) {
65 mp_obj_t *login;
66 mp_obj_get_array_fixed_n(args[0].u_obj, 2, &login);
67 user = mp_obj_str_get_str(login[0]);
68 pass = mp_obj_str_get_str(login[1]);
Daniel Camporacc204822015-06-03 17:28:03 +020069 }
danicamporaf8ee88b2015-03-19 17:06:20 +010070
danicampora2e0cd202015-10-19 11:41:29 +020071 uint32_t timeout = SERVERS_DEF_TIMEOUT_MS / 1000;
72 if (args[1].u_obj != MP_OBJ_NULL) {
73 timeout = mp_obj_get_int(args[1].u_obj);
Daniel Camporacc204822015-06-03 17:28:03 +020074 }
danicampora2e0cd202015-10-19 11:41:29 +020075
76 // configure the new login
77 servers_set_login ((char *)user, (char *)pass);
78
79 // configure the timeout
80 servers_set_timeout(timeout * 1000);
81
82 // start the servers
83 servers_start();
84
danicamporaf8ee88b2015-03-19 17:06:20 +010085 return mp_const_none;
86}
danicampora2e0cd202015-10-19 11:41:29 +020087
88STATIC const mp_arg_t network_server_args[] = {
89 { MP_QSTR_id, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
90 { MP_QSTR_login, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
91 { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
92};
Paul Sokolovskyeac22e22017-01-04 16:10:42 +030093STATIC mp_obj_t network_server_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
danicampora2e0cd202015-10-19 11:41:29 +020094 // parse args
danicampora36ae4172015-10-19 15:19:34 +020095 mp_map_t kw_args;
96 mp_map_init_fixed_table(&kw_args, n_kw, all_args + n_args);
danicampora2e0cd202015-10-19 11:41:29 +020097 mp_arg_val_t args[MP_ARRAY_SIZE(network_server_args)];
danicampora36ae4172015-10-19 15:19:34 +020098 mp_arg_parse_all(n_args, all_args, &kw_args, MP_ARRAY_SIZE(args), network_server_args, args);
danicampora2e0cd202015-10-19 11:41:29 +020099
100 // check the server id
101 if (args[0].u_obj != MP_OBJ_NULL) {
102 if (mp_obj_get_int(args[0].u_obj) != 0) {
Damien George22a63442017-02-22 12:36:23 +1100103 mp_raise_OSError(MP_ENODEV);
danicampora2e0cd202015-10-19 11:41:29 +0200104 }
105 }
106
107 // setup the object and initialize it
108 network_server_obj_t *self = &network_server_obj;
109 self->base.type = &network_server_type;
110 network_server_init_helper(self, &args[1]);
111
danicampora36ae4172015-10-19 15:19:34 +0200112 return (mp_obj_t)self;
danicampora2e0cd202015-10-19 11:41:29 +0200113}
danicampora2e0cd202015-10-19 11:41:29 +0200114
115STATIC 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}
121STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_server_init_obj, 1, network_server_init);
Daniel Camporacc204822015-06-03 17:28:03 +0200122
123// timeout value given in seconds
124STATIC mp_obj_t network_server_timeout(mp_uint_t n_args, const mp_obj_t *args) {
danicampora2e0cd202015-10-19 11:41:29 +0200125 if (n_args > 1) {
126 uint32_t timeout = mp_obj_get_int(args[1]);
127 servers_set_timeout(timeout * 1000);
Daniel Camporacc204822015-06-03 17:28:03 +0200128 return mp_const_none;
129 } else {
130 // get
131 return mp_obj_new_int(servers_get_timeout() / 1000);
132 }
133}
danicampora2e0cd202015-10-19 11:41:29 +0200134STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_server_timeout_obj, 1, 2, network_server_timeout);
135
136STATIC mp_obj_t network_server_running(mp_obj_t self_in) {
137 // get
138 return mp_obj_new_bool(servers_are_enabled());
139}
140STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_server_running_obj, network_server_running);
141
142STATIC 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}
147STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_server_deinit_obj, network_server_deinit);
danicamporaf8ee88b2015-03-19 17:06:20 +0100148#endif
149
danicampora87856452015-02-06 15:35:48 +0100150STATIC const mp_map_elem_t mp_module_network_globals_table[] = {
danicamporaf8ee88b2015-03-19 17:06:20 +0100151 { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_network) },
152 { MP_OBJ_NEW_QSTR(MP_QSTR_WLAN), (mp_obj_t)&mod_network_nic_type_wlan },
danicamporaf8ee88b2015-03-19 17:06:20 +0100153
154#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
danicamporaadd930c2016-02-22 22:51:22 +0100155 { MP_OBJ_NEW_QSTR(MP_QSTR_Server), (mp_obj_t)&network_server_type },
danicamporaf8ee88b2015-03-19 17:06:20 +0100156#endif
danicampora87856452015-02-06 15:35:48 +0100157};
158
159STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table);
160
161const mp_obj_module_t mp_module_network = {
162 .base = { &mp_type_module },
danicampora87856452015-02-06 15:35:48 +0100163 .globals = (mp_obj_dict_t*)&mp_module_network_globals,
164};
danicampora2e0cd202015-10-19 11:41:29 +0200165
166#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
167STATIC const mp_map_elem_t network_server_locals_dict_table[] = {
168 { MP_OBJ_NEW_QSTR(MP_QSTR_init), (mp_obj_t)&network_server_init_obj },
169 { MP_OBJ_NEW_QSTR(MP_QSTR_deinit), (mp_obj_t)&network_server_deinit_obj },
170 { MP_OBJ_NEW_QSTR(MP_QSTR_timeout), (mp_obj_t)&network_server_timeout_obj },
danicampora36ae4172015-10-19 15:19:34 +0200171 { MP_OBJ_NEW_QSTR(MP_QSTR_isrunning), (mp_obj_t)&network_server_running_obj },
danicampora2e0cd202015-10-19 11:41:29 +0200172};
173
174STATIC MP_DEFINE_CONST_DICT(network_server_locals_dict, network_server_locals_dict_table);
175
176STATIC const mp_obj_type_t network_server_type = {
177 { &mp_type_type },
danicamporaadd930c2016-02-22 22:51:22 +0100178 .name = MP_QSTR_Server,
danicampora36ae4172015-10-19 15:19:34 +0200179 .make_new = network_server_make_new,
danicampora2e0cd202015-10-19 11:41:29 +0200180 .locals_dict = (mp_obj_t)&network_server_locals_dict,
181};
182#endif