Merge pull request #4718 from thinkyhead/rc_twibus_patch_20160827
TWIBus patch for proper use of Wire.requestFrom
This commit is contained in:
		@@ -25,7 +25,6 @@
 | 
				
			|||||||
#if ENABLED(EXPERIMENTAL_I2CBUS)
 | 
					#if ENABLED(EXPERIMENTAL_I2CBUS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "twibus.h"
 | 
					#include "twibus.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <Wire.h>
 | 
					#include <Wire.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TWIBus::TWIBus() {
 | 
					TWIBus::TWIBus() {
 | 
				
			||||||
@@ -121,18 +120,12 @@ bool TWIBus::request(const uint8_t bytes) {
 | 
				
			|||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // requestFrom() is a blocking function
 | 
					  // requestFrom() is a blocking function
 | 
				
			||||||
  Wire.requestFrom(this->addr, bytes);
 | 
					  if (Wire.requestFrom(this->addr, bytes) == 0) {
 | 
				
			||||||
 | 
					    #if ENABLED(DEBUG_TWIBUS)
 | 
				
			||||||
  // Wait for all bytes to arrive
 | 
					      debug("request fail", this->addr);
 | 
				
			||||||
  millis_t t = millis() + this->timeout;
 | 
					    #endif
 | 
				
			||||||
  while (Wire.available() < bytes)
 | 
					    return false;
 | 
				
			||||||
    if (ELAPSED(millis(), t)) {
 | 
					  }
 | 
				
			||||||
      #if ENABLED(DEBUG_TWIBUS)
 | 
					 | 
				
			||||||
        SERIAL_ECHO_START;
 | 
					 | 
				
			||||||
        SERIAL_ECHOLNPGM("i2c timeout");
 | 
					 | 
				
			||||||
      #endif
 | 
					 | 
				
			||||||
      return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -151,6 +144,11 @@ uint8_t TWIBus::capture(char *dst, const uint8_t bytes) {
 | 
				
			|||||||
  uint8_t count = 0;
 | 
					  uint8_t count = 0;
 | 
				
			||||||
  while (count < bytes && Wire.available())
 | 
					  while (count < bytes && Wire.available())
 | 
				
			||||||
    dst[count++] = Wire.read();
 | 
					    dst[count++] = Wire.read();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #if ENABLED(DEBUG_TWIBUS)
 | 
				
			||||||
 | 
					    debug(PSTR("capture"), count);
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return count;
 | 
					  return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,14 +54,6 @@ typedef void (*twiRequestFunc_t)();
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
class TWIBus {
 | 
					class TWIBus {
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief Timeout value in milliseconds
 | 
					 | 
				
			||||||
     * @details Maximum amount of time (ms) to wait for a reply.
 | 
					 | 
				
			||||||
     *          Useful if something goes wrong on the bus and the
 | 
					 | 
				
			||||||
     *          SDA/SCL lines are held up by another device.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const int timeout = 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief Number of bytes on buffer
 | 
					     * @brief Number of bytes on buffer
 | 
				
			||||||
     * @description Number of bytes in the buffer waiting to be flushed to the bus
 | 
					     * @description Number of bytes in the buffer waiting to be flushed to the bus
 | 
				
			||||||
@@ -165,11 +157,11 @@ class TWIBus {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief Request data from the slave device and wait.
 | 
					     * @brief Request data from the slave device and wait.
 | 
				
			||||||
     * @details Request a number of bytes from a slave device.
 | 
					     * @details Request a number of bytes from a slave device.
 | 
				
			||||||
     *          Wait for the data to arrive until the timeout
 | 
					     *          Wait for the data to arrive, and return true
 | 
				
			||||||
     *          interval expires. Return true on success.
 | 
					     *          on success.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param bytes the number of bytes to request
 | 
					     * @param bytes the number of bytes to request
 | 
				
			||||||
     * @return status of the request: true=success, false=timeout
 | 
					     * @return status of the request: true=success, false=fail
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    bool request(const uint8_t bytes);
 | 
					    bool request(const uint8_t bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user