@@ -322,7 +322,12 @@ STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
322
322
mp_printf (print , "\n data CB: True, on len: %d" , self -> data_cb_size );
323
323
}
324
324
if (self -> pattern_cb ) {
325
- mp_printf (print , "\n pattern CB: True, pattern: [%s]" , self -> pattern );
325
+ char pattern [80 ] = {'\0' };
326
+ for (int i = 0 ; i < self -> pattern_len ; i ++ ) {
327
+ if ((self -> pattern [i ] >= 0x20 ) && (self -> pattern [i ] < 0x7f )) pattern [strlen (pattern )] = self -> pattern [i ];
328
+ else sprintf (pattern + strlen (pattern ), "\\x%02x" , self -> pattern [i ]);
329
+ }
330
+ mp_printf (print , "\n pattern CB: True, pattern: b'%s'" , pattern );
326
331
}
327
332
if (self -> error_cb ) {
328
333
mp_printf (print , "\n error CB: True" );
@@ -438,10 +443,16 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
438
443
if (args [ARG_timeout ].u_int >= 0 ) self -> timeout = args [ARG_timeout ].u_int ;
439
444
440
445
// set line end
441
- if (MP_OBJ_IS_STR (args [ARG_lineend ].u_obj )) {
442
- size_t lnendlen ;
443
- const char * lnend = mp_obj_str_get_data (args [ARG_lineend ].u_obj , & lnendlen );
444
- if ((lnend ) && (lnendlen > 0 ) && (lnendlen < 3 )) sprintf ((char * )self -> lineend , "%s" , lnend );
446
+ mp_buffer_info_t lnend_buff ;
447
+ mp_obj_type_t * type = mp_obj_get_type (args [ARG_lineend ].u_obj );
448
+ if (type -> buffer_p .get_buffer != NULL ) {
449
+ int ret = type -> buffer_p .get_buffer (args [ARG_lineend ].u_obj , & lnend_buff , MP_BUFFER_READ );
450
+ if (ret == 0 ) {
451
+ if ((lnend_buff .len > 0 ) && (lnend_buff .len < sizeof (self -> lineend ))) {
452
+ memset (self -> lineend , 0 , sizeof (self -> lineend ));
453
+ memcpy (self -> lineend , lnend_buff .buf , lnend_buff .len );
454
+ }
455
+ }
445
456
}
446
457
}
447
458
@@ -684,8 +695,12 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
684
695
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
685
696
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
686
697
698
+ int datalen = -1 ;
699
+ mp_buffer_info_t pattern_buff ;
687
700
int cbtype = args [ARG_type ].u_int ;
701
+
688
702
if ((!MP_OBJ_IS_FUN (args [ARG_func ].u_obj )) && (!MP_OBJ_IS_METH (args [ARG_func ].u_obj ))) {
703
+ // CB function not given, disable callback
689
704
if (uart_mutex ) xSemaphoreTake (uart_mutex , 200 / portTICK_PERIOD_MS );
690
705
switch (cbtype ) {
691
706
case UART_CB_TYPE_DATA :
@@ -707,29 +722,43 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
707
722
return mp_const_none ;
708
723
}
709
724
725
+ // Get callback parameters
726
+ switch (cbtype ) {
727
+ case UART_CB_TYPE_DATA :
728
+ if ((args [ARG_datalen ].u_int <= 0 ) || (args [ARG_datalen ].u_int >= self -> buffer_size )) {
729
+ mp_raise_ValueError ("invalid data length" );
730
+ }
731
+ datalen = args [ARG_datalen ].u_int ;
732
+ break ;
733
+ case UART_CB_TYPE_PATTERN :
734
+ {
735
+ bool has_pattern = false;
736
+ mp_obj_type_t * type = mp_obj_get_type (args [ARG_pattern ].u_obj );
737
+ if (type -> buffer_p .get_buffer != NULL ) {
738
+ int ret = type -> buffer_p .get_buffer (args [ARG_pattern ].u_obj , & pattern_buff , MP_BUFFER_READ );
739
+ if (ret == 0 ) {
740
+ if ((pattern_buff .len > 0 ) && (pattern_buff .len <= sizeof (self -> pattern ))) has_pattern = true;
741
+ }
742
+ }
743
+ if (!has_pattern ) {
744
+ mp_raise_ValueError ("invalid pattern" );
745
+ }
746
+ }
747
+ break ;
748
+ default :
749
+ break ;
750
+ }
710
751
711
- int datalen = -1 ;
712
- size_t patternlen = 0 ;
713
- const char * pattern = NULL ;
714
-
715
- if (MP_OBJ_IS_STR (args [ARG_pattern ].u_obj )) {
716
- pattern = mp_obj_str_get_data (args [ARG_pattern ].u_obj , & patternlen );
717
- if (patternlen > sizeof (self -> pattern )) patternlen = sizeof (self -> pattern );
718
- }
719
-
720
- if ((args [ARG_datalen ].u_int >= 0 ) && (args [ARG_datalen ].u_int < self -> buffer_size )) datalen = args [ARG_datalen ].u_int ;
721
-
752
+ // Set the callback
722
753
if (uart_mutex ) xSemaphoreTake (uart_mutex , 200 / portTICK_PERIOD_MS );
723
754
switch (cbtype ) {
724
755
case UART_CB_TYPE_DATA :
725
- if ( datalen >= 0 ) self -> data_cb_size = datalen ;
756
+ self -> data_cb_size = datalen ;
726
757
self -> data_cb = args [ARG_func ].u_obj ;
727
758
break ;
728
759
case UART_CB_TYPE_PATTERN :
729
- if (pattern ) {
730
- memcpy (self -> pattern , pattern , patternlen );
731
- self -> pattern_len = patternlen ;
732
- }
760
+ memcpy (self -> pattern , pattern_buff .buf , pattern_buff .len );
761
+ self -> pattern_len = pattern_buff .len ;
733
762
self -> pattern_cb = args [ARG_func ].u_obj ;
734
763
break ;
735
764
case UART_CB_TYPE_ERROR :
0 commit comments