Skip to content

Commit e1a04a4

Browse files
committed
convert to busio
1 parent 2b789da commit e1a04a4

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

Adafruit_PWMServoDriver.cpp

100755100644
Lines changed: 25 additions & 22 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

@@ -64,7 +63,10 @@ Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(const uint8_t addr,
6463
* Sets External Clock (Optional)
6564
*/
6665
void Adafruit_PWMServoDriver::begin(uint8_t prescale) {
67-
_i2c->begin();
66+
if (i2c_dev)
67+
delete i2c_dev;
68+
i2c_dev = new Adafruit_I2CDevice(_i2caddr, _i2c);
69+
i2c_dev->begin();
6870
reset();
6971
if (prescale) {
7072
setExtClk(prescale);
@@ -206,11 +208,15 @@ uint8_t Adafruit_PWMServoDriver::readPrescale(void) {
206208
/*!
207209
* @brief Gets the PWM output of one of the PCA9685 pins
208210
* @param num One of the PWM output pins, from 0 to 15
211+
* @param off If true, returns PWM OFF value, otherwise PWM ON
209212
* @return requested PWM output value
210213
*/
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();
214+
uint16_t Adafruit_PWMServoDriver::getPWM(uint8_t num, bool off) {
215+
uint8_t buffer[2] = {uint8_t(PCA9685_LED0_ON_L + 4 * num), 0};
216+
if (off)
217+
buffer[0] += 2;
218+
i2c_dev->write_then_read(buffer, 1, buffer, 2);
219+
return uint16_t(buffer[0]) | (uint16_t(buffer[1]) << 8);
214220
}
215221

216222
/*!
@@ -231,13 +237,15 @@ uint8_t Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on,
231237
Serial.println(off);
232238
#endif
233239

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();
240+
uint8_t buffer[5];
241+
buffer[0] = PCA9685_LED0_ON_L + 4 * num;
242+
buffer[1] = on;
243+
buffer[2] = on >> 8;
244+
buffer[3] = off;
245+
buffer[4] = off >> 8;
246+
i2c_dev->write(buffer, 5);
247+
248+
return 0;
241249
}
242250

243251
/*!
@@ -346,17 +354,12 @@ void Adafruit_PWMServoDriver::setOscillatorFrequency(uint32_t freq) {
346354

347355
/******************* Low level I2C interface */
348356
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();
357+
uint8_t buffer[1] = {addr};
358+
i2c_dev->write_then_read(buffer, 1, buffer, 1);
359+
return buffer[0];
355360
}
356361

357362
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();
363+
uint8_t buffer[2] = {addr, d};
364+
i2c_dev->write(buffer, 2);
362365
}

Adafruit_PWMServoDriver.h

Lines changed: 3 additions & 2 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 */
@@ -84,7 +84,7 @@ class Adafruit_PWMServoDriver {
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)