28
28
*/
29
29
30
30
#include " Adafruit_PWMServoDriver.h"
31
- #include < Wire.h>
32
31
33
32
// #define ENABLE_DEBUG_OUTPUT
34
33
@@ -64,7 +63,10 @@ Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(const uint8_t addr,
64
63
* Sets External Clock (Optional)
65
64
*/
66
65
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 ();
68
70
reset ();
69
71
if (prescale) {
70
72
setExtClk (prescale);
@@ -206,11 +208,15 @@ uint8_t Adafruit_PWMServoDriver::readPrescale(void) {
206
208
/* !
207
209
* @brief Gets the PWM output of one of the PCA9685 pins
208
210
* @param num One of the PWM output pins, from 0 to 15
211
+ * @param off If true, returns PWM OFF value, otherwise PWM ON
209
212
* @return requested PWM output value
210
213
*/
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 );
214
220
}
215
221
216
222
/* !
@@ -231,13 +237,15 @@ uint8_t Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on,
231
237
Serial.println (off);
232
238
#endif
233
239
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 ;
241
249
}
242
250
243
251
/* !
@@ -346,17 +354,12 @@ void Adafruit_PWMServoDriver::setOscillatorFrequency(uint32_t freq) {
346
354
347
355
/* ****************** Low level I2C interface */
348
356
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 ];
355
360
}
356
361
357
362
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 );
362
365
}
0 commit comments