SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
SY6970Adc.cpp
Go to the documentation of this file.
1
30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_SY6970
32
33#include "SY6970Adc.hpp"
34#include "SY6970Regs.hpp"
35
36using namespace SY6970Regs;
37
38SY6970Adc::SY6970Adc(SY6970Core &core) : _core(core) {}
39
40bool SY6970Adc::enableChannels(uint32_t mask)
41{
42 (void)mask;
43 return true; // SY6970 has no per-channel enable control
44}
45
46bool SY6970Adc::disableChannels(uint32_t mask)
47{
48 (void)mask;
49 return true; // SY6970 has no per-channel enable control
50}
51
52bool SY6970Adc::read(Channel ch, float &out)
53{
54 out = 0.0f;
55
56 // Check if ADC conversion is in progress
57 // CONV_START stays high during conversion and is read-only when CONV_RATE=1
58 int ctrl = _core.readReg(REG_PWR_ONOFF);
59 if (ctrl >= 0 && !(ctrl & MASK_CONV_START)) {
60 // ADC not busy, trigger a one-shot conversion
62 }
63
64 switch (ch) {
66 if (!_core.isVbusPresent()) {
67 out = 0.0f;
68 return true;
69 }
70 int val = _core.readReg(REG_ADC_BUSV);
71 if (val < 0) return false;
72 out = ((val & MASK_BUSV) * VBUS_VOL_STEP) + VBUS_BASE_VAL;
73 break;
74 }
76 int val = _core.readReg(REG_ADC_BATV);
77 if (val < 0) return false;
78 val = val & MASK_BATV;
79 if (val == 0) {
80 out = 0.0f;
81 return true;
82 }
83 out = (val * VBAT_VOL_STEP) + VBAT_BASE_VAL;
84 break;
85 }
87 int val = _core.readReg(REG_ADC_SYSV);
88 if (val < 0) return false;
89 out = ((val & MASK_SYSV) * VSYS_VOL_STEP) + VSYS_BASE_VAL;
90 break;
91 }
93 if (!_core.isCharging()) {
94 out = 0.0f;
95 return true;
96 }
97 int val = _core.readReg(REG_ADC_ICHGR);
98 if (val < 0 || (val & MASK_ICHGR) == 0) {
99 out = 0.0f;
100 return true;
101 }
102 out = (val & MASK_ICHGR) * CHG_STEP_VAL;
103 break;
104 }
106 int val = _core.readReg(REG_ADC_NTC);
107 if (val < 0) return false;
108 out = ((val & MASK_NTPCPT) * NTC_VOL_STEP) + NTC_BASE_VAL;
109 break;
110 }
112 int val = _core.readReg(REG_ADC_BATV);
113 if (val < 0) return false;
114 out = (val & MASK_THERM_STAT) ? 1.0f : 0.0f;
115 break;
116 }
119 default:
120 return false;
121 }
122 return true;
123}
124
126{
127 return _core.updateBits(REG_PWR_ONOFF, MASK_CONV_START, MASK_CONV_START) >= 0;
128}
129
131{
132 uint8_t val = MASK_CONV_START;
133 if (enable) {
134 val |= MASK_CONV_RATE;
135 }
136 return _core.updateBits(REG_PWR_ONOFF, MASK_CONV_START | MASK_CONV_RATE, val) >= 0;
137}
138
139#endif
@license MIT License
@license MIT License
Channel
ADC channel bitmask.
@ BAT_PERCENTAGE
Battery percentage.
@ DIE_TEMPERATURE
Die temperature.
@ BAT_VOLTAGE
Battery voltage.
@ BAT_TEMPERATURE
Battery temperature.
@ BAT_CURRENT
Battery current.
@ VBUS_CURRENT
VBUS current.
@ VBUS_VOLTAGE
VBUS voltage.
@ VSYS_VOLTAGE
VSYS voltage.
bool setContinuousMode(bool enable)
Enable or disable continuous ADC mode.
bool startConversion()
Start a single ADC conversion.
bool enableChannels(uint32_t mask) override
Enable one or more ADC channels.
Definition SY6970Adc.cpp:40
SY6970Adc(SY6970Core &core)
Construct ADC interface.
Definition SY6970Adc.cpp:38
bool disableChannels(uint32_t mask) override
Disable ADC channels (no-op for SY6970)
Definition SY6970Adc.cpp:46
bool read(Channel ch, float &out) override
Read ADC value for specified channel.
Definition SY6970Adc.cpp:52
bool isCharging()
Check if actively charging.
bool isVbusPresent()
Check if VBUS (USB power) is present.
int readReg(uint8_t reg) const
int updateBits(uint8_t reg, uint8_t mask, uint8_t value_shifted)