4545#define MASK32 (2)
4646#define LIST32 (3)
4747
48+ enum {
49+ CAN_STATE_STOPPED ,
50+ CAN_STATE_ERROR_ACTIVE ,
51+ CAN_STATE_ERROR_WARNING ,
52+ CAN_STATE_ERROR_PASSIVE ,
53+ CAN_STATE_BUS_OFF ,
54+ };
55+
4856/// \moduleref pyb
4957/// \class CAN - controller area network communication bus
5058///
@@ -484,6 +492,26 @@ STATIC mp_obj_t pyb_can_restart(mp_obj_t self_in) {
484492}
485493STATIC MP_DEFINE_CONST_FUN_OBJ_1 (pyb_can_restart_obj , pyb_can_restart );
486494
495+ // Get the state of the controller
496+ STATIC mp_obj_t pyb_can_state (mp_obj_t self_in ) {
497+ pyb_can_obj_t * self = MP_OBJ_TO_PTR (self_in );
498+ mp_int_t state = CAN_STATE_STOPPED ;
499+ if (self -> is_enabled ) {
500+ CAN_TypeDef * can = self -> can .Instance ;
501+ if (can -> ESR & CAN_ESR_BOFF ) {
502+ state = CAN_STATE_BUS_OFF ;
503+ } else if (can -> ESR & CAN_ESR_EPVF ) {
504+ state = CAN_STATE_ERROR_PASSIVE ;
505+ } else if (can -> ESR & CAN_ESR_EWGF ) {
506+ state = CAN_STATE_ERROR_WARNING ;
507+ } else {
508+ state = CAN_STATE_ERROR_ACTIVE ;
509+ }
510+ }
511+ return MP_OBJ_NEW_SMALL_INT (state );
512+ }
513+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (pyb_can_state_obj , pyb_can_state );
514+
487515/// \method any(fifo)
488516/// Return `True` if any message waiting on the FIFO, else `False`.
489517STATIC mp_obj_t pyb_can_any (mp_obj_t self_in , mp_obj_t fifo_in ) {
@@ -842,6 +870,7 @@ STATIC const mp_rom_map_elem_t pyb_can_locals_dict_table[] = {
842870 { MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& pyb_can_init_obj ) },
843871 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& pyb_can_deinit_obj ) },
844872 { MP_ROM_QSTR (MP_QSTR_restart ), MP_ROM_PTR (& pyb_can_restart_obj ) },
873+ { MP_ROM_QSTR (MP_QSTR_state ), MP_ROM_PTR (& pyb_can_state_obj ) },
845874 { MP_ROM_QSTR (MP_QSTR_any ), MP_ROM_PTR (& pyb_can_any_obj ) },
846875 { MP_ROM_QSTR (MP_QSTR_send ), MP_ROM_PTR (& pyb_can_send_obj ) },
847876 { MP_ROM_QSTR (MP_QSTR_recv ), MP_ROM_PTR (& pyb_can_recv_obj ) },
@@ -861,6 +890,13 @@ STATIC const mp_rom_map_elem_t pyb_can_locals_dict_table[] = {
861890 { MP_ROM_QSTR (MP_QSTR_LIST16 ), MP_ROM_INT (LIST16 ) },
862891 { MP_ROM_QSTR (MP_QSTR_MASK32 ), MP_ROM_INT (MASK32 ) },
863892 { MP_ROM_QSTR (MP_QSTR_LIST32 ), MP_ROM_INT (LIST32 ) },
893+
894+ // values for CAN.state()
895+ { MP_ROM_QSTR (MP_QSTR_STOPPED ), MP_ROM_INT (CAN_STATE_STOPPED ) },
896+ { MP_ROM_QSTR (MP_QSTR_ERROR_ACTIVE ), MP_ROM_INT (CAN_STATE_ERROR_ACTIVE ) },
897+ { MP_ROM_QSTR (MP_QSTR_ERROR_WARNING ), MP_ROM_INT (CAN_STATE_ERROR_WARNING ) },
898+ { MP_ROM_QSTR (MP_QSTR_ERROR_PASSIVE ), MP_ROM_INT (CAN_STATE_ERROR_PASSIVE ) },
899+ { MP_ROM_QSTR (MP_QSTR_BUS_OFF ), MP_ROM_INT (CAN_STATE_BUS_OFF ) },
864900};
865901
866902STATIC MP_DEFINE_CONST_DICT (pyb_can_locals_dict , pyb_can_locals_dict_table );
0 commit comments