Aruna
ESP32_UART.cpp
Go to the documentation of this file.
1 //
2 // Created by noeel on 16-1-19.
3 //
4 
5 #include <stdio.h>
6 #include "aruna/arunaTypes.h"
7 #include <aruna/comm.h>
9 #include "esp_log.h"
10 
11 
12 namespace aruna {
13  namespace driver {
14 
15  ESP32_UART::ESP32_UART(uart_port_t UART_NUM = UART_NUM_0,
16  int TXD_PIN = UART_PIN_NO_CHANGE,
17  int RXD_PIN = UART_PIN_NO_CHANGE,
18  int RTS_PIN = UART_PIN_NO_CHANGE,
19  int CTS_PIN = UART_PIN_NO_CHANGE,
20  uart_config_t UART_CONFIG = (uart_config_t) {
21  .baud_rate = 115200,
22  .data_bits = UART_DATA_8_BITS,
23  .parity = UART_PARITY_DISABLE,
24  .stop_bits = UART_STOP_BITS_1,
25  .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
26  .rx_flow_ctrl_thresh = 122,
27  .use_ref_tick = false
28  },
29  uart_mode_t UART_MODE = UART_MODE_UART,
30  unsigned int TX_BUF_SIZE = 256,
31  unsigned int RX_BUF_SIZE = 512) : UART_NUM(UART_NUM) {
32  // TODO logging zou moeten worden uitgeschakeld op de target UART.
33 
34  /* Configure parameters of an UART driver,
35  * communication pins and install the driver */
36 // set config
37  ESP_ERROR_CHECK(uart_param_config(UART_NUM, &UART_CONFIG));
38 // set pins
39  ESP_ERROR_CHECK(uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, RTS_PIN, CTS_PIN));
40 // install driver (driver can only be installed once, even if you uart_driver_delete is used)
41  ESP_ERROR_CHECK(uart_driver_install(UART_NUM, RX_BUF_SIZE, TX_BUF_SIZE, 20, &uart_queue, 0));
42 // Set correct mode
43  ESP_ERROR_CHECK(uart_set_mode(UART_NUM, UART_MODE));
44  }
45 
46  size_t ESP32_UART::_write(uint8_t *data, size_t dataSize) {
47  return uart_write_bytes(UART_NUM, (const char *) data, dataSize);
48  }
49 
50  unsigned int ESP32_UART::get_baudrate() {
51  uint32_t br = 0;
52  uart_get_baudrate(UART_NUM, &br);
53  return br;
54  }
55 
57  // TODO flush tx queue
58  // flush rx queue
59  xQueueReset(uart_queue);
60  ESP_ERROR_CHECK(uart_flush_input(UART_NUM));
61 
62  /*
63  * new driver cannot be installed even if uart_delete_driver is called.
64  * this causes an issue in driver selection because the winning driver gets restarted
65  */
66  ESP_ERROR_CHECK(uart_driver_delete(UART_NUM));
67  }
68 
69  size_t ESP32_UART::_read(uint8_t *buffer, size_t length) {
70  return uart_read_bytes(this->UART_NUM, buffer, length, 4);
71  }
72 
73  uint32_t ESP32_UART::_set_baudrate(uint32_t new_baudrate) {
74  ESP_ERROR_CHECK(uart_set_baudrate(UART_NUM, new_baudrate));
75  return get_baudrate();
76  }
77 
79  esp_err_t hw, sw;
80  err_t err = err_t::OK;
81  switch (new_flowcontrol) {
83  hw = uart_set_hw_flow_ctrl(UART_NUM, UART_HW_FLOWCTRL_CTS_RTS, 0);
84  sw = uart_set_sw_flow_ctrl(UART_NUM, false, XON, XOFF);
85  software_flowcontrol = false;
86  break;
88  hw = uart_set_hw_flow_ctrl(UART_NUM, UART_HW_FLOWCTRL_DISABLE, 0);
89  sw = uart_set_sw_flow_ctrl(UART_NUM, true, XON, XOFF);
90  software_flowcontrol = true;
91  break;
93  hw = uart_set_hw_flow_ctrl(UART_NUM, UART_HW_FLOWCTRL_CTS_RTS, 0);
94  sw = uart_set_sw_flow_ctrl(UART_NUM, true, XON, XOFF);
95  software_flowcontrol = true;
96  break;
99  default:
100  hw = uart_set_hw_flow_ctrl(UART_NUM, UART_HW_FLOWCTRL_DISABLE, 0);
101  sw = uart_set_sw_flow_ctrl(UART_NUM, false, XON, XOFF);
102  software_flowcontrol = false;
103  break;
104  }
105  err = hw || sw ? err_t::FAIL : err_t::OK;
106 
107  return err;
108  }
109 
111  uart_parity_t esp_parity;
112  switch (parity_bit) {
113  case parity_t::EVEN:
114  esp_parity = UART_PARITY_EVEN;
115  break;
116  case parity_t::ODD:
117  esp_parity = UART_PARITY_ODD;
118  break;
119  case parity_t::DISABLED:
120  default:
121  esp_parity = UART_PARITY_DISABLE;
122  break;
123  }
124  if (uart_set_parity(UART_NUM, esp_parity))
126  else
127  return err_t::OK;
128  }
129 
131 // TODO maak een map of bimap
132 //https://stackoverflow.com/questions/21760343/is-there-a-more-efficient-implementation-for-a-bidirectional-map
133  uart_stop_bits_t esp_stop;
134  switch (stop_bit) {
136  esp_stop = UART_STOP_BITS_1_5;
137  break;
138  case stop_bit_t::TWO:
139  esp_stop = UART_STOP_BITS_2;
140  break;
141  case stop_bit_t::ONE:
142  default:
143  esp_stop = UART_STOP_BITS_1;
144  break;
145 
146  }
147  if (uart_set_stop_bits(UART_NUM, esp_stop))
148  return err_t::FAIL;
149  else
150  return err_t::OK;
151  }
152 
154  size_t len = 0;
155  ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM, &len));
156  return len;
157  }
158 
160  uart_hw_flowcontrol_t esp_hw;
161  flowcontrol_t aruna_fc;
162  ESP_ERROR_CHECK(uart_get_hw_flow_ctrl(UART_NUM, &esp_hw));
163  switch (esp_hw) {
164  case UART_HW_FLOWCTRL_DISABLE:
165  aruna_fc = flowcontrol_t::DISABLED;
166  break;
167  case UART_HW_FLOWCTRL_RTS:
168  case UART_HW_FLOWCTRL_CTS:
169  case UART_HW_FLOWCTRL_CTS_RTS:
170  aruna_fc = flowcontrol_t::HARDWARE;
171  break;
172  case UART_HW_FLOWCTRL_MAX:
173  default:
174  aruna_fc = flowcontrol_t::NONE;
175  break;
176  }
179  else if (software_flowcontrol)
180  aruna_fc = flowcontrol_t::SOFTWARE;
181 
182  return aruna_fc;
183  }
184 
186  uart_parity_t esp_parity;
187  parity_t aruna_parity;
188  ESP_ERROR_CHECK(uart_get_parity(UART_NUM, &esp_parity));
189  switch (esp_parity) {
190  case UART_PARITY_EVEN:
191  aruna_parity = parity_t::EVEN;
192  break;
193  case UART_PARITY_ODD:
194  aruna_parity = parity_t::ODD;
195  break;
196  case UART_PARITY_DISABLE:
197  default:
198  aruna_parity = parity_t::DISABLED;
199  break;
200  }
201  return aruna_parity;
202  }
203 
205  uart_stop_bits_t esp_stop;
206  stop_bit_t aruna_stop;
207  ESP_ERROR_CHECK(uart_get_stop_bits(UART_NUM, &esp_stop));
208  switch (esp_stop) {
209  case UART_STOP_BITS_1:
210  aruna_stop = stop_bit_t::ONE;
211  break;
212  case UART_STOP_BITS_1_5:
213  aruna_stop = stop_bit_t::ONE_HALF;
214  break;
215  case UART_STOP_BITS_2:
216  aruna_stop = stop_bit_t::TWO;
217  break;
218  case UART_STOP_BITS_MAX:
219  default:
220  aruna_stop = stop_bit_t::NONE;
221  break;
222  }
223 
224  return aruna_stop;
225  }
226 
228  uart_word_length_t esp_word;
229  word_length_t aruna_word;
230  ESP_ERROR_CHECK(uart_get_word_length(UART_NUM, &esp_word));
231  switch (esp_word) {
232  case UART_DATA_5_BITS:
233  aruna_word = word_length_t::FIVE;
234  break;
235  case UART_DATA_6_BITS:
236  aruna_word = word_length_t::SIX;
237  break;
238  case UART_DATA_7_BITS:
239  aruna_word = word_length_t::SEVEN;
240  break;
241  case UART_DATA_8_BITS:
242  aruna_word = word_length_t::EIGHT;
243  break;
244  case UART_DATA_BITS_MAX:
245  default:
246  aruna_word = word_length_t::NONE;
247  break;
248  }
249  return aruna_word;
250  }
251 
253  uart_word_length_t esp_word;
254  switch (word_length) {
255  case word_length_t::FIVE:
256  esp_word = UART_DATA_5_BITS;
257  break;
258  case word_length_t::SIX:
259  esp_word = UART_DATA_6_BITS;
260  break;
262  esp_word = UART_DATA_7_BITS;
263  break;
265  default:
266  esp_word = UART_DATA_8_BITS;
267  break;
268  }
269  esp_err_t esp_err = uart_set_word_length(UART_NUM, esp_word);
270  err_t err;
271  err = esp_err ? err_t::FAIL : err_t::OK;
272  return err;
273  }
274  }
275 }
word_length_t get_word_length() override
Set UART data bits length.
Definition: ESP32_UART.cpp:227
stop_bit_t get_stop_bit() override
get stop bit
Definition: ESP32_UART.cpp:204
Definition: comm.cpp:14
uint32_t get_baudrate() override
Get baudrate of UART.
Definition: ESP32_UART.cpp:50
ESP32_UART(uart_port_t UART_NUM, int TXD_PIN, int RXD_PIN, int RTS_PIN, int CTS_PIN, uart_config_t UART_CONFIG, uart_mode_t UART_MODE, unsigned int TX_BUF_SIZE, unsigned int RX_BUF_SIZE)
Create a uart driver with custom settings.
Definition: ESP32_UART.cpp:15
err_t _set_stop_bit(stop_bit_t stop_bit) override
set stop bit
Definition: ESP32_UART.cpp:130
err_t _set_flowcontrol(flowcontrol_t new_flowcontrol) override
Set software or hardware flowcontrol.
Definition: ESP32_UART.cpp:78
const uart_port_t UART_NUM
Definition: ESP32_UART.h:58
uint32_t get_read_buffer_length() override
Get amount of bytes in the read buffer.
Definition: ESP32_UART.cpp:153
uint32_t _set_baudrate(uint32_t new_baudrate) override
Set baudrate of the UART.
Definition: ESP32_UART.cpp:73
static const uint8_t XON
Definition: UART.h:90
parity_t get_parity() override
Get parity of UART.
Definition: ESP32_UART.cpp:185
Link * driver
stores the driver.
Definition: comm.cpp:45
flowcontrol_t get_flowcontrol() override
get flowcontrol of UART
Definition: ESP32_UART.cpp:159
err_t _set_parity(parity_t parity_bit) override
Set parity bit.
Definition: ESP32_UART.cpp:110
size_t _write(uint8_t *data, size_t dataSize) override
write data to the link/bus.
Definition: ESP32_UART.cpp:46
size_t _read(uint8_t *buffer, size_t length) override
Read bytes and out them in the buffer.
Definition: ESP32_UART.cpp:69
err_t _set_word_length(word_length_t word_length) override
Set UART data bits length.
Definition: ESP32_UART.cpp:252
static const uint8_t XOFF
Definition: UART.h:91
QueueHandle_t uart_queue
Definition: ESP32_UART.h:61