Skip to content

Commit 8428bcc

Browse files
authored
Merge pull request #92 from caternuson/iss91_busio
Convert to BusIO
2 parents bbc6c30 + e6181f4 commit 8428bcc

File tree

3 files changed

+35
-26
lines changed

3 files changed

+35
-26
lines changed

Adafruit_PWMServoDriver.cpp

100755100644
Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
*/
2929

3030
#include "Adafruit_PWMServoDriver.h"
31-
#include <Wire.h>
3231

3332
//#define ENABLE_DEBUG_OUTPUT
3433

@@ -62,9 +61,14 @@ Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(const uint8_t addr,
6261
* @brief Setups the I2C interface and hardware
6362
* @param prescale
6463
* Sets External Clock (Optional)
64+
* @return true if successful, otherwise false
6565
*/
66-
void Adafruit_PWMServoDriver::begin(uint8_t prescale) {
67-
_i2c->begin();
66+
bool Adafruit_PWMServoDriver::begin(uint8_t prescale) {
67+
if (i2c_dev)
68+
delete i2c_dev;
69+
i2c_dev = new Adafruit_I2CDevice(_i2caddr, _i2c);
70+
if (!i2c_dev->begin())
71+
return false;
6872
reset();
6973
if (prescale) {
7074
setExtClk(prescale);
@@ -74,6 +78,8 @@ void Adafruit_PWMServoDriver::begin(uint8_t prescale) {
7478
}
7579
// set the default internal frequency
7680
setOscillatorFrequency(FREQUENCY_OSCILLATOR);
81+
82+
return true;
7783
}
7884

7985
/*!
@@ -206,11 +212,15 @@ uint8_t Adafruit_PWMServoDriver::readPrescale(void) {
206212
/*!
207213
* @brief Gets the PWM output of one of the PCA9685 pins
208214
* @param num One of the PWM output pins, from 0 to 15
215+
* @param off If true, returns PWM OFF value, otherwise PWM ON
209216
* @return requested PWM output value
210217
*/
211-
uint8_t Adafruit_PWMServoDriver::getPWM(uint8_t num) {
212-
_i2c->requestFrom((int)_i2caddr, PCA9685_LED0_ON_L + 4 * num, (int)4);
213-
return _i2c->read();
218+
uint16_t Adafruit_PWMServoDriver::getPWM(uint8_t num, bool off) {
219+
uint8_t buffer[2] = {uint8_t(PCA9685_LED0_ON_L + 4 * num), 0};
220+
if (off)
221+
buffer[0] += 2;
222+
i2c_dev->write_then_read(buffer, 1, buffer, 2);
223+
return uint16_t(buffer[0]) | (uint16_t(buffer[1]) << 8);
214224
}
215225

216226
/*!
@@ -231,13 +241,15 @@ uint8_t Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on,
231241
Serial.println(off);
232242
#endif
233243

234-
_i2c->beginTransmission(_i2caddr);
235-
_i2c->write(PCA9685_LED0_ON_L + 4 * num);
236-
_i2c->write(on);
237-
_i2c->write(on >> 8);
238-
_i2c->write(off);
239-
_i2c->write(off >> 8);
240-
return _i2c->endTransmission();
244+
uint8_t buffer[5];
245+
buffer[0] = PCA9685_LED0_ON_L + 4 * num;
246+
buffer[1] = on;
247+
buffer[2] = on >> 8;
248+
buffer[3] = off;
249+
buffer[4] = off >> 8;
250+
i2c_dev->write(buffer, 5);
251+
252+
return 0;
241253
}
242254

243255
/*!
@@ -346,17 +358,12 @@ void Adafruit_PWMServoDriver::setOscillatorFrequency(uint32_t freq) {
346358

347359
/******************* Low level I2C interface */
348360
uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {
349-
_i2c->beginTransmission(_i2caddr);
350-
_i2c->write(addr);
351-
_i2c->endTransmission();
352-
353-
_i2c->requestFrom((uint8_t)_i2caddr, (uint8_t)1);
354-
return _i2c->read();
361+
uint8_t buffer[1] = {addr};
362+
i2c_dev->write_then_read(buffer, 1, buffer, 1);
363+
return buffer[0];
355364
}
356365

357366
void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {
358-
_i2c->beginTransmission(_i2caddr);
359-
_i2c->write(addr);
360-
_i2c->write(d);
361-
_i2c->endTransmission();
367+
uint8_t buffer[2] = {addr, d};
368+
i2c_dev->write(buffer, 2);
362369
}

Adafruit_PWMServoDriver.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
#ifndef _ADAFRUIT_PWMServoDriver_H
2424
#define _ADAFRUIT_PWMServoDriver_H
2525

26+
#include <Adafruit_I2CDevice.h>
2627
#include <Arduino.h>
27-
#include <Wire.h>
2828

2929
// REGISTER ADDRESSES
3030
#define PCA9685_MODE1 0x00 /**< Mode Register 1 */
@@ -77,14 +77,14 @@ class Adafruit_PWMServoDriver {
7777
Adafruit_PWMServoDriver();
7878
Adafruit_PWMServoDriver(const uint8_t addr);
7979
Adafruit_PWMServoDriver(const uint8_t addr, TwoWire &i2c);
80-
void begin(uint8_t prescale = 0);
80+
bool begin(uint8_t prescale = 0);
8181
void reset();
8282
void sleep();
8383
void wakeup();
8484
void setExtClk(uint8_t prescale);
8585
void setPWMFreq(float freq);
8686
void setOutputMode(bool totempole);
87-
uint8_t getPWM(uint8_t num);
87+
uint16_t getPWM(uint8_t num, bool off = false);
8888
uint8_t setPWM(uint8_t num, uint16_t on, uint16_t off);
8989
void setPin(uint8_t num, uint16_t val, bool invert = false);
9090
uint8_t readPrescale(void);
@@ -96,6 +96,7 @@ class Adafruit_PWMServoDriver {
9696
private:
9797
uint8_t _i2caddr;
9898
TwoWire *_i2c;
99+
Adafruit_I2CDevice *i2c_dev = NULL; ///< Pointer to I2C bus interface
99100

100101
uint32_t _oscillator_freq;
101102
uint8_t read8(uint8_t addr);

library.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ paragraph=Adafruit PWM Servo Driver Library
77
category=Device Control
88
url=https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
99
architectures=*
10+
depends=Adafruit BusIO

0 commit comments

Comments
 (0)