- local hrs = math.floor(time_rat)
- if hrs < 0 then hrs = 0 elseif hrs > 23 then hrs = 23 end
-
- local min = math.floor((time_rat - hrs) * 60)
- if min < 0 then min = 0 elseif min > 59 then min = 59 end
-
- bat_now.time = string.format("%02d:%02d", hrs, min)
-
- local perc = tonumber(first_line(bstr .. "/capacity"))
-
- if not perc then
- perc = (rem / tot) * 100
- end
-
- if perc <= 100 then
- bat_now.perc = string.format("%d", perc)
- elseif perc > 100 then
- bat_now.perc = "100"
- elseif perc < 0 then
- bat_now.perc = "0"
- end
-
- if rate ~= nil and ratev ~= nil then
- bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
- else
- bat_now.watt = "N/A"
+ -- When one of the battery is charging, others' status are either
+ -- "Full", "Unknown" or "Charging". When the laptop is not plugged in,
+ -- one or more of the batteries may be full, but only one battery
+ -- discharging suffices to set global status to "Discharging".
+ bat_now.status = bat_now.n_status[1]
+ for _,status in ipairs(bat_now.n_status) do
+ if status == "Discharging" or status == "Charging" then
+ bat_now.status = status
+ end
+ end
+ bat_now.ac_status = tonumber(first_line(string.format("%s%s/online", pspath, ac))) or "N/A"
+
+ if bat_now.status ~= "N/A" then
+ -- update {perc,time,watt} iff battery not full and rate > 0
+ if bat_now.status ~= "Full" and (sum_rate_power > 0 or sum_rate_current > 0) then
+ local rate_time = 0
+ local div = (sum_rate_power > 0 and sum_rate_power) or sum_rate_current
+
+ if bat_now.status == "Charging" then
+ rate_time = (sum_energy_full - sum_energy_now) / div
+ else -- Discharging
+ rate_time = sum_energy_now / div
+ end
+
+ if 0 < rate_time and rate_time < 0.01 then -- check for magnitude discrepancies (#199)
+ rate_time_magnitude = math.abs(math.floor(math.log10(rate_time)))
+ rate_time = rate_time * 10^(rate_time_magnitude - 2)
+ end
+
+ local hours = math.floor(rate_time)
+ local minutes = math.floor((rate_time - hours) * 60)
+ bat_now.perc = math.floor(math.min(100, (sum_energy_now / sum_energy_full) * 100))
+ bat_now.time = string.format("%02d:%02d", hours, minutes)
+ bat_now.watt = tonumber(string.format("%.2f", sum_rate_energy / 1e6))
+ elseif bat_now.status ~= "Full" and sum_rate_power == 0 and bat_now.ac_status == 1 then
+ bat_now.perc = math.floor(math.min(100, (sum_energy_now / sum_energy_full) * 100))
+ bat_now.time = "00:00"
+ bat_now.watt = 0
+ elseif bat_now.status == "Full" then
+ bat_now.perc = 100
+ bat_now.time = "00:00"
+ bat_now.watt = 0