Skip to content

Commit c6e4d72

Browse files
authored
Merge pull request adafruit#10366 from dhalbert/i2ctargetrequest-deinit
i2ctarget: Add deinit() to I2CTargetRequest; remove close()
2 parents 2959f0a + 8da8e31 commit c6e4d72

File tree

1 file changed

+43
-24
lines changed

1 file changed

+43
-24
lines changed

shared-bindings/i2ctarget/I2CTarget.c

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
static mp_obj_t mp_obj_new_i2ctarget_i2c_target_request(i2ctarget_i2c_target_obj_t *target, uint8_t address, bool is_read, bool is_restart) {
2323
i2ctarget_i2c_target_request_obj_t *self =
24-
mp_obj_malloc(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type);
24+
mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type);
2525
self->target = target;
2626
self->address = address;
2727
self->is_read = is_read;
@@ -200,7 +200,7 @@ static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_locals_dict, i2ctarget_i2c_targ
200200
MP_DEFINE_CONST_OBJ_TYPE(
201201
i2ctarget_i2c_target_type,
202202
MP_QSTR_I2CTarget,
203-
MP_TYPE_FLAG_NONE,
203+
MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS,
204204
make_new, i2ctarget_i2c_target_make_new,
205205
locals_dict, &i2ctarget_i2c_target_locals_dict
206206
);
@@ -222,23 +222,38 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type,
222222
return mp_obj_new_i2ctarget_i2c_target_request(args[0], mp_obj_get_int(args[1]), mp_obj_is_true(args[2]), mp_obj_is_true(args[3]));
223223
}
224224

225-
//| def __enter__(self) -> I2CTargetRequest:
226-
//| """No-op used in Context Managers."""
227-
//| ...
228-
//|
229-
// Provided by context manager helper.
225+
static void target_request_check_for_deinit(i2ctarget_i2c_target_request_obj_t *self) {
226+
if (self->target == NULL) {
227+
raise_deinited_error();
228+
}
229+
check_for_deinit(self->target);
230+
}
230231

231-
//| def __exit__(self) -> None:
232-
//| """Close the request."""
232+
//| def deinit(self) -> None:
233+
//| """Disconnects from parent `I2CTarget`.
234+
//| Called by `__exit__()` to indicate the `I2CTargetRequest` is no longer useful."""
233235
//| ...
234236
//|
235-
// Provided by context manager helper.
237+
static mp_obj_t i2ctarget_i2c_target_request_deinit(mp_obj_t self_in) {
238+
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
239+
target_request_check_for_deinit(self);
240+
241+
i2ctarget_i2c_target_obj_t *target = self->target;
242+
243+
// Deinit I2CTargetRequest first in case _close() fails.
244+
self->target = NULL;
245+
246+
common_hal_i2ctarget_i2c_target_close(target);
247+
248+
return mp_const_none;
249+
}
250+
MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_deinit_obj, i2ctarget_i2c_target_request_deinit);
236251

237252
//| address: int
238253
//| """The I2C address of the request."""
239254
static mp_obj_t i2ctarget_i2c_target_request_get_address(mp_obj_t self_in) {
240255
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
241-
check_for_deinit(self->target);
256+
target_request_check_for_deinit(self);
242257

243258
return mp_obj_new_int(self->address);
244259
}
@@ -248,7 +263,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_address_obj, i2ctarget_i2c
248263
//| """The I2C main controller is reading from this target."""
249264
static mp_obj_t i2ctarget_i2c_target_request_get_is_read(mp_obj_t self_in) {
250265
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
251-
check_for_deinit(self->target);
266+
target_request_check_for_deinit(self);
252267

253268
return mp_obj_new_bool(self->is_read);
254269
}
@@ -259,7 +274,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_read_obj, i2ctarget_i2c
259274
//|
260275
static mp_obj_t i2ctarget_i2c_target_request_get_is_restart(mp_obj_t self_in) {
261276
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
262-
check_for_deinit(self->target);
277+
target_request_check_for_deinit(self);
263278

264279
return mp_obj_new_bool(self->is_restart);
265280
}
@@ -276,7 +291,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_
276291
//|
277292
static mp_obj_t i2ctarget_i2c_target_request_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
278293
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
279-
check_for_deinit(self->target);
294+
target_request_check_for_deinit(self);
280295

281296
enum { ARG_n, ARG_ack };
282297
static const mp_arg_t allowed_args[] = {
@@ -335,7 +350,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(i2ctarget_i2c_target_request_read_obj, 1, i2ctarget_i
335350
//|
336351
static mp_obj_t i2ctarget_i2c_target_request_write(mp_obj_t self_in, mp_obj_t buf_in) {
337352
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
338-
check_for_deinit(self->target);
353+
target_request_check_for_deinit(self);
339354

340355
if (!self->is_read) {
341356
mp_raise_OSError(MP_EACCES);
@@ -370,7 +385,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(i2ctarget_i2c_target_request_write_obj, i2ctarg
370385
//|
371386
static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *args) {
372387
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]);
373-
check_for_deinit(self->target);
388+
target_request_check_for_deinit(self);
374389

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

@@ -383,25 +398,29 @@ static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *ar
383398
}
384399
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request_ack_obj, 1, 2, i2ctarget_i2c_target_request_ack);
385400

386-
static mp_obj_t i2ctarget_i2c_target_request_close(mp_obj_t self_in) {
387-
i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in);
388-
check_for_deinit(self->target);
401+
//| def __enter__(self) -> I2CTargetRequest:
402+
//| """No-op used in Context Managers."""
403+
//| ...
404+
//|
405+
// Provided by context manager helper.
389406

390-
common_hal_i2ctarget_i2c_target_close(self->target);
391-
return mp_const_none;
392-
}
393-
static MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_close_obj, i2ctarget_i2c_target_request_close);
407+
//| def __exit__(self) -> None:
408+
//| """Close and deinit the request."""
409+
//| ...
410+
//|
411+
// Provided by context manager helper.
394412

395413
static const mp_rom_map_elem_t i2ctarget_i2c_target_request_locals_dict_table[] = {
396414
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
397415
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) },
416+
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) },
417+
{ MP_ROM_QSTR(MP_QSTR__del__), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) },
398418
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&i2ctarget_i2c_target_request_address_obj) },
399419
{ MP_ROM_QSTR(MP_QSTR_is_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_read_obj) },
400420
{ MP_ROM_QSTR(MP_QSTR_is_restart), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_restart_obj) },
401421
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_read_obj) },
402422
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&i2ctarget_i2c_target_request_write_obj) },
403423
{ MP_ROM_QSTR(MP_QSTR_ack), MP_ROM_PTR(&i2ctarget_i2c_target_request_ack_obj) },
404-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&i2ctarget_i2c_target_request_close_obj) },
405424
};
406425

407426
static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_request_locals_dict, i2ctarget_i2c_target_request_locals_dict_table);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy