Merge remote-tracking branch 'micropython/master'
Conflicts: README.md - Kept Adafruit README.md intact. py/emitglue.c - Added xtensa architecture as an OR of the define. zephyr/README.md - Fixed spelling mistake.
This commit is contained in:
commit
00a44fa36c
|
@ -130,10 +130,6 @@ void mp_hal_delay_ms(mp_uint_t delay) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NORETURN void mp_hal_raise(int errno) {
|
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, mp_obj_new_int(errno)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void mp_hal_set_interrupt_char (int c) {
|
void mp_hal_set_interrupt_char (int c) {
|
||||||
mpexception_set_interrupt_char (c);
|
mpexception_set_interrupt_char (c);
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,6 @@
|
||||||
extern void HAL_SystemInit (void);
|
extern void HAL_SystemInit (void);
|
||||||
extern void HAL_SystemDeInit (void);
|
extern void HAL_SystemDeInit (void);
|
||||||
extern void HAL_IncrementTick(void);
|
extern void HAL_IncrementTick(void);
|
||||||
extern NORETURN void mp_hal_raise(int errno);
|
|
||||||
extern void mp_hal_set_interrupt_char (int c);
|
extern void mp_hal_set_interrupt_char (int c);
|
||||||
|
|
||||||
#endif /* CC3200_LAUNCHXL_HAL_CC3200_HAL_H_ */
|
#endif /* CC3200_LAUNCHXL_HAL_CC3200_HAL_H_ */
|
||||||
|
|
|
@ -112,7 +112,7 @@ void mp_irq_remove (const mp_obj_t parent) {
|
||||||
|
|
||||||
uint mp_irq_translate_priority (uint priority) {
|
uint mp_irq_translate_priority (uint priority) {
|
||||||
if (priority < 1 || priority > MP_ARRAY_SIZE(mp_irq_priorities)) {
|
if (priority < 1 || priority > MP_ARRAY_SIZE(mp_irq_priorities)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
return mp_irq_priorities[priority - 1];
|
return mp_irq_priorities[priority - 1];
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ STATIC mp_obj_t machine_main(mp_obj_t main) {
|
||||||
if (MP_OBJ_IS_STR(main)) {
|
if (MP_OBJ_IS_STR(main)) {
|
||||||
MP_STATE_PORT(machine_config_main) = main;
|
MP_STATE_PORT(machine_config_main) = main;
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ STATIC mp_obj_t network_server_make_new(const mp_obj_type_t *type, mp_uint_t n_a
|
||||||
// check the server id
|
// check the server id
|
||||||
if (args[0].u_obj != MP_OBJ_NULL) {
|
if (args[0].u_obj != MP_OBJ_NULL) {
|
||||||
if (mp_obj_get_int(args[0].u_obj) != 0) {
|
if (mp_obj_get_int(args[0].u_obj) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ STATIC void hash_update_internal(mp_obj_t self_in, mp_obj_t data, bool digest) {
|
||||||
self->digested = false;
|
self->digested = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ STATIC mp_obj_t hash_read (mp_obj_t self_in) {
|
||||||
}
|
}
|
||||||
} else if (self->c_size < self->b_size) {
|
} else if (self->c_size < self->b_size) {
|
||||||
// it's a fixed len block which is still incomplete
|
// it's a fixed len block which is still incomplete
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self->digested) {
|
if (!self->digested) {
|
||||||
|
|
|
@ -158,7 +158,7 @@ STATIC void mount (mp_obj_t device, const char *path, uint pathlen, bool readonl
|
||||||
#endif
|
#endif
|
||||||
// cannot mount twice or on existing paths
|
// cannot mount twice or on existing paths
|
||||||
if (f_stat(path, &fno) == FR_OK || osmount_find_by_device(device)) {
|
if (f_stat(path, &fno) == FR_OK || osmount_find_by_device(device)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a new object
|
// create a new object
|
||||||
|
@ -196,7 +196,7 @@ STATIC void mount (mp_obj_t device, const char *path, uint pathlen, bool readonl
|
||||||
if (f_mount(&self->fatfs, self->path, 1) != FR_OK) {
|
if (f_mount(&self->fatfs, self->path, 1) != FR_OK) {
|
||||||
// remove it and raise
|
// remove it and raise
|
||||||
mp_obj_list_remove(&MP_STATE_PORT(mount_obj_list), self);
|
mp_obj_list_remove(&MP_STATE_PORT(mount_obj_list), self);
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// mount succeeded, increment the count
|
// mount succeeded, increment the count
|
||||||
|
@ -252,7 +252,7 @@ STATIC mp_obj_t os_chdir(mp_obj_t path_in) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != FR_OK) {
|
if (res != FR_OK) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
@ -263,7 +263,7 @@ STATIC mp_obj_t os_getcwd(void) {
|
||||||
char buf[MICROPY_ALLOC_PATH_MAX + 1];
|
char buf[MICROPY_ALLOC_PATH_MAX + 1];
|
||||||
FRESULT res = f_getcwd(buf, sizeof buf);
|
FRESULT res = f_getcwd(buf, sizeof buf);
|
||||||
if (res != FR_OK) {
|
if (res != FR_OK) {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(fresult_to_errno_table[res])));
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
}
|
}
|
||||||
return mp_obj_new_str(buf, strlen(buf), false);
|
return mp_obj_new_str(buf, strlen(buf), false);
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ STATIC mp_obj_t os_listdir(mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
|
|
||||||
res = f_opendir(&dir, path); /* Open the directory */
|
res = f_opendir(&dir, path); /* Open the directory */
|
||||||
if (res != FR_OK) {
|
if (res != FR_OK) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
|
@ -335,10 +335,10 @@ STATIC mp_obj_t os_mkdir(mp_obj_t path_o) {
|
||||||
case FR_OK:
|
case FR_OK:
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
case FR_EXIST:
|
case FR_EXIST:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_mkdir_obj, os_mkdir);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_mkdir_obj, os_mkdir);
|
||||||
|
@ -351,7 +351,7 @@ STATIC mp_obj_t os_rename(mp_obj_t path_in, mp_obj_t path_out) {
|
||||||
case FR_OK:
|
case FR_OK:
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
default:
|
default:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(os_rename_obj, os_rename);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(os_rename_obj, os_rename);
|
||||||
|
@ -363,7 +363,7 @@ STATIC mp_obj_t os_remove(mp_obj_t path_o) {
|
||||||
case FR_OK:
|
case FR_OK:
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
default:
|
default:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_remove_obj, os_remove);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_remove_obj, os_remove);
|
||||||
|
@ -394,7 +394,7 @@ STATIC mp_obj_t os_stat(mp_obj_t path_in) {
|
||||||
fno.ftime = 0;
|
fno.ftime = 0;
|
||||||
fno.fattrib = AM_DIR;
|
fno.fattrib = AM_DIR;
|
||||||
} else if ((res = f_stat(path, &fno)) != FR_OK) {
|
} else if ((res = f_stat(path, &fno)) != FR_OK) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(fresult_to_errno_table[res])));
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_tuple_t *t = mp_obj_new_tuple(10, NULL);
|
mp_obj_tuple_t *t = mp_obj_new_tuple(10, NULL);
|
||||||
|
@ -481,7 +481,7 @@ STATIC mp_obj_t os_mount(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *k
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_value_invalid_arguments));
|
mp_raise_msg(&mp_type_OSError, mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_KW(os_mount_obj, 2, os_mount);
|
MP_DEFINE_CONST_FUN_OBJ_KW(os_mount_obj, 2, os_mount);
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ STATIC mp_obj_t os_unmount(mp_obj_t path_o) {
|
||||||
|
|
||||||
// '/flash' cannot be unmounted, also not the current working directory
|
// '/flash' cannot be unmounted, also not the current working directory
|
||||||
if (path_equal(path, "/flash")) {
|
if (path_equal(path, "/flash")) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
// now unmount it
|
// now unmount it
|
||||||
|
@ -498,7 +498,7 @@ STATIC mp_obj_t os_unmount(mp_obj_t path_o) {
|
||||||
if ((mount_obj = osmount_find_by_path(path))) {
|
if ((mount_obj = osmount_find_by_path(path))) {
|
||||||
unmount (mount_obj);
|
unmount (mount_obj);
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_msg(&mp_type_ValueError, mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
@ -515,7 +515,7 @@ STATIC mp_obj_t os_mkfs(mp_obj_t device) {
|
||||||
path = mp_obj_str_get_str(device);
|
path = mp_obj_str_get_str(device);
|
||||||
// otherwise the relative path check will pass...
|
// otherwise the relative path check will pass...
|
||||||
if (path[0] != '/') {
|
if (path[0] != '/') {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_value_invalid_arguments));
|
mp_raise_msg(&mp_type_OSError, mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// mount it briefly
|
// mount it briefly
|
||||||
|
@ -541,7 +541,7 @@ STATIC mp_obj_t os_mkfs(mp_obj_t device) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != FR_OK) {
|
if (res != FR_OK) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,7 +156,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_
|
||||||
// create the socket
|
// create the socket
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_socket(s, &_errno) != 0) {
|
if (wlan_socket_socket(s, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
// add the socket to the list
|
// add the socket to the list
|
||||||
modusocket_socket_add(s->sock_base.sd, true);
|
modusocket_socket_add(s->sock_base.sd, true);
|
||||||
|
@ -182,7 +182,7 @@ STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
|
||||||
// call the NIC to bind the socket
|
// call the NIC to bind the socket
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_bind(self, ip, port, &_errno) != 0) {
|
if (wlan_socket_bind(self, ip, port, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -200,7 +200,7 @@ STATIC mp_obj_t socket_listen(mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
|
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_listen(self, backlog, &_errno) != 0) {
|
if (wlan_socket_listen(self, backlog, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
|
||||||
mp_uint_t port;
|
mp_uint_t port;
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_accept(self, socket2, ip, &port, &_errno) != 0) {
|
if (wlan_socket_accept(self, socket2, ip, &port, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the socket to the list
|
// add the socket to the list
|
||||||
|
@ -248,7 +248,7 @@ STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
|
||||||
if (!self->sock_base.cert_req && _errno == SL_ESECSNOVERIFY) {
|
if (!self->sock_base.cert_req && _errno == SL_ESECSNOVERIFY) {
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -262,7 +262,7 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
|
||||||
int _errno;
|
int _errno;
|
||||||
mp_int_t ret = wlan_socket_send(self, bufinfo.buf, bufinfo.len, &_errno);
|
mp_int_t ret = wlan_socket_send(self, bufinfo.buf, bufinfo.len, &_errno);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_obj_new_int_from_uint(ret);
|
return mp_obj_new_int_from_uint(ret);
|
||||||
}
|
}
|
||||||
|
@ -278,9 +278,9 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
|
||||||
mp_int_t ret = wlan_socket_recv(self, (byte*)vstr.buf, len, &_errno);
|
mp_int_t ret = wlan_socket_recv(self, (byte*)vstr.buf, len, &_errno);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (_errno == EAGAIN && self->sock_base.has_timeout) {
|
if (_errno == EAGAIN && self->sock_base.has_timeout) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TimeoutError, "timed out"));
|
mp_raise_msg(&mp_type_TimeoutError, "timed out");
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
return mp_const_empty_bytes;
|
return mp_const_empty_bytes;
|
||||||
|
@ -307,7 +307,7 @@ STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_
|
||||||
int _errno;
|
int _errno;
|
||||||
mp_int_t ret = wlan_socket_sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
|
mp_int_t ret = wlan_socket_sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_obj_new_int(ret);
|
return mp_obj_new_int(ret);
|
||||||
}
|
}
|
||||||
|
@ -324,9 +324,9 @@ STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
|
||||||
mp_int_t ret = wlan_socket_recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
|
mp_int_t ret = wlan_socket_recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (_errno == EAGAIN && self->sock_base.has_timeout) {
|
if (_errno == EAGAIN && self->sock_base.has_timeout) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TimeoutError, "timed out"));
|
mp_raise_msg(&mp_type_TimeoutError, "timed out");
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
mp_obj_t tuple[2];
|
mp_obj_t tuple[2];
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
@ -364,7 +364,7 @@ STATIC mp_obj_t socket_setsockopt(mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
|
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_setsockopt(self, level, opt, optval, optlen, &_errno) != 0) {
|
if (wlan_socket_setsockopt(self, level, opt, optval, optlen, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -384,7 +384,7 @@ STATIC mp_obj_t socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) {
|
||||||
}
|
}
|
||||||
int _errno;
|
int _errno;
|
||||||
if (wlan_socket_settimeout(self, timeout, &_errno) != 0) {
|
if (wlan_socket_settimeout(self, timeout, &_errno) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-_errno)));
|
mp_raise_OSError(-_errno);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -408,7 +408,7 @@ STATIC mp_obj_t socket_makefile(mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
if (n_args > 1) {
|
if (n_args > 1) {
|
||||||
const char *mode = mp_obj_str_get_str(args[1]);
|
const char *mode = mp_obj_str_get_str(args[1]);
|
||||||
if (strcmp(mode, "rb") && strcmp(mode, "wb")) {
|
if (strcmp(mode, "rb") && strcmp(mode, "wb")) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
@ -504,7 +504,7 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
|
||||||
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
|
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
|
||||||
int32_t result = wlan_gethostbyname(host, hlen, out_ip, AF_INET);
|
int32_t result = wlan_gethostbyname(host, hlen, out_ip, AF_INET);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
|
mp_raise_OSError(-result);
|
||||||
}
|
}
|
||||||
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
|
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
|
||||||
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
|
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
|
||||||
|
|
|
@ -131,10 +131,10 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
|
||||||
return ssl_sock;
|
return ssl_sock;
|
||||||
|
|
||||||
socket_error:
|
socket_error:
|
||||||
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno)));
|
mp_raise_OSError(_errno);
|
||||||
|
|
||||||
arg_error:
|
arg_error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_ssl_wrap_socket_obj, 0, mod_ssl_wrap_socket);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_ssl_wrap_socket_obj, 0, mod_ssl_wrap_socket);
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/mpconfig.h"
|
#include "py/mpconfig.h"
|
||||||
#include "py/nlr.h"
|
#include "py/runtime.h"
|
||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
#include "py/smallint.h"
|
#include "py/smallint.h"
|
||||||
#include "py/mphal.h"
|
#include "py/mphal.h"
|
||||||
|
@ -109,7 +109,7 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
|
||||||
|
|
||||||
// localtime generates a tuple of len 8. CPython uses 9, so we accept both.
|
// localtime generates a tuple of len 8. CPython uses 9, so we accept both.
|
||||||
if (len < 8 || len > 9) {
|
if (len < 8 || len > 9) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, mpexception_num_type_invalid_arguments));
|
mp_raise_TypeError(mpexception_num_type_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mp_obj_new_int_from_uint(timeutils_mktime(mp_obj_get_int(elem[0]), mp_obj_get_int(elem[1]), mp_obj_get_int(elem[2]),
|
return mp_obj_new_int_from_uint(timeutils_mktime(mp_obj_get_int(elem[0]), mp_obj_get_int(elem[1]), mp_obj_get_int(elem[2]),
|
||||||
|
|
|
@ -603,7 +603,7 @@ STATIC void wlan_reset (void) {
|
||||||
|
|
||||||
STATIC void wlan_validate_mode (uint mode) {
|
STATIC void wlan_validate_mode (uint mode) {
|
||||||
if (mode != ROLE_STA && mode != ROLE_AP) {
|
if (mode != ROLE_STA && mode != ROLE_AP) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ STATIC void wlan_set_mode (uint mode) {
|
||||||
|
|
||||||
STATIC void wlan_validate_ssid_len (uint32_t len) {
|
STATIC void wlan_validate_ssid_len (uint32_t len) {
|
||||||
if (len > MODWLAN_SSID_LEN_MAX) {
|
if (len > MODWLAN_SSID_LEN_MAX) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -647,7 +647,7 @@ STATIC void wlan_validate_security (uint8_t auth, const char *key, uint8_t len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void wlan_set_security (uint8_t auth, const char *key, uint8_t len) {
|
STATIC void wlan_set_security (uint8_t auth, const char *key, uint8_t len) {
|
||||||
|
@ -670,7 +670,7 @@ STATIC void wlan_set_security (uint8_t auth, const char *key, uint8_t len) {
|
||||||
|
|
||||||
STATIC void wlan_validate_channel (uint8_t channel) {
|
STATIC void wlan_validate_channel (uint8_t channel) {
|
||||||
if (channel < 1 || channel > 11) {
|
if (channel < 1 || channel > 11) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,7 +682,7 @@ STATIC void wlan_set_channel (uint8_t channel) {
|
||||||
#if MICROPY_HW_ANTENNA_DIVERSITY
|
#if MICROPY_HW_ANTENNA_DIVERSITY
|
||||||
STATIC void wlan_validate_antenna (uint8_t antenna) {
|
STATIC void wlan_validate_antenna (uint8_t antenna) {
|
||||||
if (antenna != ANTENNA_TYPE_INTERNAL && antenna != ANTENNA_TYPE_EXTERNAL) {
|
if (antenna != ANTENNA_TYPE_INTERNAL && antenna != ANTENNA_TYPE_EXTERNAL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,7 +847,7 @@ STATIC mp_obj_t wlan_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_ui
|
||||||
if (n_args > 1 || n_kw > 0) {
|
if (n_args > 1 || n_kw > 0) {
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
// start the peripheral
|
// start the peripheral
|
||||||
wlan_init_helper(self, &args[1]);
|
wlan_init_helper(self, &args[1]);
|
||||||
|
@ -871,7 +871,7 @@ STATIC mp_obj_t wlan_scan(mp_obj_t self_in) {
|
||||||
|
|
||||||
// check for correct wlan mode
|
// check for correct wlan mode
|
||||||
if (wlan_obj.mode == ROLE_AP) {
|
if (wlan_obj.mode == ROLE_AP) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
Sl_WlanNetworkEntry_t wlanEntry;
|
Sl_WlanNetworkEntry_t wlanEntry;
|
||||||
|
@ -925,7 +925,7 @@ STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
|
||||||
|
|
||||||
// check for the correct wlan mode
|
// check for the correct wlan mode
|
||||||
if (wlan_obj.mode == ROLE_AP) {
|
if (wlan_obj.mode == ROLE_AP) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse args
|
// parse args
|
||||||
|
@ -973,9 +973,9 @@ STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
|
||||||
modwlan_Status_t status;
|
modwlan_Status_t status;
|
||||||
status = wlan_do_connect (ssid, ssid_len, bssid, auth, key, key_len, timeout);
|
status = wlan_do_connect (ssid, ssid_len, bssid, auth, key, key_len, timeout);
|
||||||
if (status == MODWLAN_ERROR_TIMEOUT) {
|
if (status == MODWLAN_ERROR_TIMEOUT) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
} else if (status == MODWLAN_ERROR_INVALID_PARAMS) {
|
} else if (status == MODWLAN_ERROR_INVALID_PARAMS) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1004,7 @@ STATIC mp_obj_t wlan_ifconfig (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
|
||||||
|
|
||||||
// check the interface id
|
// check the interface id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the configuration
|
// get the configuration
|
||||||
|
@ -1051,7 +1051,7 @@ STATIC mp_obj_t wlan_ifconfig (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
|
||||||
// check for the correct string
|
// check for the correct string
|
||||||
const char *mode = mp_obj_str_get_str(args[1].u_obj);
|
const char *mode = mp_obj_str_get_str(args[1].u_obj);
|
||||||
if (strcmp("dhcp", mode)) {
|
if (strcmp("dhcp", mode)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
// only if we are not in AP mode
|
// only if we are not in AP mode
|
||||||
|
@ -1165,7 +1165,7 @@ STATIC mp_obj_t wlan_mac (mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
mp_buffer_info_t bufinfo;
|
mp_buffer_info_t bufinfo;
|
||||||
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
|
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
|
||||||
if (bufinfo.len != 6) {
|
if (bufinfo.len != 6) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
memcpy(self->mac, bufinfo.buf, SL_MAC_ADDR_LEN);
|
memcpy(self->mac, bufinfo.buf, SL_MAC_ADDR_LEN);
|
||||||
sl_NetCfgSet(SL_MAC_ADDRESS_SET, 1, SL_MAC_ADDR_LEN, (_u8 *)self->mac);
|
sl_NetCfgSet(SL_MAC_ADDRESS_SET, 1, SL_MAC_ADDR_LEN, (_u8 *)self->mac);
|
||||||
|
@ -1201,7 +1201,7 @@ STATIC mp_obj_t wlan_irq (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
|
||||||
return _irq;
|
return _irq;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_irq_obj, 1, wlan_irq);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_irq_obj, 1, wlan_irq);
|
||||||
|
|
||||||
|
@ -1230,18 +1230,18 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_irq_obj, 1, wlan_irq);
|
||||||
//
|
//
|
||||||
// // the call to sl_NetAppSet corrupts the input string URN=args[1], so we copy into a local buffer
|
// // the call to sl_NetAppSet corrupts the input string URN=args[1], so we copy into a local buffer
|
||||||
// if (len > MAX_DEVICE_URN_LEN) {
|
// if (len > MAX_DEVICE_URN_LEN) {
|
||||||
// nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
// mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
// }
|
// }
|
||||||
// strcpy(urn, p);
|
// strcpy(urn, p);
|
||||||
//
|
//
|
||||||
// if (sl_NetAppSet(SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, len, (unsigned char *)urn) < 0) {
|
// if (sl_NetAppSet(SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, len, (unsigned char *)urn) < 0) {
|
||||||
// nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
// mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// else {
|
// else {
|
||||||
// // get the URN
|
// // get the URN
|
||||||
// if (sl_NetAppGet(SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, &len, (uint8_t *)urn) < 0) {
|
// if (sl_NetAppGet(SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, &len, (uint8_t *)urn) < 0) {
|
||||||
// nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
// mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
// }
|
// }
|
||||||
// return mp_obj_new_str(urn, (len - 1), false);
|
// return mp_obj_new_str(urn, (len - 1), false);
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -104,7 +104,7 @@ STATIC void pyb_adc_init (pyb_adc_obj_t *self) {
|
||||||
STATIC void pyb_adc_check_init(void) {
|
STATIC void pyb_adc_check_init(void) {
|
||||||
// not initialized
|
// not initialized
|
||||||
if (!pyb_adc_obj.enabled) {
|
if (!pyb_adc_obj.enabled) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,12 +149,12 @@ STATIC mp_obj_t adc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uin
|
||||||
|
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check the number of bits
|
// check the number of bits
|
||||||
if (args[1].u_int != 12) {
|
if (args[1].u_int != 12) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup the object
|
// setup the object
|
||||||
|
@ -173,7 +173,7 @@ STATIC mp_obj_t adc_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *k
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(args), &pyb_adc_init_args[1], args);
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(args), &pyb_adc_init_args[1], args);
|
||||||
// check the number of bits
|
// check the number of bits
|
||||||
if (args[0].u_int != 12) {
|
if (args[0].u_int != 12) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
pyb_adc_init(pos_args[0]);
|
pyb_adc_init(pos_args[0]);
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
@ -206,11 +206,11 @@ STATIC mp_obj_t adc_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
|
||||||
if (args[0].u_obj != MP_OBJ_NULL) {
|
if (args[0].u_obj != MP_OBJ_NULL) {
|
||||||
ch_id = mp_obj_get_int(args[0].u_obj);
|
ch_id = mp_obj_get_int(args[0].u_obj);
|
||||||
if (ch_id >= PYB_ADC_NUM_CHANNELS) {
|
if (ch_id >= PYB_ADC_NUM_CHANNELS) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_os_resource_not_avaliable));
|
mp_raise_ValueError(mpexception_os_resource_not_avaliable);
|
||||||
} else if (args[1].u_obj != mp_const_none) {
|
} else if (args[1].u_obj != mp_const_none) {
|
||||||
uint pin_ch_id = pin_find_peripheral_type (args[1].u_obj, PIN_FN_ADC, 0);
|
uint pin_ch_id = pin_find_peripheral_type (args[1].u_obj, PIN_FN_ADC, 0);
|
||||||
if (ch_id != pin_ch_id) {
|
if (ch_id != pin_ch_id) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -277,7 +277,7 @@ STATIC mp_obj_t adc_channel_value(mp_obj_t self_in) {
|
||||||
|
|
||||||
// the channel must be enabled
|
// the channel must be enabled
|
||||||
if (!self->enabled) {
|
if (!self->enabled) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait until a new value is available
|
// wait until a new value is available
|
||||||
|
|
|
@ -144,7 +144,7 @@ STATIC bool pyb_i2c_transaction(uint cmd) {
|
||||||
STATIC void pyb_i2c_check_init(pyb_i2c_obj_t *self) {
|
STATIC void pyb_i2c_check_init(pyb_i2c_obj_t *self) {
|
||||||
// not initialized
|
// not initialized
|
||||||
if (!self->baudrate) {
|
if (!self->baudrate) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ STATIC void pyb_i2c_read_into (mp_arg_val_t *args, vstr_t *vstr) {
|
||||||
|
|
||||||
// receive the data
|
// receive the data
|
||||||
if (!pyb_i2c_read(args[0].u_int, (byte *)vstr->buf, vstr->len)) {
|
if (!pyb_i2c_read(args[0].u_int, (byte *)vstr->buf, vstr->len)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ STATIC void pyb_i2c_readmem_into (mp_arg_val_t *args, vstr_t *vstr) {
|
||||||
if (pyb_i2c_mem_addr_write (i2c_addr, (byte *)&mem_addr, mem_addr_size)) {
|
if (pyb_i2c_mem_addr_write (i2c_addr, (byte *)&mem_addr, mem_addr_size)) {
|
||||||
// Read the specified length of data
|
// Read the specified length of data
|
||||||
if (!pyb_i2c_read (i2c_addr, (byte *)vstr->buf, vstr->len)) {
|
if (!pyb_i2c_read (i2c_addr, (byte *)vstr->buf, vstr->len)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -323,7 +323,7 @@ STATIC mp_obj_t pyb_i2c_init_helper(pyb_i2c_obj_t *self, const mp_arg_val_t *arg
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC const mp_arg_t pyb_i2c_init_args[] = {
|
STATIC const mp_arg_t pyb_i2c_init_args[] = {
|
||||||
|
@ -341,7 +341,7 @@ STATIC mp_obj_t pyb_i2c_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp
|
||||||
|
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup the object
|
// setup the object
|
||||||
|
@ -445,7 +445,7 @@ STATIC mp_obj_t pyb_i2c_writeto(mp_uint_t n_args, const mp_obj_t *pos_args, mp_m
|
||||||
|
|
||||||
// send the data
|
// send the data
|
||||||
if (!pyb_i2c_write(args[0].u_int, bufinfo.buf, bufinfo.len, args[2].u_bool)) {
|
if (!pyb_i2c_write(args[0].u_int, bufinfo.buf, bufinfo.len, args[2].u_bool)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the number of bytes written
|
// return the number of bytes written
|
||||||
|
@ -514,7 +514,7 @@ STATIC mp_obj_t pyb_i2c_writeto_mem(mp_uint_t n_args, const mp_obj_t *pos_args,
|
||||||
return mp_obj_new_int(bufinfo.len);
|
return mp_obj_new_int(bufinfo.len);
|
||||||
}
|
}
|
||||||
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_writeto_mem_obj, 1, pyb_i2c_writeto_mem);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_writeto_mem_obj, 1, pyb_i2c_writeto_mem);
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ pin_obj_t *pin_find(mp_obj_t user_obj) {
|
||||||
return pin_obj;
|
return pin_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint strength) {
|
void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint strength) {
|
||||||
|
@ -185,7 +185,7 @@ uint8_t pin_find_peripheral_unit (const mp_obj_t pin, uint8_t fn, uint8_t type)
|
||||||
return pin_o->af_list[i].unit;
|
return pin_o->af_list[i].unit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pin_find_peripheral_type (const mp_obj_t pin, uint8_t fn, uint8_t unit) {
|
uint8_t pin_find_peripheral_type (const mp_obj_t pin, uint8_t fn, uint8_t unit) {
|
||||||
|
@ -195,13 +195,13 @@ uint8_t pin_find_peripheral_type (const mp_obj_t pin, uint8_t fn, uint8_t unit)
|
||||||
return pin_o->af_list[i].type;
|
return pin_o->af_list[i].type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t pin_find_af_index (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type) {
|
int8_t pin_find_af_index (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type) {
|
||||||
int8_t af = pin_obj_find_af(pin, fn, unit, type);
|
int8_t af = pin_obj_find_af(pin, fn, unit, type);
|
||||||
if (af < 0) {
|
if (af < 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
return af;
|
return af;
|
||||||
}
|
}
|
||||||
|
@ -426,18 +426,18 @@ STATIC void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t prio
|
||||||
STATIC void pin_validate_mode (uint mode) {
|
STATIC void pin_validate_mode (uint mode) {
|
||||||
if (mode != GPIO_DIR_MODE_IN && mode != GPIO_DIR_MODE_OUT && mode != PIN_TYPE_OD &&
|
if (mode != GPIO_DIR_MODE_IN && mode != GPIO_DIR_MODE_OUT && mode != PIN_TYPE_OD &&
|
||||||
mode != GPIO_DIR_MODE_ALT && mode != GPIO_DIR_MODE_ALT_OD) {
|
mode != GPIO_DIR_MODE_ALT && mode != GPIO_DIR_MODE_ALT_OD) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
STATIC void pin_validate_pull (uint pull) {
|
STATIC void pin_validate_pull (uint pull) {
|
||||||
if (pull != PIN_TYPE_STD && pull != PIN_TYPE_STD_PU && pull != PIN_TYPE_STD_PD) {
|
if (pull != PIN_TYPE_STD && pull != PIN_TYPE_STD_PU && pull != PIN_TYPE_STD_PD) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void pin_validate_drive(uint strength) {
|
STATIC void pin_validate_drive(uint strength) {
|
||||||
if (strength != PIN_STRENGTH_2MA && strength != PIN_STRENGTH_4MA && strength != PIN_STRENGTH_6MA) {
|
if (strength != PIN_STRENGTH_2MA && strength != PIN_STRENGTH_4MA && strength != PIN_STRENGTH_6MA) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ STATIC void pin_validate_af(const pin_obj_t* pin, int8_t idx, uint8_t *fn, uint8
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC uint8_t pin_get_value (const pin_obj_t* self) {
|
STATIC uint8_t pin_get_value (const pin_obj_t* self) {
|
||||||
|
@ -591,7 +591,7 @@ STATIC mp_obj_t pin_obj_init_helper(pin_obj_t *self, mp_uint_t n_args, const mp_
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
STATIC void pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
||||||
|
@ -905,7 +905,7 @@ STATIC mp_obj_t pin_irq (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *k
|
||||||
return _irq;
|
return _irq;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pin_irq_obj, 1, pin_irq);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pin_irq_obj, 1, pin_irq);
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,7 @@ STATIC uint pyb_rtc_datetime_s_us(const mp_obj_t datetime, uint32_t *seconds) {
|
||||||
|
|
||||||
// verify the tuple
|
// verify the tuple
|
||||||
if (len < 3 || len > 8) {
|
if (len < 3 || len > 8) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
tm.tm_year = mp_obj_get_int(items[0]);
|
tm.tm_year = mp_obj_get_int(items[0]);
|
||||||
|
@ -294,7 +294,7 @@ STATIC mp_obj_t pyb_rtc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp
|
||||||
|
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup the object
|
// setup the object
|
||||||
|
@ -362,7 +362,7 @@ STATIC mp_obj_t pyb_rtc_alarm (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
|
||||||
|
|
||||||
// check the alarm id
|
// check the alarm id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t f_seconds;
|
uint32_t f_seconds;
|
||||||
|
@ -371,7 +371,7 @@ STATIC mp_obj_t pyb_rtc_alarm (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
|
||||||
if (MP_OBJ_IS_TYPE(args[1].u_obj, &mp_type_tuple)) { // datetime tuple given
|
if (MP_OBJ_IS_TYPE(args[1].u_obj, &mp_type_tuple)) { // datetime tuple given
|
||||||
// repeat cannot be used with a datetime tuple
|
// repeat cannot be used with a datetime tuple
|
||||||
if (repeat) {
|
if (repeat) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
f_mseconds = pyb_rtc_datetime_s_us (args[1].u_obj, &f_seconds) / 1000;
|
f_mseconds = pyb_rtc_datetime_s_us (args[1].u_obj, &f_seconds) / 1000;
|
||||||
} else { // then it must be an integer
|
} else { // then it must be an integer
|
||||||
|
@ -397,7 +397,7 @@ STATIC mp_obj_t pyb_rtc_alarm_left (mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
|
|
||||||
// only alarm id 0 is available
|
// only alarm id 0 is available
|
||||||
if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
|
if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the current time
|
// get the current time
|
||||||
|
@ -415,7 +415,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_rtc_alarm_left_obj, 1, 2, pyb_rtc
|
||||||
STATIC mp_obj_t pyb_rtc_alarm_cancel (mp_uint_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t pyb_rtc_alarm_cancel (mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
// only alarm id 0 is available
|
// only alarm id 0 is available
|
||||||
if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
|
if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
// disable the alarm
|
// disable the alarm
|
||||||
pyb_rtc_disable_alarm();
|
pyb_rtc_disable_alarm();
|
||||||
|
@ -453,7 +453,7 @@ STATIC mp_obj_t pyb_rtc_irq (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
|
||||||
return _irq;
|
return _irq;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_rtc_irq_obj, 1, pyb_rtc_irq);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_rtc_irq_obj, 1, pyb_rtc_irq);
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ STATIC mp_obj_t pyb_sd_init_helper (pybsd_obj_t *self, const mp_arg_val_t *args)
|
||||||
|
|
||||||
pyb_sd_hw_init (self);
|
pyb_sd_hw_init (self);
|
||||||
if (sd_disk_init() != 0) {
|
if (sd_disk_init() != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// register it with the sleep module
|
// register it with the sleep module
|
||||||
|
@ -132,7 +132,7 @@ STATIC mp_obj_t pyb_sd_make_new (const mp_obj_type_t *type, mp_uint_t n_args, mp
|
||||||
|
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup and initialize the object
|
// setup and initialize the object
|
||||||
|
|
|
@ -131,7 +131,7 @@ STATIC void pybspi_rx (pyb_spi_obj_t *self, void *data) {
|
||||||
|
|
||||||
STATIC void pybspi_transfer (pyb_spi_obj_t *self, const char *txdata, char *rxdata, uint32_t len, uint32_t *txchar) {
|
STATIC void pybspi_transfer (pyb_spi_obj_t *self, const char *txdata, char *rxdata, uint32_t len, uint32_t *txchar) {
|
||||||
if (!self->baudrate) {
|
if (!self->baudrate) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
// send and receive the data
|
// send and receive the data
|
||||||
MAP_SPICSEnable(GSPI_BASE);
|
MAP_SPICSEnable(GSPI_BASE);
|
||||||
|
@ -218,7 +218,7 @@ STATIC mp_obj_t pyb_spi_init_helper(pyb_spi_obj_t *self, const mp_arg_val_t *arg
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const mp_arg_t pyb_spi_init_args[] = {
|
static const mp_arg_t pyb_spi_init_args[] = {
|
||||||
|
@ -240,7 +240,7 @@ STATIC mp_obj_t pyb_spi_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp
|
||||||
|
|
||||||
// check the peripheral id
|
// check the peripheral id
|
||||||
if (args[0].u_int != 0) {
|
if (args[0].u_int != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup the object
|
// setup the object
|
||||||
|
@ -295,7 +295,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(pyb_spi_write_obj, pyb_spi_write);
|
||||||
STATIC mp_obj_t pyb_spi_read(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t pyb_spi_read(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_nbytes, MP_ARG_REQUIRED | MP_ARG_OBJ, },
|
{ MP_QSTR_nbytes, MP_ARG_REQUIRED | MP_ARG_OBJ, },
|
||||||
{ MP_QSTR_write, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0x00} },
|
{ MP_QSTR_write, MP_ARG_INT, {.u_int = 0x00} },
|
||||||
};
|
};
|
||||||
|
|
||||||
// parse args
|
// parse args
|
||||||
|
@ -319,7 +319,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_spi_read_obj, 1, pyb_spi_read);
|
||||||
STATIC mp_obj_t pyb_spi_readinto(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t pyb_spi_readinto(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_buf, MP_ARG_REQUIRED | MP_ARG_OBJ, },
|
{ MP_QSTR_buf, MP_ARG_REQUIRED | MP_ARG_OBJ, },
|
||||||
{ MP_QSTR_write, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0x00} },
|
{ MP_QSTR_write, MP_ARG_INT, {.u_int = 0x00} },
|
||||||
};
|
};
|
||||||
|
|
||||||
// parse args
|
// parse args
|
||||||
|
@ -357,7 +357,7 @@ STATIC mp_obj_t pyb_spi_write_readinto (mp_obj_t self, mp_obj_t writebuf, mp_obj
|
||||||
// get the read buffer
|
// get the read buffer
|
||||||
mp_get_buffer_raise(readbuf, &bufinfo_read, MP_BUFFER_WRITE);
|
mp_get_buffer_raise(readbuf, &bufinfo_read, MP_BUFFER_WRITE);
|
||||||
if (bufinfo_read.len != bufinfo_write.len) {
|
if (bufinfo_read.len != bufinfo_write.len) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,7 +223,7 @@ STATIC uint32_t compute_prescaler_period_and_match_value(pyb_timer_channel_obj_t
|
||||||
return prescaler;
|
return prescaler;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void timer_init (pyb_timer_obj_t *tim) {
|
STATIC void timer_init (pyb_timer_obj_t *tim) {
|
||||||
|
@ -319,7 +319,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *tim, mp_uint_t n_args, co
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC mp_obj_t pyb_timer_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
|
STATIC mp_obj_t pyb_timer_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
|
||||||
|
@ -329,7 +329,7 @@ STATIC mp_obj_t pyb_timer_make_new(const mp_obj_type_t *type, mp_uint_t n_args,
|
||||||
// create a new Timer object
|
// create a new Timer object
|
||||||
int32_t timer_idx = mp_obj_get_int(args[0]);
|
int32_t timer_idx = mp_obj_get_int(args[0]);
|
||||||
if (timer_idx < 0 || timer_idx > (PYBTIMER_NUM_TIMERS - 1)) {
|
if (timer_idx < 0 || timer_idx > (PYBTIMER_NUM_TIMERS - 1)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
pyb_timer_obj_t *tim = &pyb_timer_obj[timer_idx];
|
pyb_timer_obj_t *tim = &pyb_timer_obj[timer_idx];
|
||||||
|
@ -370,7 +370,7 @@ STATIC mp_obj_t pyb_timer_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp
|
||||||
|
|
||||||
// verify that the timer has been already initialized
|
// verify that the timer has been already initialized
|
||||||
if (!tim->config) {
|
if (!tim->config) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
if (channel_n != TIMER_A && channel_n != TIMER_B && channel_n != (TIMER_A | TIMER_B)) {
|
if (channel_n != TIMER_A && channel_n != TIMER_B && channel_n != (TIMER_A | TIMER_B)) {
|
||||||
// invalid channel
|
// invalid channel
|
||||||
|
@ -440,7 +440,7 @@ STATIC mp_obj_t pyb_timer_channel(mp_uint_t n_args, const mp_obj_t *pos_args, mp
|
||||||
return ch;
|
return ch;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_timer_channel_obj, 2, pyb_timer_channel);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_timer_channel_obj, 2, pyb_timer_channel);
|
||||||
|
|
||||||
|
@ -560,7 +560,7 @@ STATIC mp_obj_t pyb_timer_channel_freq(mp_uint_t n_args, const mp_obj_t *args) {
|
||||||
// set
|
// set
|
||||||
int32_t _frequency = mp_obj_get_int(args[1]);
|
int32_t _frequency = mp_obj_get_int(args[1]);
|
||||||
if (_frequency <= 0) {
|
if (_frequency <= 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
ch->frequency = _frequency;
|
ch->frequency = _frequency;
|
||||||
ch->period = 1000000 / _frequency;
|
ch->period = 1000000 / _frequency;
|
||||||
|
@ -579,7 +579,7 @@ STATIC mp_obj_t pyb_timer_channel_period(mp_uint_t n_args, const mp_obj_t *args)
|
||||||
// set
|
// set
|
||||||
int32_t _period = mp_obj_get_int(args[1]);
|
int32_t _period = mp_obj_get_int(args[1]);
|
||||||
if (_period <= 0) {
|
if (_period <= 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
ch->period = _period;
|
ch->period = _period;
|
||||||
ch->frequency = 1000000 / _period;
|
ch->frequency = 1000000 / _period;
|
||||||
|
@ -712,7 +712,7 @@ STATIC mp_obj_t pyb_timer_channel_irq (mp_uint_t n_args, const mp_obj_t *pos_arg
|
||||||
return _irq;
|
return _irq;
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_timer_channel_irq_obj, 1, pyb_timer_channel_irq);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_timer_channel_irq_obj, 1, pyb_timer_channel_irq);
|
||||||
|
|
||||||
|
|
|
@ -280,7 +280,7 @@ STATIC void UARTGenericIntHandler(uint32_t uart_id) {
|
||||||
STATIC void uart_check_init(pyb_uart_obj_t *self) {
|
STATIC void uart_check_init(pyb_uart_obj_t *self) {
|
||||||
// not initialized
|
// not initialized
|
||||||
if (!self->baudrate) {
|
if (!self->baudrate) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, const mp_arg_val_t *a
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC const mp_arg_t pyb_uart_init_args[] = {
|
STATIC const mp_arg_t pyb_uart_init_args[] = {
|
||||||
|
@ -472,7 +472,7 @@ STATIC mp_obj_t pyb_uart_make_new(const mp_obj_type_t *type, mp_uint_t n_args, m
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uart_id > PYB_UART_1) {
|
if (uart_id > PYB_UART_1) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the correct uart instance
|
// get the correct uart instance
|
||||||
|
@ -556,7 +556,7 @@ STATIC mp_obj_t pyb_uart_irq (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map
|
||||||
return uart_irq_new (self, trigger, priority, args[2].u_obj);
|
return uart_irq_new (self, trigger, priority, args[2].u_obj);
|
||||||
|
|
||||||
invalid_args:
|
invalid_args:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_uart_irq_obj, 1, pyb_uart_irq);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_uart_irq_obj, 1, pyb_uart_irq);
|
||||||
|
|
||||||
|
@ -622,7 +622,7 @@ STATIC mp_uint_t pyb_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t
|
||||||
|
|
||||||
// write the data
|
// write the data
|
||||||
if (!uart_tx_strn(self, buf, size)) {
|
if (!uart_tx_strn(self, buf, size)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_operation_failed);
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,14 +100,14 @@ STATIC mp_obj_t pyb_wdt_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp
|
||||||
mp_arg_parse_all(n_args, all_args, &kw_args, MP_ARRAY_SIZE(args), pyb_wdt_init_args, args);
|
mp_arg_parse_all(n_args, all_args, &kw_args, MP_ARRAY_SIZE(args), pyb_wdt_init_args, args);
|
||||||
|
|
||||||
if (args[0].u_obj != mp_const_none && mp_obj_get_int(args[0].u_obj) > 0) {
|
if (args[0].u_obj != mp_const_none && mp_obj_get_int(args[0].u_obj) > 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable);
|
||||||
}
|
}
|
||||||
uint timeout_ms = args[1].u_int;
|
uint timeout_ms = args[1].u_int;
|
||||||
if (timeout_ms < PYBWDT_MIN_TIMEOUT_MS) {
|
if (timeout_ms < PYBWDT_MIN_TIMEOUT_MS) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
if (pyb_wdt_obj.running) {
|
if (pyb_wdt_obj.running) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
|
mp_raise_msg(&mp_type_OSError, mpexception_os_request_not_possible);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable the WDT peripheral clock
|
// Enable the WDT peripheral clock
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
// options to control how Micro Python is built
|
// options to control how Micro Python is built
|
||||||
|
|
||||||
#define MICROPY_ALLOC_PATH_MAX (128)
|
#define MICROPY_ALLOC_PATH_MAX (128)
|
||||||
|
#define MICROPY_PERSISTENT_CODE_LOAD (1)
|
||||||
#define MICROPY_EMIT_THUMB (0)
|
#define MICROPY_EMIT_THUMB (0)
|
||||||
#define MICROPY_EMIT_INLINE_THUMB (0)
|
#define MICROPY_EMIT_INLINE_THUMB (0)
|
||||||
#define MICROPY_COMP_MODULE_CONST (1)
|
#define MICROPY_COMP_MODULE_CONST (1)
|
||||||
|
|
|
@ -28,10 +28,13 @@
|
||||||
|
|
||||||
#include "py/mpconfig.h"
|
#include "py/mpconfig.h"
|
||||||
#include "py/mpstate.h"
|
#include "py/mpstate.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
#include "py/gc.h"
|
#include "py/gc.h"
|
||||||
#include "py/mpthread.h"
|
#include "py/mpthread.h"
|
||||||
|
#include "py/mphal.h"
|
||||||
#include "mptask.h"
|
#include "mptask.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
#include "irq.h"
|
||||||
|
|
||||||
#if MICROPY_PY_THREAD
|
#if MICROPY_PY_THREAD
|
||||||
|
|
||||||
|
@ -131,7 +134,7 @@ void mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size) {
|
||||||
TaskHandle_t id = xTaskCreateStatic(freertos_entry, "Thread", *stack_size / sizeof(void*), arg, 2, stack, tcb);
|
TaskHandle_t id = xTaskCreateStatic(freertos_entry, "Thread", *stack_size / sizeof(void*), arg, 2, stack, tcb);
|
||||||
if (id == NULL) {
|
if (id == NULL) {
|
||||||
mp_thread_mutex_unlock(&thread_mutex);
|
mp_thread_mutex_unlock(&thread_mutex);
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "can't create thread"));
|
mp_raise_msg(&mp_type_OSError, "can't create thread");
|
||||||
}
|
}
|
||||||
|
|
||||||
// add thread to linked list of all threads
|
// add thread to linked list of all threads
|
||||||
|
@ -165,14 +168,23 @@ void mp_thread_mutex_init(mp_thread_mutex_t *mutex) {
|
||||||
mutex->handle = xSemaphoreCreateMutexStatic(&mutex->buffer);
|
mutex->handle = xSemaphoreCreateMutexStatic(&mutex->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// To allow hard interrupts to work with threading we only take/give the semaphore
|
||||||
|
// if we are not within an interrupt context and interrupts are enabled.
|
||||||
|
|
||||||
int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait) {
|
int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait) {
|
||||||
int ret = xSemaphoreTake(mutex->handle, wait ? portMAX_DELAY : 0);
|
if ((HAL_NVIC_INT_CTRL_REG & HAL_VECTACTIVE_MASK) == 0 && query_irq() == IRQ_STATE_ENABLED) {
|
||||||
return ret == pdTRUE;
|
int ret = xSemaphoreTake(mutex->handle, wait ? portMAX_DELAY : 0);
|
||||||
|
return ret == pdTRUE;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex) {
|
void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex) {
|
||||||
xSemaphoreGive(mutex->handle);
|
if ((HAL_NVIC_INT_CTRL_REG & HAL_VECTACTIVE_MASK) == 0 && query_irq() == IRQ_STATE_ENABLED) {
|
||||||
// TODO check return value
|
xSemaphoreGive(mutex->handle);
|
||||||
|
// TODO check return value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // MICROPY_PY_THREAD
|
#endif // MICROPY_PY_THREAD
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
#include "py/mpconfig.h"
|
#include "py/mpconfig.h"
|
||||||
#include "py/misc.h"
|
#include "py/misc.h"
|
||||||
#include "py/nlr.h"
|
#include "py/runtime.h"
|
||||||
#include "py/mphal.h"
|
#include "py/mphal.h"
|
||||||
#include "serverstask.h"
|
#include "serverstask.h"
|
||||||
#include "simplelink.h"
|
#include "simplelink.h"
|
||||||
|
@ -187,7 +187,7 @@ void servers_close_socket (int16_t *sd) {
|
||||||
|
|
||||||
void servers_set_login (char *user, char *pass) {
|
void servers_set_login (char *user, char *pass) {
|
||||||
if (strlen(user) > SERVERS_USER_PASS_LEN_MAX || strlen(pass) > SERVERS_USER_PASS_LEN_MAX) {
|
if (strlen(user) > SERVERS_USER_PASS_LEN_MAX || strlen(pass) > SERVERS_USER_PASS_LEN_MAX) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX);
|
memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX);
|
||||||
memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
|
memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
|
||||||
|
@ -196,7 +196,7 @@ void servers_set_login (char *user, char *pass) {
|
||||||
void servers_set_timeout (uint32_t timeout) {
|
void servers_set_timeout (uint32_t timeout) {
|
||||||
if (timeout < SERVERS_MIN_TIMEOUT_MS) {
|
if (timeout < SERVERS_MIN_TIMEOUT_MS) {
|
||||||
// timeout is too low
|
// timeout is too low
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
mp_raise_ValueError(mpexception_value_invalid_arguments);
|
||||||
}
|
}
|
||||||
servers_data.timeout = timeout;
|
servers_data.timeout = timeout;
|
||||||
}
|
}
|
||||||
|
|
2
conf.py
2
conf.py
|
@ -69,7 +69,7 @@ copyright = '2014-2016, Damien P. George, Scott Shawcroft, Tony DiCola and other
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '1.8'
|
version = '1.8'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '1.8.4'
|
release = '1.8.5'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
.. currentmodule:: machine
|
.. currentmodule:: machine
|
||||||
|
|
||||||
class SPI -- a master-driven serial protocol
|
class SPI -- a Serial Peripheral Interface bus protocol
|
||||||
============================================
|
=======================================================
|
||||||
|
|
||||||
SPI is a serial protocol that is driven by a master. At the physical level
|
SPI is a serial protocol that is driven by a master. At the physical level,
|
||||||
there are 3 lines: SCK, MOSI, MISO.
|
bus consistens of 3 lines: SCK, MOSI, MISO. Multiple devices can share the
|
||||||
|
same bus. Each device should have a separate, 4th signal, SS (Slave Select),
|
||||||
|
to select a particualr device on a bus with which communication takes place.
|
||||||
|
Management of an SS signal should happen in user code (via machine.Pin class).
|
||||||
|
|
||||||
.. only:: port_wipy
|
.. only:: port_wipy
|
||||||
|
|
||||||
|
@ -21,65 +24,83 @@ there are 3 lines: SCK, MOSI, MISO.
|
||||||
Constructors
|
Constructors
|
||||||
------------
|
------------
|
||||||
|
|
||||||
.. only:: port_wipy
|
.. class:: SPI(id, ...)
|
||||||
|
|
||||||
.. class:: SPI(id, ...)
|
Construct an SPI object on the given bus, ``id``. Values of ``id`` depend
|
||||||
|
on a particular port and its hardware. Values 0, 1, etc. are commonly used
|
||||||
|
to select hardware SPI block #0, #1, etc. Value -1 can be used for
|
||||||
|
bitbanging (software) implementation of SPI (if supported by a port).
|
||||||
|
|
||||||
Construct an SPI object on the given bus. ``id`` can be only 0.
|
With no additional parameters, the SPI object is created but not
|
||||||
With no additional parameters, the SPI object is created but not
|
initialised (it has the settings from the last initialisation of
|
||||||
initialised (it has the settings from the last initialisation of
|
the bus, if any). If extra arguments are given, the bus is initialised.
|
||||||
the bus, if any). If extra arguments are given, the bus is initialised.
|
See ``init`` for parameters of initialisation.
|
||||||
See ``init`` for parameters of initialisation.
|
|
||||||
|
|
||||||
Methods
|
Methods
|
||||||
-------
|
-------
|
||||||
|
|
||||||
.. method:: SPI.init(mode, baudrate=1000000, \*, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, pins=(CLK, MOSI, MISO))
|
.. method:: SPI.init(baudrate=1000000, \*, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, pins=(CLK, MOSI, MISO), sck=None, mosi=None, miso=None)
|
||||||
|
|
||||||
Initialise the SPI bus with the given parameters:
|
Initialise the SPI bus with the given parameters:
|
||||||
|
|
||||||
- ``mode`` must be ``SPI.MASTER``.
|
|
||||||
- ``baudrate`` is the SCK clock rate.
|
- ``baudrate`` is the SCK clock rate.
|
||||||
- ``polarity`` can be 0 or 1, and is the level the idle clock line sits at.
|
- ``polarity`` can be 0 or 1, and is the level the idle clock line sits at.
|
||||||
- ``phase`` can be 0 or 1 to sample data on the first or second clock edge
|
- ``phase`` can be 0 or 1 to sample data on the first or second clock edge
|
||||||
respectively.
|
respectively.
|
||||||
- ``bits`` is the width of each transfer, accepted values are 8, 16 and 32.
|
- ``bits`` is the width in bits of each transfer. Only 8 of is guaranteed to be supported by all hardware.
|
||||||
- ``firstbit`` can be ``SPI.MSB`` only.
|
- ``firstbit`` can be ``SPI.MSB`` or ``SPI.LSB``.
|
||||||
- ``pins`` is an optional tuple with the pins to assign to the SPI bus.
|
- ``pins`` is an optional tuple with the pins to assign to the SPI bus (deprecated, only for WiPy).
|
||||||
|
- ``sck``, ``mosi``, ``miso`` are pins (machine.Pin) objects to use for bus signals. For most
|
||||||
|
hardware SPI blocks (as selected by ``id`` parameter to the constructore), pins are fixed
|
||||||
|
and cannot be changed. In some cases, hardware blocks allow 2-3 alternative pin sets for
|
||||||
|
a hardware SPI block. Arbitrary pin assignments are possible only for a bitbanging SPI driver
|
||||||
|
(``id``=-1).
|
||||||
|
|
||||||
.. method:: SPI.deinit()
|
.. method:: SPI.deinit()
|
||||||
|
|
||||||
Turn off the SPI bus.
|
Turn off the SPI bus.
|
||||||
|
|
||||||
|
.. method:: SPI.read(nbytes, write=0x00)
|
||||||
|
|
||||||
|
Read a number of bytes specified by ``nbytes`` while continuously writing
|
||||||
|
the single byte given by ``write``.
|
||||||
|
Returns a ``bytes`` object with the data that was read.
|
||||||
|
|
||||||
|
.. method:: SPI.readinto(buf, write=0x00)
|
||||||
|
|
||||||
|
Read into the buffer specified by ``buf`` while continuously writing the
|
||||||
|
single byte given by ``write``.
|
||||||
|
Returns ``None``.
|
||||||
|
|
||||||
|
Note: on WiPy this function returns the number of bytes read.
|
||||||
|
|
||||||
.. method:: SPI.write(buf)
|
.. method:: SPI.write(buf)
|
||||||
|
|
||||||
Write the data contained in ``buf``.
|
Write the bytes contained in ``buf``.
|
||||||
Returns the number of bytes written.
|
Returns ``None``.
|
||||||
|
|
||||||
.. method:: SPI.read(nbytes, *, write=0x00)
|
Note: on WiPy this function returns the number of bytes written.
|
||||||
|
|
||||||
Read the ``nbytes`` while writing the data specified by ``write``.
|
|
||||||
Return the number of bytes read.
|
|
||||||
|
|
||||||
.. method:: SPI.readinto(buf, *, write=0x00)
|
|
||||||
|
|
||||||
Read into the buffer specified by ``buf`` while writing the data specified by
|
|
||||||
``write``.
|
|
||||||
Return the number of bytes read.
|
|
||||||
|
|
||||||
.. method:: SPI.write_readinto(write_buf, read_buf)
|
.. method:: SPI.write_readinto(write_buf, read_buf)
|
||||||
|
|
||||||
Write from ``write_buf`` and read into ``read_buf``. Both buffers must have the
|
Write the bytes from ``write_buf`` while reading into ``read_buf``. The
|
||||||
|
buffers can be the same or different, but both buffers must have the
|
||||||
same length.
|
same length.
|
||||||
Returns the number of bytes written
|
Returns ``None``.
|
||||||
|
|
||||||
|
Note: on WiPy this function returns the number of bytes written.
|
||||||
|
|
||||||
Constants
|
Constants
|
||||||
---------
|
---------
|
||||||
|
|
||||||
.. data:: SPI.MASTER
|
.. data:: SPI.MASTER
|
||||||
|
|
||||||
for initialising the SPI bus to master
|
for initialising the SPI bus to master; this is only used for the WiPy
|
||||||
|
|
||||||
.. data:: SPI.MSB
|
.. data:: SPI.MSB
|
||||||
|
|
||||||
set the first bit to be the most significant bit
|
set the first bit to be the most significant bit
|
||||||
|
|
||||||
|
.. data:: SPI.LSB
|
||||||
|
|
||||||
|
set the first bit to be the least significant bit
|
||||||
|
|
|
@ -0,0 +1,456 @@
|
||||||
|
.. _constrained:
|
||||||
|
|
||||||
|
MicroPython on Microcontrollers
|
||||||
|
===============================
|
||||||
|
|
||||||
|
MicroPython is designed to be capable of running on microcontrollers. These
|
||||||
|
have hardware limitations which may be unfamiliar to programmers more familiar
|
||||||
|
with conventional computers. In particular the amount of RAM and nonvolatile
|
||||||
|
"disk" (flash memory) storage is limited. This tutorial offers ways to make
|
||||||
|
the most of the limited resources. Because MicroPython runs on controllers
|
||||||
|
based on a variety of architectures, the methods presented are generic: in some
|
||||||
|
cases it will be necessary to obtain detailed information from platform specific
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
Flash Memory
|
||||||
|
------------
|
||||||
|
|
||||||
|
On the Pyboard the simple way to address the limited capacity is to fit a micro
|
||||||
|
SD card. In some cases this is impractical, either because the device does not
|
||||||
|
have an SD card slot or for reasons of cost or power consumption; hence the
|
||||||
|
on-chip flash must be used. The firmware including the MicroPython subsystem is
|
||||||
|
stored in the onboard flash. The remaining capacity is available for use. For
|
||||||
|
reasons connected with the physical architecture of the flash memory part of
|
||||||
|
this capacity may be inaccessible as a filesystem. In such cases this space may
|
||||||
|
be employed by incorporating user modules into a firmware build which is then
|
||||||
|
flashed to the device.
|
||||||
|
|
||||||
|
There are two ways to achieve this: frozen modules and frozen bytecode. Frozen
|
||||||
|
modules store the Python source with the firmware. Frozen bytecode uses the
|
||||||
|
cross compiler to convert the source to bytecode which is then stored with the
|
||||||
|
firmware. In either case the module may be accessed with an import statement:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
import mymodule
|
||||||
|
|
||||||
|
The procedure for producing frozen modules and bytecode is platform dependent;
|
||||||
|
instructions for building the firmware can be found in the README files in the
|
||||||
|
relevant part of the source tree.
|
||||||
|
|
||||||
|
In general terms the steps are as follows:
|
||||||
|
|
||||||
|
* Clone the MicroPython `repository <https://github.com/micropython/micropython>`_.
|
||||||
|
* Acquire the (platform specific) toolchain to build the firmware.
|
||||||
|
* Build the cross compiler.
|
||||||
|
* Place the modules to be frozen in a specified directory (dependent on whether
|
||||||
|
the module is to be frozen as source or as bytecode).
|
||||||
|
* Build the firmware. A specific command may be required to build frozen
|
||||||
|
code of either type - see the platform documentation.
|
||||||
|
* Flash the firmware to the device.
|
||||||
|
|
||||||
|
RAM
|
||||||
|
---
|
||||||
|
|
||||||
|
When reducing RAM usage there are two phases to consider: compilation and
|
||||||
|
execution. In addition to memory consumption, there is also an issue known as
|
||||||
|
heap fragmentation. In general terms it is best to minimise the repeated
|
||||||
|
creation and destruction of objects. The reason for this is covered in the
|
||||||
|
section covering the `heap`_.
|
||||||
|
|
||||||
|
Compilation Phase
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When a module is imported, MicroPython compiles the code to bytecode which is
|
||||||
|
then executed by the MicroPython virtual machine (VM). The bytecode is stored
|
||||||
|
in RAM. The compiler itself requires RAM, but this becomes available for use
|
||||||
|
when the compilation has completed.
|
||||||
|
|
||||||
|
If a number of modules have already been imported the situation can arise where
|
||||||
|
there is insufficient RAM to run the compiler. In this case the import
|
||||||
|
statement will produce a memory exception.
|
||||||
|
|
||||||
|
If a module instantiates global objects on import it will consume RAM at the
|
||||||
|
time of import, which is then unavailable for the compiler to use on subsequent
|
||||||
|
imports. In general it is best to avoid code which runs on import; a better
|
||||||
|
approach is to have initialisation code which is run by the application after
|
||||||
|
all modules have been imported. This maximises the RAM available to the
|
||||||
|
compiler.
|
||||||
|
|
||||||
|
If RAM is still insufficient to compile all modules one solution is to
|
||||||
|
precompile modules. MicroPython has a cross compiler capable of compiling Python
|
||||||
|
modules to bytecode (see the README in the mpy-cross directory). The resulting
|
||||||
|
bytecode file has a .mpy extension; it may be copied to the filesystem and
|
||||||
|
imported in the usual way. Alternatively some or all modules may be implemented
|
||||||
|
as frozen bytecode: on most platforms this saves even more RAM as the bytecode
|
||||||
|
is run directly from flash rather than being stored in RAM.
|
||||||
|
|
||||||
|
Execution Phase
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
There are a number of coding techniques for reducing RAM usage.
|
||||||
|
|
||||||
|
**Constants**
|
||||||
|
|
||||||
|
MicroPython provides a ``const`` keyword which may be used as follows:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
from micropython import const
|
||||||
|
ROWS = const(33)
|
||||||
|
_COLS = const(0x10)
|
||||||
|
a = ROWS
|
||||||
|
b = _COLS
|
||||||
|
|
||||||
|
In both instances where the constant is assigned to a variable the compiler
|
||||||
|
will avoid coding a lookup to the name of the constant by substituting its
|
||||||
|
literal value. This saves bytecode and hence RAM. However the ``ROWS`` value
|
||||||
|
will occupy at least two machine words, one each for the key and value in the
|
||||||
|
globals dictionary. The presence in the dictionary is necessary because another
|
||||||
|
module might import or use it. This RAM can be saved by prepending the name
|
||||||
|
with an underscore as in ``_COLS``: this symbol is not visible outside the
|
||||||
|
module so will not occupy RAM.
|
||||||
|
|
||||||
|
The argument to ``const()`` may be anything which, at compile time, evaluates
|
||||||
|
to an integer e.g. ``0x100`` or ``1 << 8``. It can even include other const
|
||||||
|
symbols that have already been defined, e.g. ``1 << BIT``.
|
||||||
|
|
||||||
|
**Constant data structures**
|
||||||
|
|
||||||
|
Where there is a substantial volume of constant data and the platform supports
|
||||||
|
execution from Flash, RAM may be saved as follows. The data should be located in
|
||||||
|
Python modules and frozen as bytecode. The data must be defined as ``bytes``
|
||||||
|
objects. The compiler 'knows' that ``bytes`` objects are immutable and ensures
|
||||||
|
that the objects remain in flash memory rather than being copied to RAM. The
|
||||||
|
``ustruct`` module can assist in converting between ``bytes`` types and other
|
||||||
|
Python built-in types.
|
||||||
|
|
||||||
|
When considering the implications of frozen bytecode, note that in Python
|
||||||
|
strings, floats, bytes, integers and complex numbers are immutable. Accordingly
|
||||||
|
these will be frozen into flash. Thus, in the line
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
mystring = "The quick brown fox"
|
||||||
|
|
||||||
|
the actual string "The quick brown fox" will reside in flash. At runtime a
|
||||||
|
reference to the string is assigned to the *variable* ``mystring``. The reference
|
||||||
|
occupies a single machine word. In principle a long integer could be used to
|
||||||
|
store constant data:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
bar = 0xDEADBEEF0000DEADBEEF
|
||||||
|
|
||||||
|
As in the string example, at runtime a reference to the arbitrarily large
|
||||||
|
integer is assigned to the variable ``bar``. That reference occupies a
|
||||||
|
single machine word.
|
||||||
|
|
||||||
|
It might be expected that tuples of integers could be employed for the purpose
|
||||||
|
of storing constant data with minimal RAM use. With the current compiler this
|
||||||
|
is ineffective (the code works, but RAM is not saved).
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
foo = (1, 2, 3, 4, 5, 6, 100000)
|
||||||
|
|
||||||
|
At runtime the tuple will be located in RAM. This may be subject to future
|
||||||
|
improvement.
|
||||||
|
|
||||||
|
**Needless object creation**
|
||||||
|
|
||||||
|
There are a number of situations where objects may unwittingly be created and
|
||||||
|
destroyed. This can reduce the usability of RAM through fragmentation. The
|
||||||
|
following sections discuss instances of this.
|
||||||
|
|
||||||
|
**String concatenation**
|
||||||
|
|
||||||
|
Consider the following code fragments which aim to produce constant strings:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
var = "foo" + "bar"
|
||||||
|
var1 = "foo" "bar"
|
||||||
|
var2 = """\
|
||||||
|
foo\
|
||||||
|
bar"""
|
||||||
|
|
||||||
|
Each produces the same outcome, however the first needlessly creates two string
|
||||||
|
objects at runtime, allocates more RAM for concatenation before producing the
|
||||||
|
third. The others perform the concatenation at compile time which is more
|
||||||
|
efficient, reducing fragmentation.
|
||||||
|
|
||||||
|
Where strings must be dynamically created before being fed to a stream such as
|
||||||
|
a file it will save RAM if this is done in a piecemeal fashion. Rather than
|
||||||
|
creating a large string object, create a substring and feed it to the stream
|
||||||
|
before dealing with the next.
|
||||||
|
|
||||||
|
The best way to create dynamic strings is by means of the string ``format``
|
||||||
|
method:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
var = "Temperature {:5.2f} Pressure {:06d}\n".format(temp, press)
|
||||||
|
|
||||||
|
**Buffers**
|
||||||
|
|
||||||
|
When accessing devices such as instances of UART, I2C and SPI interfaces, using
|
||||||
|
pre-allocated buffers avoids the creation of needless objects. Consider these
|
||||||
|
two loops:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
while True:
|
||||||
|
var = spi.read(100)
|
||||||
|
# process data
|
||||||
|
|
||||||
|
buf = bytearray(100)
|
||||||
|
while True:
|
||||||
|
spi.readinto(buf)
|
||||||
|
# process data in buf
|
||||||
|
|
||||||
|
The first creates a buffer on each pass whereas the second re-uses a pre-allocated
|
||||||
|
buffer; this is both faster and more efficient in terms of memory fragmentation.
|
||||||
|
|
||||||
|
**Bytes are smaller than ints**
|
||||||
|
|
||||||
|
On most platforms an integer consumes four bytes. Consider the two calls to the
|
||||||
|
function ``foo()``:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
def foo(bar):
|
||||||
|
for x in bar:
|
||||||
|
print(x)
|
||||||
|
foo((1, 2, 0xff))
|
||||||
|
foo(b'\1\2\xff')
|
||||||
|
|
||||||
|
In the first call a tuple of integers is created in RAM. The second efficiently
|
||||||
|
creates a ``bytes`` object consuming the minimum amount of RAM. If the module
|
||||||
|
were frozen as bytecode, the ``bytes`` object would reside in flash.
|
||||||
|
|
||||||
|
**Strings Versus Bytes**
|
||||||
|
|
||||||
|
Python3 introduced Unicode support. This introduced a distinction between a
|
||||||
|
string and an array of bytes. MicroPython ensures that Unicode strings take no
|
||||||
|
additional space so long as all characters in the string are ASCII (i.e. have
|
||||||
|
a value < 126). If values in the full 8-bit range are required ``bytes`` and
|
||||||
|
``bytearray`` objects can be used to ensure that no additional space will be
|
||||||
|
required. Note that most string methods (e.g. ``strip()``) apply also to ``bytes``
|
||||||
|
instances so the process of eliminating Unicode can be painless.
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
s = 'the quick brown fox' # A string instance
|
||||||
|
b = b'the quick brown fox' # a bytes instance
|
||||||
|
|
||||||
|
Where it is necessary to convert between strings and bytes the string ``encode``
|
||||||
|
and the bytes ``decode`` methods can be used. Note that both strings and bytes
|
||||||
|
are immutable. Any operation which takes as input such an object and produces
|
||||||
|
another implies at least one RAM allocation to produce the result. In the
|
||||||
|
second line below a new bytes object is allocated. This would also occur if ``foo``
|
||||||
|
were a string.
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
foo = b' empty whitespace'
|
||||||
|
foo = foo.lstrip()
|
||||||
|
|
||||||
|
**Runtime compiler execution**
|
||||||
|
|
||||||
|
The Python keywords ``eval`` and ``exec`` invoke the compiler at runtime, which
|
||||||
|
requires significant amounts of RAM. Note that the ``pickle`` library employs
|
||||||
|
``exec``. It may be more RAM efficient to use the ``json`` library for object
|
||||||
|
serialisation.
|
||||||
|
|
||||||
|
**Storing strings in flash**
|
||||||
|
|
||||||
|
Python strings are immutable hence have the potential to be stored in read only
|
||||||
|
memory. The compiler can place in flash strings defined in Python code. As with
|
||||||
|
frozen modules it is necessary to have a copy of the source tree on the PC and
|
||||||
|
the toolchain to build the firmware. The procedure will work even if the
|
||||||
|
modules have not been fully debugged, so long as they can be imported and run.
|
||||||
|
|
||||||
|
After importing the modules, execute:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
micropython.qstr_info(1)
|
||||||
|
|
||||||
|
Then copy and paste all the Q(xxx) lines into a text editor. Check for and
|
||||||
|
remove lines which are obviously invalid. Open the file qstrdefsport.h which
|
||||||
|
will be found in stmhal (or the equivalent directory for the architecture in
|
||||||
|
use). Copy and paste the corrected lines at the end of the file. Save the file,
|
||||||
|
rebuild and flash the firmware. The outcome can be checked by importing the
|
||||||
|
modules and again issuing:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
micropython.qstr_info(1)
|
||||||
|
|
||||||
|
The Q(xxx) lines should be gone.
|
||||||
|
|
||||||
|
.. _heap:
|
||||||
|
|
||||||
|
The Heap
|
||||||
|
--------
|
||||||
|
|
||||||
|
When a running program instantiates an object the necessary RAM is allocated
|
||||||
|
from a fixed size pool known as the heap. When the object goes out of scope (in
|
||||||
|
other words becomes inaccessible to code) the redundant object is known as
|
||||||
|
"garbage". A process known as "garbage collection" (GC) reclaims that memory,
|
||||||
|
returning it to the free heap. This process runs automatically, however it can
|
||||||
|
be invoked directly by issuing ``gc.collect()``.
|
||||||
|
|
||||||
|
The discourse on this is somewhat involved. For a 'quick fix' issue the
|
||||||
|
following periodically:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
gc.collect()
|
||||||
|
gc.threshold(gc.mem_free() // 4 + gc.mem_alloc())
|
||||||
|
|
||||||
|
Fragmentation
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Say a program creates an object ``foo``, then an object ``bar``. Subsequently
|
||||||
|
``foo`` goes out of scope but ``bar`` remains. The RAM used by ``foo`` will be
|
||||||
|
reclaimed by GC. However if ``bar`` was allocated to a higher address, the
|
||||||
|
RAM reclaimed from ``foo`` will only be of use for objects no bigger than
|
||||||
|
``foo``. In a complex or long running program the heap can become fragmented:
|
||||||
|
despite there being a substantial amount of RAM available, there is insufficient
|
||||||
|
contiguous space to allocate a particular object, and the program fails with a
|
||||||
|
memory error.
|
||||||
|
|
||||||
|
The techniques outlined above aim to minimise this. Where large permanent buffers
|
||||||
|
or other objects are required it is best to instantiate these early in the
|
||||||
|
process of program execution before fragmentation can occur. Further improvements
|
||||||
|
may be made by monitoring the state of the heap and by controlling GC; these are
|
||||||
|
outlined below.
|
||||||
|
|
||||||
|
Reporting
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
A number of library functions are available to report on memory allocation and
|
||||||
|
to control GC. These are to be found in the ``gc`` and ``micropython`` modules.
|
||||||
|
The following example may be pasted at the REPL (``ctrl e`` to enter paste mode,
|
||||||
|
``ctrl d`` to run it).
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
import gc
|
||||||
|
import micropython
|
||||||
|
gc.collect()
|
||||||
|
micropython.mem_info()
|
||||||
|
print('-----------------------------')
|
||||||
|
print('Initial free: {} allocated: {}'.format(gc.mem_free(), gc.mem_alloc()))
|
||||||
|
def func():
|
||||||
|
a = bytearray(10000)
|
||||||
|
gc.collect()
|
||||||
|
print('Func definition: {} allocated: {}'.format(gc.mem_free(), gc.mem_alloc()))
|
||||||
|
func()
|
||||||
|
print('Func run free: {} allocated: {}'.format(gc.mem_free(), gc.mem_alloc()))
|
||||||
|
gc.collect()
|
||||||
|
print('Garbage collect free: {} allocated: {}'.format(gc.mem_free(), gc.mem_alloc()))
|
||||||
|
print('-----------------------------')
|
||||||
|
micropython.mem_info(1)
|
||||||
|
|
||||||
|
Methods employed above:
|
||||||
|
|
||||||
|
* ``gc.collect()`` Force a garbage collection. See footnote.
|
||||||
|
* ``micropython.mem_info()`` Print a summary of RAM utilisation.
|
||||||
|
* ``gc.mem_free()`` Return the free heap size in bytes.
|
||||||
|
* ``gc.mem_alloc()`` Return the number of bytes currently allocated.
|
||||||
|
* ``micropython.mem_info(1)`` Print a table of heap utilisation (detailed below).
|
||||||
|
|
||||||
|
The numbers produced are dependent on the platform, but it can be seen that
|
||||||
|
declaring the function uses a small amount of RAM in the form of bytecode
|
||||||
|
emitted by the compiler (the RAM used by the compiler has been reclaimed).
|
||||||
|
Running the function uses over 10KiB, but on return ``a`` is garbage because it
|
||||||
|
is out of scope and cannot be referenced. The final ``gc.collect()`` recovers
|
||||||
|
that memory.
|
||||||
|
|
||||||
|
The final output produced by ``micropython.mem_info(1)`` will vary in detail but
|
||||||
|
may be interpreted as follows:
|
||||||
|
|
||||||
|
====== =================
|
||||||
|
Symbol Meaning
|
||||||
|
====== =================
|
||||||
|
. free block
|
||||||
|
h head block
|
||||||
|
= tail block
|
||||||
|
m marked head block
|
||||||
|
T tuple
|
||||||
|
L list
|
||||||
|
D dict
|
||||||
|
F float
|
||||||
|
B byte code
|
||||||
|
M module
|
||||||
|
====== =================
|
||||||
|
|
||||||
|
Each letter represents a single block of memory, a block being 16 bytes. So each
|
||||||
|
line of the heap dump represents 0x400 bytes or 1KiB of RAM.
|
||||||
|
|
||||||
|
Control of Garbage Collection
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A GC can be demanded at any time by issuing ``gc.collect()``. It is advantageous
|
||||||
|
to do this at intervals, firstly to pre-empt fragmentation and secondly for
|
||||||
|
performance. A GC can take several milliseconds but is quicker when there is
|
||||||
|
little work to do (about 1ms on the Pyboard). An explicit call can minimise that
|
||||||
|
delay while ensuring it occurs at points in the program when it is acceptable.
|
||||||
|
|
||||||
|
Automatic GC is provoked under the following circumstances. When an attempt at
|
||||||
|
allocation fails, a GC is performed and the allocation re-tried. Only if this
|
||||||
|
fails is an exception raised. Secondly an automatic GC will be triggered if the
|
||||||
|
amount of free RAM falls below a threshold. This threshold can be adapted as
|
||||||
|
execution progresses:
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
gc.collect()
|
||||||
|
gc.threshold(gc.mem_free() // 4 + gc.mem_alloc())
|
||||||
|
|
||||||
|
This will provoke a GC when more than 25% of the currently free heap becomes
|
||||||
|
occupied.
|
||||||
|
|
||||||
|
In general modules should instantiate data objects at runtime using constructors
|
||||||
|
or other initialisation functions. The reason is that if this occurs on
|
||||||
|
initialisation the compiler may be starved of RAM when subsequent modules are
|
||||||
|
imported. If modules do instantiate data on import then ``gc.collect()`` issued
|
||||||
|
after the import will ameliorate the problem.
|
||||||
|
|
||||||
|
String Operations
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
MicroPython handles strings in an efficient manner and understanding this can
|
||||||
|
help in designing applications to run on microcontrollers. When a module
|
||||||
|
is compiled, strings which occur multiple times are stored once only, a process
|
||||||
|
known as string interning. In MicroPython an interned string is known as a ``qstr``.
|
||||||
|
In a module imported normally that single instance will be located in RAM, but
|
||||||
|
as described above, in modules frozen as bytecode it will be located in flash.
|
||||||
|
|
||||||
|
String comparisons are also performed efficiently using hashing rather than
|
||||||
|
character by character. The penalty for using strings rather than integers may
|
||||||
|
hence be small both in terms of performance and RAM usage - a fact which may
|
||||||
|
come as a surprise to C programmers.
|
||||||
|
|
||||||
|
Postscript
|
||||||
|
----------
|
||||||
|
|
||||||
|
MicroPython passes, returns and (by default) copies objects by reference. A
|
||||||
|
reference occupies a single machine word so these processes are efficient in
|
||||||
|
RAM usage and speed.
|
||||||
|
|
||||||
|
Where variables are required whose size is neither a byte nor a machine word
|
||||||
|
there are standard libraries which can assist in storing these efficiently and
|
||||||
|
in performing conversions. See the ``array``, ``ustruct`` and ``uctypes``
|
||||||
|
modules.
|
||||||
|
|
||||||
|
Footnote: gc.collect() return value
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On Unix and Windows platforms the ``gc.collect()`` method returns an integer
|
||||||
|
which signifies the number of distinct memory regions that were reclaimed in the
|
||||||
|
collection (more precisely, the number of heads that were turned into frees). For
|
||||||
|
efficiency reasons bare metal ports do not return this value.
|
|
@ -15,6 +15,7 @@ MicroPython are described in the sections here.
|
||||||
repl.rst
|
repl.rst
|
||||||
isr_rules.rst
|
isr_rules.rst
|
||||||
speed_python.rst
|
speed_python.rst
|
||||||
|
constrained.rst
|
||||||
|
|
||||||
.. only:: port_pyboard
|
.. only:: port_pyboard
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,19 @@ MICROPY_PY_USSL = 1
|
||||||
MICROPY_SSL_AXTLS = 1
|
MICROPY_SSL_AXTLS = 1
|
||||||
MICROPY_PY_BTREE = 1
|
MICROPY_PY_BTREE = 1
|
||||||
|
|
||||||
|
FROZEN_DIR = scripts
|
||||||
|
FROZEN_MPY_DIR = modules
|
||||||
|
|
||||||
# include py core make definitions
|
# include py core make definitions
|
||||||
include ../py/py.mk
|
include ../py/py.mk
|
||||||
|
|
||||||
MPY_CROSS = ../mpy-cross/mpy-cross
|
MPY_CROSS = ../mpy-cross/mpy-cross
|
||||||
MPY_TOOL = ../tools/mpy-tool.py
|
MPY_TOOL = ../tools/mpy-tool.py
|
||||||
MAKE_FROZEN = ../tools/make-frozen.py
|
|
||||||
|
|
||||||
FROZEN_DIR = scripts
|
|
||||||
FROZEN_MPY_DIR = modules
|
|
||||||
PORT ?= /dev/ttyACM0
|
PORT ?= /dev/ttyACM0
|
||||||
BAUD ?= 115200
|
BAUD ?= 115200
|
||||||
FLASH_MODE ?= qio
|
FLASH_MODE ?= qio
|
||||||
FLASH_SIZE ?= 8m
|
FLASH_SIZE ?= detect
|
||||||
CROSS_COMPILE = xtensa-lx106-elf-
|
CROSS_COMPILE = xtensa-lx106-elf-
|
||||||
ESP_SDK = $(shell $(CC) -print-sysroot)/usr
|
ESP_SDK = $(shell $(CC) -print-sysroot)/usr
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ SRC_C = \
|
||||||
main.c \
|
main.c \
|
||||||
help.c \
|
help.c \
|
||||||
esp_mphal.c \
|
esp_mphal.c \
|
||||||
|
esp_init_data.c \
|
||||||
gccollect.c \
|
gccollect.c \
|
||||||
lexerstr32.c \
|
lexerstr32.c \
|
||||||
uart.c \
|
uart.c \
|
||||||
|
@ -90,7 +91,6 @@ SRC_C = \
|
||||||
modmachine.c \
|
modmachine.c \
|
||||||
modonewire.c \
|
modonewire.c \
|
||||||
ets_alt_task.c \
|
ets_alt_task.c \
|
||||||
$(BUILD)/frozen.c \
|
|
||||||
fatfs_port.c \
|
fatfs_port.c \
|
||||||
axtls_helpers.c \
|
axtls_helpers.c \
|
||||||
hspi.c \
|
hspi.c \
|
||||||
|
|
|
@ -20,7 +20,7 @@ PHDRS
|
||||||
irom0_0_phdr PT_LOAD;
|
irom0_0_phdr PT_LOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTRY(call_user_start)
|
ENTRY(firmware_start)
|
||||||
EXTERN(_DebugExceptionVector)
|
EXTERN(_DebugExceptionVector)
|
||||||
EXTERN(_DoubleExceptionVector)
|
EXTERN(_DoubleExceptionVector)
|
||||||
EXTERN(_KernelExceptionVector)
|
EXTERN(_KernelExceptionVector)
|
||||||
|
@ -130,8 +130,10 @@ SECTIONS
|
||||||
|
|
||||||
*stmhal/pybstdio.o(.literal*, .text*)
|
*stmhal/pybstdio.o(.literal*, .text*)
|
||||||
|
|
||||||
|
build/main.o(.literal* .text*)
|
||||||
*gccollect.o(.literal* .text*)
|
*gccollect.o(.literal* .text*)
|
||||||
*gchelper.o(.literal* .text*)
|
*gchelper.o(.literal* .text*)
|
||||||
|
*help.o(.literal* .text*)
|
||||||
*lexerstr32.o(.literal* .text*)
|
*lexerstr32.o(.literal* .text*)
|
||||||
*utils.o(.literal* .text*)
|
*utils.o(.literal* .text*)
|
||||||
*modpyb.o(.literal*, .text*)
|
*modpyb.o(.literal*, .text*)
|
||||||
|
@ -141,6 +143,7 @@ SECTIONS
|
||||||
*modpybadc.o(.literal*, .text*)
|
*modpybadc.o(.literal*, .text*)
|
||||||
*modpybuart.o(.literal*, .text*)
|
*modpybuart.o(.literal*, .text*)
|
||||||
*modpybi2c.o(.literal*, .text*)
|
*modpybi2c.o(.literal*, .text*)
|
||||||
|
*modmachine.o(.literal*, .text*)
|
||||||
*modmachinewdt.o(.literal*, .text*)
|
*modmachinewdt.o(.literal*, .text*)
|
||||||
*modpybspi.o(.literal*, .text*)
|
*modpybspi.o(.literal*, .text*)
|
||||||
*modpybhspi.o(.literal*, .text*)
|
*modpybhspi.o(.literal*, .text*)
|
||||||
|
@ -199,7 +202,8 @@ SECTIONS
|
||||||
*(.entry.text)
|
*(.entry.text)
|
||||||
*(.init.literal)
|
*(.init.literal)
|
||||||
*(.init)
|
*(.init)
|
||||||
*(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
|
*(.literal .text .literal.* .text.* .iram0.literal .iram0.text .iram0.text.*.literal .iram0.text.*)
|
||||||
|
*(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
|
||||||
*(.fini.literal)
|
*(.fini.literal)
|
||||||
*(.fini)
|
*(.fini)
|
||||||
*(.gnu.version)
|
*(.gnu.version)
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 Paul Sokolovsky
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "etshal.h"
|
||||||
|
#include "esp_mphal.h"
|
||||||
|
#include "user_interface.h"
|
||||||
|
#include "extmod/misc.h"
|
||||||
|
|
||||||
|
uint32_t SPIRead(uint32_t offset, void *buf, uint32_t len);
|
||||||
|
uint32_t SPIWrite(uint32_t offset, const void *buf, uint32_t len);
|
||||||
|
uint32_t SPIEraseSector(int sector);
|
||||||
|
NORETURN void call_user_start(void);
|
||||||
|
void ets_printf(const char *fmt, ...);
|
||||||
|
extern char flashchip;
|
||||||
|
|
||||||
|
static const uint8_t default_init_data[] __attribute__((aligned(4))) = {
|
||||||
|
0x05, 0x00, 0x04, 0x02, 0x05, 0x05, 0x05, 0x02, 0x05, 0x00, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05,
|
||||||
|
0x04, 0xfe, 0xfd, 0xff, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe1, 0x0a, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0xf8, 0xf8, 0x52, 0x4e, 0x4a, 0x44, 0x40, 0x38, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xe1, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x93, 0x43, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
void firmware_start(void) {
|
||||||
|
// For SDK 1.5.2, either address has shifted and not mirrored in
|
||||||
|
// eagle.rom.addr.v6.ld, or extra initial member was added.
|
||||||
|
SpiFlashChip *flash = (SpiFlashChip*)(&flashchip + 4);
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
SPIRead(flash->chip_size - 4 * 0x1000, buf, sizeof(buf));
|
||||||
|
/*for (int i = 0; i < sizeof(buf); i++) {
|
||||||
|
static char hexf[] = "%x ";
|
||||||
|
ets_printf(hexf, buf[i]);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
bool inited = false;
|
||||||
|
for (int i = 0; i < sizeof(buf); i++) {
|
||||||
|
if (buf[i] != 0xff) {
|
||||||
|
inited = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inited) {
|
||||||
|
static char msg[] = "Writing init data\n";
|
||||||
|
ets_printf(msg);
|
||||||
|
SPIRead((uint32_t)&default_init_data - 0x40200000, buf, sizeof(buf));
|
||||||
|
SPIWrite(flash->chip_size - 4 * 0x1000, buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
asm("j call_user_start");
|
||||||
|
}
|
|
@ -141,7 +141,7 @@ mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) {
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
|
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
|
||||||
|
|
||||||
void nlr_jump_fail(void *val) {
|
void MP_FASTCODE(nlr_jump_fail)(void *val) {
|
||||||
printf("NLR jump failed\n");
|
printf("NLR jump failed\n");
|
||||||
for (;;) {
|
for (;;) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,10 @@ def setup_conn(port, accept_handler):
|
||||||
def accept_conn(listen_sock):
|
def accept_conn(listen_sock):
|
||||||
global client_s
|
global client_s
|
||||||
cl, remote_addr = listen_sock.accept()
|
cl, remote_addr = listen_sock.accept()
|
||||||
|
if uos.dupterm():
|
||||||
|
print("\nConcurrent WebREPL connection from", remote_addr, "rejected")
|
||||||
|
cl.close()
|
||||||
|
return
|
||||||
print("\nWebREPL connection from:", remote_addr)
|
print("\nWebREPL connection from:", remote_addr)
|
||||||
client_s = cl
|
client_s = cl
|
||||||
websocket_helper.server_handshake(cl)
|
websocket_helper.server_handshake(cl)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "modpybrtc.h"
|
#include "modpybrtc.h"
|
||||||
#include "timeutils.h"
|
#include "timeutils.h"
|
||||||
#include "user_interface.h"
|
#include "user_interface.h"
|
||||||
|
#include "extmod/utime_mphal.h"
|
||||||
|
|
||||||
/// \module time - time related functions
|
/// \module time - time related functions
|
||||||
///
|
///
|
||||||
|
@ -99,53 +100,6 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(time_mktime_obj, time_mktime);
|
MP_DEFINE_CONST_FUN_OBJ_1(time_mktime_obj, time_mktime);
|
||||||
|
|
||||||
/// \function sleep(seconds)
|
|
||||||
/// Sleep for the given number of seconds.
|
|
||||||
STATIC mp_obj_t time_sleep(mp_obj_t seconds_o) {
|
|
||||||
#if MICROPY_PY_BUILTINS_FLOAT
|
|
||||||
mp_hal_delay_ms(1000 * mp_obj_get_float(seconds_o));
|
|
||||||
#else
|
|
||||||
mp_hal_delay_ms(1000 * mp_obj_get_int(seconds_o));
|
|
||||||
#endif
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(time_sleep_obj, time_sleep);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_sleep_ms(mp_obj_t arg) {
|
|
||||||
mp_hal_delay_ms(mp_obj_get_int(arg));
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_sleep_ms_obj, time_sleep_ms);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_sleep_us(mp_obj_t arg) {
|
|
||||||
mp_hal_delay_us(mp_obj_get_int(arg));
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_sleep_us_obj, time_sleep_us);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_ticks_ms(void) {
|
|
||||||
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_ms() & MP_SMALL_INT_POSITIVE_MASK);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_ms_obj, time_ticks_ms);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_ticks_us(void) {
|
|
||||||
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_us() & MP_SMALL_INT_POSITIVE_MASK);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_us_obj, time_ticks_us);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_ticks_cpu(void) {
|
|
||||||
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_cpu() & MP_SMALL_INT_POSITIVE_MASK);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_cpu_obj, time_ticks_cpu);
|
|
||||||
|
|
||||||
STATIC mp_obj_t time_ticks_diff(mp_obj_t start_in, mp_obj_t end_in) {
|
|
||||||
// we assume that the arguments come from ticks_xx so are small ints
|
|
||||||
uint32_t start = MP_OBJ_SMALL_INT_VALUE(start_in);
|
|
||||||
uint32_t end = MP_OBJ_SMALL_INT_VALUE(end_in);
|
|
||||||
return MP_OBJ_NEW_SMALL_INT((end - start) & MP_SMALL_INT_POSITIVE_MASK);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(time_ticks_diff_obj, time_ticks_diff);
|
|
||||||
|
|
||||||
/// \function time()
|
/// \function time()
|
||||||
/// Returns the number of seconds, as an integer, since 1/1/2000.
|
/// Returns the number of seconds, as an integer, since 1/1/2000.
|
||||||
STATIC mp_obj_t time_time(void) {
|
STATIC mp_obj_t time_time(void) {
|
||||||
|
@ -159,13 +113,13 @@ STATIC const mp_map_elem_t time_module_globals_table[] = {
|
||||||
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_localtime), (mp_obj_t)&time_localtime_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_localtime), (mp_obj_t)&time_localtime_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_mktime), (mp_obj_t)&time_mktime_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_mktime), (mp_obj_t)&time_mktime_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&time_sleep_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&mp_utime_sleep_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep_ms), (mp_obj_t)&time_sleep_ms_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep_ms), (mp_obj_t)&mp_utime_sleep_ms_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep_us), (mp_obj_t)&time_sleep_us_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep_us), (mp_obj_t)&mp_utime_sleep_us_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_ms), (mp_obj_t)&time_ticks_ms_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_ms), (mp_obj_t)&mp_utime_ticks_ms_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_us), (mp_obj_t)&time_ticks_us_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_us), (mp_obj_t)&mp_utime_ticks_us_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_cpu), (mp_obj_t)&time_ticks_cpu_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_cpu), (mp_obj_t)&mp_utime_ticks_cpu_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_diff), (mp_obj_t)&time_ticks_diff_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_ticks_diff), (mp_obj_t)&mp_utime_ticks_diff_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_time_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_time_obj },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define MICROPY_ALLOC_PARSE_RULE_INC (8)
|
#define MICROPY_ALLOC_PARSE_RULE_INC (8)
|
||||||
#define MICROPY_ALLOC_PARSE_RESULT_INC (8)
|
#define MICROPY_ALLOC_PARSE_RESULT_INC (8)
|
||||||
#define MICROPY_ALLOC_PARSE_CHUNK_INIT (64)
|
#define MICROPY_ALLOC_PARSE_CHUNK_INIT (64)
|
||||||
|
#define MICROPY_PERSISTENT_CODE_LOAD (1)
|
||||||
#define MICROPY_EMIT_X64 (0)
|
#define MICROPY_EMIT_X64 (0)
|
||||||
#define MICROPY_EMIT_THUMB (0)
|
#define MICROPY_EMIT_THUMB (0)
|
||||||
#define MICROPY_EMIT_INLINE_THUMB (0)
|
#define MICROPY_EMIT_INLINE_THUMB (0)
|
||||||
|
@ -17,6 +18,7 @@
|
||||||
#define MICROPY_DEBUG_PRINTER_DEST mp_debug_print
|
#define MICROPY_DEBUG_PRINTER_DEST mp_debug_print
|
||||||
#define MICROPY_ENABLE_GC (1)
|
#define MICROPY_ENABLE_GC (1)
|
||||||
#define MICROPY_STACK_CHECK (1)
|
#define MICROPY_STACK_CHECK (1)
|
||||||
|
#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
|
||||||
#define MICROPY_REPL_EVENT_DRIVEN (0)
|
#define MICROPY_REPL_EVENT_DRIVEN (0)
|
||||||
#define MICROPY_REPL_AUTO_INDENT (1)
|
#define MICROPY_REPL_AUTO_INDENT (1)
|
||||||
#define MICROPY_HELPER_REPL (1)
|
#define MICROPY_HELPER_REPL (1)
|
||||||
|
@ -33,6 +35,7 @@
|
||||||
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
||||||
#define MICROPY_PY_BUILTINS_SET (1)
|
#define MICROPY_PY_BUILTINS_SET (1)
|
||||||
#define MICROPY_PY_BUILTINS_SLICE (1)
|
#define MICROPY_PY_BUILTINS_SLICE (1)
|
||||||
|
#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1)
|
||||||
#define MICROPY_PY_BUILTINS_PROPERTY (1)
|
#define MICROPY_PY_BUILTINS_PROPERTY (1)
|
||||||
#define MICROPY_PY___FILE__ (0)
|
#define MICROPY_PY___FILE__ (0)
|
||||||
#define MICROPY_PY_GC (1)
|
#define MICROPY_PY_GC (1)
|
||||||
|
@ -49,6 +52,7 @@
|
||||||
#define MICROPY_PY_SYS_MAXSIZE (1)
|
#define MICROPY_PY_SYS_MAXSIZE (1)
|
||||||
#define MICROPY_PY_SYS_EXIT (1)
|
#define MICROPY_PY_SYS_EXIT (1)
|
||||||
#define MICROPY_PY_SYS_STDFILES (1)
|
#define MICROPY_PY_SYS_STDFILES (1)
|
||||||
|
#define MICROPY_PY_SYS_STDIO_BUFFER (1)
|
||||||
#define MICROPY_PY_UERRNO (1)
|
#define MICROPY_PY_UERRNO (1)
|
||||||
#define MICROPY_PY_UBINASCII (1)
|
#define MICROPY_PY_UBINASCII (1)
|
||||||
#define MICROPY_PY_UCTYPES (1)
|
#define MICROPY_PY_UCTYPES (1)
|
||||||
|
@ -58,6 +62,7 @@
|
||||||
#define MICROPY_PY_UJSON (1)
|
#define MICROPY_PY_UJSON (1)
|
||||||
#define MICROPY_PY_URANDOM (1)
|
#define MICROPY_PY_URANDOM (1)
|
||||||
#define MICROPY_PY_URE (1)
|
#define MICROPY_PY_URE (1)
|
||||||
|
#define MICROPY_PY_UTIME_MP_HAL (1)
|
||||||
#define MICROPY_PY_UZLIB (1)
|
#define MICROPY_PY_UZLIB (1)
|
||||||
#define MICROPY_PY_LWIP (1)
|
#define MICROPY_PY_LWIP (1)
|
||||||
#define MICROPY_PY_MACHINE (1)
|
#define MICROPY_PY_MACHINE (1)
|
||||||
|
@ -177,4 +182,6 @@ extern const struct _mp_obj_module_t onewire_module;
|
||||||
#define MICROPY_HW_MCU_NAME "ESP8266"
|
#define MICROPY_HW_MCU_NAME "ESP8266"
|
||||||
#define MICROPY_PY_SYS_PLATFORM "esp8266"
|
#define MICROPY_PY_SYS_PLATFORM "esp8266"
|
||||||
|
|
||||||
|
#define MP_FASTCODE(n) __attribute__((section(".iram0.text." #n))) n
|
||||||
|
|
||||||
#define _assert(expr) ((expr) ? (void)0 : __assert_func(__FILE__, __LINE__, __func__, #expr))
|
#define _assert(expr) ((expr) ? (void)0 : __assert_func(__FILE__, __LINE__, __func__, #expr))
|
||||||
|
|
|
@ -272,7 +272,7 @@ STATIC mp_obj_t machine_i2c_scan(mp_obj_t self_in) {
|
||||||
// 7-bit addresses 0b0000xxx and 0b1111xxx are reserved
|
// 7-bit addresses 0b0000xxx and 0b1111xxx are reserved
|
||||||
for (int addr = 0x08; addr < 0x78; ++addr) {
|
for (int addr = 0x08; addr < 0x78; ++addr) {
|
||||||
mp_hal_i2c_start(self);
|
mp_hal_i2c_start(self);
|
||||||
int ack = mp_hal_i2c_write_byte(self, (addr << 1) | 1);
|
int ack = mp_hal_i2c_write_byte(self, (addr << 1));
|
||||||
if (ack) {
|
if (ack) {
|
||||||
mp_obj_list_append(list, MP_OBJ_NEW_SMALL_INT(addr));
|
mp_obj_list_append(list, MP_OBJ_NEW_SMALL_INT(addr));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* This file is part of the Micro Python project, http://micropython.org/
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Damien P. George
|
* Copyright (c) 2014-2016 Damien P. George
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -28,8 +28,10 @@
|
||||||
|
|
||||||
#include "py/nlr.h"
|
#include "py/nlr.h"
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
|
#include "py/objstringio.h"
|
||||||
#include "py/parsenum.h"
|
#include "py/parsenum.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
#include "py/stream.h"
|
||||||
|
|
||||||
#if MICROPY_PY_UJSON
|
#if MICROPY_PY_UJSON
|
||||||
|
|
||||||
|
@ -42,7 +44,7 @@ STATIC mp_obj_t mod_ujson_dumps(mp_obj_t obj) {
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_dumps_obj, mod_ujson_dumps);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_dumps_obj, mod_ujson_dumps);
|
||||||
|
|
||||||
// This function implements a simple non-recursive JSON parser.
|
// The function below implements a simple non-recursive JSON parser.
|
||||||
//
|
//
|
||||||
// The JSON specification is at http://www.ietf.org/rfc/rfc4627.txt
|
// The JSON specification is at http://www.ietf.org/rfc/rfc4627.txt
|
||||||
// The parser here will parse any valid JSON and return the correct
|
// The parser here will parse any valid JSON and return the correct
|
||||||
|
@ -52,13 +54,35 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_dumps_obj, mod_ujson_dumps);
|
||||||
// input is outside it's specs.
|
// input is outside it's specs.
|
||||||
//
|
//
|
||||||
// Most of the work is parsing the primitives (null, false, true, numbers,
|
// Most of the work is parsing the primitives (null, false, true, numbers,
|
||||||
// strings). It does 1 pass over the input string and so is easily extended to
|
// strings). It does 1 pass over the input stream. It tries to be fast and
|
||||||
// being able to parse from a non-seekable stream. It tries to be fast and
|
|
||||||
// small in code size, while not using more RAM than necessary.
|
// small in code size, while not using more RAM than necessary.
|
||||||
STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
|
||||||
mp_uint_t len;
|
typedef struct _ujson_stream_t {
|
||||||
const char *s = mp_obj_str_get_data(obj, &len);
|
mp_obj_t stream_obj;
|
||||||
const char *top = s + len;
|
mp_uint_t (*read)(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode);
|
||||||
|
int errcode;
|
||||||
|
byte cur;
|
||||||
|
} ujson_stream_t;
|
||||||
|
|
||||||
|
#define S_EOF (0) // null is not allowed in json stream so is ok as EOF marker
|
||||||
|
#define S_END(s) ((s).cur == S_EOF)
|
||||||
|
#define S_CUR(s) ((s).cur)
|
||||||
|
#define S_NEXT(s) (ujson_stream_next(&(s)))
|
||||||
|
|
||||||
|
STATIC byte ujson_stream_next(ujson_stream_t *s) {
|
||||||
|
mp_uint_t ret = s->read(s->stream_obj, &s->cur, 1, &s->errcode);
|
||||||
|
if (s->errcode != 0) {
|
||||||
|
mp_raise_OSError(s->errcode);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
s->cur = S_EOF;
|
||||||
|
}
|
||||||
|
return s->cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC mp_obj_t mod_ujson_load(mp_obj_t stream_obj) {
|
||||||
|
const mp_stream_p_t *stream_p = mp_get_stream_raise(stream_obj, MP_STREAM_OP_READ);
|
||||||
|
ujson_stream_t s = {stream_obj, stream_p->read, 0, 0};
|
||||||
vstr_t vstr;
|
vstr_t vstr;
|
||||||
vstr_init(&vstr, 8);
|
vstr_init(&vstr, 8);
|
||||||
mp_obj_list_t stack; // we use a list as a simple stack for nested JSON
|
mp_obj_list_t stack; // we use a list as a simple stack for nested JSON
|
||||||
|
@ -67,41 +91,43 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
mp_obj_t stack_top = MP_OBJ_NULL;
|
mp_obj_t stack_top = MP_OBJ_NULL;
|
||||||
mp_obj_type_t *stack_top_type = NULL;
|
mp_obj_type_t *stack_top_type = NULL;
|
||||||
mp_obj_t stack_key = MP_OBJ_NULL;
|
mp_obj_t stack_key = MP_OBJ_NULL;
|
||||||
|
S_NEXT(s);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
cont:
|
cont:
|
||||||
if (s == top) {
|
if (S_END(s)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mp_obj_t next = MP_OBJ_NULL;
|
mp_obj_t next = MP_OBJ_NULL;
|
||||||
bool enter = false;
|
bool enter = false;
|
||||||
switch (*s) {
|
byte cur = S_CUR(s);
|
||||||
|
S_NEXT(s);
|
||||||
|
switch (cur) {
|
||||||
case ',':
|
case ',':
|
||||||
case ':':
|
case ':':
|
||||||
case ' ':
|
case ' ':
|
||||||
case '\t':
|
case '\t':
|
||||||
case '\n':
|
case '\n':
|
||||||
case '\r':
|
case '\r':
|
||||||
s += 1;
|
|
||||||
goto cont;
|
goto cont;
|
||||||
case 'n':
|
case 'n':
|
||||||
if (s + 3 < top && s[1] == 'u' && s[2] == 'l' && s[3] == 'l') {
|
if (S_CUR(s) == 'u' && S_NEXT(s) == 'l' && S_NEXT(s) == 'l') {
|
||||||
s += 4;
|
S_NEXT(s);
|
||||||
next = mp_const_none;
|
next = mp_const_none;
|
||||||
} else {
|
} else {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
if (s + 4 < top && s[1] == 'a' && s[2] == 'l' && s[3] == 's' && s[4] == 'e') {
|
if (S_CUR(s) == 'a' && S_NEXT(s) == 'l' && S_NEXT(s) == 's' && S_NEXT(s) == 'e') {
|
||||||
s += 5;
|
S_NEXT(s);
|
||||||
next = mp_const_false;
|
next = mp_const_false;
|
||||||
} else {
|
} else {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
if (s + 3 < top && s[1] == 'r' && s[2] == 'u' && s[3] == 'e') {
|
if (S_CUR(s) == 'r' && S_NEXT(s) == 'u' && S_NEXT(s) == 'e') {
|
||||||
s += 4;
|
S_NEXT(s);
|
||||||
next = mp_const_true;
|
next = mp_const_true;
|
||||||
} else {
|
} else {
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -109,11 +135,10 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
vstr_reset(&vstr);
|
vstr_reset(&vstr);
|
||||||
for (s++; s < top && *s != '"';) {
|
for (; !S_END(s) && S_CUR(s) != '"';) {
|
||||||
byte c = *s;
|
byte c = S_CUR(s);
|
||||||
if (c == '\\') {
|
if (c == '\\') {
|
||||||
s++;
|
c = S_NEXT(s);
|
||||||
c = *s;
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'b': c = 0x08; break;
|
case 'b': c = 0x08; break;
|
||||||
case 'f': c = 0x0c; break;
|
case 'f': c = 0x0c; break;
|
||||||
|
@ -121,10 +146,9 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
case 'r': c = 0x0d; break;
|
case 'r': c = 0x0d; break;
|
||||||
case 't': c = 0x09; break;
|
case 't': c = 0x09; break;
|
||||||
case 'u': {
|
case 'u': {
|
||||||
if (s + 4 >= top) { goto fail; }
|
|
||||||
mp_uint_t num = 0;
|
mp_uint_t num = 0;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
c = (*++s | 0x20) - '0';
|
c = (S_NEXT(s) | 0x20) - '0';
|
||||||
if (c > 9) {
|
if (c > 9) {
|
||||||
c -= ('a' - ('9' + 1));
|
c -= ('a' - ('9' + 1));
|
||||||
}
|
}
|
||||||
|
@ -137,27 +161,29 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
}
|
}
|
||||||
vstr_add_byte(&vstr, c);
|
vstr_add_byte(&vstr, c);
|
||||||
str_cont:
|
str_cont:
|
||||||
s++;
|
S_NEXT(s);
|
||||||
}
|
}
|
||||||
if (s == top) {
|
if (S_END(s)) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
s++;
|
S_NEXT(s);
|
||||||
next = mp_obj_new_str(vstr.buf, vstr.len, false);
|
next = mp_obj_new_str(vstr.buf, vstr.len, false);
|
||||||
break;
|
break;
|
||||||
case '-':
|
case '-':
|
||||||
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': {
|
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': {
|
||||||
bool flt = false;
|
bool flt = false;
|
||||||
vstr_reset(&vstr);
|
vstr_reset(&vstr);
|
||||||
for (; s < top; s++) {
|
for (;;) {
|
||||||
if (*s == '.' || *s == 'E' || *s == 'e') {
|
vstr_add_byte(&vstr, cur);
|
||||||
|
cur = S_CUR(s);
|
||||||
|
if (cur == '.' || cur == 'E' || cur == 'e') {
|
||||||
flt = true;
|
flt = true;
|
||||||
} else if (*s == '-' || unichar_isdigit(*s)) {
|
} else if (cur == '-' || unichar_isdigit(cur)) {
|
||||||
// pass
|
// pass
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
vstr_add_byte(&vstr, *s);
|
S_NEXT(s);
|
||||||
}
|
}
|
||||||
if (flt) {
|
if (flt) {
|
||||||
next = mp_parse_num_decimal(vstr.buf, vstr.len, false, false, NULL);
|
next = mp_parse_num_decimal(vstr.buf, vstr.len, false, false, NULL);
|
||||||
|
@ -169,16 +195,13 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
case '[':
|
case '[':
|
||||||
next = mp_obj_new_list(0, NULL);
|
next = mp_obj_new_list(0, NULL);
|
||||||
enter = true;
|
enter = true;
|
||||||
s += 1;
|
|
||||||
break;
|
break;
|
||||||
case '{':
|
case '{':
|
||||||
next = mp_obj_new_dict(0);
|
next = mp_obj_new_dict(0);
|
||||||
enter = true;
|
enter = true;
|
||||||
s += 1;
|
|
||||||
break;
|
break;
|
||||||
case '}':
|
case '}':
|
||||||
case ']': {
|
case ']': {
|
||||||
s += 1;
|
|
||||||
if (stack_top == MP_OBJ_NULL) {
|
if (stack_top == MP_OBJ_NULL) {
|
||||||
// no object at all
|
// no object at all
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -231,10 +254,10 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
}
|
}
|
||||||
success:
|
success:
|
||||||
// eat trailing whitespace
|
// eat trailing whitespace
|
||||||
while (s < top && unichar_isspace(*s)) {
|
while (unichar_isspace(S_CUR(s))) {
|
||||||
s++;
|
S_NEXT(s);
|
||||||
}
|
}
|
||||||
if (s < top) {
|
if (!S_END(s)) {
|
||||||
// unexpected chars
|
// unexpected chars
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -248,11 +271,21 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
fail:
|
fail:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "syntax error in JSON"));
|
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "syntax error in JSON"));
|
||||||
}
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_load_obj, mod_ujson_load);
|
||||||
|
|
||||||
|
STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) {
|
||||||
|
mp_uint_t len;
|
||||||
|
const char *buf = mp_obj_str_get_data(obj, &len);
|
||||||
|
vstr_t vstr = {len, len, (char*)buf, true};
|
||||||
|
mp_obj_stringio_t sio = {{&mp_type_stringio}, &vstr, 0};
|
||||||
|
return mod_ujson_load(MP_OBJ_FROM_PTR(&sio));
|
||||||
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_loads_obj, mod_ujson_loads);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_loads_obj, mod_ujson_loads);
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t mp_module_ujson_globals_table[] = {
|
STATIC const mp_rom_map_elem_t mp_module_ujson_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ujson) },
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ujson) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_dumps), MP_ROM_PTR(&mod_ujson_dumps_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_dumps), MP_ROM_PTR(&mod_ujson_dumps_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_load), MP_ROM_PTR(&mod_ujson_load_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_loads), MP_ROM_PTR(&mod_ujson_loads_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_loads), MP_ROM_PTR(&mod_ujson_loads_obj) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -215,6 +215,16 @@ STATIC mp_uint_t socket_write(mp_obj_t o_in, const void *buf, mp_uint_t size, in
|
||||||
return MP_STREAM_ERROR;
|
return MP_STREAM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
|
||||||
|
// Currently supports only blocking mode
|
||||||
|
(void)self_in;
|
||||||
|
if (!mp_obj_is_true(flag_in)) {
|
||||||
|
mp_not_implemented("");
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
|
||||||
|
|
||||||
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
|
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
|
||||||
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
@ -236,6 +246,7 @@ STATIC const mp_rom_map_elem_t ussl_socket_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socket_close_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socket_close_obj) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016 Damien P. George
|
||||||
|
* Copyright (c) 2016 Paul Sokolovsky
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "py/mpconfig.h"
|
||||||
|
#if MICROPY_PY_UTIME_MP_HAL
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
#include "py/mphal.h"
|
||||||
|
#include "py/smallint.h"
|
||||||
|
#include "extmod/utime_mphal.h"
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_sleep(mp_obj_t seconds_o) {
|
||||||
|
#if MICROPY_PY_BUILTINS_FLOAT
|
||||||
|
mp_hal_delay_ms(1000 * mp_obj_get_float(seconds_o));
|
||||||
|
#else
|
||||||
|
mp_hal_delay_ms(1000 * mp_obj_get_int(seconds_o));
|
||||||
|
#endif
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(mp_utime_sleep_obj, time_sleep);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_sleep_ms(mp_obj_t arg) {
|
||||||
|
mp_int_t ms = mp_obj_get_int(arg);
|
||||||
|
if (ms > 0) {
|
||||||
|
mp_hal_delay_ms(ms);
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(mp_utime_sleep_ms_obj, time_sleep_ms);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_sleep_us(mp_obj_t arg) {
|
||||||
|
mp_int_t us = mp_obj_get_int(arg);
|
||||||
|
if (us > 0) {
|
||||||
|
mp_hal_delay_us(us);
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(mp_utime_sleep_us_obj, time_sleep_us);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_ticks_ms(void) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_ms() & MP_SMALL_INT_POSITIVE_MASK);
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_0(mp_utime_ticks_ms_obj, time_ticks_ms);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_ticks_us(void) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_us() & MP_SMALL_INT_POSITIVE_MASK);
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_0(mp_utime_ticks_us_obj, time_ticks_us);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_ticks_cpu(void) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(mp_hal_ticks_cpu() & MP_SMALL_INT_POSITIVE_MASK);
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_0(mp_utime_ticks_cpu_obj, time_ticks_cpu);
|
||||||
|
|
||||||
|
STATIC mp_obj_t time_ticks_diff(mp_obj_t start_in, mp_obj_t end_in) {
|
||||||
|
// we assume that the arguments come from ticks_xx so are small ints
|
||||||
|
uint32_t start = MP_OBJ_SMALL_INT_VALUE(start_in);
|
||||||
|
uint32_t end = MP_OBJ_SMALL_INT_VALUE(end_in);
|
||||||
|
return MP_OBJ_NEW_SMALL_INT((end - start) & MP_SMALL_INT_POSITIVE_MASK);
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_2(mp_utime_ticks_diff_obj, time_ticks_diff);
|
||||||
|
|
||||||
|
#endif // MICROPY_PY_UTIME_MP_HAL
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016 Damien P. George
|
||||||
|
* Copyright (c) 2016 Paul Sokolovsky
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_sleep_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_sleep_ms_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_sleep_us_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_ticks_ms_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_ticks_us_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_ticks_cpu_obj);
|
||||||
|
MP_DECLARE_CONST_FUN_OBJ(mp_utime_ticks_diff_obj);
|
|
@ -32,6 +32,7 @@ extern "C" {
|
||||||
#define TINF_DONE 1
|
#define TINF_DONE 1
|
||||||
#define TINF_DATA_ERROR (-3)
|
#define TINF_DATA_ERROR (-3)
|
||||||
#define TINF_CHKSUM_ERROR (-4)
|
#define TINF_CHKSUM_ERROR (-4)
|
||||||
|
#define TINF_DICT_ERROR (-5)
|
||||||
|
|
||||||
/* checksum types */
|
/* checksum types */
|
||||||
#define TINF_CHKSUM_NONE 0
|
#define TINF_CHKSUM_NONE 0
|
||||||
|
|
|
@ -361,6 +361,9 @@ static int tinf_inflate_block_data(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt)
|
||||||
/* possibly get more bits from distance code */
|
/* possibly get more bits from distance code */
|
||||||
offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
|
offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
|
||||||
if (d->dict_ring) {
|
if (d->dict_ring) {
|
||||||
|
if (offs > d->dict_size) {
|
||||||
|
return TINF_DICT_ERROR;
|
||||||
|
}
|
||||||
d->lzOff = d->dict_idx - offs;
|
d->lzOff = d->dict_idx - offs;
|
||||||
if (d->lzOff < 0) {
|
if (d->lzOff < 0) {
|
||||||
d->lzOff += d->dict_size;
|
d->lzOff += d->dict_size;
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "py/nlr.h"
|
#include "py/nlr.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
#include "py/mperrno.h"
|
||||||
#include "lib/fatfs/ff.h"
|
#include "lib/fatfs/ff.h"
|
||||||
#include "lib/fatfs/diskio.h"
|
#include "lib/fatfs/diskio.h"
|
||||||
#include "extmod/vfs_fat_file.h"
|
#include "extmod/vfs_fat_file.h"
|
||||||
|
@ -76,24 +77,42 @@ STATIC mp_obj_t fat_vfs_listdir_func(size_t n_args, const mp_obj_t *args) {
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_listdir_obj, 1, 2, fat_vfs_listdir_func);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_listdir_obj, 1, 2, fat_vfs_listdir_func);
|
||||||
|
|
||||||
STATIC mp_obj_t fat_vfs_remove(mp_obj_t vfs_in, mp_obj_t path_in) {
|
STATIC mp_obj_t fat_vfs_remove_internal(mp_obj_t path_in, mp_int_t attr) {
|
||||||
(void)vfs_in;
|
|
||||||
const char *path = mp_obj_str_get_str(path_in);
|
const char *path = mp_obj_str_get_str(path_in);
|
||||||
// TODO check that path is actually a file before trying to unlink it
|
|
||||||
FRESULT res = f_unlink(path);
|
FILINFO fno;
|
||||||
if (res == FR_OK) {
|
#if _USE_LFN
|
||||||
return mp_const_none;
|
fno.lfname = NULL;
|
||||||
} else {
|
fno.lfsize = 0;
|
||||||
|
#endif
|
||||||
|
FRESULT res = f_stat(path, &fno);
|
||||||
|
|
||||||
|
if (res != FR_OK) {
|
||||||
mp_raise_OSError(fresult_to_errno_table[res]);
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if path is a file or directory
|
||||||
|
if ((fno.fattrib & AM_DIR) == attr) {
|
||||||
|
res = f_unlink(path);
|
||||||
|
|
||||||
|
if (res != FR_OK) {
|
||||||
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
} else {
|
||||||
|
mp_raise_OSError(attr ? MP_ENOTDIR : MP_EISDIR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC mp_obj_t fat_vfs_remove(mp_obj_t vfs_in, mp_obj_t path_in) {
|
||||||
|
(void)vfs_in;
|
||||||
|
return fat_vfs_remove_internal(path_in, 0); // 0 == file attribute
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_remove_obj, fat_vfs_remove);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_remove_obj, fat_vfs_remove);
|
||||||
|
|
||||||
STATIC mp_obj_t fat_vfs_rmdir(mp_obj_t vfs_in, mp_obj_t path_in) {
|
STATIC mp_obj_t fat_vfs_rmdir(mp_obj_t vfs_in, mp_obj_t path_in) {
|
||||||
// TODO: Currently just redirects to fat_vfs_remove(), which are
|
(void) vfs_in;
|
||||||
// backed by the same underlying FatFs function. Should at least
|
return fat_vfs_remove_internal(path_in, AM_DIR);
|
||||||
// check that path is actually a dir.
|
|
||||||
return fat_vfs_remove(vfs_in, path_in);
|
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_rmdir_obj, fat_vfs_rmdir);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_rmdir_obj, fat_vfs_rmdir);
|
||||||
|
|
||||||
|
|
|
@ -110,14 +110,20 @@ STATIC mp_uint_t file_obj_write(mp_obj_t self_in, const void *buf, mp_uint_t siz
|
||||||
|
|
||||||
STATIC mp_obj_t file_obj_flush(mp_obj_t self_in) {
|
STATIC mp_obj_t file_obj_flush(mp_obj_t self_in) {
|
||||||
pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
f_sync(&self->fp);
|
FRESULT res = f_sync(&self->fp);
|
||||||
|
if (res != FR_OK) {
|
||||||
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_flush_obj, file_obj_flush);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_flush_obj, file_obj_flush);
|
||||||
|
|
||||||
STATIC mp_obj_t file_obj_close(mp_obj_t self_in) {
|
STATIC mp_obj_t file_obj_close(mp_obj_t self_in) {
|
||||||
pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
f_close(&self->fp);
|
FRESULT res = f_close(&self->fp);
|
||||||
|
if (res != FR_OK) {
|
||||||
|
mp_raise_OSError(fresult_to_errno_table[res]);
|
||||||
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close);
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include "genhdr/mpversion.h"
|
#include "genhdr/mpversion.h"
|
||||||
|
|
||||||
pyexec_mode_kind_t pyexec_mode_kind = PYEXEC_MODE_FRIENDLY_REPL;
|
pyexec_mode_kind_t pyexec_mode_kind = PYEXEC_MODE_FRIENDLY_REPL;
|
||||||
|
int pyexec_system_exit = 0;
|
||||||
STATIC bool repl_display_debugging_info = 0;
|
STATIC bool repl_display_debugging_info = 0;
|
||||||
|
|
||||||
#define EXEC_FLAG_PRINT_EOF (1)
|
#define EXEC_FLAG_PRINT_EOF (1)
|
||||||
|
@ -61,6 +62,9 @@ STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
uint32_t start = 0;
|
uint32_t start = 0;
|
||||||
|
|
||||||
|
// by default a SystemExit exception returns 0
|
||||||
|
pyexec_system_exit = 0;
|
||||||
|
|
||||||
nlr_buf_t nlr;
|
nlr_buf_t nlr;
|
||||||
if (nlr_push(&nlr) == 0) {
|
if (nlr_push(&nlr) == 0) {
|
||||||
mp_obj_t module_fun;
|
mp_obj_t module_fun;
|
||||||
|
@ -99,7 +103,7 @@ STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind,
|
||||||
// check for SystemExit
|
// check for SystemExit
|
||||||
if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_SystemExit)) {
|
if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_SystemExit)) {
|
||||||
// at the moment, the value of SystemExit is unused
|
// at the moment, the value of SystemExit is unused
|
||||||
ret = PYEXEC_FORCED_EXIT;
|
ret = pyexec_system_exit;
|
||||||
} else {
|
} else {
|
||||||
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
|
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -148,7 +152,7 @@ STATIC int pyexec_raw_repl_process_char(int c);
|
||||||
STATIC int pyexec_friendly_repl_process_char(int c);
|
STATIC int pyexec_friendly_repl_process_char(int c);
|
||||||
|
|
||||||
void pyexec_event_repl_init(void) {
|
void pyexec_event_repl_init(void) {
|
||||||
MP_STATE_VM(repl_line) = vstr_new_size(32);
|
MP_STATE_VM(repl_line) = vstr_new(32);
|
||||||
repl.cont_line = false;
|
repl.cont_line = false;
|
||||||
readline_init(MP_STATE_VM(repl_line), ">>> ");
|
readline_init(MP_STATE_VM(repl_line), ">>> ");
|
||||||
if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) {
|
if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) {
|
||||||
|
|
|
@ -33,6 +33,11 @@ typedef enum {
|
||||||
|
|
||||||
extern pyexec_mode_kind_t pyexec_mode_kind;
|
extern pyexec_mode_kind_t pyexec_mode_kind;
|
||||||
|
|
||||||
|
// Set this to the value (eg PYEXEC_FORCED_EXIT) that will be propagated through
|
||||||
|
// the pyexec functions if a SystemExit exception is raised by the running code.
|
||||||
|
// It will reset to 0 at the start of each execution (eg each REPL entry).
|
||||||
|
extern int pyexec_system_exit;
|
||||||
|
|
||||||
#define PYEXEC_FORCED_EXIT (0x100)
|
#define PYEXEC_FORCED_EXIT (0x100)
|
||||||
#define PYEXEC_SWITCH_MODE (0x200)
|
#define PYEXEC_SWITCH_MODE (0x200)
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,7 @@ void mp_arg_check_num(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_ar
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
mp_arg_error_terse_mismatch();
|
mp_arg_error_terse_mismatch();
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "function does not take keyword arguments");
|
||||||
"function does not take keyword arguments"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,8 +115,7 @@ void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n
|
||||||
mp_arg_error_terse_mismatch();
|
mp_arg_error_terse_mismatch();
|
||||||
} else {
|
} else {
|
||||||
// TODO better error message
|
// TODO better error message
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "extra positional arguments given");
|
||||||
"extra positional arguments given"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (kws_found < kws->used) {
|
if (kws_found < kws->used) {
|
||||||
|
@ -125,8 +123,7 @@ void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n
|
||||||
mp_arg_error_terse_mismatch();
|
mp_arg_error_terse_mismatch();
|
||||||
} else {
|
} else {
|
||||||
// TODO better error message
|
// TODO better error message
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "extra keyword arguments given");
|
||||||
"extra keyword arguments given"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +136,7 @@ void mp_arg_parse_all_kw_array(size_t n_pos, size_t n_kw, const mp_obj_t *args,
|
||||||
|
|
||||||
#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE || _MSC_VER
|
#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE || _MSC_VER
|
||||||
NORETURN void mp_arg_error_terse_mismatch(void) {
|
NORETURN void mp_arg_error_terse_mismatch(void) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "argument num/types mismatch"));
|
mp_raise_msg(&mp_type_TypeError, "argument num/types mismatch");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
5
py/bc.c
5
py/bc.c
|
@ -185,7 +185,7 @@ void mp_setup_code_state(mp_code_state_t *code_state, mp_obj_fun_bc_t *self, siz
|
||||||
}
|
}
|
||||||
// Didn't find name match with positional args
|
// Didn't find name match with positional args
|
||||||
if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) == 0) {
|
if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) == 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "function does not take keyword arguments"));
|
mp_raise_msg(&mp_type_TypeError, "function does not take keyword arguments");
|
||||||
}
|
}
|
||||||
mp_obj_dict_store(dict, kwargs[2 * i], kwargs[2 * i + 1]);
|
mp_obj_dict_store(dict, kwargs[2 * i], kwargs[2 * i + 1]);
|
||||||
continue2:;
|
continue2:;
|
||||||
|
@ -234,8 +234,7 @@ continue2:;
|
||||||
} else {
|
} else {
|
||||||
// no keyword arguments given
|
// no keyword arguments given
|
||||||
if (n_kwonly_args != 0) {
|
if (n_kwonly_args != 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "function missing keyword-only argument");
|
||||||
"function missing keyword-only argument"));
|
|
||||||
}
|
}
|
||||||
if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) != 0) {
|
if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) != 0) {
|
||||||
*var_pos_kw_args = mp_obj_new_dict(0);
|
*var_pos_kw_args = mp_obj_new_dict(0);
|
||||||
|
|
|
@ -95,7 +95,7 @@ STATIC mp_obj_t mp_builtin_compile(size_t n_args, const mp_obj_t *args) {
|
||||||
case MP_QSTR_exec: parse_input_kind = MP_PARSE_FILE_INPUT; break;
|
case MP_QSTR_exec: parse_input_kind = MP_PARSE_FILE_INPUT; break;
|
||||||
case MP_QSTR_eval: parse_input_kind = MP_PARSE_EVAL_INPUT; break;
|
case MP_QSTR_eval: parse_input_kind = MP_PARSE_EVAL_INPUT; break;
|
||||||
default:
|
default:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "bad compile mode"));
|
mp_raise_msg(&mp_type_ValueError, "bad compile mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_code_t *code = m_new_obj(mp_obj_code_t);
|
mp_obj_code_t *code = m_new_obj(mp_obj_code_t);
|
||||||
|
|
|
@ -138,7 +138,7 @@ STATIC void do_load_from_lexer(mp_obj_t module_obj, mp_lexer_t *lex, const char
|
||||||
if (lex == NULL) {
|
if (lex == NULL) {
|
||||||
// we verified the file exists using stat, but lexer could still fail
|
// we verified the file exists using stat, but lexer could still fail
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ImportError, "module not found"));
|
mp_raise_msg(&mp_type_ImportError, "module not found");
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
|
||||||
"no module named '%s'", fname));
|
"no module named '%s'", fname));
|
||||||
|
@ -340,7 +340,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
|
||||||
DEBUG_printf("Warning: no dots in current module name and level>0\n");
|
DEBUG_printf("Warning: no dots in current module name and level>0\n");
|
||||||
p = this_name + this_name_l;
|
p = this_name + this_name_l;
|
||||||
} else if (level != -1) {
|
} else if (level != -1) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ImportError, "Invalid relative import"));
|
mp_raise_msg(&mp_type_ImportError, "invalid relative import");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint new_mod_l = (mod_len == 0 ? (size_t)(p - this_name) : (size_t)(p - this_name) + 1 + mod_len);
|
uint new_mod_l = (mod_len == 0 ? (size_t)(p - this_name) : (size_t)(p - this_name) + 1 + mod_len);
|
||||||
|
@ -355,7 +355,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
|
||||||
DEBUG_printf("Resolved base name for relative import: '%s'\n", qstr_str(new_mod_q));
|
DEBUG_printf("Resolved base name for relative import: '%s'\n", qstr_str(new_mod_q));
|
||||||
if (new_mod_q == MP_QSTR_) {
|
if (new_mod_q == MP_QSTR_) {
|
||||||
// CPython raises SystemError
|
// CPython raises SystemError
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ImportError, "cannot perform relative import"));
|
mp_raise_msg(&mp_type_ImportError, "cannot perform relative import");
|
||||||
}
|
}
|
||||||
module_name = MP_OBJ_NEW_QSTR(new_mod_q);
|
module_name = MP_OBJ_NEW_QSTR(new_mod_q);
|
||||||
mod_str = new_mod;
|
mod_str = new_mod;
|
||||||
|
@ -425,7 +425,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
|
||||||
#endif
|
#endif
|
||||||
// couldn't find the file, so fail
|
// couldn't find the file, so fail
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ImportError, "module not found"));
|
mp_raise_msg(&mp_type_ImportError, "module not found");
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
|
||||||
"no module named '%q'", mod_name));
|
"no module named '%q'", mod_name));
|
||||||
|
|
17
py/compile.c
17
py/compile.c
|
@ -2723,15 +2723,8 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
|
||||||
mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn;
|
mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn;
|
||||||
EMIT_ARG(set_source_line, pns->source_line);
|
EMIT_ARG(set_source_line, pns->source_line);
|
||||||
compile_function_t f = compile_function[MP_PARSE_NODE_STRUCT_KIND(pns)];
|
compile_function_t f = compile_function[MP_PARSE_NODE_STRUCT_KIND(pns)];
|
||||||
if (f == NULL) {
|
assert(f != NULL);
|
||||||
#if MICROPY_DEBUG_PRINTERS
|
f(comp, pns);
|
||||||
printf("node %u cannot be compiled\n", (uint)MP_PARSE_NODE_STRUCT_KIND(pns));
|
|
||||||
mp_parse_node_print(pn, 0);
|
|
||||||
#endif
|
|
||||||
compile_syntax_error(comp, pn, "internal compiler error");
|
|
||||||
} else {
|
|
||||||
f(comp, pns);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2836,12 +2829,10 @@ STATIC void compile_scope_func_annotations(compiler_t *comp, mp_parse_node_t pn)
|
||||||
// no annotation
|
// no annotation
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_typedargslist_dbl_star) {
|
} else {
|
||||||
|
assert(MP_PARSE_NODE_STRUCT_KIND(pns) == PN_typedargslist_dbl_star);
|
||||||
// double star with possible annotation
|
// double star with possible annotation
|
||||||
// fallthrough
|
// fallthrough
|
||||||
} else {
|
|
||||||
// no annotation
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_parse_node_t pn_annotation = pns->nodes[1];
|
mp_parse_node_t pn_annotation = pns->nodes[1];
|
||||||
|
|
|
@ -425,7 +425,7 @@ mp_raw_code_t *mp_raw_code_load_file(const char *filename) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__thumb2__) || defined(__thumb__)
|
#elif defined(__thumb2__) || defined(__thumb__) || defined(__xtensa__)
|
||||||
// fatfs file reader (assume thumb2 arch uses fatfs...)
|
// fatfs file reader (assume thumb2 arch uses fatfs...)
|
||||||
|
|
||||||
#include "lib/fatfs/ff.h"
|
#include "lib/fatfs/ff.h"
|
||||||
|
|
12
py/lexer.c
12
py/lexer.c
|
@ -343,7 +343,6 @@ STATIC void mp_lexer_next_token_into(mp_lexer_t *lex, bool first_token) {
|
||||||
lex->tok_kind = MP_TOKEN_NEWLINE;
|
lex->tok_kind = MP_TOKEN_NEWLINE;
|
||||||
|
|
||||||
mp_uint_t num_spaces = lex->column - 1;
|
mp_uint_t num_spaces = lex->column - 1;
|
||||||
lex->emit_dent = 0;
|
|
||||||
if (num_spaces == indent_top(lex)) {
|
if (num_spaces == indent_top(lex)) {
|
||||||
} else if (num_spaces > indent_top(lex)) {
|
} else if (num_spaces > indent_top(lex)) {
|
||||||
indent_push(lex, num_spaces);
|
indent_push(lex, num_spaces);
|
||||||
|
@ -359,16 +358,7 @@ STATIC void mp_lexer_next_token_into(mp_lexer_t *lex, bool first_token) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (is_end(lex)) {
|
} else if (is_end(lex)) {
|
||||||
if (indent_top(lex) > 0) {
|
lex->tok_kind = MP_TOKEN_END;
|
||||||
lex->tok_kind = MP_TOKEN_NEWLINE;
|
|
||||||
lex->emit_dent = 0;
|
|
||||||
while (indent_top(lex) > 0) {
|
|
||||||
indent_pop(lex);
|
|
||||||
lex->emit_dent -= 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lex->tok_kind = MP_TOKEN_END;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (is_char_or(lex, '\'', '\"')
|
} else if (is_char_or(lex, '\'', '\"')
|
||||||
|| (is_char_or3(lex, 'r', 'u', 'b') && is_char_following_or(lex, '\'', '\"'))
|
|| (is_char_or3(lex, 'r', 'u', 'b') && is_char_following_or(lex, '\'', '\"'))
|
||||||
|
|
|
@ -151,8 +151,7 @@ void vstr_init_fixed_buf(vstr_t *vstr, size_t alloc, char *buf);
|
||||||
struct _mp_print_t;
|
struct _mp_print_t;
|
||||||
void vstr_init_print(vstr_t *vstr, size_t alloc, struct _mp_print_t *print);
|
void vstr_init_print(vstr_t *vstr, size_t alloc, struct _mp_print_t *print);
|
||||||
void vstr_clear(vstr_t *vstr);
|
void vstr_clear(vstr_t *vstr);
|
||||||
vstr_t *vstr_new(void);
|
vstr_t *vstr_new(size_t alloc);
|
||||||
vstr_t *vstr_new_size(size_t alloc);
|
|
||||||
void vstr_free(vstr_t *vstr);
|
void vstr_free(vstr_t *vstr);
|
||||||
static inline void vstr_reset(vstr_t *vstr) { vstr->len = 0; }
|
static inline void vstr_reset(vstr_t *vstr) { vstr->len = 0; }
|
||||||
static inline char *vstr_str(vstr_t *vstr) { return vstr->buf; }
|
static inline char *vstr_str(vstr_t *vstr) { return vstr->buf; }
|
||||||
|
|
|
@ -178,7 +178,7 @@ STATIC mp_obj_t mp_builtin_chr(mp_obj_t o_in) {
|
||||||
str[3] = (c & 0x3F) | 0x80;
|
str[3] = (c & 0x3F) | 0x80;
|
||||||
len = 4;
|
len = 4;
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "chr() arg not in range(0x110000)"));
|
mp_raise_msg(&mp_type_ValueError, "chr() arg not in range(0x110000)");
|
||||||
}
|
}
|
||||||
return mp_obj_new_str(str, len, true);
|
return mp_obj_new_str(str, len, true);
|
||||||
#else
|
#else
|
||||||
|
@ -187,7 +187,7 @@ STATIC mp_obj_t mp_builtin_chr(mp_obj_t o_in) {
|
||||||
char str[1] = {ord};
|
char str[1] = {ord};
|
||||||
return mp_obj_new_str(str, 1, true);
|
return mp_obj_new_str(str, 1, true);
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "chr() arg not in range(256)"));
|
mp_raise_msg(&mp_type_ValueError, "chr() arg not in range(256)");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -286,7 +286,7 @@ STATIC mp_obj_t mp_builtin_min_max(size_t n_args, const mp_obj_t *args, mp_map_t
|
||||||
if (default_elem != NULL) {
|
if (default_elem != NULL) {
|
||||||
best_obj = default_elem->value;
|
best_obj = default_elem->value;
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "arg is an empty sequence"));
|
mp_raise_msg(&mp_type_ValueError, "arg is an empty sequence");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return best_obj;
|
return best_obj;
|
||||||
|
@ -507,8 +507,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_sum_obj, 1, 2, mp_builtin_sum);
|
||||||
|
|
||||||
STATIC mp_obj_t mp_builtin_sorted(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
|
STATIC mp_obj_t mp_builtin_sorted(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
|
||||||
if (n_args > 1) {
|
if (n_args > 1) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "must use keyword argument for key function");
|
||||||
"must use keyword argument for key function"));
|
|
||||||
}
|
}
|
||||||
mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, 0, args);
|
mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, 0, args);
|
||||||
mp_obj_list_sort(1, &self, kwargs);
|
mp_obj_list_sort(1, &self, kwargs);
|
||||||
|
|
|
@ -34,6 +34,16 @@
|
||||||
// Various builtins specific to MicroPython runtime,
|
// Various builtins specific to MicroPython runtime,
|
||||||
// living in micropython module
|
// living in micropython module
|
||||||
|
|
||||||
|
STATIC mp_obj_t mp_micropython_opt_level(size_t n_args, const mp_obj_t *args) {
|
||||||
|
if (n_args == 0) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(MP_STATE_VM(mp_optimise_value));
|
||||||
|
} else {
|
||||||
|
MP_STATE_VM(mp_optimise_value) = mp_obj_get_int(args[0]);
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_micropython_opt_level_obj, 0, 1, mp_micropython_opt_level);
|
||||||
|
|
||||||
#if MICROPY_PY_MICROPYTHON_MEM_INFO
|
#if MICROPY_PY_MICROPYTHON_MEM_INFO
|
||||||
|
|
||||||
#if MICROPY_MEM_STATS
|
#if MICROPY_MEM_STATS
|
||||||
|
@ -121,6 +131,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_alloc_emergency_exception_buf_obj, mp_alloc_
|
||||||
STATIC const mp_rom_map_elem_t mp_module_micropython_globals_table[] = {
|
STATIC const mp_rom_map_elem_t mp_module_micropython_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_micropython) },
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_micropython) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_const), MP_ROM_PTR(&mp_identity_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_const), MP_ROM_PTR(&mp_identity_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_opt_level), MP_ROM_PTR(&mp_micropython_opt_level_obj) },
|
||||||
#if MICROPY_PY_MICROPYTHON_MEM_INFO
|
#if MICROPY_PY_MICROPYTHON_MEM_INFO
|
||||||
#if MICROPY_MEM_STATS
|
#if MICROPY_MEM_STATS
|
||||||
{ MP_ROM_QSTR(MP_QSTR_mem_total), MP_ROM_PTR(&mp_micropython_mem_total_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_mem_total), MP_ROM_PTR(&mp_micropython_mem_total_obj) },
|
||||||
|
|
|
@ -239,7 +239,7 @@ STATIC mp_obj_t mod_thread_start_new_thread(size_t n_args, const mp_obj_t *args)
|
||||||
} else {
|
} else {
|
||||||
// positional and keyword arguments
|
// positional and keyword arguments
|
||||||
if (mp_obj_get_type(args[2]) != &mp_type_dict) {
|
if (mp_obj_get_type(args[2]) != &mp_type_dict) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "expecting a dict for keyword args"));
|
mp_raise_msg(&mp_type_TypeError, "expecting a dict for keyword args");
|
||||||
}
|
}
|
||||||
mp_map_t *map = &((mp_obj_dict_t*)MP_OBJ_TO_PTR(args[2]))->map;
|
mp_map_t *map = &((mp_obj_dict_t*)MP_OBJ_TO_PTR(args[2]))->map;
|
||||||
th_args = m_new_obj_var(thread_entry_args_t, mp_obj_t, pos_args_len + 2 * map->used);
|
th_args = m_new_obj_var(thread_entry_args_t, mp_obj_t, pos_args_len + 2 * map->used);
|
||||||
|
|
|
@ -860,6 +860,12 @@ typedef double mp_float_t;
|
||||||
#define MICROPY_PY_UERRNO (0)
|
#define MICROPY_PY_UERRNO (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Whether to provide "utime" module functions implementation
|
||||||
|
// in terms of mp_hal_* functions.
|
||||||
|
#ifndef MICROPY_PY_UTIME_MP_HAL
|
||||||
|
#define MICROPY_PY_UTIME_MP_HAL (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Whether to provide "_thread" module
|
// Whether to provide "_thread" module
|
||||||
#ifndef MICROPY_PY_THREAD
|
#ifndef MICROPY_PY_THREAD
|
||||||
#define MICROPY_PY_THREAD (0)
|
#define MICROPY_PY_THREAD (0)
|
||||||
|
|
|
@ -66,6 +66,10 @@ mp_uint_t mp_hal_ticks_ms(void);
|
||||||
mp_uint_t mp_hal_ticks_us(void);
|
mp_uint_t mp_hal_ticks_us(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef mp_hal_ticks_cpu
|
||||||
|
mp_uint_t mp_hal_ticks_cpu(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
// If port HAL didn't define its own pin API, use generic
|
// If port HAL didn't define its own pin API, use generic
|
||||||
// "virtual pin" API from the core.
|
// "virtual pin" API from the core.
|
||||||
#ifndef mp_hal_pin_obj_t
|
#ifndef mp_hal_pin_obj_t
|
||||||
|
|
|
@ -252,8 +252,8 @@ int mp_print_mp_int(const mp_print_t *print, mp_obj_t x, int base, int base_char
|
||||||
// enough, a dynamic one will be allocated.
|
// enough, a dynamic one will be allocated.
|
||||||
char stack_buf[sizeof(mp_int_t) * 4];
|
char stack_buf[sizeof(mp_int_t) * 4];
|
||||||
char *buf = stack_buf;
|
char *buf = stack_buf;
|
||||||
mp_uint_t buf_size = sizeof(stack_buf);
|
size_t buf_size = sizeof(stack_buf);
|
||||||
mp_uint_t fmt_size = 0;
|
size_t fmt_size = 0;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
if (prec > 1) {
|
if (prec > 1) {
|
||||||
|
|
41
py/mpz.c
41
py/mpz.c
|
@ -645,18 +645,6 @@ STATIC void mpn_div(mpz_dig_t *num_dig, mp_uint_t *num_len, const mpz_dig_t *den
|
||||||
|
|
||||||
#define MIN_ALLOC (2)
|
#define MIN_ALLOC (2)
|
||||||
|
|
||||||
STATIC const uint8_t log_base2_floor[] = {
|
|
||||||
0,
|
|
||||||
0, 1, 1, 2,
|
|
||||||
2, 2, 2, 3,
|
|
||||||
3, 3, 3, 3,
|
|
||||||
3, 3, 3, 4,
|
|
||||||
4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4,
|
|
||||||
4, 4, 4, 5
|
|
||||||
};
|
|
||||||
|
|
||||||
void mpz_init_zero(mpz_t *z) {
|
void mpz_init_zero(mpz_t *z) {
|
||||||
z->neg = 0;
|
z->neg = 0;
|
||||||
z->fixed_dig = 0;
|
z->fixed_dig = 0;
|
||||||
|
@ -734,11 +722,9 @@ STATIC void mpz_need_dig(mpz_t *z, mp_uint_t need) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (z->dig == NULL || z->alloc < need) {
|
if (z->dig == NULL || z->alloc < need) {
|
||||||
if (z->fixed_dig) {
|
// if z has fixed digit buffer there's not much we can do as the caller will
|
||||||
// cannot reallocate fixed buffers
|
// be expecting a buffer with at least "need" bytes (but it shouldn't happen)
|
||||||
assert(0);
|
assert(!z->fixed_dig);
|
||||||
return;
|
|
||||||
}
|
|
||||||
z->dig = m_renew(mpz_dig_t, z->dig, z->alloc, need);
|
z->dig = m_renew(mpz_dig_t, z->dig, z->alloc, need);
|
||||||
z->alloc = need;
|
z->alloc = need;
|
||||||
}
|
}
|
||||||
|
@ -1497,13 +1483,10 @@ mpz_t *mpz_lcm(const mpz_t *z1, const mpz_t *z2) {
|
||||||
quo * rhs + rem = lhs
|
quo * rhs + rem = lhs
|
||||||
0 <= rem < rhs
|
0 <= rem < rhs
|
||||||
can have lhs, rhs the same
|
can have lhs, rhs the same
|
||||||
|
assumes rhs != 0 (undefined behaviour if it is)
|
||||||
*/
|
*/
|
||||||
void mpz_divmod_inpl(mpz_t *dest_quo, mpz_t *dest_rem, const mpz_t *lhs, const mpz_t *rhs) {
|
void mpz_divmod_inpl(mpz_t *dest_quo, mpz_t *dest_rem, const mpz_t *lhs, const mpz_t *rhs) {
|
||||||
if (rhs->len == 0) {
|
assert(!mpz_is_zero(rhs));
|
||||||
mpz_set_from_int(dest_quo, 0);
|
|
||||||
mpz_set_from_int(dest_rem, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mpz_need_dig(dest_quo, lhs->len + 1); // +1 necessary?
|
mpz_need_dig(dest_quo, lhs->len + 1); // +1 necessary?
|
||||||
memset(dest_quo->dig, 0, (lhs->len + 1) * sizeof(mpz_dig_t));
|
memset(dest_quo->dig, 0, (lhs->len + 1) * sizeof(mpz_dig_t));
|
||||||
|
@ -1657,18 +1640,6 @@ mp_float_t mpz_as_float(const mpz_t *i) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mp_uint_t mpz_as_str_size(const mpz_t *i, mp_uint_t base, const char *prefix, char comma) {
|
|
||||||
if (base < 2 || base > 32) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_uint_t num_digits = i->len * DIG_SIZE / log_base2_floor[base] + 1;
|
|
||||||
mp_uint_t num_commas = comma ? num_digits / 3: 0;
|
|
||||||
mp_uint_t prefix_len = prefix ? strlen(prefix) : 0;
|
|
||||||
|
|
||||||
return num_digits + num_commas + prefix_len + 2; // +1 for sign, +1 for null byte
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
this function is unused
|
this function is unused
|
||||||
char *mpz_as_str(const mpz_t *i, mp_uint_t base) {
|
char *mpz_as_str(const mpz_t *i, mp_uint_t base) {
|
||||||
|
@ -1678,7 +1649,7 @@ char *mpz_as_str(const mpz_t *i, mp_uint_t base) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// assumes enough space as calculated by mpz_as_str_size
|
// assumes enough space as calculated by mp_int_format_size
|
||||||
// returns length of string, not including null byte
|
// returns length of string, not including null byte
|
||||||
mp_uint_t mpz_as_str_inpl(const mpz_t *i, mp_uint_t base, const char *prefix, char base_char, char comma, char *str) {
|
mp_uint_t mpz_as_str_inpl(const mpz_t *i, mp_uint_t base, const char *prefix, char base_char, char comma, char *str) {
|
||||||
if (str == NULL || base < 2 || base > 32) {
|
if (str == NULL || base < 2 || base > 32) {
|
||||||
|
|
1
py/mpz.h
1
py/mpz.h
|
@ -127,6 +127,7 @@ void mpz_or_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
|
||||||
void mpz_xor_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
|
void mpz_xor_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
|
||||||
void mpz_divmod_inpl(mpz_t *dest_quo, mpz_t *dest_rem, const mpz_t *lhs, const mpz_t *rhs);
|
void mpz_divmod_inpl(mpz_t *dest_quo, mpz_t *dest_rem, const mpz_t *lhs, const mpz_t *rhs);
|
||||||
|
|
||||||
|
static inline size_t mpz_max_num_bits(const mpz_t *z) { return z->len * MPZ_DIG_SIZE; }
|
||||||
mp_int_t mpz_hash(const mpz_t *z);
|
mp_int_t mpz_hash(const mpz_t *z);
|
||||||
bool mpz_as_int_checked(const mpz_t *z, mp_int_t *value);
|
bool mpz_as_int_checked(const mpz_t *z, mp_int_t *value);
|
||||||
bool mpz_as_uint_checked(const mpz_t *z, mp_uint_t *value);
|
bool mpz_as_uint_checked(const mpz_t *z, mp_uint_t *value);
|
||||||
|
|
31
py/obj.c
31
py/obj.c
|
@ -233,8 +233,7 @@ mp_int_t mp_obj_get_int(mp_const_obj_t arg) {
|
||||||
return mp_obj_int_get_checked(arg);
|
return mp_obj_int_get_checked(arg);
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "can't convert to int");
|
||||||
"can't convert to int"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"can't convert %s to int", mp_obj_get_type_str(arg)));
|
"can't convert %s to int", mp_obj_get_type_str(arg)));
|
||||||
|
@ -282,8 +281,7 @@ mp_float_t mp_obj_get_float(mp_obj_t arg) {
|
||||||
return mp_obj_float_get(arg);
|
return mp_obj_float_get(arg);
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "can't convert to float");
|
||||||
"can't convert to float"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"can't convert %s to float", mp_obj_get_type_str(arg)));
|
"can't convert %s to float", mp_obj_get_type_str(arg)));
|
||||||
|
@ -312,8 +310,7 @@ void mp_obj_get_complex(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) {
|
||||||
mp_obj_complex_get(arg, real, imag);
|
mp_obj_complex_get(arg, real, imag);
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "can't convert to complex");
|
||||||
"can't convert to complex"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"can't convert %s to complex", mp_obj_get_type_str(arg)));
|
"can't convert %s to complex", mp_obj_get_type_str(arg)));
|
||||||
|
@ -331,8 +328,7 @@ void mp_obj_get_array(mp_obj_t o, mp_uint_t *len, mp_obj_t **items) {
|
||||||
mp_obj_list_get(o, len, items);
|
mp_obj_list_get(o, len, items);
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "expected tuple/list");
|
||||||
"expected tuple/list"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
|
"object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
|
||||||
|
@ -346,8 +342,7 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, mp_uint_t len, mp_obj_t **items) {
|
||||||
mp_obj_get_array(o, &seq_len, items);
|
mp_obj_get_array(o, &seq_len, items);
|
||||||
if (seq_len != len) {
|
if (seq_len != len) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
|
mp_raise_msg(&mp_type_ValueError, "tuple/list has wrong length");
|
||||||
"tuple/list has wrong length"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
||||||
"requested length %d but object has length %d", (int)len, (int)seq_len));
|
"requested length %d but object has length %d", (int)len, (int)seq_len));
|
||||||
|
@ -362,8 +357,7 @@ mp_uint_t mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index,
|
||||||
i = MP_OBJ_SMALL_INT_VALUE(index);
|
i = MP_OBJ_SMALL_INT_VALUE(index);
|
||||||
} else if (!mp_obj_get_int_maybe(index, &i)) {
|
} else if (!mp_obj_get_int_maybe(index, &i)) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "indices must be integers");
|
||||||
"indices must be integers"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"%q indices must be integers, not %s",
|
"%q indices must be integers, not %s",
|
||||||
|
@ -383,7 +377,7 @@ mp_uint_t mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index,
|
||||||
} else {
|
} else {
|
||||||
if (i < 0 || (mp_uint_t)i >= len) {
|
if (i < 0 || (mp_uint_t)i >= len) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, "index out of range"));
|
mp_raise_msg(&mp_type_IndexError, "index out of range");
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError,
|
||||||
"%q index out of range", type->name));
|
"%q index out of range", type->name));
|
||||||
|
@ -416,8 +410,7 @@ mp_obj_t mp_obj_len(mp_obj_t o_in) {
|
||||||
mp_obj_t len = mp_obj_len_maybe(o_in);
|
mp_obj_t len = mp_obj_len_maybe(o_in);
|
||||||
if (len == MP_OBJ_NULL) {
|
if (len == MP_OBJ_NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object has no len");
|
||||||
"object has no len"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"object of type '%s' has no len()", mp_obj_get_type_str(o_in)));
|
"object of type '%s' has no len()", mp_obj_get_type_str(o_in)));
|
||||||
|
@ -458,8 +451,7 @@ mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
|
||||||
}
|
}
|
||||||
if (value == MP_OBJ_NULL) {
|
if (value == MP_OBJ_NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object does not support item deletion");
|
||||||
"object does not support item deletion"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object does not support item deletion", mp_obj_get_type_str(base)));
|
"'%s' object does not support item deletion", mp_obj_get_type_str(base)));
|
||||||
|
@ -474,8 +466,7 @@ mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object does not support item assignment");
|
||||||
"object does not support item assignment"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object does not support item assignment", mp_obj_get_type_str(base)));
|
"'%s' object does not support item assignment", mp_obj_get_type_str(base)));
|
||||||
|
@ -504,7 +495,7 @@ bool mp_get_buffer(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
|
||||||
|
|
||||||
void mp_get_buffer_raise(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
|
void mp_get_buffer_raise(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
|
||||||
if (!mp_get_buffer(obj, bufinfo, flags)) {
|
if (!mp_get_buffer(obj, bufinfo, flags)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "object with buffer protocol required"));
|
mp_raise_msg(&mp_type_TypeError, "object with buffer protocol required");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ STATIC void array_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t
|
||||||
STATIC mp_obj_array_t *array_new(char typecode, mp_uint_t n) {
|
STATIC mp_obj_array_t *array_new(char typecode, mp_uint_t n) {
|
||||||
int typecode_size = mp_binary_get_size('@', typecode, NULL);
|
int typecode_size = mp_binary_get_size('@', typecode, NULL);
|
||||||
if (typecode_size == 0) {
|
if (typecode_size == 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "bad typecode"));
|
mp_raise_msg(&mp_type_ValueError, "bad typecode");
|
||||||
}
|
}
|
||||||
mp_obj_array_t *o = m_new_obj(mp_obj_array_t);
|
mp_obj_array_t *o = m_new_obj(mp_obj_array_t);
|
||||||
#if MICROPY_PY_BUILTINS_BYTEARRAY && MICROPY_PY_ARRAY
|
#if MICROPY_PY_BUILTINS_BYTEARRAY && MICROPY_PY_ARRAY
|
||||||
|
@ -395,7 +395,7 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
|
||||||
mp_obj_array_t *src_slice = MP_OBJ_TO_PTR(value);
|
mp_obj_array_t *src_slice = MP_OBJ_TO_PTR(value);
|
||||||
if (item_sz != mp_binary_get_size('@', src_slice->typecode & TYPECODE_MASK, NULL)) {
|
if (item_sz != mp_binary_get_size('@', src_slice->typecode & TYPECODE_MASK, NULL)) {
|
||||||
compat_error:
|
compat_error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "lhs and rhs should be compatible"));
|
mp_raise_msg(&mp_type_ValueError, "lhs and rhs should be compatible");
|
||||||
}
|
}
|
||||||
src_len = src_slice->len;
|
src_len = src_slice->len;
|
||||||
src_items = src_slice->items;
|
src_items = src_slice->items;
|
||||||
|
|
|
@ -197,7 +197,7 @@ mp_obj_t mp_obj_complex_binary_op(mp_uint_t op, mp_float_t lhs_real, mp_float_t
|
||||||
case MP_BINARY_OP_INPLACE_TRUE_DIVIDE:
|
case MP_BINARY_OP_INPLACE_TRUE_DIVIDE:
|
||||||
if (rhs_imag == 0) {
|
if (rhs_imag == 0) {
|
||||||
if (rhs_real == 0) {
|
if (rhs_real == 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "complex division by zero"));
|
mp_raise_msg(&mp_type_ZeroDivisionError, "complex division by zero");
|
||||||
}
|
}
|
||||||
lhs_real /= rhs_real;
|
lhs_real /= rhs_real;
|
||||||
lhs_imag /= rhs_real;
|
lhs_imag /= rhs_real;
|
||||||
|
@ -226,7 +226,7 @@ mp_obj_t mp_obj_complex_binary_op(mp_uint_t op, mp_float_t lhs_real, mp_float_t
|
||||||
lhs_real = 1;
|
lhs_real = 1;
|
||||||
rhs_real = 0;
|
rhs_real = 0;
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "0.0 to a complex power"));
|
mp_raise_msg(&mp_type_ZeroDivisionError, "0.0 to a complex power");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mp_float_t ln1 = MICROPY_FLOAT_C_FUN(log)(abs1);
|
mp_float_t ln1 = MICROPY_FLOAT_C_FUN(log)(abs1);
|
||||||
|
|
17
py/objdict.c
17
py/objdict.c
|
@ -162,7 +162,7 @@ mp_obj_t mp_obj_dict_get(mp_obj_t self_in, mp_obj_t index) {
|
||||||
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
|
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
|
||||||
if (elem == NULL) {
|
if (elem == NULL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
|
nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, index));
|
||||||
} else {
|
} else {
|
||||||
return elem->value;
|
return elem->value;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ STATIC mp_obj_t dict_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
|
||||||
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
|
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
|
||||||
if (elem == NULL) {
|
if (elem == NULL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
|
nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, index));
|
||||||
} else {
|
} else {
|
||||||
return elem->value;
|
return elem->value;
|
||||||
}
|
}
|
||||||
|
@ -250,15 +250,16 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(dict_copy_obj, dict_copy);
|
||||||
// this is a classmethod
|
// this is a classmethod
|
||||||
STATIC mp_obj_t dict_fromkeys(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t dict_fromkeys(size_t n_args, const mp_obj_t *args) {
|
||||||
mp_obj_t iter = mp_getiter(args[1]);
|
mp_obj_t iter = mp_getiter(args[1]);
|
||||||
mp_obj_t len = mp_obj_len_maybe(iter);
|
|
||||||
mp_obj_t value = mp_const_none;
|
mp_obj_t value = mp_const_none;
|
||||||
mp_obj_t next = MP_OBJ_NULL;
|
mp_obj_t next = MP_OBJ_NULL;
|
||||||
mp_obj_t self_out;
|
|
||||||
|
|
||||||
if (n_args > 2) {
|
if (n_args > 2) {
|
||||||
value = args[2];
|
value = args[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// optimisation to allocate result based on len of argument
|
||||||
|
mp_obj_t self_out;
|
||||||
|
mp_obj_t len = mp_obj_len_maybe(args[1]);
|
||||||
if (len == MP_OBJ_NULL) {
|
if (len == MP_OBJ_NULL) {
|
||||||
/* object's type doesn't have a __len__ slot */
|
/* object's type doesn't have a __len__ slot */
|
||||||
self_out = mp_obj_new_dict(0);
|
self_out = mp_obj_new_dict(0);
|
||||||
|
@ -282,7 +283,7 @@ STATIC mp_obj_t dict_get_helper(mp_map_t *self, mp_obj_t key, mp_obj_t deflt, mp
|
||||||
if (elem == NULL || elem->value == MP_OBJ_NULL) {
|
if (elem == NULL || elem->value == MP_OBJ_NULL) {
|
||||||
if (deflt == MP_OBJ_NULL) {
|
if (deflt == MP_OBJ_NULL) {
|
||||||
if (lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND) {
|
if (lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
|
nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, key));
|
||||||
} else {
|
} else {
|
||||||
value = mp_const_none;
|
value = mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -342,7 +343,7 @@ STATIC mp_obj_t dict_popitem(mp_obj_t self_in) {
|
||||||
mp_uint_t cur = 0;
|
mp_uint_t cur = 0;
|
||||||
mp_map_elem_t *next = dict_iter_next(self, &cur);
|
mp_map_elem_t *next = dict_iter_next(self, &cur);
|
||||||
if (next == NULL) {
|
if (next == NULL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "popitem(): dictionary is empty"));
|
mp_raise_msg(&mp_type_KeyError, "popitem(): dictionary is empty");
|
||||||
}
|
}
|
||||||
self->map.used--;
|
self->map.used--;
|
||||||
mp_obj_t items[] = {next->key, next->value};
|
mp_obj_t items[] = {next->key, next->value};
|
||||||
|
@ -384,9 +385,7 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg
|
||||||
if (key == MP_OBJ_STOP_ITERATION
|
if (key == MP_OBJ_STOP_ITERATION
|
||||||
|| value == MP_OBJ_STOP_ITERATION
|
|| value == MP_OBJ_STOP_ITERATION
|
||||||
|| stop != MP_OBJ_STOP_ITERATION) {
|
|| stop != MP_OBJ_STOP_ITERATION) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(
|
mp_raise_msg(&mp_type_ValueError, "dictionary update sequence has the wrong length");
|
||||||
&mp_type_ValueError,
|
|
||||||
"dictionary update sequence has the wrong length"));
|
|
||||||
} else {
|
} else {
|
||||||
mp_map_lookup(&self->map, key, MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = value;
|
mp_map_lookup(&self->map, key, MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ mp_obj_t mp_obj_float_binary_op(mp_uint_t op, mp_float_t lhs_val, mp_obj_t rhs_i
|
||||||
case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE:
|
case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE:
|
||||||
if (rhs_val == 0) {
|
if (rhs_val == 0) {
|
||||||
zero_division_error:
|
zero_division_error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "division by zero"));
|
mp_raise_msg(&mp_type_ZeroDivisionError, "division by zero");
|
||||||
}
|
}
|
||||||
// Python specs require that x == (x//y)*y + (x%y) so we must
|
// Python specs require that x == (x//y)*y + (x%y) so we must
|
||||||
// call divmod to compute the correct floor division, which
|
// call divmod to compute the correct floor division, which
|
||||||
|
|
|
@ -105,7 +105,7 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_
|
||||||
}
|
}
|
||||||
if (self->code_state.sp == self->code_state.state - 1) {
|
if (self->code_state.sp == self->code_state.state - 1) {
|
||||||
if (send_value != mp_const_none) {
|
if (send_value != mp_const_none) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "can't send non-None value to a just-started generator"));
|
mp_raise_msg(&mp_type_TypeError, "can't send non-None value to a just-started generator");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*self->code_state.sp = send_value;
|
*self->code_state.sp = send_value;
|
||||||
|
@ -157,7 +157,7 @@ STATIC mp_obj_t gen_resume_and_raise(mp_obj_t self_in, mp_obj_t send_value, mp_o
|
||||||
|
|
||||||
case MP_VM_RETURN_YIELD:
|
case MP_VM_RETURN_YIELD:
|
||||||
if (throw_value != MP_OBJ_NULL && mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(mp_obj_get_type(throw_value)), MP_OBJ_FROM_PTR(&mp_type_GeneratorExit))) {
|
if (throw_value != MP_OBJ_NULL && mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(mp_obj_get_type(throw_value)), MP_OBJ_FROM_PTR(&mp_type_GeneratorExit))) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "generator ignored GeneratorExit"));
|
mp_raise_msg(&mp_type_RuntimeError, "generator ignored GeneratorExit");
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ STATIC mp_obj_t gen_instance_close(mp_obj_t self_in) {
|
||||||
mp_obj_t ret;
|
mp_obj_t ret;
|
||||||
switch (mp_obj_gen_resume(self_in, mp_const_none, MP_OBJ_FROM_PTR(&mp_const_GeneratorExit_obj), &ret)) {
|
switch (mp_obj_gen_resume(self_in, mp_const_none, MP_OBJ_FROM_PTR(&mp_const_GeneratorExit_obj), &ret)) {
|
||||||
case MP_VM_RETURN_YIELD:
|
case MP_VM_RETURN_YIELD:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "generator ignored GeneratorExit"));
|
mp_raise_msg(&mp_type_RuntimeError, "generator ignored GeneratorExit");
|
||||||
|
|
||||||
// Swallow StopIteration & GeneratorExit (== successful close), and re-raise any other
|
// Swallow StopIteration & GeneratorExit (== successful close), and re-raise any other
|
||||||
case MP_VM_RETURN_EXCEPTION:
|
case MP_VM_RETURN_EXCEPTION:
|
||||||
|
|
26
py/objint.c
26
py/objint.c
|
@ -133,8 +133,8 @@ void mp_obj_int_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t
|
||||||
// enough, a dynamic one will be allocated.
|
// enough, a dynamic one will be allocated.
|
||||||
char stack_buf[sizeof(mp_int_t) * 4];
|
char stack_buf[sizeof(mp_int_t) * 4];
|
||||||
char *buf = stack_buf;
|
char *buf = stack_buf;
|
||||||
mp_uint_t buf_size = sizeof(stack_buf);
|
size_t buf_size = sizeof(stack_buf);
|
||||||
mp_uint_t fmt_size;
|
size_t fmt_size;
|
||||||
|
|
||||||
char *str = mp_obj_int_formatted(&buf, &buf_size, &fmt_size, self_in, 10, NULL, '\0', '\0');
|
char *str = mp_obj_int_formatted(&buf, &buf_size, &fmt_size, self_in, 10, NULL, '\0', '\0');
|
||||||
mp_print_str(print, str);
|
mp_print_str(print, str);
|
||||||
|
@ -162,14 +162,14 @@ STATIC const uint8_t log_base2_floor[] = {
|
||||||
4, 4, 4, 5
|
4, 4, 4, 5
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC uint int_as_str_size_formatted(uint base, const char *prefix, char comma) {
|
size_t mp_int_format_size(size_t num_bits, int base, const char *prefix, char comma) {
|
||||||
if (base < 2 || base > 32) {
|
if (base < 2 || base > 32) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint num_digits = sizeof(fmt_int_t) * 8 / log_base2_floor[base] + 1;
|
size_t num_digits = num_bits / log_base2_floor[base] + 1;
|
||||||
uint num_commas = comma ? num_digits / 3: 0;
|
size_t num_commas = comma ? num_digits / 3 : 0;
|
||||||
uint prefix_len = prefix ? strlen(prefix) : 0;
|
size_t prefix_len = prefix ? strlen(prefix) : 0;
|
||||||
return num_digits + num_commas + prefix_len + 2; // +1 for sign, +1 for null byte
|
return num_digits + num_commas + prefix_len + 2; // +1 for sign, +1 for null byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ STATIC uint int_as_str_size_formatted(uint base, const char *prefix, char comma)
|
||||||
//
|
//
|
||||||
// The resulting formatted string will be returned from this function and the
|
// The resulting formatted string will be returned from this function and the
|
||||||
// formatted size will be in *fmt_size.
|
// formatted size will be in *fmt_size.
|
||||||
char *mp_obj_int_formatted(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size, mp_const_obj_t self_in,
|
char *mp_obj_int_formatted(char **buf, size_t *buf_size, size_t *fmt_size, mp_const_obj_t self_in,
|
||||||
int base, const char *prefix, char base_char, char comma) {
|
int base, const char *prefix, char base_char, char comma) {
|
||||||
fmt_int_t num;
|
fmt_int_t num;
|
||||||
if (MP_OBJ_IS_SMALL_INT(self_in)) {
|
if (MP_OBJ_IS_SMALL_INT(self_in)) {
|
||||||
|
@ -211,7 +211,7 @@ char *mp_obj_int_formatted(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size,
|
||||||
sign = '-';
|
sign = '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
uint needed_size = int_as_str_size_formatted(base, prefix, comma);
|
size_t needed_size = mp_int_format_size(sizeof(fmt_int_t) * 8, base, prefix, comma);
|
||||||
if (needed_size > *buf_size) {
|
if (needed_size > *buf_size) {
|
||||||
*buf = m_new(char, needed_size);
|
*buf = m_new(char, needed_size);
|
||||||
*buf_size = needed_size;
|
*buf_size = needed_size;
|
||||||
|
@ -294,19 +294,19 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
||||||
|
|
||||||
// This is called only with strings whose value doesn't fit in SMALL_INT
|
// This is called only with strings whose value doesn't fit in SMALL_INT
|
||||||
mp_obj_t mp_obj_new_int_from_str_len(const char **str, mp_uint_t len, bool neg, mp_uint_t base) {
|
mp_obj_t mp_obj_new_int_from_str_len(const char **str, mp_uint_t len, bool neg, mp_uint_t base) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "long int not supported in this build"));
|
mp_raise_msg(&mp_type_OverflowError, "long int not supported in this build");
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is called when an integer larger than a SMALL_INT is needed (although val might still fit in a SMALL_INT)
|
// This is called when an integer larger than a SMALL_INT is needed (although val might still fit in a SMALL_INT)
|
||||||
mp_obj_t mp_obj_new_int_from_ll(long long val) {
|
mp_obj_t mp_obj_new_int_from_ll(long long val) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "small int overflow"));
|
mp_raise_msg(&mp_type_OverflowError, "small int overflow");
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is called when an integer larger than a SMALL_INT is needed (although val might still fit in a SMALL_INT)
|
// This is called when an integer larger than a SMALL_INT is needed (although val might still fit in a SMALL_INT)
|
||||||
mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) {
|
mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "small int overflow"));
|
mp_raise_msg(&mp_type_OverflowError, "small int overflow");
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,7 +316,7 @@ mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) {
|
||||||
if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) {
|
if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) {
|
||||||
return MP_OBJ_NEW_SMALL_INT(value);
|
return MP_OBJ_NEW_SMALL_INT(value);
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "small int overflow"));
|
mp_raise_msg(&mp_type_OverflowError, "small int overflow");
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ mp_obj_t mp_obj_new_int(mp_int_t value) {
|
||||||
if (MP_SMALL_INT_FITS(value)) {
|
if (MP_SMALL_INT_FITS(value)) {
|
||||||
return MP_OBJ_NEW_SMALL_INT(value);
|
return MP_OBJ_NEW_SMALL_INT(value);
|
||||||
}
|
}
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "small int overflow"));
|
mp_raise_msg(&mp_type_OverflowError, "small int overflow");
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,13 +50,15 @@ typedef enum {
|
||||||
mp_fp_as_int_class_t mp_classify_fp_as_int(mp_float_t val);
|
mp_fp_as_int_class_t mp_classify_fp_as_int(mp_float_t val);
|
||||||
#endif // MICROPY_PY_BUILTINS_FLOAT
|
#endif // MICROPY_PY_BUILTINS_FLOAT
|
||||||
|
|
||||||
|
size_t mp_int_format_size(size_t num_bits, int base, const char *prefix, char comma);
|
||||||
|
|
||||||
void mp_obj_int_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
|
void mp_obj_int_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
|
||||||
char *mp_obj_int_formatted(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size, mp_const_obj_t self_in,
|
char *mp_obj_int_formatted(char **buf, size_t *buf_size, size_t *fmt_size, mp_const_obj_t self_in,
|
||||||
int base, const char *prefix, char base_char, char comma);
|
int base, const char *prefix, char base_char, char comma);
|
||||||
char *mp_obj_int_formatted_impl(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size, mp_const_obj_t self_in,
|
char *mp_obj_int_formatted_impl(char **buf, size_t *buf_size, size_t *fmt_size, mp_const_obj_t self_in,
|
||||||
int base, const char *prefix, char base_char, char comma);
|
int base, const char *prefix, char base_char, char comma);
|
||||||
mp_int_t mp_obj_int_hash(mp_obj_t self_in);
|
mp_int_t mp_obj_int_hash(mp_obj_t self_in);
|
||||||
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len, byte *buf);
|
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf);
|
||||||
int mp_obj_int_sign(mp_obj_t self_in);
|
int mp_obj_int_sign(mp_obj_t self_in);
|
||||||
mp_obj_t mp_obj_int_abs(mp_obj_t self_in);
|
mp_obj_t mp_obj_int_abs(mp_obj_t self_in);
|
||||||
mp_obj_t mp_obj_int_unary_op(mp_uint_t op, mp_obj_t o_in);
|
mp_obj_t mp_obj_int_unary_op(mp_uint_t op, mp_obj_t o_in);
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
const mp_obj_int_t mp_maxsize_obj = {{&mp_type_int}, MP_SSIZE_MAX};
|
const mp_obj_int_t mp_maxsize_obj = {{&mp_type_int}, MP_SSIZE_MAX};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len, byte *buf) {
|
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) {
|
||||||
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
||||||
mp_obj_int_t *self = self_in;
|
mp_obj_int_t *self = self_in;
|
||||||
long long val = self->val;
|
long long val = self->val;
|
||||||
|
|
|
@ -90,12 +90,12 @@ STATIC mp_obj_int_t *mp_obj_int_new_mpz(void) {
|
||||||
// formatted size will be in *fmt_size.
|
// formatted size will be in *fmt_size.
|
||||||
//
|
//
|
||||||
// This particular routine should only be called for the mpz representation of the int.
|
// This particular routine should only be called for the mpz representation of the int.
|
||||||
char *mp_obj_int_formatted_impl(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size, mp_const_obj_t self_in,
|
char *mp_obj_int_formatted_impl(char **buf, size_t *buf_size, size_t *fmt_size, mp_const_obj_t self_in,
|
||||||
int base, const char *prefix, char base_char, char comma) {
|
int base, const char *prefix, char base_char, char comma) {
|
||||||
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
||||||
const mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in);
|
const mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
mp_uint_t needed_size = mpz_as_str_size(&self->mpz, base, prefix, comma);
|
size_t needed_size = mp_int_format_size(mpz_max_num_bits(&self->mpz), base, prefix, comma);
|
||||||
if (needed_size > *buf_size) {
|
if (needed_size > *buf_size) {
|
||||||
*buf = m_new(char, needed_size);
|
*buf = m_new(char, needed_size);
|
||||||
*buf_size = needed_size;
|
*buf_size = needed_size;
|
||||||
|
@ -107,7 +107,7 @@ char *mp_obj_int_formatted_impl(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len, byte *buf) {
|
void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) {
|
||||||
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
|
||||||
mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
mpz_as_bytes(&self->mpz, big_endian, len, buf);
|
mpz_as_bytes(&self->mpz, big_endian, len, buf);
|
||||||
|
@ -234,8 +234,7 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
||||||
case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: {
|
case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: {
|
||||||
if (mpz_is_zero(zrhs)) {
|
if (mpz_is_zero(zrhs)) {
|
||||||
zero_division_error:
|
zero_division_error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError,
|
mp_raise_msg(&mp_type_ZeroDivisionError, "division by zero");
|
||||||
"division by zero"));
|
|
||||||
}
|
}
|
||||||
mpz_t rem; mpz_init_zero(&rem);
|
mpz_t rem; mpz_init_zero(&rem);
|
||||||
mpz_divmod_inpl(&res->mpz, &rem, zlhs, zrhs);
|
mpz_divmod_inpl(&res->mpz, &rem, zlhs, zrhs);
|
||||||
|
@ -272,7 +271,7 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
||||||
case MP_BINARY_OP_INPLACE_RSHIFT: {
|
case MP_BINARY_OP_INPLACE_RSHIFT: {
|
||||||
mp_int_t irhs = mp_obj_int_get_checked(rhs_in);
|
mp_int_t irhs = mp_obj_int_get_checked(rhs_in);
|
||||||
if (irhs < 0) {
|
if (irhs < 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "negative shift count"));
|
mp_raise_msg(&mp_type_ValueError, "negative shift count");
|
||||||
}
|
}
|
||||||
if (op == MP_BINARY_OP_LSHIFT || op == MP_BINARY_OP_INPLACE_LSHIFT) {
|
if (op == MP_BINARY_OP_LSHIFT || op == MP_BINARY_OP_INPLACE_LSHIFT) {
|
||||||
mpz_shl_inpl(&res->mpz, zlhs, irhs);
|
mpz_shl_inpl(&res->mpz, zlhs, irhs);
|
||||||
|
@ -398,7 +397,7 @@ mp_int_t mp_obj_int_get_checked(mp_const_obj_t self_in) {
|
||||||
return value;
|
return value;
|
||||||
} else {
|
} else {
|
||||||
// overflow
|
// overflow
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "overflow converting long int to machine word"));
|
mp_raise_msg(&mp_type_OverflowError, "overflow converting long int to machine word");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,7 +266,7 @@ STATIC mp_obj_t list_pop(size_t n_args, const mp_obj_t *args) {
|
||||||
mp_check_self(MP_OBJ_IS_TYPE(args[0], &mp_type_list));
|
mp_check_self(MP_OBJ_IS_TYPE(args[0], &mp_type_list));
|
||||||
mp_obj_list_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_list_t *self = MP_OBJ_TO_PTR(args[0]);
|
||||||
if (self->len == 0) {
|
if (self->len == 0) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, "pop from empty list"));
|
mp_raise_msg(&mp_type_IndexError, "pop from empty list");
|
||||||
}
|
}
|
||||||
mp_uint_t index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
|
mp_uint_t index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
|
||||||
mp_obj_t ret = self->items[index];
|
mp_obj_t ret = self->items[index];
|
||||||
|
|
|
@ -73,7 +73,7 @@ STATIC void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
|
||||||
} else {
|
} else {
|
||||||
// delete/store attribute
|
// delete/store attribute
|
||||||
// provide more detailed error message than we'd get by just returning
|
// provide more detailed error message than we'd get by just returning
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_AttributeError, "can't set attribute"));
|
mp_raise_msg(&mp_type_AttributeError, "can't set attribute");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(object___init___obj, object___init__);
|
||||||
|
|
||||||
STATIC mp_obj_t object___new__(mp_obj_t cls) {
|
STATIC mp_obj_t object___new__(mp_obj_t cls) {
|
||||||
if (!MP_OBJ_IS_TYPE(cls, &mp_type_type) || !mp_obj_is_instance_type((mp_obj_type_t*)MP_OBJ_TO_PTR(cls))) {
|
if (!MP_OBJ_IS_TYPE(cls, &mp_type_type) || !mp_obj_is_instance_type((mp_obj_type_t*)MP_OBJ_TO_PTR(cls))) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "__new__ arg must be a user-type");
|
||||||
"__new__ arg must be a user-type"));
|
|
||||||
}
|
}
|
||||||
mp_obj_t o = MP_OBJ_SENTINEL;
|
mp_obj_t o = MP_OBJ_SENTINEL;
|
||||||
mp_obj_t res = mp_obj_instance_make_new(MP_OBJ_TO_PTR(cls), 1, 0, &o);
|
mp_obj_t res = mp_obj_instance_make_new(MP_OBJ_TO_PTR(cls), 1, 0, &o);
|
||||||
|
|
|
@ -68,7 +68,7 @@ STATIC void check_set(mp_obj_t o) {
|
||||||
if (MP_OBJ_IS_TYPE(o, &mp_type_frozenset)) {
|
if (MP_OBJ_IS_TYPE(o, &mp_type_frozenset)) {
|
||||||
// Mutable method called on frozenset; emulate CPython behavior, eg:
|
// Mutable method called on frozenset; emulate CPython behavior, eg:
|
||||||
// AttributeError: 'frozenset' object has no attribute 'add'
|
// AttributeError: 'frozenset' object has no attribute 'add'
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_AttributeError, "'frozenset' has no such attribute"));
|
mp_raise_msg(&mp_type_AttributeError, "'frozenset' has no such attribute");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mp_check_self(MP_OBJ_IS_TYPE(o, &mp_type_set));
|
mp_check_self(MP_OBJ_IS_TYPE(o, &mp_type_set));
|
||||||
|
@ -389,7 +389,7 @@ STATIC mp_obj_t set_pop(mp_obj_t self_in) {
|
||||||
mp_obj_set_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_set_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
mp_obj_t obj = mp_set_remove_first(&self->set);
|
mp_obj_t obj = mp_set_remove_first(&self->set);
|
||||||
if (obj == MP_OBJ_NULL) {
|
if (obj == MP_OBJ_NULL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "pop from an empty set"));
|
mp_raise_msg(&mp_type_KeyError, "pop from an empty set");
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,22 +30,16 @@
|
||||||
|
|
||||||
#include "py/nlr.h"
|
#include "py/nlr.h"
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
|
#include "py/objstringio.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
|
|
||||||
#if MICROPY_PY_IO
|
#if MICROPY_PY_IO
|
||||||
|
|
||||||
typedef struct _mp_obj_stringio_t {
|
|
||||||
mp_obj_base_t base;
|
|
||||||
vstr_t *vstr;
|
|
||||||
// StringIO has single pointer used for both reading and writing
|
|
||||||
mp_uint_t pos;
|
|
||||||
} mp_obj_stringio_t;
|
|
||||||
|
|
||||||
#if MICROPY_CPYTHON_COMPAT
|
#if MICROPY_CPYTHON_COMPAT
|
||||||
STATIC void check_stringio_is_open(const mp_obj_stringio_t *o) {
|
STATIC void check_stringio_is_open(const mp_obj_stringio_t *o) {
|
||||||
if (o->vstr == NULL) {
|
if (o->vstr == NULL) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "I/O operation on closed file"));
|
mp_raise_msg(&mp_type_ValueError, "I/O operation on closed file");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -156,7 +150,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(stringio___exit___obj, 4, 4, stringio
|
||||||
STATIC mp_obj_stringio_t *stringio_new(const mp_obj_type_t *type) {
|
STATIC mp_obj_stringio_t *stringio_new(const mp_obj_type_t *type) {
|
||||||
mp_obj_stringio_t *o = m_new_obj(mp_obj_stringio_t);
|
mp_obj_stringio_t *o = m_new_obj(mp_obj_stringio_t);
|
||||||
o->base.type = type;
|
o->base.type = type;
|
||||||
o->vstr = vstr_new();
|
o->vstr = vstr_new(16);
|
||||||
o->pos = 0;
|
o->pos = 0;
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 Damien P. George
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
#ifndef MICROPY_INCLUDED_PY_OBJSTRINGIO_H
|
||||||
|
#define MICROPY_INCLUDED_PY_OBJSTRINGIO_H
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
|
||||||
|
typedef struct _mp_obj_stringio_t {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
vstr_t *vstr;
|
||||||
|
// StringIO has single pointer used for both reading and writing
|
||||||
|
mp_uint_t pos;
|
||||||
|
} mp_obj_stringio_t;
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_PY_OBJSTRINGIO_H
|
21
py/objtype.c
21
py/objtype.c
|
@ -311,8 +311,7 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size
|
||||||
}
|
}
|
||||||
if (init_ret != mp_const_none) {
|
if (init_ret != mp_const_none) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "__init__() should return None");
|
||||||
"__init__() should return None"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"__init__() should return None, not '%s'", mp_obj_get_type_str(init_ret)));
|
"__init__() should return None, not '%s'", mp_obj_get_type_str(init_ret)));
|
||||||
|
@ -508,7 +507,7 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
|
||||||
// the code.
|
// the code.
|
||||||
const mp_obj_t *proxy = mp_obj_property_get(member);
|
const mp_obj_t *proxy = mp_obj_property_get(member);
|
||||||
if (proxy[0] == mp_const_none) {
|
if (proxy[0] == mp_const_none) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_AttributeError, "unreadable attribute"));
|
mp_raise_msg(&mp_type_AttributeError, "unreadable attribute");
|
||||||
} else {
|
} else {
|
||||||
dest[0] = mp_call_function_n_kw(proxy[0], 1, 0, &self_in);
|
dest[0] = mp_call_function_n_kw(proxy[0], 1, 0, &self_in);
|
||||||
}
|
}
|
||||||
|
@ -710,8 +709,7 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons
|
||||||
mp_obj_t call = mp_obj_instance_get_call(self_in);
|
mp_obj_t call = mp_obj_instance_get_call(self_in);
|
||||||
if (call == MP_OBJ_NULL) {
|
if (call == MP_OBJ_NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not callable");
|
||||||
"object not callable"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not callable", mp_obj_get_type_str(self_in)));
|
"'%s' object is not callable", mp_obj_get_type_str(self_in)));
|
||||||
|
@ -793,7 +791,7 @@ STATIC mp_obj_t type_make_new(const mp_obj_type_t *type_in, size_t n_args, size_
|
||||||
return mp_obj_new_type(mp_obj_str_get_qstr(args[0]), args[1], args[2]);
|
return mp_obj_new_type(mp_obj_str_get_qstr(args[0]), args[1], args[2]);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "type takes 1 or 3 arguments"));
|
mp_raise_msg(&mp_type_TypeError, "type takes 1 or 3 arguments");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -804,7 +802,7 @@ STATIC mp_obj_t type_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp
|
||||||
|
|
||||||
if (self->make_new == NULL) {
|
if (self->make_new == NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "cannot create instance"));
|
mp_raise_msg(&mp_type_TypeError, "cannot create instance");
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"cannot create '%q' instances", self->name));
|
"cannot create '%q' instances", self->name));
|
||||||
|
@ -892,8 +890,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
|
||||||
// TODO: Verify with CPy, tested on function type
|
// TODO: Verify with CPy, tested on function type
|
||||||
if (t->make_new == NULL) {
|
if (t->make_new == NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "type is not an acceptable base type");
|
||||||
"type is not an acceptable base type"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"type '%q' is not an acceptable base type", t->name));
|
"type '%q' is not an acceptable base type", t->name));
|
||||||
|
@ -927,7 +924,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
|
||||||
const mp_obj_type_t *native_base;
|
const mp_obj_type_t *native_base;
|
||||||
uint num_native_bases = instance_count_native_bases(o, &native_base);
|
uint num_native_bases = instance_count_native_bases(o, &native_base);
|
||||||
if (num_native_bases > 1) {
|
if (num_native_bases > 1) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "multiple bases have instance lay-out conflict"));
|
mp_raise_msg(&mp_type_TypeError, "multiple bases have instance lay-out conflict");
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_map_t *locals_map = &o->locals_dict->map;
|
mp_map_t *locals_map = &o->locals_dict->map;
|
||||||
|
@ -1074,7 +1071,7 @@ STATIC mp_obj_t mp_obj_is_subclass(mp_obj_t object, mp_obj_t classinfo) {
|
||||||
} else if (MP_OBJ_IS_TYPE(classinfo, &mp_type_tuple)) {
|
} else if (MP_OBJ_IS_TYPE(classinfo, &mp_type_tuple)) {
|
||||||
mp_obj_tuple_get(classinfo, &len, &items);
|
mp_obj_tuple_get(classinfo, &len, &items);
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "issubclass() arg 2 must be a class or a tuple of classes"));
|
mp_raise_msg(&mp_type_TypeError, "issubclass() arg 2 must be a class or a tuple of classes");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint i = 0; i < len; i++) {
|
for (uint i = 0; i < len; i++) {
|
||||||
|
@ -1088,7 +1085,7 @@ STATIC mp_obj_t mp_obj_is_subclass(mp_obj_t object, mp_obj_t classinfo) {
|
||||||
|
|
||||||
STATIC mp_obj_t mp_builtin_issubclass(mp_obj_t object, mp_obj_t classinfo) {
|
STATIC mp_obj_t mp_builtin_issubclass(mp_obj_t object, mp_obj_t classinfo) {
|
||||||
if (!MP_OBJ_IS_TYPE(object, &mp_type_type)) {
|
if (!MP_OBJ_IS_TYPE(object, &mp_type_type)) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "issubclass() arg 1 must be a class"));
|
mp_raise_msg(&mp_type_TypeError, "issubclass() arg 1 must be a class");
|
||||||
}
|
}
|
||||||
return mp_obj_is_subclass(object, classinfo);
|
return mp_obj_is_subclass(object, classinfo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
#include "py/runtime.h"
|
||||||
#include "py/parsenumbase.h"
|
#include "py/parsenumbase.h"
|
||||||
#include "py/parsenum.h"
|
#include "py/parsenum.h"
|
||||||
#include "py/smallint.h"
|
#include "py/smallint.h"
|
||||||
|
@ -55,7 +55,7 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m
|
||||||
// check radix base
|
// check radix base
|
||||||
if ((base != 0 && base < 2) || base > 36) {
|
if ((base != 0 && base < 2) || base > 36) {
|
||||||
// this won't be reached if lex!=NULL
|
// this won't be reached if lex!=NULL
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "int() arg 2 must be >= 2 and <= 36"));
|
mp_raise_msg(&mp_type_ValueError, "int() arg 2 must be >= 2 and <= 36");
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip leading space
|
// skip leading space
|
||||||
|
|
5
py/py.mk
5
py/py.mk
|
@ -229,6 +229,7 @@ PY_O_BASENAME = \
|
||||||
../extmod/vfs_fat_file.o \
|
../extmod/vfs_fat_file.o \
|
||||||
../extmod/vfs_fat_lexer.o \
|
../extmod/vfs_fat_lexer.o \
|
||||||
../extmod/vfs_fat_misc.o \
|
../extmod/vfs_fat_misc.o \
|
||||||
|
../extmod/utime_mphal.o \
|
||||||
../extmod/moduos_dupterm.o \
|
../extmod/moduos_dupterm.o \
|
||||||
../lib/embed/abort_.o \
|
../lib/embed/abort_.o \
|
||||||
../lib/utils/printf.o \
|
../lib/utils/printf.o \
|
||||||
|
@ -236,6 +237,10 @@ PY_O_BASENAME = \
|
||||||
# prepend the build destination prefix to the py object files
|
# prepend the build destination prefix to the py object files
|
||||||
PY_O = $(addprefix $(PY_BUILD)/, $(PY_O_BASENAME))
|
PY_O = $(addprefix $(PY_BUILD)/, $(PY_O_BASENAME))
|
||||||
|
|
||||||
|
ifneq ($(FROZEN_DIR),)
|
||||||
|
PY_O += $(BUILD)/$(BUILD)/frozen.o
|
||||||
|
endif
|
||||||
|
|
||||||
# Sources that may contain qstrings
|
# Sources that may contain qstrings
|
||||||
SRC_QSTR_IGNORE = nlr% emitnx% emitnthumb% emitnarm%
|
SRC_QSTR_IGNORE = nlr% emitnx% emitnthumb% emitnarm%
|
||||||
SRC_QSTR = $(SRC_MOD) $(addprefix py/,$(filter-out $(SRC_QSTR_IGNORE),$(PY_O_BASENAME:.o=.c)) emitnative.c)
|
SRC_QSTR = $(SRC_MOD) $(addprefix py/,$(filter-out $(SRC_QSTR_IGNORE),$(PY_O_BASENAME:.o=.c)) emitnative.c)
|
||||||
|
|
53
py/runtime.c
53
py/runtime.c
|
@ -138,8 +138,7 @@ mp_obj_t mp_load_global(qstr qst) {
|
||||||
elem = mp_map_lookup((mp_map_t*)&mp_module_builtins_globals.map, MP_OBJ_NEW_QSTR(qst), MP_MAP_LOOKUP);
|
elem = mp_map_lookup((mp_map_t*)&mp_module_builtins_globals.map, MP_OBJ_NEW_QSTR(qst), MP_MAP_LOOKUP);
|
||||||
if (elem == NULL) {
|
if (elem == NULL) {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_NameError,
|
mp_raise_msg(&mp_type_NameError, "name not defined");
|
||||||
"name not defined"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NameError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NameError,
|
||||||
"name '%q' is not defined", qst));
|
"name '%q' is not defined", qst));
|
||||||
|
@ -230,8 +229,7 @@ mp_obj_t mp_unary_op(mp_uint_t op, mp_obj_t arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "unsupported type for operator");
|
||||||
"unsupported type for operator"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"unsupported type for %q: '%s'",
|
"unsupported type for %q: '%s'",
|
||||||
|
@ -323,7 +321,7 @@ mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
||||||
case MP_BINARY_OP_INPLACE_LSHIFT: {
|
case MP_BINARY_OP_INPLACE_LSHIFT: {
|
||||||
if (rhs_val < 0) {
|
if (rhs_val < 0) {
|
||||||
// negative shift not allowed
|
// negative shift not allowed
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "negative shift count"));
|
mp_raise_msg(&mp_type_ValueError, "negative shift count");
|
||||||
} else if (rhs_val >= (mp_int_t)BITS_PER_WORD || lhs_val > (MP_SMALL_INT_MAX >> rhs_val) || lhs_val < (MP_SMALL_INT_MIN >> rhs_val)) {
|
} else if (rhs_val >= (mp_int_t)BITS_PER_WORD || lhs_val > (MP_SMALL_INT_MAX >> rhs_val) || lhs_val < (MP_SMALL_INT_MIN >> rhs_val)) {
|
||||||
// left-shift will overflow, so use higher precision integer
|
// left-shift will overflow, so use higher precision integer
|
||||||
lhs = mp_obj_new_int_from_ll(lhs_val);
|
lhs = mp_obj_new_int_from_ll(lhs_val);
|
||||||
|
@ -338,7 +336,7 @@ mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
||||||
case MP_BINARY_OP_INPLACE_RSHIFT:
|
case MP_BINARY_OP_INPLACE_RSHIFT:
|
||||||
if (rhs_val < 0) {
|
if (rhs_val < 0) {
|
||||||
// negative shift not allowed
|
// negative shift not allowed
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "negative shift count"));
|
mp_raise_msg(&mp_type_ValueError, "negative shift count");
|
||||||
} else {
|
} else {
|
||||||
// standard precision is enough for right-shift
|
// standard precision is enough for right-shift
|
||||||
if (rhs_val >= (mp_int_t)BITS_PER_WORD) {
|
if (rhs_val >= (mp_int_t)BITS_PER_WORD) {
|
||||||
|
@ -414,7 +412,7 @@ mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
||||||
lhs = mp_obj_new_float(lhs_val);
|
lhs = mp_obj_new_float(lhs_val);
|
||||||
goto generic_binary_op;
|
goto generic_binary_op;
|
||||||
#else
|
#else
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "negative power with no float support"));
|
mp_raise_msg(&mp_type_ValueError, "negative power with no float support");
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
mp_int_t ans = 1;
|
mp_int_t ans = 1;
|
||||||
|
@ -515,8 +513,7 @@ mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not iterable");
|
||||||
"object not iterable"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not iterable", mp_obj_get_type_str(rhs)));
|
"'%s' object is not iterable", mp_obj_get_type_str(rhs)));
|
||||||
|
@ -538,8 +535,7 @@ generic_binary_op:
|
||||||
|
|
||||||
unsupported_op:
|
unsupported_op:
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "unsupported type for operator");
|
||||||
"unsupported type for operator"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"unsupported types for %q: '%s', '%s'",
|
"unsupported types for %q: '%s', '%s'",
|
||||||
|
@ -547,7 +543,7 @@ unsupported_op:
|
||||||
}
|
}
|
||||||
|
|
||||||
zero_division:
|
zero_division:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "division by zero"));
|
mp_raise_msg(&mp_type_ZeroDivisionError, "division by zero");
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t mp_call_function_0(mp_obj_t fun) {
|
mp_obj_t mp_call_function_0(mp_obj_t fun) {
|
||||||
|
@ -581,8 +577,7 @@ mp_obj_t mp_call_function_n_kw(mp_obj_t fun_in, mp_uint_t n_args, mp_uint_t n_kw
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not callable");
|
||||||
"object not callable"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not callable", mp_obj_get_type_str(fun_in)));
|
"'%s' object is not callable", mp_obj_get_type_str(fun_in)));
|
||||||
|
@ -813,16 +808,14 @@ void mp_unpack_sequence(mp_obj_t seq_in, mp_uint_t num, mp_obj_t *items) {
|
||||||
|
|
||||||
too_short:
|
too_short:
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
|
mp_raise_msg(&mp_type_ValueError, "wrong number of values to unpack");
|
||||||
"wrong number of values to unpack"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
||||||
"need more than %d values to unpack", (int)seq_len));
|
"need more than %d values to unpack", (int)seq_len));
|
||||||
}
|
}
|
||||||
too_long:
|
too_long:
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
|
mp_raise_msg(&mp_type_ValueError, "wrong number of values to unpack");
|
||||||
"wrong number of values to unpack"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
||||||
"too many values to unpack (expected %d)", (int)num));
|
"too many values to unpack (expected %d)", (int)num));
|
||||||
|
@ -888,8 +881,7 @@ void mp_unpack_ex(mp_obj_t seq_in, mp_uint_t num_in, mp_obj_t *items) {
|
||||||
|
|
||||||
too_short:
|
too_short:
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
|
mp_raise_msg(&mp_type_ValueError, "wrong number of values to unpack");
|
||||||
"wrong number of values to unpack"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
|
||||||
"need more than %d values to unpack", (int)seq_len));
|
"need more than %d values to unpack", (int)seq_len));
|
||||||
|
@ -928,8 +920,7 @@ STATIC mp_obj_t checked_fun_call(mp_obj_t self_in, size_t n_args, size_t n_kw, c
|
||||||
const mp_obj_type_t *arg0_type = mp_obj_get_type(args[0]);
|
const mp_obj_type_t *arg0_type = mp_obj_get_type(args[0]);
|
||||||
if (arg0_type != self->type) {
|
if (arg0_type != self->type) {
|
||||||
if (MICROPY_ERROR_REPORTING != MICROPY_ERROR_REPORTING_DETAILED) {
|
if (MICROPY_ERROR_REPORTING != MICROPY_ERROR_REPORTING_DETAILED) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "argument has wrong type");
|
||||||
"argument has wrong type"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"argument should be a '%q' not a '%q'", self->type->name, arg0_type->name));
|
"argument should be a '%q' not a '%q'", self->type->name, arg0_type->name));
|
||||||
|
@ -1045,8 +1036,7 @@ void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) {
|
||||||
if (dest[0] == MP_OBJ_NULL) {
|
if (dest[0] == MP_OBJ_NULL) {
|
||||||
// no attribute/method called attr
|
// no attribute/method called attr
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_AttributeError,
|
mp_raise_msg(&mp_type_AttributeError, "no such attribute");
|
||||||
"no such attribute"));
|
|
||||||
} else {
|
} else {
|
||||||
// following CPython, we give a more detailed error message for type objects
|
// following CPython, we give a more detailed error message for type objects
|
||||||
if (MP_OBJ_IS_TYPE(base, &mp_type_type)) {
|
if (MP_OBJ_IS_TYPE(base, &mp_type_type)) {
|
||||||
|
@ -1074,8 +1064,7 @@ void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_AttributeError,
|
mp_raise_msg(&mp_type_AttributeError, "no such attribute");
|
||||||
"no such attribute"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError,
|
||||||
"'%s' object has no attribute '%q'",
|
"'%s' object has no attribute '%q'",
|
||||||
|
@ -1105,8 +1094,7 @@ mp_obj_t mp_getiter(mp_obj_t o_in) {
|
||||||
|
|
||||||
// object not iterable
|
// object not iterable
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not iterable");
|
||||||
"object not iterable"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not iterable", mp_obj_get_type_str(o_in)));
|
"'%s' object is not iterable", mp_obj_get_type_str(o_in)));
|
||||||
|
@ -1128,8 +1116,7 @@ mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) {
|
||||||
return mp_call_method_n_kw(0, 0, dest);
|
return mp_call_method_n_kw(0, 0, dest);
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not an iterator");
|
||||||
"object not an iterator"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not an iterator", mp_obj_get_type_str(o_in)));
|
"'%s' object is not an iterator", mp_obj_get_type_str(o_in)));
|
||||||
|
@ -1165,8 +1152,7 @@ mp_obj_t mp_iternext(mp_obj_t o_in) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
|
mp_raise_msg(&mp_type_TypeError, "object not an iterator");
|
||||||
"object not an iterator"));
|
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
|
||||||
"'%s' object is not an iterator", mp_obj_get_type_str(o_in)));
|
"'%s' object is not an iterator", mp_obj_get_type_str(o_in)));
|
||||||
|
@ -1384,8 +1370,7 @@ void *m_malloc_fail(size_t num_bytes) {
|
||||||
// dummy
|
// dummy
|
||||||
#if MICROPY_ENABLE_GC
|
#if MICROPY_ENABLE_GC
|
||||||
} else if (gc_is_locked()) {
|
} else if (gc_is_locked()) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_MemoryError,
|
mp_raise_msg(&mp_type_MemoryError, "memory allocation failed, heap is locked");
|
||||||
"memory allocation failed, heap is locked"));
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_MemoryError,
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_MemoryError,
|
||||||
|
|
|
@ -235,7 +235,7 @@ mp_obj_t mp_seq_index_obj(const mp_obj_t *items, mp_uint_t len, mp_uint_t n_args
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "object not in sequence"));
|
mp_raise_msg(&mp_type_ValueError, "object not in sequence");
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t mp_seq_count_obj(const mp_obj_t *items, mp_uint_t len, mp_obj_t value) {
|
mp_obj_t mp_seq_count_obj(const mp_obj_t *items, mp_uint_t len, mp_obj_t value) {
|
||||||
|
|
|
@ -101,7 +101,7 @@ const mp_stream_p_t *mp_get_stream_raise(mp_obj_t self_in, int flags) {
|
||||||
|| ((flags & MP_STREAM_OP_WRITE) && stream_p->write == NULL)
|
|| ((flags & MP_STREAM_OP_WRITE) && stream_p->write == NULL)
|
||||||
|| ((flags & MP_STREAM_OP_IOCTL) && stream_p->ioctl == NULL)) {
|
|| ((flags & MP_STREAM_OP_IOCTL) && stream_p->ioctl == NULL)) {
|
||||||
// CPython: io.UnsupportedOperation, OSError subclass
|
// CPython: io.UnsupportedOperation, OSError subclass
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "stream operation not supported"));
|
mp_raise_msg(&mp_type_OSError, "stream operation not supported");
|
||||||
}
|
}
|
||||||
return stream_p;
|
return stream_p;
|
||||||
}
|
}
|
||||||
|
|
14
py/vstr.c
14
py/vstr.c
|
@ -74,20 +74,8 @@ void vstr_clear(vstr_t *vstr) {
|
||||||
vstr->buf = NULL;
|
vstr->buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vstr_t *vstr_new(void) {
|
vstr_t *vstr_new(size_t alloc) {
|
||||||
vstr_t *vstr = m_new_obj(vstr_t);
|
vstr_t *vstr = m_new_obj(vstr_t);
|
||||||
if (vstr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
vstr_init(vstr, 16);
|
|
||||||
return vstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
vstr_t *vstr_new_size(size_t alloc) {
|
|
||||||
vstr_t *vstr = m_new_obj(vstr_t);
|
|
||||||
if (vstr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
vstr_init(vstr, alloc);
|
vstr_init(vstr, alloc);
|
||||||
return vstr;
|
return vstr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,19 +40,28 @@ SRC_C = \
|
||||||
SRC_TEST_C = \
|
SRC_TEST_C = \
|
||||||
test_main.c \
|
test_main.c \
|
||||||
|
|
||||||
|
STM_SRC_C = $(addprefix stmhal/,\
|
||||||
|
pybstdio.c \
|
||||||
|
)
|
||||||
|
|
||||||
SRC_S = \
|
SRC_S = \
|
||||||
|
|
||||||
OBJ =
|
OBJ =
|
||||||
OBJ += $(PY_O)
|
OBJ += $(PY_O)
|
||||||
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
||||||
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
|
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
|
||||||
|
OBJ += $(addprefix $(BUILD)/, $(STM_SRC_C:.c=.o))
|
||||||
|
|
||||||
OBJ_TEST =
|
OBJ_TEST =
|
||||||
OBJ_TEST += $(PY_O)
|
OBJ_TEST += $(PY_O)
|
||||||
OBJ_TEST += $(addprefix $(BUILD)/, $(SRC_TEST_C:.c=.o))
|
OBJ_TEST += $(addprefix $(BUILD)/, $(SRC_TEST_C:.c=.o))
|
||||||
OBJ_TEST += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
|
OBJ_TEST += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
|
||||||
|
OBJ_TEST += $(addprefix $(BUILD)/, $(STM_SRC_C:.c=.o))
|
||||||
OBJ_TEST += $(BUILD)/tinytest.o
|
OBJ_TEST += $(BUILD)/tinytest.o
|
||||||
|
|
||||||
|
# List of sources for qstr extraction
|
||||||
|
SRC_QSTR += $(SRC_C) $(STM_SRC_C)
|
||||||
|
|
||||||
all: run
|
all: run
|
||||||
|
|
||||||
run: $(BUILD)/firmware.elf
|
run: $(BUILD)/firmware.elf
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
// this is needed for extmod/crypto-algorithms/sha256.c
|
||||||
|
#include <string.h>
|
|
@ -20,9 +20,18 @@
|
||||||
#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1)
|
#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1)
|
||||||
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
||||||
#define MICROPY_PY_BUILTINS_MEMORYVIEW (1)
|
#define MICROPY_PY_BUILTINS_MEMORYVIEW (1)
|
||||||
#define MICROPY_PY_IO (0)
|
#define MICROPY_PY_IO (1)
|
||||||
#define MICROPY_PY_SYS_EXIT (1)
|
#define MICROPY_PY_SYS_EXIT (1)
|
||||||
#define MICROPY_PY_SYS_MAXSIZE (1)
|
#define MICROPY_PY_SYS_MAXSIZE (1)
|
||||||
|
#define MICROPY_PY_UERRNO (1)
|
||||||
|
#define MICROPY_PY_UBINASCII (1)
|
||||||
|
#define MICROPY_PY_URANDOM (1)
|
||||||
|
#define MICROPY_PY_UCTYPES (1)
|
||||||
|
#define MICROPY_PY_UZLIB (1)
|
||||||
|
#define MICROPY_PY_UJSON (1)
|
||||||
|
#define MICROPY_PY_URE (1)
|
||||||
|
#define MICROPY_PY_UHEAPQ (1)
|
||||||
|
#define MICROPY_PY_UHASHLIB (1)
|
||||||
#define MICROPY_USE_INTERNAL_PRINTF (0)
|
#define MICROPY_USE_INTERNAL_PRINTF (0)
|
||||||
|
|
||||||
// type definitions for the specific machine
|
// type definitions for the specific machine
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
// empty file
|
#define mp_hal_stdin_rx_chr() (0)
|
||||||
|
#define mp_hal_stdout_tx_strn_cooked(s, l) write(1, (s), (l))
|
||||||
|
|
|
@ -274,16 +274,9 @@ $(PY_BUILD)/mpprint.o: COPT += -Os
|
||||||
all: $(BUILD)/firmware.dfu $(BUILD)/firmware.hex
|
all: $(BUILD)/firmware.dfu $(BUILD)/firmware.hex
|
||||||
|
|
||||||
ifneq ($(FROZEN_DIR),)
|
ifneq ($(FROZEN_DIR),)
|
||||||
|
# To use frozen source modules, put your .py files in a subdirectory (eg scripts/)
|
||||||
|
# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch).
|
||||||
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
|
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
|
||||||
OBJ += $(BUILD)/frozen-files.o
|
|
||||||
MAKE_FROZEN = ../tools/make-frozen.py
|
|
||||||
|
|
||||||
$(BUILD)/frozen-files.o: $(BUILD)/frozen-files.c
|
|
||||||
$(call compile_c)
|
|
||||||
|
|
||||||
$(BUILD)/frozen-files.c: $(shell find $(FROZEN_DIR) -type f)
|
|
||||||
@$(ECHO) "Creating $@"
|
|
||||||
$(Q)$(PYTHON) $(MAKE_FROZEN) $(FROZEN_DIR) > $@
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(FROZEN_MPY_DIR),)
|
ifneq ($(FROZEN_MPY_DIR),)
|
||||||
|
|
|
@ -57,15 +57,9 @@
|
||||||
#define MMA_AXIS_SIGNED_VALUE(i) (((i) & 0x3f) | ((i) & 0x20 ? (~0x1f) : 0))
|
#define MMA_AXIS_SIGNED_VALUE(i) (((i) & 0x3f) | ((i) & 0x20 ? (~0x1f) : 0))
|
||||||
|
|
||||||
void accel_init(void) {
|
void accel_init(void) {
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
|
|
||||||
// PB5 is connected to AVDD; pull high to enable MMA accel device
|
// PB5 is connected to AVDD; pull high to enable MMA accel device
|
||||||
GPIO_clear_pin(MICROPY_HW_MMA_AVDD_PIN.gpio, MICROPY_HW_MMA_AVDD_PIN.pin_mask); // turn off AVDD
|
mp_hal_pin_low(&MICROPY_HW_MMA_AVDD_PIN); // turn off AVDD
|
||||||
GPIO_InitStructure.Pin = MICROPY_HW_MMA_AVDD_PIN.pin_mask;
|
mp_hal_pin_output(&MICROPY_HW_MMA_AVDD_PIN);
|
||||||
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
|
||||||
GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
|
|
||||||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
|
||||||
HAL_GPIO_Init(MICROPY_HW_MMA_AVDD_PIN.gpio, &GPIO_InitStructure);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void accel_start(void) {
|
STATIC void accel_start(void) {
|
||||||
|
@ -81,9 +75,9 @@ STATIC void accel_start(void) {
|
||||||
i2c_init(&I2CHandle1);
|
i2c_init(&I2CHandle1);
|
||||||
|
|
||||||
// turn off AVDD, wait 30ms, turn on AVDD, wait 30ms again
|
// turn off AVDD, wait 30ms, turn on AVDD, wait 30ms again
|
||||||
GPIO_clear_pin(MICROPY_HW_MMA_AVDD_PIN.gpio, MICROPY_HW_MMA_AVDD_PIN.pin_mask); // turn off
|
mp_hal_pin_low(&MICROPY_HW_MMA_AVDD_PIN); // turn off
|
||||||
HAL_Delay(30);
|
HAL_Delay(30);
|
||||||
GPIO_set_pin(MICROPY_HW_MMA_AVDD_PIN.gpio, MICROPY_HW_MMA_AVDD_PIN.pin_mask); // turn on
|
mp_hal_pin_high(&MICROPY_HW_MMA_AVDD_PIN); // turn on
|
||||||
HAL_Delay(30);
|
HAL_Delay(30);
|
||||||
|
|
||||||
HAL_StatusTypeDef status;
|
HAL_StatusTypeDef status;
|
||||||
|
|
|
@ -66,6 +66,5 @@
|
||||||
#define MICROPY_HW_LED2 (pin_B12) // green
|
#define MICROPY_HW_LED2 (pin_B12) // green
|
||||||
#define MICROPY_HW_LED3 (pin_B12) // green
|
#define MICROPY_HW_LED3 (pin_B12) // green
|
||||||
#define MICROPY_HW_LED4 (pin_B12) // green
|
#define MICROPY_HW_LED4 (pin_B12) // green
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
|
@ -69,9 +69,8 @@
|
||||||
#define MICROPY_HW_LED2 (pin_A4) // same as LED1
|
#define MICROPY_HW_LED2 (pin_A4) // same as LED1
|
||||||
#define MICROPY_HW_LED3 (pin_A4) // same as LED1
|
#define MICROPY_HW_LED3 (pin_A4) // same as LED1
|
||||||
#define MICROPY_HW_LED4 (pin_A4) // same as LED1
|
#define MICROPY_HW_LED4 (pin_A4) // same as LED1
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
||||||
// SD card detect switch (not used, always on)
|
// SD card detect switch (not used, always on)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
||||||
|
|
|
@ -63,9 +63,8 @@ void LIMIFROG_board_early_init(void);
|
||||||
|
|
||||||
// LEDs
|
// LEDs
|
||||||
#define MICROPY_HW_LED1 (pin_C3) // red
|
#define MICROPY_HW_LED1 (pin_C3) // red
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRR = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRR = pin->pin_mask<<16)
|
|
||||||
|
|
||||||
// USB config
|
// USB config
|
||||||
// #define MICROPY_HW_USB_OTG_ID_PIN (pin_C12) // This is not the official ID Pin which should be PA10
|
// #define MICROPY_HW_USB_OTG_ID_PIN (pin_C12) // This is not the official ID Pin which should be PA10
|
||||||
|
|
|
@ -64,9 +64,8 @@ void NETDUINO_PLUS_2_board_early_init(void);
|
||||||
#define MICROPY_HW_LED2 (pin_C13) // White LED (aka Power)
|
#define MICROPY_HW_LED2 (pin_C13) // White LED (aka Power)
|
||||||
#define MICROPY_HW_LED3 (pin_A10) // Same as Led(1)
|
#define MICROPY_HW_LED3 (pin_A10) // Same as Led(1)
|
||||||
#define MICROPY_HW_LED4 (pin_C13) // Same as Led(2)
|
#define MICROPY_HW_LED4 (pin_C13) // Same as Led(2)
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
||||||
// USB VBUS detect pin
|
// USB VBUS detect pin
|
||||||
#define MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)
|
#define MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)
|
||||||
|
|
|
@ -54,6 +54,5 @@
|
||||||
|
|
||||||
// LEDs
|
// LEDs
|
||||||
#define MICROPY_HW_LED1 (pin_A5) // Green LD2 LED on Nucleo
|
#define MICROPY_HW_LED1 (pin_A5) // Green LD2 LED on Nucleo
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
|
@ -65,6 +65,5 @@
|
||||||
|
|
||||||
// LEDs
|
// LEDs
|
||||||
#define MICROPY_HW_LED1 (pin_A5) // Green LD2 LED on Nucleo
|
#define MICROPY_HW_LED1 (pin_A5) // Green LD2 LED on Nucleo
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
|
@ -71,9 +71,8 @@
|
||||||
|
|
||||||
// LEDs
|
// LEDs
|
||||||
#define MICROPY_HW_LED1 (pin_C13)
|
#define MICROPY_HW_LED1 (pin_C13)
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
|
||||||
|
|
||||||
// SD card detect switch
|
// SD card detect switch
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_C11)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_C11)
|
||||||
|
|
|
@ -73,9 +73,8 @@
|
||||||
#define MICROPY_HW_LED4 (pin_B4) // blue
|
#define MICROPY_HW_LED4 (pin_B4) // blue
|
||||||
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
||||||
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
||||||
// SD card detect switch
|
// SD card detect switch
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_B5)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_B5)
|
||||||
|
|
|
@ -84,9 +84,8 @@
|
||||||
#define MICROPY_HW_LED4 (pin_B4) // blue
|
#define MICROPY_HW_LED4 (pin_B4) // blue
|
||||||
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
||||||
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
||||||
// SD card detect switch
|
// SD card detect switch
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
||||||
|
|
|
@ -84,9 +84,8 @@
|
||||||
#define MICROPY_HW_LED4 (pin_B4) // blue
|
#define MICROPY_HW_LED4 (pin_B4) // blue
|
||||||
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
#define MICROPY_HW_LED3_PWM { TIM2, 2, TIM_CHANNEL_1, GPIO_AF1_TIM2 }
|
||||||
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
#define MICROPY_HW_LED4_PWM { TIM3, 3, TIM_CHANNEL_1, GPIO_AF2_TIM3 }
|
||||||
#define MICROPY_HW_LED_OTYPE (GPIO_MODE_OUTPUT_PP)
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
|
|
||||||
|
|
||||||
// SD card detect switch
|
// SD card detect switch
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_A8)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue