BayEOS-Arduino  1.8.0_0.0.4
HardwareSerialPlus.h
1 #ifndef HardwareSerialPlus_h
2 #define HardwareSerialPlus_h
3 #include <inttypes.h>
4 
5 #include "Stream.h"
6 // Define config for Serial.begin(baud, config);
7 #define SERIAL_5N1 0x00
8 #define SERIAL_6N1 0x02
9 #define SERIAL_7N1 0x04
10 #define SERIAL_8N1 0x06
11 #define SERIAL_5N2 0x08
12 #define SERIAL_6N2 0x0A
13 #define SERIAL_7N2 0x0C
14 #define SERIAL_8N2 0x0E
15 #define SERIAL_5E1 0x20
16 #define SERIAL_6E1 0x22
17 #define SERIAL_7E1 0x24
18 #define SERIAL_8E1 0x26
19 #define SERIAL_5E2 0x28
20 #define SERIAL_6E2 0x2A
21 #define SERIAL_7E2 0x2C
22 #define SERIAL_8E2 0x2E
23 #define SERIAL_5O1 0x30
24 #define SERIAL_6O1 0x32
25 #define SERIAL_7O1 0x34
26 #define SERIAL_8O1 0x36
27 #define SERIAL_5O2 0x38
28 #define SERIAL_6O2 0x3A
29 #define SERIAL_7O2 0x3C
30 #define SERIAL_8O2 0x3E
31 
32 class HardwareSerialPlus : public Stream
33 {
34 protected:
35  volatile uint8_t * const _ubrrh;
36  volatile uint8_t * const _ubrrl;
37  volatile uint8_t * const _ucsra;
38  volatile uint8_t * const _ucsrb;
39  volatile uint8_t * const _ucsrc;
40  volatile uint8_t * const _udr;
41 
42  // Has any byte been written to the UART since begin()
43  bool _written;
44  volatile uint16_t _rx_buffer_head;
45  volatile uint16_t _rx_buffer_tail;
46  volatile uint16_t _tx_buffer_head;
47  volatile uint16_t _tx_buffer_tail;
48 
49  uint16_t _rx_buffer_size;
50  uint16_t _tx_buffer_size;
51  unsigned char* _rx_buffer;
52  unsigned char* _tx_buffer;
53 public:
54  inline HardwareSerialPlus(
55  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
56  volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
57  volatile uint8_t *ucsrc, volatile uint8_t *udr,
58  unsigned char *rxbuffer, uint16_t rxsize,unsigned char *txbuffer, uint16_t txsize);
59  void setRxBuffer(unsigned char *buffer, uint16_t size);
60  void setTxBuffer(unsigned char *buffer, uint16_t size);
61  void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
62  void begin(unsigned long, uint8_t);
63  void end();
64  int available(void);
65  int peek(void);
66  void flush(void);
67  int read(void);
68  int availableForWrite(void);
69  size_t write(uint8_t);
70  inline size_t write(unsigned long n) { return write((uint8_t)n); }
71  inline size_t write(long n) { return write((uint8_t)n); }
72  inline size_t write(unsigned int n) { return write((uint8_t)n); }
73  inline size_t write(int n) { return write((uint8_t)n); }
74  using Print::write; // pull in write(str) and write(buf, size) from Print
75  operator bool() { return true; }
76  inline void _rx_complete_irq(void);
77  void _tx_udr_empty_irq(void);
78 };
79 
80 #if defined(UBRRH) || defined(UBRR0H)
81  extern HardwareSerialPlus SerialPlus;
82  #define HAVE_HWSERIAL0P
83 #endif
84 #if defined(UBRR1H)
85  extern HardwareSerialPlus SerialPlus1;
86  #define HAVE_HWSERIAL1P
87 #endif
88 #if defined(UBRR2H)
89  extern HardwareSerialPlus SerialPlus2;
90  #define HAVE_HWSERIAL2P
91 #endif
92 #if defined(UBRR3H)
93  extern HardwareSerialPlus SerialPlus3;
94  #define HAVE_HWSERIAL3P
95 #endif
96 
97 extern void serialPlusEventRun(void) __attribute__((weak));
98 
99 
100 #endif