Skip to content

Commit 03ba5e9

Browse files
authored
Merge pull request #2 from ETrobocon/fix/mphal-stdout-tx-strn-signature
bricks: fix mp_hal_stdout_tx_strn() signature mismatch
2 parents c01a6c1 + b95d98d commit 03ba5e9

5 files changed

Lines changed: 48 additions & 15 deletions

File tree

bricks/_common_stm32/mphalport.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,17 @@ int mp_hal_stdin_rx_chr(void) {
8888
}
8989

9090
// Send string of given length
91-
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
91+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
92+
size_t org_len = len;
93+
9294
while (len--) {
9395
while (!(USART6->SR & USART_SR_TXE)) {
9496
MICROPY_VM_HOOK_LOOP
9597
}
9698
USART6->DR = *str++;
9799
}
100+
101+
return org_len;
98102
}
99103

100104
void mp_hal_stdout_tx_flush(void) {
@@ -127,7 +131,9 @@ int mp_hal_stdin_rx_chr(void) {
127131
}
128132

129133
// Send string of given length
130-
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
134+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
135+
size_t org_len = len;
136+
131137
while (len) {
132138
uint32_t size = len;
133139
pbio_error_t err = pbsys_bluetooth_tx((const uint8_t *)str, &size);
@@ -141,11 +147,13 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
141147
if (err != PBIO_ERROR_AGAIN) {
142148
// Ignoring error for now. This means stdout lost if Bluetooth is
143149
// disconnected.
144-
return;
150+
return org_len - len;
145151
}
146152

147153
MICROPY_EVENT_POLL_HOOK
148154
}
155+
156+
return org_len;
149157
}
150158

151159
void mp_hal_stdout_tx_flush(void) {

bricks/ev3dev/ev3dev_mphal.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,26 @@ int mp_hal_stdin_rx_chr(void) {
109109
return c;
110110
}
111111

112-
void mp_hal_stdout_tx_strn(const char *str, size_t len) {
113-
MP_THREAD_GIL_EXIT();
114-
int ret = write(STDOUT_FILENO, str, len);
115-
MP_THREAD_GIL_ENTER();
116-
(void)ret; // to suppress compiler warning
112+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
113+
size_t remaining = len;
114+
while (remaining > 0) {
115+
MP_THREAD_GIL_EXIT();
116+
ssize_t ret = write(STDOUT_FILENO, str, remaining);
117+
MP_THREAD_GIL_ENTER();
118+
if (ret < 0) {
119+
if (errno == EINTR) {
120+
continue;
121+
}
122+
return len - remaining;
123+
}
124+
/* Defensive check: POSIX guarantees ret <= remaining, but guard against non-compliant implementations. */
125+
if ((size_t)ret > remaining) {
126+
return len;
127+
}
128+
str += ret;
129+
remaining -= (size_t)ret;
130+
}
131+
return len;
117132
}
118133

119134
// cooked is same as uncooked because the terminal does some postprocessing

bricks/ev3rt/mphalport.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,14 @@ int mp_hal_stdin_rx_chr(void) {
7575
}
7676

7777
// Send string of given length
78-
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
78+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
7979
uint32_t in_waiting;
8080
if (bluetooth_is_connected(&in_waiting)) {
8181
serial_wri_dat(EV3_SERIAL_BT, str, len);
82+
return len;
8283
}
84+
85+
return 0;
8386
}
8487

8588
void mp_hal_stdout_tx_flush(void) {

bricks/nxt/mphalport.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,20 @@ int mp_hal_stdin_rx_chr(void) {
8585
}
8686

8787
// Send string of given length
88-
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
88+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
8989

9090
// Nothing to do if disconnected or empty data
9191
if (!nx_bt_stream_opened() || len == 0) {
92-
return;
92+
return 0;
9393
}
9494

95+
size_t org_len = len;
9596
nx_bt_stream_write((uint8_t *)str, len);
9697
while (!nx_bt_stream_data_written()) {
9798
MICROPY_EVENT_POLL_HOOK;
9899
}
100+
101+
return org_len;
99102
}
100103

101104
void mp_hal_stdout_tx_flush(void) {

bricks/primehub_spike-rt/mphalport.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ int mp_hal_stdin_rx_chr(void) {
5858
}
5959

6060
// Send string of given length
61-
//void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
6261
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
62+
size_t org_len = len;
6363
extern void tPutLogTarget_ePutLog_putChar(char c);
6464
while (len--) {
6565
tPutLogTarget_ePutLog_putChar(*str++);
6666
}
6767
// serial_wri_dat(TASK_PORTID, str, len)
68-
return 0;
68+
return org_len;
6969
}
7070

7171
#else // !PYBRICKS_HUB_DEBUG
@@ -94,7 +94,9 @@ int mp_hal_stdin_rx_chr(void) {
9494
}
9595

9696
// Send string of given length
97-
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
97+
mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
98+
size_t org_len = len;
99+
98100
while (len) {
99101
uint32_t size = len;
100102
pbio_error_t err = pbsys_bluetooth_tx((const uint8_t *)str, &size);
@@ -108,11 +110,13 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
108110
if (err != PBIO_ERROR_AGAIN) {
109111
// Ignoring error for now. This means stdout lost if Bluetooth is
110112
// disconnected.
111-
return;
113+
return org_len - len;
112114
}
113115

114116
MICROPY_EVENT_POLL_HOOK
115117
}
118+
119+
return org_len;
116120
}
117121

118122
#endif // PYBRICKS_HUB_DEBUG

0 commit comments

Comments
 (0)