- ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
- rxbuf[rx_bytes] = UDR0;
- if (rx_bytes + 1 < BUFSIZE) // ignore overruns
- rx_bytes++;
- last_rx = get_clock();
- }
+ uint8_t rx_byte = UDR0;
+
+ if (transmitting) // discard it
+ return;
+
+ buffer[buf_len] = rx_byte;
+
+ if (buf_len + 1 < BUFSIZE) // ignore overruns
+ buf_len++;
+
+ last_rx = get_clock();
+}
+
+ISR(USART_TX_vect)
+{
+ UCSR0B &= ~_BV(TXCIE0); // disable further IRQs
+ ctl_pin_off();
+ buf_len = 0;
+ transmitting = 0; // enable receiving