pico_stdio improvements (#598)
* add stdio_usb_connected() method * add PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS to allow waiting for CDC connection during init(* * add puts_raw and putchar_raw to skip any CR/LF translation
This commit is contained in:
@ -54,6 +54,16 @@
|
||||
#define PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE 1200
|
||||
#endif
|
||||
|
||||
// PICO_CONFIG: PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS, Maximum number of milliseconds to wait during initialization for a CDC connection from the host (negative means indefinite) before returning, default=0, group=pico_stdio_usb
|
||||
#ifndef PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS
|
||||
#define PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS 0
|
||||
#endif
|
||||
|
||||
// PICO_CONFIG: PICO_STDIO_USB_POST_CONNECT_WAIT_DELAY_MS, Number of milliseconds to wait during initialization after a host CDC connection is detected before returning (some host terminals seem to sometimes lose transmissions sent right after connection), default=50, group=pico_stdio_usb
|
||||
#ifndef PICO_STDIO_USB_POST_CONNECT_WAIT_DELAY_MS
|
||||
#define PICO_STDIO_USB_POST_CONNECT_WAIT_DELAY_MS 50
|
||||
#endif
|
||||
|
||||
// PICO_CONFIG: PICO_STDIO_USB_RESET_BOOTSEL_ACTIVITY_LED, Optionally define a pin to use as bootloader activity LED when BOOTSEL mode is entered via USB (either VIA_BAUD_RATE or VIA_VENDOR_INTERFACE), type=int, min=0, max=29, group=pico_stdio_usb
|
||||
|
||||
// PICO_CONFIG: PICO_STDIO_USB_RESET_BOOTSEL_FIXED_ACTIVITY_LED, Whether the pin specified by PICO_STDIO_USB_RESET_BOOTSEL_ACTIVITY_LED is fixed or can be modified by picotool over the VENDOR USB interface, type=bool, default=0, group=pico_stdio_usb
|
||||
@ -94,10 +104,22 @@ extern "C" {
|
||||
extern stdio_driver_t stdio_usb;
|
||||
|
||||
/*! \brief Explicitly initialize USB stdio and add it to the current set of stdin drivers
|
||||
* \ingroup pico_stdio_uart
|
||||
* \ingroup pico_stdio_usb
|
||||
*
|
||||
* \ref PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS can be set to cause this method to wait for a CDC connection
|
||||
* from the host before returning, which is useful if you don't want any initial stdout output to be discarded
|
||||
* before the connection is established.
|
||||
*
|
||||
* \return true if the USB CDC was initialized, false if an error occurred
|
||||
*/
|
||||
bool stdio_usb_init(void);
|
||||
|
||||
/*! \brief Check if there is an active stdio CDC connection to a host
|
||||
* \ingroup pico_stdio_usb
|
||||
*
|
||||
* \return true if stdio is connected over CDC
|
||||
*/
|
||||
bool stdio_usb_connected(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -103,9 +103,29 @@ bool stdio_usb_init(void) {
|
||||
bool rc = add_alarm_in_us(PICO_STDIO_USB_TASK_INTERVAL_US, timer_task, NULL, true);
|
||||
if (rc) {
|
||||
stdio_set_driver_enabled(&stdio_usb, true);
|
||||
#if PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS
|
||||
#if PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS > 0
|
||||
absolute_time_t until = make_timeout_time_ms(PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS);
|
||||
#else
|
||||
absolute_time_t until = at_the_end_of_time;
|
||||
#endif
|
||||
do {
|
||||
if (stdio_usb_connected()) {
|
||||
#if PICO_STDIO_USB_POST_CONNECT_WAIT_DELAY_MS != 0
|
||||
sleep_ms(PICO_STDIO_USB_POST_CONNECT_WAIT_DELAY_MS);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
sleep_ms(10);
|
||||
} while (!time_reached(until));
|
||||
#endif
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool stdio_usb_connected(void) {
|
||||
return tud_cdc_connected();
|
||||
}
|
||||
#else
|
||||
#include "pico/stdio_usb.h"
|
||||
#warning stdio USB was configured, but is being disabled as TinyUSB is explicitly linked
|
||||
|
Reference in New Issue
Block a user