summaryrefslogtreecommitdiff
path: root/firmware/powermgmt.c
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2021-07-07 08:22:50 +0200
committerTomasz Moń <desowin@gmail.com>2021-07-07 08:24:01 +0200
commit841e704fc3b5bde96ca8de4794c85198e2f12a65 (patch)
tree796859262b7398b6300d01c09782971f5ee65226 /firmware/powermgmt.c
parentb87e75f768eba3ccdf422a5082c91097a0b72b5b (diff)
downloadrockbox-841e704fc3b5bde96ca8de4794c85198e2f12a65.tar.gz
rockbox-841e704fc3b5bde96ca8de4794c85198e2f12a65.zip
Sansa Connect: Read HDQ battery data
Make it possible for target to provide voltage, percentage and time to empty values. The voltage measurement is nice to have in debug menu even if the actions are taken only based on percentage. Perform battery level estimation based on voltage only if percentage is not available. Use time to empty based on actual power consumption. This makes the estimated runtime displayed in Rockbox Info to react to backlight setting. The bq27000 updates time to empty estimate every 5.12 seconds so it is possible to see the estimate with backlight off on the screen if user enters Rockbox Info, activates hold switch, waits 11 seconds and releases the hold switch. Change-Id: Iafe3fa0fb334e3428e3a0ad05b2c020d208dc934
Diffstat (limited to 'firmware/powermgmt.c')
-rw-r--r--firmware/powermgmt.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index a05e0aeb68..51ea99f6fa 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -88,16 +88,12 @@ static long last_event_tick = 0;
88#if (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) == PERCENTAGE_MEASURE 88#if (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) == PERCENTAGE_MEASURE
89#ifdef SIMULATOR 89#ifdef SIMULATOR
90int _battery_level(void) { return -1; } 90int _battery_level(void) { return -1; }
91int _battery_voltage(void);
92extern const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11];
93extern const unsigned short percent_to_volt_charge[11];
94#else
95int _battery_voltage(void) { return -1; }
96const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11];
97const unsigned short percent_to_volt_charge[11];
98#endif 91#endif
99#elif (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) == VOLTAGE_MEASURE 92#else
100int _battery_level(void) { return -1; } 93int _battery_level(void) { return -1; }
94#endif
95
96#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) == VOLTAGE_MEASURE
101/* 97/*
102 * Average battery voltage and charger voltage, filtered via a digital 98 * Average battery voltage and charger voltage, filtered via a digital
103 * exponential filter (aka. exponential moving average, scaled): 99 * exponential filter (aka. exponential moving average, scaled):
@@ -106,10 +102,8 @@ int _battery_level(void) { return -1; }
106static unsigned int avgbat; 102static unsigned int avgbat;
107/* filtered battery voltage, millivolts */ 103/* filtered battery voltage, millivolts */
108static unsigned int battery_millivolts; 104static unsigned int battery_millivolts;
109#elif (CONFIG_BATTERY_MEASURE == 0) 105#else
110int _battery_voltage(void) { return -1; } 106int _battery_voltage(void) { return -1; }
111int _battery_level(void) { return -1; }
112
113const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11]; 107const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11];
114const unsigned short percent_to_volt_charge[11]; 108const unsigned short percent_to_volt_charge[11];
115#endif 109#endif
@@ -156,9 +150,9 @@ void battery_read_info(int *voltage, int *level)
156 *voltage = millivolts; 150 *voltage = millivolts;
157 151
158 if (level) { 152 if (level) {
159 percent = voltage_to_battery_level(millivolts); 153 percent = _battery_level();
160 if (percent < 0) 154 if (percent < 0)
161 percent = _battery_level(); 155 percent = voltage_to_battery_level(millivolts);
162 *level = percent; 156 *level = percent;
163 } 157 }
164} 158}