@@ -436,9 +436,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(pyb_can_any_obj, pyb_can_any);
436436/// Return value: `None`.
437437STATIC mp_obj_t pyb_can_send (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
438438 static const mp_arg_t allowed_args [] = {
439- { MP_QSTR_send , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
440- { MP_QSTR_addr , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = 0 } },
439+ { MP_QSTR_data , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
440+ { MP_QSTR_id , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = 0 } },
441441 { MP_QSTR_timeout , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
442+ { MP_QSTR_rtr , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
442443 };
443444
444445 // parse args
@@ -464,11 +465,16 @@ STATIC mp_obj_t pyb_can_send(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
464465 tx_msg .StdId = args [1 ].u_int & 0x7FF ;
465466 tx_msg .IDE = CAN_ID_STD ;
466467 }
467- tx_msg .RTR = CAN_RTR_DATA ;
468+ if (args [3 ].u_bool == false) {
469+ tx_msg .RTR = CAN_RTR_DATA ;
470+ } else {
471+ tx_msg .RTR = CAN_RTR_REMOTE ;
472+ }
468473 tx_msg .DLC = bufinfo .len ;
469474 for (mp_uint_t i = 0 ; i < bufinfo .len ; i ++ ) {
470475 tx_msg .Data [i ] = ((byte * )bufinfo .buf )[i ]; // Data is uint32_t but holds only 1 byte
471476 }
477+
472478 self -> can .pTxMsg = & tx_msg ;
473479 HAL_StatusTypeDef status = CAN_Transmit (& self -> can , args [2 ].u_int );
474480
@@ -543,7 +549,7 @@ STATIC mp_obj_t pyb_can_recv(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
543549 } else {
544550 tuple -> items [0 ] = MP_OBJ_NEW_SMALL_INT (rx_msg .ExtId );
545551 }
546- tuple -> items [1 ] = MP_OBJ_NEW_SMALL_INT ( rx_msg .RTR ) ;
552+ tuple -> items [1 ] = rx_msg .RTR == CAN_RTR_REMOTE ? mp_const_true : mp_const_false ;
547553 tuple -> items [2 ] = MP_OBJ_NEW_SMALL_INT (rx_msg .FMI );
548554 vstr_t vstr ;
549555 vstr_init_len (& vstr , rx_msg .DLC );
@@ -597,6 +603,7 @@ STATIC mp_obj_t pyb_can_setfilter(mp_uint_t n_args, const mp_obj_t *pos_args, mp
597603 { MP_QSTR_mode , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = 0 } },
598604 { MP_QSTR_fifo , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = CAN_FILTER_FIFO0 } },
599605 { MP_QSTR_params , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
606+ { MP_QSTR_rtr , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
600607 };
601608
602609 // parse args
@@ -605,8 +612,14 @@ STATIC mp_obj_t pyb_can_setfilter(mp_uint_t n_args, const mp_obj_t *pos_args, mp
605612 mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
606613
607614 mp_uint_t len ;
615+ mp_uint_t rtr_len ;
616+ mp_uint_t rtr_masks [4 ] = {0 , 0 , 0 , 0 };
617+ mp_obj_t * rtr_flags ;
608618 mp_obj_t * params ;
609619 mp_obj_get_array (args [3 ].u_obj , & len , & params );
620+ if (args [4 ].u_obj != MP_OBJ_NULL ){
621+ mp_obj_get_array (args [4 ].u_obj , & rtr_len , & rtr_flags );
622+ }
610623
611624 CAN_FilterConfTypeDef filter ;
612625 if (args [1 ].u_int == MASK16 || args [1 ].u_int == LIST16 ) {
@@ -615,15 +628,41 @@ STATIC mp_obj_t pyb_can_setfilter(mp_uint_t n_args, const mp_obj_t *pos_args, mp
615628 }
616629 filter .FilterScale = CAN_FILTERSCALE_16BIT ;
617630 if (self -> extframe ) {
618- filter .FilterIdLow = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [0 ])); // id1
619- filter .FilterMaskIdLow = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [1 ])); // mask1
620- filter .FilterIdHigh = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [2 ])); // id2
621- filter .FilterMaskIdHigh = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [3 ])); // mask2
622- } else {
623- filter .FilterIdLow = mp_obj_get_int (params [0 ]) << 5 ; // id1
624- filter .FilterMaskIdLow = mp_obj_get_int (params [1 ]) << 5 ; // mask1
625- filter .FilterIdHigh = mp_obj_get_int (params [2 ]) << 5 ; // id2
626- filter .FilterMaskIdHigh = mp_obj_get_int (params [3 ]) << 5 ; // mask2
631+ if (args [4 ].u_obj != MP_OBJ_NULL ) {
632+ if (args [1 ].u_int == MASK16 ) {
633+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x02 : 0 ;
634+ rtr_masks [1 ] = 0x02 ;
635+ rtr_masks [2 ] = mp_obj_get_int (rtr_flags [1 ]) ? 0x02 : 0 ;
636+ rtr_masks [3 ] = 0x02 ;
637+ } else { // LIST16
638+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x02 : 0 ;
639+ rtr_masks [1 ] = mp_obj_get_int (rtr_flags [1 ]) ? 0x02 : 0 ;
640+ rtr_masks [2 ] = mp_obj_get_int (rtr_flags [2 ]) ? 0x02 : 0 ;
641+ rtr_masks [3 ] = mp_obj_get_int (rtr_flags [3 ]) ? 0x02 : 0 ;
642+ }
643+ }
644+ filter .FilterIdLow = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [0 ])) | rtr_masks [0 ]; // id1
645+ filter .FilterMaskIdLow = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [1 ])) | rtr_masks [1 ]; // mask1
646+ filter .FilterIdHigh = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [2 ])) | rtr_masks [2 ]; // id2
647+ filter .FilterMaskIdHigh = EXTENDED_ID_TO_16BIT_FILTER (mp_obj_get_int (params [3 ])) | rtr_masks [3 ]; // mask2
648+ } else { // Basic frames
649+ if (args [4 ].u_obj != MP_OBJ_NULL ) {
650+ if (args [1 ].u_int == MASK16 ) {
651+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x10 : 0 ;
652+ rtr_masks [1 ] = 0x10 ;
653+ rtr_masks [2 ] = mp_obj_get_int (rtr_flags [1 ]) ? 0x10 : 0 ;
654+ rtr_masks [3 ] = 0x10 ;
655+ } else { // LIST16
656+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x10 : 0 ;
657+ rtr_masks [1 ] = mp_obj_get_int (rtr_flags [1 ]) ? 0x10 : 0 ;
658+ rtr_masks [2 ] = mp_obj_get_int (rtr_flags [2 ]) ? 0x10 : 0 ;
659+ rtr_masks [3 ] = mp_obj_get_int (rtr_flags [3 ]) ? 0x10 : 0 ;
660+ }
661+ }
662+ filter .FilterIdLow = (mp_obj_get_int (params [0 ]) << 5 ) | rtr_masks [0 ]; // id1
663+ filter .FilterMaskIdLow = (mp_obj_get_int (params [1 ]) << 5 ) | rtr_masks [1 ]; // mask1
664+ filter .FilterIdHigh = (mp_obj_get_int (params [2 ]) << 5 ) | rtr_masks [2 ]; // id2
665+ filter .FilterMaskIdHigh = (mp_obj_get_int (params [3 ]) << 5 ) | rtr_masks [3 ]; // mask2
627666 }
628667 if (args [1 ].u_int == MASK16 ) {
629668 filter .FilterMode = CAN_FILTERMODE_IDMASK ;
@@ -636,12 +675,20 @@ STATIC mp_obj_t pyb_can_setfilter(mp_uint_t n_args, const mp_obj_t *pos_args, mp
636675 if (len != 2 ) {
637676 goto error ;
638677 }
639- filter .FilterScale = CAN_FILTERSCALE_32BIT ;
640-
678+ filter .FilterScale = CAN_FILTERSCALE_32BIT ;
679+ if (args [4 ].u_obj != MP_OBJ_NULL ) {
680+ if (args [1 ].u_int == MASK32 ) {
681+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x02 : 0 ;
682+ rtr_masks [1 ] = 0x02 ;
683+ } else { // LIST32
684+ rtr_masks [0 ] = mp_obj_get_int (rtr_flags [0 ]) ? 0x02 : 0 ;
685+ rtr_masks [1 ] = mp_obj_get_int (rtr_flags [1 ]) ? 0x02 : 0 ;
686+ }
687+ }
641688 filter .FilterIdHigh = (mp_obj_get_int (params [0 ]) & 0xFF00 ) >> 13 ;
642- filter .FilterIdLow = ((mp_obj_get_int (params [0 ]) & 0x00FF ) << 3 ) | 4 ;
689+ filter .FilterIdLow = ((( mp_obj_get_int (params [0 ]) & 0x00FF ) << 3 ) | 4 ) | rtr_masks [ 0 ] ;
643690 filter .FilterMaskIdHigh = (mp_obj_get_int (params [1 ]) & 0xFF00 ) >> 13 ;
644- filter .FilterMaskIdLow = ((mp_obj_get_int (params [1 ]) & 0x00FF ) << 3 ) | 4 ;
691+ filter .FilterMaskIdLow = ((( mp_obj_get_int (params [1 ]) & 0x00FF ) << 3 ) | 4 ) | rtr_masks [ 1 ] ;
645692 if (args [1 ].u_int == MASK32 ) {
646693 filter .FilterMode = CAN_FILTERMODE_IDMASK ;
647694 }
0 commit comments