Skip to content

Commit e174e5c

Browse files
thenewwazoodevbis
authored andcommitted
Add support for inverted signal
1 parent 69ff549 commit e174e5c

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

components/softuart/softuart.c

+20-8
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ typedef struct
5151
uint32_t baudrate;
5252
volatile softuart_buffer_t buffer;
5353
uint16_t bit_time;
54+
bool invert;
5455
} softuart_t;
5556

5657
static softuart_t uarts[SOFTUART_MAX_UARTS] = { { 0 } };
@@ -96,7 +97,7 @@ static void handle_rx(void *arg)
9697
d >>= 1;
9798

9899
// Read bit
99-
if (gpio_get_level(uart->rx_pin))
100+
if (gpio_get_level(uart->rx_pin) ^ uart->invert)
100101
{
101102
// If high, set msb of 8bit to 1
102103
d |= 0x80;
@@ -121,7 +122,7 @@ static void handle_rx(void *arg)
121122
ets_delay_us(uart->bit_time);
122123

123124
// Done, reenable interrupt
124-
gpio_set_intr_type(uart->rx_pin, GPIO_INTR_NEGEDGE);
125+
gpio_set_intr_type(uart->rx_pin, uart->invert ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE);
125126
// gpio_isr_handler_add(uart->rx_pin, handle_rx, (void *)(uart->rx_pin));
126127
}
127128

@@ -151,7 +152,7 @@ static bool check_uart_enabled(uint8_t uart_no)
151152
/// Public
152153
///////////////////////////////////////////////////////////////////////////////
153154

154-
bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t tx_pin)
155+
bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t tx_pin, bool invert)
155156
{
156157
// do some checks
157158
if (!check_uart_no(uart_no)) return false;
@@ -175,6 +176,7 @@ bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t
175176
uart->baudrate = baudrate;
176177
uart->rx_pin = rx_pin;
177178
uart->tx_pin = tx_pin;
179+
uart->invert = invert;
178180

179181
// Calculate bit_time
180182
uart->bit_time = (1000000 / baudrate);
@@ -202,12 +204,12 @@ bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t
202204

203205
// gpio_enable(tx_pin, GPIO_MODE_OUTPUT);
204206
// gpio_pullup_en(tx_pin);
205-
gpio_set_level(tx_pin, 1);
207+
gpio_set_level(tx_pin, !uart->invert);
206208

207209
//install gpio isr service
208210
gpio_install_isr_service(0);
209211
// Setup the interrupt handler to get the start bit
210-
gpio_set_intr_type(rx_pin, GPIO_INTR_NEGEDGE);
212+
gpio_set_intr_type(rx_pin, uart->invert ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE);
211213
gpio_isr_handler_add(rx_pin, handle_rx, (void *)rx_pin);
212214

213215
ets_delay_us(1000); // TODO: not sure if it really needed
@@ -238,7 +240,7 @@ bool softuart_put(uint8_t uart_no, char c)
238240
softuart_t *uart = uarts + uart_no;
239241

240242
uint32_t start_time = 0x7FFFFFFF & esp_get_time();
241-
gpio_set_level(uart->tx_pin, 0);
243+
gpio_set_level(uart->tx_pin, uart->invert);
242244

243245
for (uint8_t i = 0; i <= 8; i++)
244246
{
@@ -247,15 +249,15 @@ bool softuart_put(uint8_t uart_no, char c)
247249
if ((0x7FFFFFFF & esp_get_time()) < start_time)
248250
break;
249251
}
250-
gpio_set_level(uart->tx_pin, c & (1 << i));
252+
gpio_set_level(uart->tx_pin, c & ((!uart->invert) << i));
251253
}
252254

253255
while ((0x7FFFFFFF & esp_get_time()) < (start_time + (uart->bit_time * 9)))
254256
{
255257
if ((0x7FFFFFFF & esp_get_time()) < start_time)
256258
break;
257259
}
258-
gpio_set_level(uart->tx_pin, 1);
260+
gpio_set_level(uart->tx_pin, !uart->invert);
259261
ets_delay_us(uart->bit_time * 6);
260262

261263
return true;
@@ -272,6 +274,16 @@ bool softuart_puts(uint8_t uart_no, const char *s)
272274
return true;
273275
}
274276

277+
bool softuart_putn(uint8_t uart_no, const uint8_t* s, size_t n) {
278+
for (size_t i = 0; i < n; i++) {
279+
if (!softuart_put(uart_no, s[i])) {
280+
return false;
281+
}
282+
}
283+
284+
return true;
285+
}
286+
275287
bool softuart_available(uint8_t uart_no)
276288
{
277289
if (!check_uart_no(uart_no)) return false;

components/softuart/softuart.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <stdint.h>
2424
#include <stdbool.h>
25+
#include <stddef.h>
2526

2627
#ifdef __cplusplus
2728
extern "C"
@@ -44,7 +45,7 @@ extern "C"
4445
* @param tx_pin GPIO pin number for TX
4546
* @return true if no errors occured otherwise false
4647
*/
47-
bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t tx_pin);
48+
bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t tx_pin, bool invert);
4849

4950
/**
5051
* Deinitialize software uart
@@ -69,6 +70,11 @@ bool softuart_put(uint8_t uart_no, char c);
6970
*/
7071
bool softuart_puts(uint8_t uart_no, const char *s);
7172

73+
/**
74+
* Put string with length to software uart
75+
*/
76+
bool softuart_putn(uint8_t uart_no, const uint8_t* s, size_t n);
77+
7278
/**
7379
* Check if data is available
7480
* @param uart_no Software uart index, 0..SOFTUART_MAX_UARTS

0 commit comments

Comments
 (0)