3131
3232#include "py/mpstate.h"
3333#include "py/mphal.h"
34+ #include "py/runtime.h"
3435
3536#ifndef _WIN32
3637#include <signal.h>
@@ -106,8 +107,40 @@ void mp_hal_stdio_mode_orig(void) {
106107
107108#endif
108109
110+ #if MICROPY_PY_OS_DUPTERM
111+ void mp_hal_dupterm_tx_strn (const char * str , size_t len ) {
112+ if (MP_STATE_PORT (term_obj ) != MP_OBJ_NULL ) {
113+ mp_obj_t write_m [3 ];
114+ mp_load_method (MP_STATE_PORT (term_obj ), MP_QSTR_write , write_m );
115+ write_m [2 ] = mp_obj_new_bytearray_by_ref (len , (char * )str );
116+ mp_call_method_n_kw (1 , 0 , write_m );
117+ }
118+ }
119+ #endif
120+
109121int mp_hal_stdin_rx_chr (void ) {
110122 unsigned char c ;
123+ #if MICROPY_PY_OS_DUPTERM
124+ while (MP_STATE_PORT (term_obj ) != MP_OBJ_NULL ) {
125+ mp_obj_t read_m [3 ];
126+ mp_load_method (MP_STATE_PORT (term_obj ), MP_QSTR_read , read_m );
127+ read_m [2 ] = MP_OBJ_NEW_SMALL_INT (1 );
128+ mp_obj_t res = mp_call_method_n_kw (1 , 0 , read_m );
129+ if (res == mp_const_none ) {
130+ break ;
131+ }
132+ mp_buffer_info_t bufinfo ;
133+ mp_get_buffer_raise (res , & bufinfo , MP_BUFFER_READ );
134+ if (bufinfo .len == 0 ) {
135+ break ;
136+ }
137+ c = * (byte * )bufinfo .buf ;
138+ if (c == '\n' ) {
139+ c = '\r' ;
140+ }
141+ return c ;
142+ }
143+ #endif
111144 int ret = read (0 , & c , 1 );
112145 if (ret == 0 ) {
113146 c = 4 ; // EOF, ctrl-D
@@ -119,6 +152,7 @@ int mp_hal_stdin_rx_chr(void) {
119152
120153void mp_hal_stdout_tx_strn (const char * str , size_t len ) {
121154 int ret = write (1 , str , len );
155+ mp_hal_dupterm_tx_strn (str , len );
122156 (void )ret ; // to suppress compiler warning
123157}
124158
0 commit comments