aboutsummaryrefslogtreecommitdiff
path: root/libraries/SoftwareSerial
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2014-04-22 16:30:13 +0200
committerMatthijs Kooijman <matthijs@stdin.nl>2015-01-26 17:03:25 +0100
commitddcdc901a7b5eb9504f4fb3debf16e985e734b5f (patch)
tree80d1b2660e974ef81344d4625d61306c205413a6 /libraries/SoftwareSerial
parentcf0cc48d9a8de84fabb44e644dcac6a3f8afc66c (diff)
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).
Diffstat (limited to 'libraries/SoftwareSerial')
-rw-r--r--libraries/SoftwareSerial/SoftwareSerial.cpp33
1 files 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);