Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ports/atmel-samd/boards/feather_m4_can/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY__EVE = 1
CIRCUITPY_BITMAPFILTER = 0
CIRCUITPY_CANIO = 1
CIRCUITPY_FLOPPYIO = 0
CIRCUITPY_SYNTHIO = 0
CIRCUITPY_GIFIO = 0
CIRCUITPY_JPEGIO = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ EXTERNAL_FLASH_DEVICES = "GD25Q16C,W25Q16JVxQ"
LONGINT_IMPL = MPZ

CIRCUITPY__EVE = 1
CIRCUITPY_CODEOP = 0
CIRCUITPY_FLOPPYIO = 0
CIRCUITPY_JPEGIO = 0
CIRCUITPY_SYNTHIO = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICES = "GD25Q16C,W25Q16JVxQ"
LONGINT_IMPL = MPZ

CIRCUITPY_CODEOP = 0
CIRCUITPY_FLOPPYIO = 0
CIRCUITPY_GIFIO = 0
CIRCUITPY_JPEGIO = 0
Expand Down
39 changes: 24 additions & 15 deletions shared-bindings/i2ctarget/I2CTarget.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static mp_obj_t mp_obj_new_i2ctarget_i2c_target_request(i2ctarget_i2c_target_obj
//| :param bool smbus: Use SMBUS timings if the hardware supports it"""
//| ...
static mp_obj_t i2ctarget_i2c_target_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
i2ctarget_i2c_target_obj_t *self = mp_obj_malloc(i2ctarget_i2c_target_obj_t, &i2ctarget_i2c_target_type);
i2ctarget_i2c_target_obj_t *self = mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_obj_t, &i2ctarget_i2c_target_type);
enum { ARG_scl, ARG_sda, ARG_addresses, ARG_smbus };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ },
Expand Down Expand Up @@ -85,13 +85,18 @@ static mp_obj_t i2ctarget_i2c_target_make_new(const mp_obj_type_t *type, size_t
//| """Releases control of the underlying hardware so other classes can use it."""
//| ...
static mp_obj_t i2ctarget_i2c_target_obj_deinit(mp_obj_t self_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_type));
i2ctarget_i2c_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
common_hal_i2ctarget_i2c_target_deinit(self);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_deinit_obj, i2ctarget_i2c_target_obj_deinit);

static void check_for_deinit(i2ctarget_i2c_target_obj_t *self) {
if (common_hal_i2ctarget_i2c_target_deinited(self)) {
raise_deinited_error();
}
}

//| def __enter__(self) -> I2CTarget:
//| """No-op used in Context Managers."""
//| ...
Expand All @@ -102,7 +107,6 @@ MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_deinit_obj, i2ctarget_i2c_target_
//| :ref:`lifetime-and-contextmanagers` for more info."""
//| ...
static mp_obj_t i2ctarget_i2c_target_obj___exit__(size_t n_args, const mp_obj_t *args) {
mp_check_self(mp_obj_is_type(args[0], &i2ctarget_i2c_target_type));
i2ctarget_i2c_target_obj_t *self = MP_OBJ_TO_PTR(args[0]);
common_hal_i2ctarget_i2c_target_deinit(self);
return mp_const_none;
Expand All @@ -117,11 +121,9 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target___exit___obj, 4,
//| :rtype: ~i2ctarget.I2CTargetRequest"""
//|
static mp_obj_t i2ctarget_i2c_target_request(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
mp_check_self(mp_obj_is_type(pos_args[0], &i2ctarget_i2c_target_type));
i2ctarget_i2c_target_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
if (common_hal_i2ctarget_i2c_target_deinited(self)) {
raise_deinited_error();
}
check_for_deinit(self);

enum { ARG_timeout };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_SMALL_INT(-1)} },
Expand Down Expand Up @@ -186,6 +188,7 @@ static MP_DEFINE_CONST_FUN_OBJ_KW(i2ctarget_i2c_target_request_obj, 1, i2ctarget

static const mp_rom_map_elem_t i2ctarget_i2c_target_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2ctarget_i2c_target_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&i2ctarget_i2c_target_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&i2ctarget_i2c_target___exit___obj) },
{ MP_ROM_QSTR(MP_QSTR_request), MP_ROM_PTR(&i2ctarget_i2c_target_request_obj) },
Expand Down Expand Up @@ -227,8 +230,9 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type,
//| """Close the request."""
//| ...
static mp_obj_t i2ctarget_i2c_target_request_obj___exit__(size_t n_args, const mp_obj_t *args) {
mp_check_self(mp_obj_is_type(args[0], &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]);
check_for_deinit(self->target);

common_hal_i2ctarget_i2c_target_close(self->target);
return mp_const_none;
}
Expand All @@ -237,26 +241,29 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request___exit__
//| address: int
//| """The I2C address of the request."""
static mp_obj_t i2ctarget_i2c_target_request_get_address(mp_obj_t self_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self->target);

return mp_obj_new_int(self->address);
}
MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_address_obj, i2ctarget_i2c_target_request_get_address);

//| is_read: bool
//| """The I2C main controller is reading from this target."""
static mp_obj_t i2ctarget_i2c_target_request_get_is_read(mp_obj_t self_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self->target);

return mp_obj_new_bool(self->is_read);
}
MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_read_obj, i2ctarget_i2c_target_request_get_is_read);

//| is_restart: bool
//| """Is Repeated Start Condition."""
static mp_obj_t i2ctarget_i2c_target_request_get_is_restart(mp_obj_t self_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self->target);

return mp_obj_new_bool(self->is_restart);
}
MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_i2c_target_request_get_is_restart);
Expand All @@ -270,8 +277,9 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_
//| :return: Bytes read"""
//| ...
static mp_obj_t i2ctarget_i2c_target_request_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
mp_check_self(mp_obj_is_type(pos_args[0], &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
check_for_deinit(self->target);

enum { ARG_n, ARG_ack };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_n, MP_ARG_INT, {.u_int = -1} },
Expand Down Expand Up @@ -327,8 +335,8 @@ MP_DEFINE_CONST_FUN_OBJ_KW(i2ctarget_i2c_target_request_read_obj, 1, i2ctarget_i
//| :return: Number of bytes written"""
//| ...
static mp_obj_t i2ctarget_i2c_target_request_write(mp_obj_t self_in, mp_obj_t buf_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self->target);

if (!self->is_read) {
mp_raise_OSError(MP_EACCES);
Expand Down Expand Up @@ -361,8 +369,9 @@ static MP_DEFINE_CONST_FUN_OBJ_2(i2ctarget_i2c_target_request_write_obj, i2ctarg
//| ...
//|
static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *args) {
mp_check_self(mp_obj_is_type(args[0], &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]);
check_for_deinit(self->target);

bool ack = (n_args == 1) ? true : mp_obj_is_true(args[1]);

if (self->is_read) {
Expand All @@ -375,8 +384,8 @@ static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *ar
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request_ack_obj, 1, 2, i2ctarget_i2c_target_request_ack);

static mp_obj_t i2ctarget_i2c_target_request_close(mp_obj_t self_in) {
mp_check_self(mp_obj_is_type(self_in, &i2ctarget_i2c_target_request_type));
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self->target);

common_hal_i2ctarget_i2c_target_close(self->target);
return mp_const_none;
Expand Down