@ -308,17 +308,30 @@ STATIC mp_obj_t machine_uart_sendbreak(mp_obj_t self_in) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1 ( machine_uart_sendbreak_obj , machine_uart_sendbreak ) ;
STATIC mp_obj_t machine_uart_txdone ( mp_obj_t self_in ) {
machine_uart_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
if ( self - > tx_status = = kStatus_LPUART_TxIdle ) {
return mp_const_true ;
} else {
return mp_const_false ;
}
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1 ( machine_uart_txdone_obj , machine_uart_txdone ) ;
STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table [ ] = {
{ MP_ROM_QSTR ( MP_QSTR_init ) , MP_ROM_PTR ( & machine_uart_init_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_any ) , MP_ROM_PTR ( & machine_uart_any_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_flush ) , MP_ROM_PTR ( & mp_stream_flush_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_read ) , MP_ROM_PTR ( & mp_stream_read_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_readline ) , MP_ROM_PTR ( & mp_stream_unbuffered_readline_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_readinto ) , MP_ROM_PTR ( & mp_stream_readinto_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_write ) , MP_ROM_PTR ( & mp_stream_write_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_sendbreak ) , MP_ROM_PTR ( & machine_uart_sendbreak_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_txdone ) , MP_ROM_PTR ( & machine_uart_txdone_obj ) } ,
{ MP_ROM_QSTR ( MP_QSTR_INV_TX ) , MP_ROM_INT ( UART_INVERT_TX ) } ,
{ MP_ROM_QSTR ( MP_QSTR_INV_RX ) , MP_ROM_INT ( UART_INVERT_RX ) } ,
@ -433,6 +446,21 @@ STATIC mp_uint_t machine_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint
if ( ( flags & MP_STREAM_POLL_WR ) ) {
ret | = MP_STREAM_POLL_WR ;
}
} else if ( request = = MP_STREAM_FLUSH ) {
// The timeout is estimated using the buffer size and the baudrate.
// Take the worst case assumptions at 13 bit symbol size times 2.
uint64_t timeout = ( uint64_t ) ( 3 + self - > txbuf_len ) * 13000000ll * 2 /
self - > config . baudRate_Bps + ticks_us64 ( ) ;
do {
if ( machine_uart_txdone ( ( mp_obj_t ) self ) = = mp_const_true ) {
return 0 ;
}
MICROPY_EVENT_POLL_HOOK
} while ( ticks_us64 ( ) < timeout ) ;
* errcode = MP_ETIMEDOUT ;
ret = MP_STREAM_ERROR ;
} else {
* errcode = MP_EINVAL ;
ret = MP_STREAM_ERROR ;