77#include < hardware/uart.h>
88#include < stdint.h>
99
10+ // /////////////////////////////////////////////////////////
1011
1112/* *
1213 This is a FIFO, but with a fixed size that will over write old
1516template <uint16_t BUFFER_SIZE> class Fifo {
1617 // public:
1718 uint8_t buffer[BUFFER_SIZE];
18- uint16_t head{0 }; // read / pop
19- uint16_t tail{0 }; // write / push
19+ uint16_t head{0 }; // read / pop / oldest data
20+ uint16_t tail{0 }; // write / push / newest data
2021 uint16_t numElem{0 };
2122
2223public:
@@ -42,18 +43,46 @@ template <uint16_t BUFFER_SIZE> class Fifo {
4243 }
4344 buffer[tail] = b;
4445 tail = nextPos (tail);
45- numElem = numElem + 1 ;
46+ numElem += 1 ;
4647 }
4748
4849 uint8_t pop () volatile {
4950 if (isEmpty ()) return 0 ;
5051 uint8_t ret = buffer[head];
5152 head = nextPos (head);
5253 numElem = numElem - 1 ;
54+ if (numElem == 0 ) clear ();
5355 return ret;
5456 }
57+
58+ // uint16_t copy(uint8_t *p, const uint16_t size) volatile {
59+ // if (tail > head) {
60+ // uint16_t n = tail - head;
61+ // n = n > size ? size : n;
62+ // memcpy(p, &buffer[head], n);
63+ // head += n;
64+ // return n;
65+ // }
66+ // else {
67+ // uint16_t n = BUFFER_SIZE - head;
68+ // n = n > size ? size : n;
69+ // uint16_t save = n;
70+ // memcpy(p, &buffer[head], n);
71+ // if (n == size) {
72+ // head += n;
73+ // return save;
74+ // }
75+ // n = size - n;
76+ // n = n > tail ? tail : n;
77+ // memcpy(&p[save], &buffer[n], n);
78+ // head = n;
79+ // return save + n;
80+ // }
81+ // }
5582};
5683
84+ // /////////////////////////////////////////////////////////
85+
5786constexpr uint UART0_TX_PIN = 0 ;
5887constexpr uint UART0_RX_PIN = 1 ;
5988constexpr uint UART1_TX_PIN = 8 ;
@@ -65,15 +94,6 @@ constexpr uint32_t tx_valid[2] = { // uart0, uart1
6594constexpr uint32_t rx_valid[2 ] = { // uart0, uart1
6695 (1 << 1 ) | (1 << 13 ) | (1 << 17 ) | (1 << 29 ),
6796 (1 << 5 ) | (1 << 9 ) | (1 << 21 ) | (1 << 25 )};
68- // constexpr uint32_t sda_valid[2] = { // i2c0, i2c1
69- // (1 << 0) | (1 << 4) | (1 << 8) | (1 << 12) | (1 << 16) | (1 << 20) |
70- // (1 << 24) | (1 << 28),
71- // (1 << 2) | (1 << 6) | (1 << 10) | (1 << 14) | (1 << 18) | (1 << 22) |
72- // (1 << 26)};
73- // constexpr uint32_t scl_valid[2] = { // i2c0, i2c1
74- // (1 << 1) | (1 << 5) | (1 << 9) | (1 << 13) | (1 << 17) | (1 << 21) | (1 <<
75- // 25) | (1 << 29), (1 << 3) | (1 << 7) | (1 << 11) | (1 << 15) | (1 << 19) |
76- // (1 << 23) | (1 << 27)};
7797
7898constexpr uint16_t UART_BUFFER_SIZE = 128 ;
7999static volatile Fifo<UART_BUFFER_SIZE> buffer_0;
@@ -114,15 +134,17 @@ static void uart1_irq_func(void) {
114134 irq_set_enabled (UART1_IRQ, true );
115135}
116136
137+
117138class ServoPort {
118139 uart_inst_t *uart;
140+ uint32_t dd{0 };
119141 volatile Fifo<UART_BUFFER_SIZE> *buffer{nullptr };
120142
121143public:
122144 ServoPort () {}
123145 ~ServoPort () { uart_deinit (uart); }
124146
125- uint init (uint baudrate, uint8_t port, uint8_t pin_tx, uint8_t pin_rx) {
147+ uint init (uint baudrate, uint8_t port, uint8_t pin_tx, uint8_t pin_rx, uint8_t pin_dd ) {
126148 bool valid = (1 << pin_tx) & tx_valid[port];
127149 if (!valid) return 0 ;
128150 valid = (1 << pin_rx) & rx_valid[port];
@@ -156,17 +178,20 @@ class ServoPort {
156178 uart_set_fifo_enabled (uart, true );
157179 uart_set_translate_crlf (uart, false );
158180
181+ gpio_init (pin_dd);
182+ gpio_set_dir (pin_dd, GPIO_OUT);
183+ dd = pin_dd;
184+ gpio_put (dd, 0 );
185+
159186 return baudrate;
160187 }
161188
162189 inline bool is_enabled () { return uart_is_enabled (uart); }
163-
164190 inline void flush () { buffer->clear (); }
165-
166191 inline uint set_baud (uint baud) { return uart_set_baudrate (uart, baud); }
167-
168192 inline size_t available () { return buffer->size (); }
169193
194+ inline uint8_t read () { return buffer->pop (); }
170195 size_t read (uint8_t *data, size_t size) {
171196 size_t cnt = 0 ;
172197 size_t bsize = buffer->size ();
@@ -175,11 +200,12 @@ class ServoPort {
175200 }
176201
177202 return cnt;
203+ // return buffer->copy(data, size);
178204 }
179205
180- inline uint8_t read () { return buffer->pop (); }
181-
182206 void write (const uint8_t *data, size_t size) {
207+ gpio_put (dd, 1 );
183208 uart_write_blocking (uart, data, size);
209+ gpio_put (dd, 0 );
184210 }
185211};
0 commit comments