Skip to content

Commit adfaa91

Browse files
committed
Simplify PresentStatus handling with C++ bit-fields
Add a uint16_t operator to allow seamless comparison and PowerDevice.sendReport(..) calls.
1 parent 91f641b commit adfaa91

File tree

2 files changed

+45
-35
lines changed

2 files changed

+45
-35
lines changed

examples/UPS/UPS.ino

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const char STRING_SERIAL[] PROGMEM = "UPS10";
1717
const byte bDeviceChemistry = IDEVICECHEMISTRY;
1818
const byte bOEMVendor = IOEMVENDOR;
1919

20-
uint16_t iPresentStatus = 0, iPreviousStatus = 0;
20+
PresentStatus iPresentStatus = {}, iPreviousStatus = {};
2121

2222
byte bRechargable = 1;
2323
byte bCapacityMode = 2; // units are in %%
@@ -108,54 +108,54 @@ void loop() {
108108

109109
// Charging
110110
if(bCharging)
111-
bitSet(iPresentStatus,PRESENTSTATUS_CHARGING);
111+
iPresentStatus.CHARGING = 1;
112112
else
113-
bitClear(iPresentStatus,PRESENTSTATUS_CHARGING);
113+
iPresentStatus.CHARGING = 0;
114114
if(bACPresent)
115-
bitSet(iPresentStatus,PRESENTSTATUS_ACPRESENT);
115+
iPresentStatus.ACPRESENT = 1;
116116
else
117-
bitClear(iPresentStatus,PRESENTSTATUS_ACPRESENT);
117+
iPresentStatus.ACPRESENT = 0;
118118
if(iRemaining == iFullChargeCapacity)
119-
bitSet(iPresentStatus,PRESENTSTATUS_FULLCHARGE);
119+
iPresentStatus.FULLCHARGE = 1;
120120
else
121-
bitClear(iPresentStatus,PRESENTSTATUS_FULLCHARGE);
121+
iPresentStatus.FULLCHARGE = 0;
122122

123123
// Discharging
124124
if(bDischarging) {
125-
bitSet(iPresentStatus,PRESENTSTATUS_DISCHARGING);
126-
// if(iRemaining < iRemnCapacityLimit) bitSet(iPresentStatus,PRESENTSTATUS_BELOWRCL);
125+
iPresentStatus.DISCHARGING = 1;
126+
// if(iRemaining < iRemnCapacityLimit) iPresentStatus.BELOWRCL = 1;
127127

128128
if(iRunTimeToEmpty < iRemainTimeLimit)
129-
bitSet(iPresentStatus, PRESENTSTATUS_RTLEXPIRED);
129+
iPresentStatus.RTLEXPIRED = 1;
130130
else
131-
bitClear(iPresentStatus, PRESENTSTATUS_RTLEXPIRED);
131+
iPresentStatus.RTLEXPIRED = 0;
132132

133133
}
134134
else {
135-
bitClear(iPresentStatus,PRESENTSTATUS_DISCHARGING);
136-
bitClear(iPresentStatus, PRESENTSTATUS_RTLEXPIRED);
135+
iPresentStatus.DISCHARGING = 0;
136+
iPresentStatus.RTLEXPIRED = 0;
137137
}
138138

139139
// Shutdown requested
140140
if(iDelayBe4ShutDown > 0 ) {
141-
bitSet(iPresentStatus, PRESENTSTATUS_SHUTDOWNREQ);
141+
iPresentStatus.SHUTDOWNREQ = 1;
142142
Serial.println("shutdown requested");
143143
}
144144
else
145-
bitClear(iPresentStatus, PRESENTSTATUS_SHUTDOWNREQ);
145+
iPresentStatus.SHUTDOWNREQ = 0;
146146

147147
// Shutdown imminent
148-
if((iPresentStatus & (1 << PRESENTSTATUS_SHUTDOWNREQ)) ||
149-
(iPresentStatus & (1 << PRESENTSTATUS_RTLEXPIRED))) {
150-
bitSet(iPresentStatus, PRESENTSTATUS_SHUTDOWNIMNT);
148+
if((iPresentStatus.SHUTDOWNREQ) ||
149+
(iPresentStatus.RTLEXPIRED)) {
150+
iPresentStatus.SHUTDOWNIMNT = 1;
151151
Serial.println("shutdown imminent");
152152
}
153153
else
154-
bitClear(iPresentStatus, PRESENTSTATUS_SHUTDOWNIMNT);
154+
iPresentStatus.SHUTDOWNIMNT = 0;
155155

156156

157157

158-
bitSet(iPresentStatus ,PRESENTSTATUS_BATTPRESENT);
158+
iPresentStatus.BATTPRESENT = 1;
159159

160160

161161

src/HIDPowerDevice.h

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,31 @@
7272
#define HID_PD_IOEMINFORMATION 0x20 // Feature
7373

7474

75-
// PresenStatus dynamic flags
76-
#define PRESENTSTATUS_CHARGING 0x00
77-
#define PRESENTSTATUS_DISCHARGING 0x01
78-
#define PRESENTSTATUS_ACPRESENT 0x02
79-
#define PRESENTSTATUS_BATTPRESENT 0x03
80-
#define PRESENTSTATUS_BELOWRCL 0x04
81-
#define PRESENTSTATUS_RTLEXPIRED 0x05
82-
#define PRESENTSTATUS_NEEDREPLACE 0x06
83-
#define PRESENTSTATUS_VOLTAGENR 0x07
84-
#define PRESENTSTATUS_FULLCHARGE 0x08
85-
#define PRESENTSTATUS_FULLDISCHARGE 0x09
86-
#define PRESENTSTATUS_SHUTDOWNREQ 0x0A
87-
#define PRESENTSTATUS_SHUTDOWNIMNT 0x0B
88-
#define PRESENTSTATUS_COMMLOST 0x0C
89-
#define PRESENTSTATUS_OVERLOAD 0x0D
75+
// PresentStatus dynamic flags
76+
struct PresentStatus {
77+
uint8_t CHARGING : 1; // bit 0x00
78+
uint8_t DISCHARGING : 1; // bit 0x01
79+
uint8_t ACPRESENT : 1; // bit 0x02
80+
uint8_t BATTPRESENT : 1; // bit 0x03
81+
uint8_t BELOWRCL : 1; // bit 0x04
82+
uint8_t RTLEXPIRED : 1; // bit 0x05
83+
uint8_t NEEDREPLACE : 1; // bit 0x06
84+
uint8_t VOLTAGENR : 1; // bit 0x07
85+
86+
uint8_t FULLCHARGE : 1; // bit 0x08
87+
uint8_t FULLDISCHARGE : 1;// bit 0x09
88+
uint8_t SHUTDOWNREQ : 1; // bit 0x0A
89+
uint8_t SHUTDOWNIMNT : 1; // bit 0x0B
90+
uint8_t COMMLOST : 1; // bit 0x0C
91+
uint8_t OVERLOAD : 1; // bit 0x0D
92+
uint8_t unused1 : 1;
93+
uint8_t unused2 : 1;
94+
95+
operator uint16_t () {
96+
return *(uint16_t*)(this); // switch to std::bit_cast after migrating to C++20
97+
}
98+
};
99+
static_assert(sizeof(PresentStatus) == sizeof(uint16_t));
90100

91101

92102

0 commit comments

Comments
 (0)