diff --git a/drivers/avr/ir_uart.c b/drivers/avr/ir_uart.c index 361f47f..c2699c8 100644 --- a/drivers/avr/ir_uart.c +++ b/drivers/avr/ir_uart.c @@ -7,6 +7,7 @@ #include "usart1.h" #include "timer0.h" #include "pio.h" +#include "delay.h" /* Return non-zero if there is a character ready to be read. */ @@ -51,8 +52,25 @@ ir_uart_putc (char ch) /* Gobble echoed character. The echoing is due to an electrical common-path interference problem caused by a poor PCB layout of the - track powering the IR receiver. */ - ir_uart_getc (); + track powering the IR receiver. Unfortunately, it does not always + occur with some combination of UCFK4 boards and laptops. Perhaps + some laptops are more miserly with their current allocation and + some IR LEDs do not draw as much current? So as a workaround + we need to wait until the transmission has finished and then check + if something was immediately received. + + Having said all this, it is possible to get an optical reflection + of the transmitted signal. The following code should handle this + as well. */ + + while (! ir_uart_write_finished_p ()) + continue; + + /* Play safe and wait for receive complete flag to be set. */ + DELAY_US (1); + + if (ir_uart_read_ready_p ()) + ir_uart_getc (); return 1; }