From ddcdc901a7b5eb9504f4fb3debf16e985e734b5f Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 22 Apr 2014 16:30:13 +0200 Subject: [PATCH] Simplify SoftwareSerial::write Before, there was nearly identical code for the inverted and regular cases. However, simply inverting the byte in the inverted case allows using the regular code twice, reducing the generated code size by 100 bytes (on an Arduino Uno and gcc 4.3, on gcc 4.8 the reduction is 50 bytes). --- libraries/SoftwareSerial/SoftwareSerial.cpp | 33 +++++++-------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp index 0e70cb7..da9af30 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -486,34 +486,21 @@ size_t SoftwareSerial::write(uint8_t b) // Write each of the 8 bits if (_inverse_logic) - { - for (byte mask = 0x01; mask; mask <<= 1) - { - if (b & mask) // choose bit - tx_pin_write(LOW); // send 1 - else - tx_pin_write(HIGH); // send 0 - - tunedDelay(_tx_delay); - } + b = ~b; - tx_pin_write(LOW); // restore pin to natural state - } - else + for (byte mask = 0x01; mask; mask <<= 1) { - for (byte mask = 0x01; mask; mask <<= 1) - { - if (b & mask) // choose bit - tx_pin_write(HIGH); // send 1 - else - tx_pin_write(LOW); // send 0 - - tunedDelay(_tx_delay); - } + if (b & mask) // choose bit + tx_pin_write(HIGH); // send 1 + else + tx_pin_write(LOW); // send 0 - tx_pin_write(HIGH); // restore pin to natural state + tunedDelay(_tx_delay); } + // restore pin to natural state + tx_pin_write(_inverse_logic ? LOW : HIGH); + SREG = oldSREG; // turn interrupts back on tunedDelay(_tx_delay);