Skip to content

Commit d89d9e9

Browse files
authored
Merge pull request #12 from arduino-libraries/refactor
Refactor common code into base classes.
2 parents feb948d + e3061de commit d89d9e9

14 files changed

+140
-377
lines changed

.github/workflows/compile-examples.yml

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
env:
3232
UNIVERSAL_SKETCH_PATHS: |
3333
- examples/BasicUsage
34+
- examples/ReadWriteRegs
3435
SKETCHES_REPORTS_PATH: sketches-reports
3536

3637
strategy:

examples/BasicUsage/BasicUsage.ino

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
#include "Arduino_PMIC.h"
1+
/*
2+
* Demonstrate basic library usage.
3+
*/
4+
5+
#include <Arduino_PMIC.h>
26

37
void setup() {
48
PMIC.begin();

examples/C33-Low-Power/C33-Low-Power.ino

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/*
2+
* Test low power capability of Portenta C33.
3+
*/
4+
15
#include <Arduino_PMIC.h>
26

37
#include <Wire.h>
@@ -32,6 +36,9 @@ void setup()
3236
PMIC.configLDO3(Ldo3Voltage::V_1_20, false, false, false);
3337
PMIC.configSw2(Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2CurrentLimit::I_1_5_A, false, false, false);
3438

39+
Serial.print("Device ID = ");
40+
Serial.println(PMIC.getDeviceId(), HEX);
41+
3542
p_cfg.low_power_mode = LPM_MODE_DEEP; // LPM_MODE_SLEEP LPM_MODE_STANDBY LPM_MODE_STANDBY_SNOOZE LPM_MODE_DEEP
3643
p_cfg.standby_wake_sources = LPM_STANDBY_WAKE_SOURCE_IRQ0 | LPM_STANDBY_WAKE_SOURCE_RTCALM;
3744
p_cfg.dtc_state_in_snooze = LPM_SNOOZE_DTC_DISABLE; // LPM_SNOOZE_DTC_ENABLE LPM_SNOOZE_DTC_DISABLE
+15-15
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
1-
#include "Arduino_PMIC.h"
2-
#include "PF1550/PF1550_Register.h"
1+
/*
2+
* Read and write some registers from the PF1550 PMIC.
3+
*/
34

4-
#define Serial Serial1
5+
#include <Arduino_PMIC.h>
56

6-
uint8_t regVal;
7+
//#define Serial Serial1
78

8-
void setup() {
9+
void setup()
10+
{
911
Serial.begin(115200);
1012
while(!Serial);
1113

1214
PMIC.begin();
13-
1415
PMIC.debug(Serial);
15-
1616
}
1717

1818

19-
void loop() {
19+
void loop()
20+
{
2021
PMIC.writePMICreg(Register::CHARGER_CHG_EOC_CNFG, 0x41);
21-
regVal = PMIC.readPMICreg(Register::CHARGER_CHG_EOC_CNFG);
22+
uint8_t reg_val = PMIC.readPMICreg(Register::CHARGER_CHG_EOC_CNFG);
2223

2324
Serial.print("CHARGER_CHG_SNS register value: ");
24-
Serial.println(regVal,HEX);
25+
Serial.println(reg_val,HEX);
2526

26-
regVal = PMIC.readPMICreg(Register::CHARGER_VBUS_SNS);
27+
reg_val = PMIC.readPMICreg(Register::CHARGER_VBUS_SNS);
2728

2829
Serial.print("CHARGER_VBUS_SNS register value: ");
29-
Serial.println(regVal,HEX);
30+
Serial.println(reg_val,HEX);
3031

31-
regVal = PMIC.readPMICreg(Register::CHARGER_CHG_INT_OK);
32+
reg_val = PMIC.readPMICreg(Register::CHARGER_CHG_INT_OK);
3233

3334
Serial.print("CHARGER_CHG_INT_OK register value: ");
34-
Serial.println(regVal,HEX);
35+
Serial.println(reg_val,HEX);
3536
Serial.println();
3637
Serial.println();
3738

3839
delay(5000);
39-
4040
}

src/PF1550.cpp

+12-10
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@
2222

2323
#include "PF1550.h"
2424

25-
#include "PF1550/PF1550_Io_C33.h"
26-
#include "PF1550/PF1550_Io_EnvieH747.h"
25+
#include <Wire.h>
26+
27+
#include "PF1550/PF1550_IO_C33.h"
28+
#include "PF1550/PF1550_IO_Portenta_H7.h"
2729

2830
/******************************************************************************
2931
CTOR/DTOR
3032
******************************************************************************/
3133

32-
PF1550::PF1550(interface::PF1550_Io & io)
34+
PF1550::PF1550(PF1550_IO & io)
3335
: _control(io),
3436
_debug(NULL)
3537
{
@@ -54,12 +56,12 @@ void PF1550::debug(Stream& stream)
5456
_control.debug(stream);
5557
}
5658

57-
void PF1550::setPMICbit(Register const reg_addr, uint8_t posBit)
59+
void PF1550::setPMICbit(Register const reg_addr, uint8_t const posBit)
5860
{
5961
_control.setBit(reg_addr, posBit);
6062
}
6163

62-
void PF1550::writePMICreg(Register const reg_addr, uint8_t val)
64+
void PF1550::writePMICreg(Register const reg_addr, uint8_t const val)
6365
{
6466
if (_debug) {
6567
_debug->print("PF1550::writePMICreg at address=");
@@ -144,9 +146,9 @@ void PF1550::configSw2(Sw2Voltage const sw2_volt,
144146
}
145147

146148
void PF1550::configCharger(IFastCharge const i_fast_charge,
147-
VFastCharge const v_fast_charge,
148-
IEndOfCharge const i_end_of_charge,
149-
IInputCurrentLimit const i_input_current_limit)
149+
VFastCharge const v_fast_charge,
150+
IEndOfCharge const i_end_of_charge,
151+
IInputCurrentLimit const i_input_current_limit)
150152
{
151153
_control.setFastChargeCurrent (i_fast_charge);
152154
_control.setFastChargeVoltage (v_fast_charge);
@@ -159,9 +161,9 @@ void PF1550::configCharger(IFastCharge const i_fast_charge,
159161
******************************************************************************/
160162

161163
#ifdef ARDUINO_PORTENTA_H33
162-
static PF1550_Io_C33 io(interface::PF1550_I2C_DEFAULT_ADDR);
164+
static PF1550_IO_C33 io(&Wire3, PF1550_I2C_DEFAULT_ADDR);
163165
#else
164-
static PF1550_Io_EnvieH747 io(interface::PF1550_I2C_DEFAULT_ADDR);
166+
static PF1550_IO_Portenta_H7 io(&Wire1, PF1550_I2C_DEFAULT_ADDR);
165167
#endif
166168

167169
PF1550 PMIC(io);

src/PF1550.h

+13-11
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
#ifndef ARDUINO_PF1550_H_
2020
#define ARDUINO_PF1550_H_
2121

22-
#define PF1550_I2C_ADDR (interface::PF1550_I2C_DEFAULT_ADDR)
22+
#define PF1550_I2C_ADDR (PF1550_I2C_DEFAULT_ADDR)
2323

2424
/******************************************************************************
2525
INCLUDE
2626
******************************************************************************/
27-
#include "Arduino.h"
28-
#include "PF1550/interface/PF1550_Io.h"
27+
28+
#include <Arduino.h>
29+
30+
#include "PF1550/PF1550_IO.h"
2931
#include "PF1550/PF1550_Types.h"
3032
#include "PF1550/PF1550_Control.h"
3133
#include "PF1550/PF1550_Register.h"
@@ -34,7 +36,7 @@
3436
EXTERN DECLARATION
3537
******************************************************************************/
3638

37-
class PF1550; /* Forward declaration of class PF1550 */
39+
class PF1550;
3840
extern PF1550 PMIC;
3941

4042
/******************************************************************************
@@ -45,14 +47,14 @@ class PF1550
4547
{
4648
public:
4749

48-
PF1550(interface::PF1550_Io & io);
50+
PF1550(PF1550_IO & io);
4951

5052
int begin();
5153

5254
void debug(Stream& stream);
5355

54-
void setPMICbit(Register const reg_addr, uint8_t posBit);
55-
void writePMICreg(Register const reg_addr, uint8_t val);
56+
void setPMICbit(Register const reg_addr, uint8_t const posBit);
57+
void writePMICreg(Register const reg_addr, uint8_t const val);
5658
uint8_t readPMICreg(Register const reg_addr);
5759

5860
void configLDO1(Ldo1Voltage const ldo_1_volt, bool const enable, bool const enable_in_standby, bool const enable_in_sleep);
@@ -71,18 +73,18 @@ class PF1550
7173
VFastCharge const v_fast_charge,
7274
IEndOfCharge const i_end_of_charge,
7375
IInputCurrentLimit const i_input_current_limit);
74-
76+
77+
uint8_t getDeviceId() { return _control.getDeviceId(); }
78+
7579
/* Static function registered to be executed from within external interrupt ISR */
7680
static void ISR_onPMICEvent() { PMIC.onPMICEvent(); }
7781
/* Actual PMIC event ISR handler with access to member variables */
7882
inline void onPMICEvent() { _control.onPMICEvent(); }
7983

80-
private:
8184

85+
private:
8286
PF1550_Control _control;
83-
8487
Stream* _debug;
85-
8688
};
8789

8890
#endif /* ARDUINO_PF1550_H_ */

src/PF1550/PF1550_Control.cpp

+6-11
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
CTOR/DTOR
3131
******************************************************************************/
3232

33-
PF1550_Control::PF1550_Control(interface::PF1550_Io & io)
33+
PF1550_Control::PF1550_Control(PF1550_IO & io)
3434
: _io(io)
3535
{
3636

@@ -56,21 +56,16 @@ void PF1550_Control::setBit(Register const reg, uint8_t const bit_pos)
5656
_io.setBit(reg, bit_pos);
5757
}
5858

59-
void PF1550_Control::writeReg(Register const reg_addr, uint8_t val)
59+
void PF1550_Control::writeReg(Register const reg_addr, uint8_t const val)
6060
{
61-
uint8_t i2c_data[2];
62-
63-
i2c_data[0] = (uint8_t)reg_addr;
64-
i2c_data[1] = val;
65-
6661
if (_debug) {
67-
_debug->print("PF1550_Control::writeReg at address=");
68-
_debug->print(i2c_data[0], HEX);
62+
_debug->print("PF1550_Control::writeReg at address = ");
63+
_debug->print(static_cast<uint8_t>(reg_addr), HEX);
6964
_debug->print(" data=");
70-
_debug->println(i2c_data[1], HEX);
65+
_debug->println(val, HEX);
7166
}
7267

73-
_io.writeRegister(PF1550_I2C_ADDR, i2c_data, 2, 0);
68+
_io.writeRegister(reg_addr, val);
7469
}
7570

7671
void PF1550_Control::readReg(Register const reg_addr, uint8_t *data)

src/PF1550/PF1550_Control.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
******************************************************************************/
2525

2626
#include "PF1550_Types.h"
27-
#include "interface/PF1550_Io.h"
27+
#include "PF1550_IO.h"
2828
#include "Arduino.h"
2929

3030
/******************************************************************************
@@ -42,15 +42,15 @@ class PF1550_Control
4242

4343
public:
4444

45-
PF1550_Control(interface::PF1550_Io & io);
45+
PF1550_Control(PF1550_IO & io);
4646

4747

4848
int begin();
4949
void debug(Stream& stream);
5050

51-
void setBit(Register const reg, uint8_t const bit_pos);
52-
void writeReg(Register const reg_addr, uint8_t val);
53-
void readReg(Register const reg_addr, uint8_t *data);
51+
void setBit (Register const reg, uint8_t const bit_pos);
52+
void writeReg(Register const reg_addr, uint8_t const val);
53+
void readReg (Register const reg_addr, uint8_t * data);
5454

5555
/* LDO1 Configuration *******************************************************/
5656
void setLDO1Voltage (Ldo1Voltage const ldo1_volt);
@@ -87,7 +87,7 @@ class PF1550_Control
8787

8888
private:
8989

90-
interface::PF1550_Io & _io;
90+
PF1550_IO & _io;
9191

9292
void onChargerEvent();
9393
void onSwitch1Event();

src/PF1550/interface/PF1550_Io.cpp renamed to src/PF1550/PF1550_IO.cpp

+38-19
Original file line numberDiff line numberDiff line change
@@ -21,49 +21,68 @@
2121
******************************************************************************/
2222

2323
#include "PF1550.h"
24-
#include "PF1550_Io.h"
24+
#include "PF1550_IO.h"
2525

2626
#include <assert.h>
2727

2828
/******************************************************************************
29-
NAMESPACE
29+
CTOR/DTOR
3030
******************************************************************************/
3131

32-
namespace interface
32+
PF1550_IO::PF1550_IO(arduino::HardwareI2C * wire, uint8_t const i2c_addr)
33+
: _wire{wire}
34+
, _i2c_addr{i2c_addr}
35+
, _debug{nullptr}
3336
{
3437

38+
}
39+
3540
/******************************************************************************
3641
PUBLIC MEMBER FUNCTIONS
3742
******************************************************************************/
3843

39-
void PF1550_Io::setBit(Register const reg, uint8_t const bit_pos)
44+
int PF1550_IO::begin()
45+
{
46+
_wire->begin();
47+
_wire->setClock(100000);
48+
return derived_begin();
49+
}
50+
51+
void PF1550_IO::readRegister(Register const reg_addr, uint8_t * data)
52+
{
53+
_wire->beginTransmission(_i2c_addr);
54+
_wire->write(static_cast<uint8_t>(reg_addr));
55+
_wire->endTransmission(false); /* No Stop. */
56+
57+
_wire->requestFrom(_i2c_addr, 1, true);
58+
while (_wire->available() < 1) { }
59+
*data = _wire->read();
60+
}
61+
62+
void PF1550_IO::writeRegister(Register const reg_addr, uint8_t const data)
63+
{
64+
_wire->beginTransmission(_i2c_addr);
65+
_wire->write(static_cast<uint8_t>(reg_addr));
66+
_wire->write(data);
67+
_wire->endTransmission(true);
68+
}
69+
70+
void PF1550_IO::setBit(Register const reg, uint8_t const bit_pos)
4071
{
4172
assert(bit_pos < 8);
4273
uint8_t reg_val;
4374
readRegister(reg, &reg_val);
4475
reg_val |= (1<<bit_pos);
4576

46-
uint8_t i2c_data[2];
47-
i2c_data[0] = (uint8_t)reg;
48-
i2c_data[1] = reg_val;
49-
writeRegister(PF1550_I2C_ADDR, i2c_data, 2, 0);
77+
writeRegister(reg, reg_val);
5078
}
5179

52-
void PF1550_Io::clrBit(Register const reg, uint8_t const bit_pos)
80+
void PF1550_IO::clrBit(Register const reg, uint8_t const bit_pos)
5381
{
5482
assert(bit_pos < 8);
5583
uint8_t reg_val;
5684
readRegister(reg, &reg_val);
5785
reg_val &= ~(1<<bit_pos);
5886

59-
uint8_t i2c_data[2];
60-
i2c_data[0] = (uint8_t)reg;
61-
i2c_data[1] = reg_val;
62-
writeRegister(PF1550_I2C_ADDR, i2c_data, 2, 0);
87+
writeRegister(reg, reg_val);
6388
}
64-
65-
/******************************************************************************
66-
NAMESPACE
67-
******************************************************************************/
68-
69-
} /* interface */

0 commit comments

Comments
 (0)