1+ #include " BatteryService.h"
2+ #include < Loop/LoopManager.h>
3+ #include < soc/efuse_reg.h>
4+ #include " ../Pins.hpp"
5+ #include " ../Clockstar.h"
6+
7+ BatteryService Battery;
8+
9+ uint16_t BatteryService::mapReading (uint16_t reading){
10+ int mapped = map (reading, MIN_READ, MAX_READ, MIN_VOLT, MAX_VOLT);
11+ return mapped;
12+ }
13+
14+ void BatteryService::begin (){
15+ LoopManager::addListener (this );
16+ pinMode (PIN_CHARGE, INPUT_PULLDOWN);
17+ pinMode (PIN_BATT, INPUT);
18+ analogSetPinAttenuation (PIN_BATT, ADC_0db);
19+
20+ for (int i = 0 ; i < MeasureCount; i++){
21+ measureVoltage += analogRead (PIN_BATT);
22+ }
23+
24+ voltage = mapReading (measureVoltage / MeasureCount);
25+
26+ measureVoltage = 0 ;
27+ measureCount = 0 ;
28+ measureTime = millis ();
29+
30+ if (getVoltage () < MIN_VOLT && !charging ()){
31+ Clockstar.shutdown ();
32+ return ;
33+ }
34+ }
35+
36+ void BatteryService::loop (uint micros){
37+ if (millis () - measureTime <= 1000 .0f * MeasureInverval / MeasureCount) return ;
38+
39+ measureVoltage += analogRead (PIN_BATT);
40+ measureTime = millis ();
41+
42+ if (++measureCount < MeasureCount) return ;
43+
44+ voltage = mapReading (measureVoltage / MeasureCount);
45+ measureVoltage = 0 ;
46+ measureCount = 0 ;
47+
48+ if (getVoltage () < MIN_VOLT && !charging ()){
49+ Clockstar.shutdown ();
50+ return ;
51+ }
52+ }
53+
54+ uint8_t BatteryService::getLevel () const {
55+ uint8_t percentage = getPercentage ();
56+ if (percentage > 80 ){
57+ return 5 ;
58+ }else if (percentage > 60 ){
59+ return 4 ;
60+ }else if (percentage > 40 ){
61+ return 3 ;
62+ }else if (percentage > 20 ){
63+ return 2 ;
64+ }else if (percentage >= 5 ){
65+ return 1 ;
66+ }else if (percentage < 5 ){
67+ return 0 ;
68+ }
69+ }
70+
71+ uint8_t BatteryService::getPercentage () const {
72+ int16_t percentage = map (getVoltage (), MIN_VOLT, MAX_VOLT, 0 , 100 );
73+ if (percentage < 0 ){
74+ return 0 ;
75+ }else if (percentage > 100 ){
76+ return 100 ;
77+ }else {
78+ return percentage;
79+ }
80+ }
81+
82+ uint16_t BatteryService::getVoltage () const {
83+ return voltage + getVoltOffset ();
84+ }
85+
86+ int16_t BatteryService::getVoltOffset (){
87+ uint32_t upper = REG_GET_FIELD (EFUSE_BLK3_RDATA3_REG, EFUSE_RD_ADC1_TP_HIGH);
88+ uint32_t lower = REG_GET_FIELD (EFUSE_BLK3_RDATA3_REG, EFUSE_RD_ADC1_TP_LOW);
89+ return (upper << 7 ) | lower;
90+ }
91+
92+ bool BatteryService::charging () const {
93+ return digitalRead (PIN_CHARGE);
94+ }
0 commit comments