7 #include "HardwareSerialPlus.h" 8 #include "HardwareSerialPlus_private.h" 15 #if defined(HAVE_HWSERIAL0P) 16 void serialPlusEvent() __attribute__((weak));
17 bool Serial0Plus_available() __attribute__((weak));
20 #if defined(HAVE_HWSERIAL1P) 21 void serialPlusEvent1() __attribute__((weak));
22 bool SerialPlus1_available() __attribute__((weak));
25 #if defined(HAVE_HWSERIAL2P) 26 void serialPlusEvent2() __attribute__((weak));
27 bool SerialPlus2_available() __attribute__((weak));
30 #if defined(HAVE_HWSERIAL3P) 31 void serialPlusEvent3() __attribute__((weak));
32 bool SerialPlus3_available() __attribute__((weak));
35 void serialEventRun(
void)
37 #if defined(HAVE_HWSERIAL0P) 38 if (Serial0Plus_available && serialPlusEvent && Serial0Plus_available()) serialPlusEvent();
40 #if defined(HAVE_HWSERIAL1P) 41 if (SerialPlus1_available && serialPlusEvent1 && SerialPlus1_available()) serialPlusEvent1();
43 #if defined(HAVE_HWSERIAL2P) 44 if (SerialPlus2_available && serialPlusEvent2 && SerialPlus2_available()) serialPlusEvent2();
46 #if defined(HAVE_HWSERIAL3P) 47 if (SerialPlus3_available && serialPlusEvent3 && SerialPlus3_available()) serialPlusEvent3();
53 void HardwareSerialPlus::setRxBuffer(
unsigned char* buffer, uint16_t size){
55 _rx_buffer_size = size;
58 void HardwareSerialPlus::setTxBuffer(
unsigned char* buffer, uint16_t size){
60 _tx_buffer_size = size;
69 void HardwareSerialPlus::_tx_udr_empty_irq(
void)
73 unsigned char c = _tx_buffer[_tx_buffer_tail];
74 _tx_buffer_tail = (_tx_buffer_tail + 1) % _tx_buffer_size;
83 if (_tx_buffer_head == _tx_buffer_tail) {
89 void HardwareSerialPlus::begin(
unsigned long baud, byte config)
92 uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
100 if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
103 baud_setting = (F_CPU / 8 / baud - 1) / 2;
107 *_ubrrh = baud_setting >> 8;
108 *_ubrrl = baud_setting;
113 #if defined(__AVR_ATmega8__) 120 sbi(*_ucsrb, RXCIE0);
121 cbi(*_ucsrb, UDRIE0);
124 void HardwareSerialPlus::end()
131 cbi(*_ucsrb, RXCIE0);
132 cbi(*_ucsrb, UDRIE0);
135 _rx_buffer_head = _rx_buffer_tail;
138 int HardwareSerialPlus::available(
void)
140 return ((
unsigned int)(_rx_buffer_size + _rx_buffer_head - _rx_buffer_tail)) % _rx_buffer_size;
143 int HardwareSerialPlus::peek(
void)
145 if (_rx_buffer_head == _rx_buffer_tail) {
148 return _rx_buffer[_rx_buffer_tail];
153 int HardwareSerialPlus::read(
void)
156 if (_rx_buffer_head == _rx_buffer_tail) {
159 unsigned char c = _rx_buffer[_rx_buffer_tail];
160 _rx_buffer_tail = (_rx_buffer_tail + 1) % _rx_buffer_size;
165 int HardwareSerialPlus::availableForWrite(
void)
167 uint8_t oldSREG = SREG;
169 uint16_t head = _tx_buffer_head;
170 uint16_t tail = _tx_buffer_tail;
172 if (head >= tail)
return _tx_buffer_size - 1 - head + tail;
173 return tail - head - 1;
176 void HardwareSerialPlus::flush()
184 while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
185 if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
189 if (bit_is_set(*_ucsra, UDRE0))
196 size_t HardwareSerialPlus::write(uint8_t c)
203 if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
208 uint16_t i = (_tx_buffer_head + 1) % _tx_buffer_size;
212 while (i == _tx_buffer_tail) {
213 if (bit_is_clear(SREG, SREG_I)) {
218 if(bit_is_set(*_ucsra, UDRE0))
225 _tx_buffer[_tx_buffer_head] = c;
228 sbi(*_ucsrb, UDRIE0);