Skip to content

Commit 6f5cee2

Browse files
authored
Merge pull request #802 from adafruit/add-availableforwrite-hwserial
add availableForWrite() for uart
2 parents e1f1884 + 124758a commit 6f5cee2

File tree

5 files changed

+23
-6
lines changed

5 files changed

+23
-6
lines changed

cores/nRF5/HardwareSerial.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class HardwareSerial : public Stream
7070
virtual void flush(void) = 0;
7171
virtual size_t write(uint8_t) = 0;
7272
virtual size_t write(const uint8_t *buffer, size_t size) = 0;
73+
virtual int availableForWrite(void);
7374
using Print::write; // pull in write(str) from Print
7475
virtual operator bool() = 0;
7576
};

cores/nRF5/RingBuffer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ int RingBuffer::available()
6767
return delta;
6868
}
6969

70+
int RingBuffer::availableForStore() {
71+
if (_iHead >= _iTail) {
72+
return SERIAL_BUFFER_SIZE - 1 - _iHead + _iTail;
73+
} else {
74+
return _iTail - _iHead - 1;
75+
}
76+
}
77+
7078
int RingBuffer::peek()
7179
{
7280
if(_iTail == _iHead)

cores/nRF5/RingBuffer.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ class RingBuffer
3939
public:
4040
RingBuffer( void ) ;
4141
void store_char( uint8_t c ) ;
42-
void clear();
43-
int read_char();
44-
int available();
45-
int peek();
46-
bool isFull();
42+
void clear();
43+
int read_char();
44+
int available();
45+
int availableForStore();
46+
int peek();
47+
bool isFull();
4748

4849
private:
49-
int nextIndex(int index);
50+
int nextIndex(int index);
5051
} ;
5152

5253
#endif /* _RING_BUFFER_ */

cores/nRF5/Uart.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,12 @@ size_t Uart::write(const uint8_t *buffer, size_t size)
253253
return sent;
254254
}
255255

256+
int Uart::availableForWrite(void) {
257+
// UART does not use ring buffer for TX, therefore it is either busy or not
258+
UBaseType_t available = uxSemaphoreGetCount(_end_tx_sem);
259+
return available ? SERIAL_BUFFER_SIZE : 0;
260+
}
261+
256262
//------------- Serial1 (or Serial in case of nRF52832) -------------//
257263
#ifdef NRF52832_XXAA
258264
Uart Serial( NRF_UARTE0, UARTE0_UART0_IRQn, PIN_SERIAL_RX, PIN_SERIAL_TX );

cores/nRF5/Uart.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Uart : public HardwareSerial
3939
void begin(unsigned long baudrate, uint16_t config);
4040
void end();
4141
int available();
42+
int availableForWrite(void);
4243
int peek();
4344
int read();
4445
void flush();

0 commit comments

Comments
 (0)