3 #include "PicoStreamPrintf.h"
4 #include "pins_arduino.h"
5 #include "HardwareSerial.h"
7 #include "PicoLogger.h"
9 #include "RingBufferN.h"
10 #include "pico/stdlib.h"
11 #include "hardware/uart.h"
17 #define BUFFER_SIZE 512
23 #if !defined(TINYUSB_HOST_LINKED) && !defined(TINYUSB_DEVICE_LINKED)
26 #define SerialUSB Serial
45 virtual void begin(
unsigned long baudrate) {
50 virtual void begin(
unsigned long baudrate, uint16_t config){
59 virtual int available(
void){
61 return buffer.available();
64 virtual int peek(
void) {
69 virtual int read(
void){
74 return buffer.read_char();
77 virtual void flush(
void) {
82 virtual size_t write(uint8_t c) {
83 size_t len = putchar(c);
84 #ifndef PICO_ARDUINO_NO_FLUSH
91 virtual size_t write(
const uint8_t *buffer,
size_t size){
93 for (
size_t j=0;j<size;j++){
94 result += putchar(buffer[j]);
103 using Print::println;
106 virtual operator bool(){
107 return tud_cdc_connected() && is_open;
112 RingBufferN<BUFFER_SIZE> buffer;
116 if (buffer.available()==0){
118 int wait_time = 1000;
119 int c = getchar_timeout_us(wait_time);
120 while(c!=PICO_ERROR_TIMEOUT && buffer.availableForStore()>0){
121 buffer.store_char(c);
122 c = getchar_timeout_us(wait_time);
129 inline PicoSerialUSB Serial;
143 this->uart_no = uart_no;
144 this->uart = uart_no == 0 ? uart0 : uart1;
147 virtual void begin(
unsigned long baudrate=PICO_DEFAULT_UART_BAUD_RATE) {
148 begin(baudrate, -1, -1, SERIAL_8N1);
151 virtual void begin(
unsigned long baudrate, uint16_t config) {
152 begin(baudrate, -1, -1, config);
167 virtual void begin(
unsigned long baudrate,
int rxPin,
int txPin, uint32_t config=SERIAL_8N1,
bool invert=
false,
bool cts=
false,
bool rts=
false) {
168 Logger.
printf(PicoLogger::Info,
"PicoHardwareSerial::begin %ld\n", baudrate);
171 uart_init(uart, baudrate);
172 setupDefaultRxTxPins();
173 uart_set_hw_flow(uart, cts, rts);
175 uart_set_translate_crlf(uart,
false);
176 uart_set_fifo_enabled(uart,
true);
178 uint rate_effective = uart_set_baudrate(uart,baudrate);
179 open = uart_is_enabled(uart);
181 Logger.
printf(PicoLogger::Info,
"baud_rate requested: %ld\n",baudrate);
182 Logger.
printf(PicoLogger::Info,
"baud_rate effective: %ld\n",rate_effective);
183 Logger.
printf(PicoLogger::Info,
"uart_is_enabled: %s\n", open ?
"true" :
"false");
189 Logger.
printf(PicoLogger::Info,
"PicoHardwareSerial::end %d\n",uart_no);
194 virtual int available(
void){
196 return buffer.available();
199 virtual int availableForWrite(
void){
200 return uart_is_writable(uart);
203 virtual int peek(
void){
205 return buffer.peek();
208 virtual int read(
void){
210 return buffer.read_char();
215 using Print::println;
217 virtual size_t write(uint8_t c) {
218 bool ok = uart_is_writable (uart);
225 virtual size_t write(
const uint8_t *buffer,
size_t size){
226 uart_write_blocking(uart, buffer, size);
234 virtual void flush(
void) {
237 virtual operator bool(){
243 RingBufferN<BUFFER_SIZE> buffer;
252 void readBuffer(
bool refill=
false) {
254 if (refill || buffer.available()==0){
255 while(buffer.availableForStore()>0 && uart_is_readable(uart) ) {
256 char c = uart_get_hw(uart)->dr;
257 buffer.store_char(c);
262 void set_config(uint32_t config){
263 Logger.
info(
"set_config");
267 uart_set_format(uart, 5, 1,UART_PARITY_NONE);
270 uart_set_format(uart, 6, 1,UART_PARITY_NONE);
273 uart_set_format(uart, 7, 1,UART_PARITY_NONE);
276 Logger.
info(
"SERIAL_8N1 - UART_PARITY_NONE");
277 uart_set_format(uart, 8, 1,UART_PARITY_NONE);
280 uart_set_format(uart, 5, 2,UART_PARITY_NONE);
283 uart_set_format(uart, 6, 2,UART_PARITY_NONE);
286 uart_set_format(uart, 7, 2,UART_PARITY_NONE);
289 uart_set_format(uart, 8, 2,UART_PARITY_NONE);
292 uart_set_format(uart, 5, 1,UART_PARITY_EVEN);
295 uart_set_format(uart, 6, 1,UART_PARITY_EVEN);
298 uart_set_format(uart, 7, 1,UART_PARITY_EVEN);
301 uart_set_format(uart, 8, 1,UART_PARITY_EVEN);
304 uart_set_format(uart, 5, 2,UART_PARITY_EVEN);
307 uart_set_format(uart, 6, 2,UART_PARITY_EVEN);
310 uart_set_format(uart, 7, 2,UART_PARITY_EVEN);
313 uart_set_format(uart, 8, 2,UART_PARITY_EVEN);
316 uart_set_format(uart, 5, 1,UART_PARITY_ODD);
319 uart_set_format(uart, 6, 1,UART_PARITY_ODD);
322 uart_set_format(uart, 7, 1,UART_PARITY_ODD);
325 uart_set_format(uart, 8, 1,UART_PARITY_ODD);
328 uart_set_format(uart, 5, 2,UART_PARITY_ODD);
331 uart_set_format(uart, 6, 2,UART_PARITY_ODD);
334 uart_set_format(uart, 7, 2,UART_PARITY_ODD);
337 uart_set_format(uart, 8, 2,UART_PARITY_ODD);
342 void setupDefaultRxTxPins(){
343 Logger.
info(
"setupDefaultRxTxPins");
362 Logger.
printf(PicoLogger::Info,
"Using UART: %d \n", uart_no);
363 Logger.
printf(PicoLogger::Info,
"txPin is %d\n", tx_pin);
364 Logger.
printf(PicoLogger::Info,
"rxPin is %d\n", rx_pin);
367 gpio_set_function(tx_pin, GPIO_FUNC_UART);
370 gpio_set_function(rx_pin, GPIO_FUNC_UART);
379 inline PicoSerialUART Serial1(0);
380 inline PicoSerialUART Serial2(1);
Definition: HardwareSerial.h:88
virtual int printf(LogLevel current_level, const char *fmt,...)
printf support
Definition: PicoLogger.h:65
virtual bool isLogging(LogLevel level=Info)
checks if the logging is active
Definition: PicoLogger.h:40
virtual void info(const char *str, const char *str1=nullptr, const char *str2=nullptr)
logs an info message
Definition: PicoLogger.h:50
Serial Stream for a defined UART. By default we use the following pins: UART0 tx/rx = gp0/gp1; UART1 ...
Definition: PicoHardwareSerial.h:137
virtual void begin(unsigned long baudrate, int rxPin, int txPin, uint32_t config=SERIAL_8N1, bool invert=false, bool cts=false, bool rts=false)
Initialization to output to UART.
Definition: PicoHardwareSerial.h:167
PicoUSBSerial is using the pico USB output. It is mapped to the Arduino Serial variable.
Definition: PicoHardwareSerial.h:33
virtual size_t write(uint8_t c)
provide implmentation of standard Arduino output of single character
Definition: PicoHardwareSerial.h:82
virtual size_t write(const uint8_t *buffer, size_t size)
provide implmentation of standard Arduino output of multiple characters
Definition: PicoHardwareSerial.h:91
Support for Serial.printf. The maximum printable length is defined by PRINTF_BUFFER_SIZE which is set...
Definition: PicoStreamPrintf.h:16
Pico Arduino Framework.
Definition: Arduino.cpp:26