Skip to content

[PATCH] Wire library: coding unnecessarily complex #20

Closed
@hfvogt

Description

@hfvogt

In the wire library there are several functions where an - unnecessarily - complex coding has been used:
endTransmission: the availability of data is already checked in while(...), therefore need not be checked again in the loop.
requestFrom: the for-loop has a predefined and fixed number of loops. Therefore a check whether the last element has been reached is unnecessary and does not add any benefit.

Attached are two patches to simplify these functions:

--- ArduinoCore-samd.orig/libraries/Wire/Wire.cpp   2015-07-16 10:36:01.416937191 +0200
+++ ArduinoCore-samd/libraries/Wire/Wire.cpp    2015-07-16 19:17:07.675799549 +0200
@@ -132,12 +132,8 @@ uint8_t TwoWire::endTransmission(bool st
       sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
       return 3 ;  // Nack or error
     }
-
-    if(txBuffer.available() == 0)
-    {
-      sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
-    }
   }
+  sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);

   return 0;
 }
--- ArduinoCore-samd.orig/libraries/Wire/Wire.cpp   2015-07-16 19:17:07.675799549 +0200
+++ ArduinoCore-samd/libraries/Wire/Wire.cpp    2015-07-16 19:24:33.179778166 +0200
@@ -66,22 +66,15 @@ uint8_t TwoWire::requestFrom(uint8_t add
     rxBuffer.store_char(sercom->readDataWIRE());

     // Connected to slave
-    //while(toRead--)
-    for(byteRead = 0; byteRead < quantity; ++byteRead)
+    for(byteRead = 1; byteRead < quantity; ++byteRead)
     {
-      if( byteRead == quantity - 1)  // Stop transmission
-      {
-        sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission
-        //sercom->readDataWIRE(); // Clear data register to send NACK
-        sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop
-      }
-      else // Continue transmission
-      {
-        sercom->prepareAckBitWIRE();  // Prepare Acknowledge
-        sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_READ); // Prepare the ACK command for the slave
-        rxBuffer.store_char( sercom->readDataWIRE() );  // Read data and send the ACK
-      }
+      sercom->prepareAckBitWIRE();  // Prepare Acknowledge
+      sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_READ); // Prepare the ACK command for the slave
+      rxBuffer.store_char( sercom->readDataWIRE() );  // Read data and send the ACK
     }
+    sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission
+    //sercom->readDataWIRE(); // Clear data register to send NACK
+    sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop
   }

   return byteRead;

If this is the wrong place to provide patched please guide me to the right place. I have more patches that I would like to share.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions