Merge pull request #802 from adafruit/add-availableforwrite-hwserial

add availableForWrite() for uart
This commit is contained in:
Ha Thach 2023-11-30 16:35:09 +07:00 committed by GitHub
commit 6f5cee25a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 6 deletions

View file

@ -70,6 +70,7 @@ class HardwareSerial : public Stream
virtual void flush(void) = 0;
virtual size_t write(uint8_t) = 0;
virtual size_t write(const uint8_t *buffer, size_t size) = 0;
virtual int availableForWrite(void);
using Print::write; // pull in write(str) from Print
virtual operator bool() = 0;
};

View file

@ -67,6 +67,14 @@ int RingBuffer::available()
return delta;
}
int RingBuffer::availableForStore() {
if (_iHead >= _iTail) {
return SERIAL_BUFFER_SIZE - 1 - _iHead + _iTail;
} else {
return _iTail - _iHead - 1;
}
}
int RingBuffer::peek()
{
if(_iTail == _iHead)

View file

@ -39,14 +39,15 @@ class RingBuffer
public:
RingBuffer( void ) ;
void store_char( uint8_t c ) ;
void clear();
int read_char();
int available();
int peek();
bool isFull();
void clear();
int read_char();
int available();
int availableForStore();
int peek();
bool isFull();
private:
int nextIndex(int index);
int nextIndex(int index);
} ;
#endif /* _RING_BUFFER_ */

View file

@ -253,6 +253,12 @@ size_t Uart::write(const uint8_t *buffer, size_t size)
return sent;
}
int Uart::availableForWrite(void) {
// UART does not use ring buffer for TX, therefore it is either busy or not
UBaseType_t available = uxSemaphoreGetCount(_end_tx_sem);
return available ? SERIAL_BUFFER_SIZE : 0;
}
//------------- Serial1 (or Serial in case of nRF52832) -------------//
#ifdef NRF52832_XXAA
Uart Serial( NRF_UARTE0, UARTE0_UART0_IRQn, PIN_SERIAL_RX, PIN_SERIAL_TX );

View file

@ -39,6 +39,7 @@ class Uart : public HardwareSerial
void begin(unsigned long baudrate, uint16_t config);
void end();
int available();
int availableForWrite(void);
int peek();
int read();
void flush();