21
21
22
22
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 ) {
23
23
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 );
25
25
self -> target = target ;
26
26
self -> address = address ;
27
27
self -> is_read = is_read ;
@@ -200,7 +200,7 @@ static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_locals_dict, i2ctarget_i2c_targ
200
200
MP_DEFINE_CONST_OBJ_TYPE (
201
201
i2ctarget_i2c_target_type ,
202
202
MP_QSTR_I2CTarget ,
203
- MP_TYPE_FLAG_NONE ,
203
+ MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS ,
204
204
make_new , i2ctarget_i2c_target_make_new ,
205
205
locals_dict , & i2ctarget_i2c_target_locals_dict
206
206
);
@@ -222,23 +222,38 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type,
222
222
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 ]));
223
223
}
224
224
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
+ }
230
231
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."""
233
235
//| ...
234
236
//|
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 );
236
251
237
252
//| address: int
238
253
//| """The I2C address of the request."""
239
254
static mp_obj_t i2ctarget_i2c_target_request_get_address (mp_obj_t self_in ) {
240
255
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 );
242
257
243
258
return mp_obj_new_int (self -> address );
244
259
}
@@ -248,7 +263,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_address_obj, i2ctarget_i2c
248
263
//| """The I2C main controller is reading from this target."""
249
264
static mp_obj_t i2ctarget_i2c_target_request_get_is_read (mp_obj_t self_in ) {
250
265
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 );
252
267
253
268
return mp_obj_new_bool (self -> is_read );
254
269
}
@@ -259,7 +274,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_read_obj, i2ctarget_i2c
259
274
//|
260
275
static mp_obj_t i2ctarget_i2c_target_request_get_is_restart (mp_obj_t self_in ) {
261
276
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 );
263
278
264
279
return mp_obj_new_bool (self -> is_restart );
265
280
}
@@ -276,7 +291,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_
276
291
//|
277
292
static mp_obj_t i2ctarget_i2c_target_request_read (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
278
293
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 );
280
295
281
296
enum { ARG_n , ARG_ack };
282
297
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
335
350
//|
336
351
static mp_obj_t i2ctarget_i2c_target_request_write (mp_obj_t self_in , mp_obj_t buf_in ) {
337
352
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 );
339
354
340
355
if (!self -> is_read ) {
341
356
mp_raise_OSError (MP_EACCES );
@@ -370,7 +385,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(i2ctarget_i2c_target_request_write_obj, i2ctarg
370
385
//|
371
386
static mp_obj_t i2ctarget_i2c_target_request_ack (uint n_args , const mp_obj_t * args ) {
372
387
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 );
374
389
375
390
bool ack = (n_args == 1 ) ? true : mp_obj_is_true (args [1 ]);
376
391
@@ -383,25 +398,29 @@ static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *ar
383
398
}
384
399
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (i2ctarget_i2c_target_request_ack_obj , 1 , 2 , i2ctarget_i2c_target_request_ack );
385
400
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.
389
406
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.
394
412
395
413
static const mp_rom_map_elem_t i2ctarget_i2c_target_request_locals_dict_table [] = {
396
414
{ MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
397
415
{ 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 ) },
398
418
{ MP_ROM_QSTR (MP_QSTR_address ), MP_ROM_PTR (& i2ctarget_i2c_target_request_address_obj ) },
399
419
{ MP_ROM_QSTR (MP_QSTR_is_read ), MP_ROM_PTR (& i2ctarget_i2c_target_request_is_read_obj ) },
400
420
{ MP_ROM_QSTR (MP_QSTR_is_restart ), MP_ROM_PTR (& i2ctarget_i2c_target_request_is_restart_obj ) },
401
421
{ MP_ROM_QSTR (MP_QSTR_read ), MP_ROM_PTR (& i2ctarget_i2c_target_request_read_obj ) },
402
422
{ MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& i2ctarget_i2c_target_request_write_obj ) },
403
423
{ 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 ) },
405
424
};
406
425
407
426
static MP_DEFINE_CONST_DICT (i2ctarget_i2c_target_request_locals_dict , i2ctarget_i2c_target_request_locals_dict_table ) ;
0 commit comments