Skip to content

Commit

Permalink
Merge pull request #59 from beyenilmez/feature/MoreBatteryInfo
Browse files Browse the repository at this point in the history
feat: #58 - add more battery info
  • Loading branch information
beyluta authored Dec 14, 2023
2 parents 34fe8f7 + 7930637 commit 8c235b0
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 26 deletions.
27 changes: 19 additions & 8 deletions Assets/Templates/battery.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,26 @@
</div>
<span id="percent">100%</span>
</div>
<span class="status" id="status">Fully charged</span>
<span class="info" id="status">Fully charged</span>
<span class="info" id="remaining">Charging</span>
</body>
</html>

<script>
function onNativeBatteryLevelEvent(level) {
if (Number(level) >= 100) {
function onNativeBatteryEvent(batteryInfo) {
if (Number(batteryInfo.batteryLifePercent) >= 100) {
document.querySelector("#status").innerText = "Fully charged";
document.querySelector("#battery-icon").innerHTML =
'<i class="fa-solid fa-battery-full"></i>';
} else if (Number(level) >= 80) {
} else if (Number(batteryInfo.batteryLifePercent) >= 80) {
document.querySelector("#status").innerText = "High";
document.querySelector("#battery-icon").innerHTML =
'<i class="fa-solid fa-battery-three-quarters"></i>';
} else if (Number(level) >= 50) {
} else if (Number(batteryInfo.batteryLifePercent) >= 50) {
document.querySelector("#status").innerText = "Medium";
document.querySelector("#battery-icon").innerHTML =
'<i class="fa-solid fa-battery-half"></i>';
} else if (Number(level) >= 20) {
} else if (Number(batteryInfo.batteryLifePercent) >= 20) {
document.querySelector("#status").innerText = "Low";
document.querySelector("#battery-icon").innerHTML =
'<i class="fa-solid fa-battery-quarter"></i>';
Expand All @@ -47,7 +48,17 @@
'<i class="fa-solid fa-battery-empty"></i>';
}

document.querySelector("#percent").innerText = `${level}%`;
document.querySelector("#percent").innerText = `${batteryInfo.batteryLifePercent}%`;

if (batteryInfo.batteryLifeRemaining != -1) {
const hour = Math.floor(batteryInfo.batteryLifeRemaining / 3600) + "h";
const minute = Math.floor((batteryInfo.batteryLifeRemaining / 60) % 60) + "min";
document.querySelector("#remaining").innerText = (hour !== "0h" ? hour : "") + " " + (minute !== "0min" ? minute : "");
} else if (batteryInfo.powerLineStatus === "Online") {
document.querySelector("#remaining").innerText = "Charging";
} else {
document.querySelector("#remaining").innerText = "";
}
}
</script>

Expand Down Expand Up @@ -93,7 +104,7 @@
gap: 25px;
}

.status {
.info {
font-size: 24px;
}
</style>
12 changes: 11 additions & 1 deletion Assets/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,17 @@ <h2 class="settings-title">Hardware events</h2>
Here are some examples of the events that can be received from the hardware of your computer.

<div class="code" style="margin-top: 20px; font-family:'Courier New', Courier, monospace;">
<span style="color: var(--orange)">function</span> <span style="color: var(--purple)">onNativeBatteryLevelEvent</span>(<span style="color: var(--blue)">batteryLevel</span>)
<span style="color: var(--orange)">function</span> <span style="color: var(--purple)">onNativeBatteryEvent</span>(<span style="color: var(--blue)">batteryInfo</span>)
</div><br>
This function will receive a JSON response.
<div class="code" style="margin-top: 20px; font-family:'Courier New', Courier, monospace;">
<span style="color: var(--orange);">{</span><br>
<div style="margin: 0 0 0 10px;">batteryChargeStatus: <span style="color: var(--blue); ">0</span>,<br></div>
<div style="margin: 0 0 0 10px;">batteryFullLifetime: <span style="color: var(--blue);">12100</span>,<br></div>
<div style="margin: 0 0 0 10px;">batteryLifePercent: <span style="color: var(--blue);">51</span>,<br></div>
<div style="margin: 0 0 0 10px;">batteryLifeRemaining: <span style="color: var(--blue);">6172</span>,<br></div>
<div style="margin: 0 0 0 10px;">powerLineStatus: <span style="color: var(--orange);">"Offline"</span><br></div>
<span style="color: var(--orange);">}</span>
</div>

<div class="code" style="margin-top: 20px; font-family:'Courier New', Courier, monospace;">
Expand Down
10 changes: 5 additions & 5 deletions Components/WidgetsManager.Component.cs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ private void OnInitializeHooks(object sender, ElapsedEventArgs e)
userActivityHook.OnMouseActivity += new MouseEventHandler(OnMouseActivity);

HardwareActivityHook hardwareActivityHook = new HardwareActivityHook();
hardwareActivityHook.OnBatteryLevel += OnBatteryLevelChanged;
hardwareActivityHook.OnBattery += OnBatteryChanged;
hardwareActivityHook.OnSpaceAvailable += OnSpaceAvailableChanged;
hardwareActivityHook.OnAnyApplicationFullscrenStatusChanged += OnAnyApplicationFullscrenStatusChanged;
}));
Expand All @@ -293,8 +293,8 @@ private void CallJavaScriptFunction(string data, HardwareEvent hardwareEvent)
this.widgetService.InjectJavascript(widget, "if (typeof onNativeKeyEvents === 'function') { onNativeKeyEvents(" + data + "); }");
break;

case HardwareEvent.BatteryLevel:
this.widgetService.InjectJavascript(widget, "if (typeof onNativeBatteryLevelEvent === 'function') { onNativeBatteryLevelEvent(" + data + "); }");
case HardwareEvent.Battery:
this.widgetService.InjectJavascript(widget, "if (typeof onNativeBatteryEvent === 'function') { onNativeBatteryEvent(" + data + "); }");
break;

case HardwareEvent.SpaceAvailable:
Expand Down Expand Up @@ -343,9 +343,9 @@ private void OnMouseActivity(object sender, MouseEventArgs e)
CallJavaScriptFunction(JsonConvert.SerializeObject(action), HardwareEvent.NativeKeys);
}

private void OnBatteryLevelChanged(string level)
private void OnBatteryChanged(string batteryInfo)
{
CallJavaScriptFunction(level, HardwareEvent.BatteryLevel);
CallJavaScriptFunction(batteryInfo, HardwareEvent.Battery);
}

private void OnSpaceAvailableChanged(long freeSpace)
Expand Down
12 changes: 6 additions & 6 deletions Hooks/HardwareActivity.Hook.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ namespace Hooks
{
internal class HardwareActivityHook
{
public delegate void BatteryLevelHandler(string level);
public delegate void BatteryHandler(string level);
public delegate void SpaceAvailableInDriveHandler(long freeSpace);
public delegate void AnyFullscreenApplicationHandler(bool fullscreen);
public event BatteryLevelHandler OnBatteryLevel;
public event BatteryHandler OnBattery;
public event SpaceAvailableInDriveHandler OnSpaceAvailable;
public event AnyFullscreenApplicationHandler OnAnyApplicationFullscrenStatusChanged;

Expand All @@ -19,15 +19,15 @@ internal class HardwareActivityHook

public HardwareActivityHook()
{
this.timerService.CreateTimer(1000, OnBatteryLevelEvent, true, true);
this.timerService.CreateTimer(1000, OnBatteryEvent, true, true);
this.timerService.CreateTimer(1000, OnSpaceAvailableInDrivesEvent, true, true);
this.timerService.CreateTimer(1000, OnAnyApplicationFullscreenStatusEvent, true, true);
}

private void OnBatteryLevelEvent(object sender, ElapsedEventArgs e)
private void OnBatteryEvent(object sender, ElapsedEventArgs e)
{
string level = this.hardwareService.GetBatteryLevelPercentage();
OnBatteryLevel.Invoke(level);
string batteryInfo = this.hardwareService.GetBatteryInfo();
OnBattery.Invoke(batteryInfo);
}

private void OnSpaceAvailableInDrivesEvent(object sender, ElapsedEventArgs e)
Expand Down
39 changes: 38 additions & 1 deletion Models/Hardware.Model.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
internal enum HardwareEvent
{
NativeKeys = 0,
BatteryLevel = 1,
Battery = 1,
SpaceAvailable = 2,
}

Expand Down Expand Up @@ -49,4 +49,41 @@ internal struct PeripheralAction
/// </summary>
public string mouseWheelOffset { get; set; }
}

internal struct BatteryInfo {
/// <summary>
/// Battery charging status: Charging, Critical, High, Low, NoSystemBattery, Unknown
/// </summary>
public string batteryChargeStatus {
get; set;
}

/// <summary>
/// Full lifetime of the battery in seconds
/// </summary>
public string batteryFullLifetime {
get; set;
}

/// <summary>
/// Percentage of the remaining battery life
/// </summary>
public string batteryLifePercent {
get; set;
}

/// <summary>
/// Remaining battery lifetime in seconds
/// </summary>
public string batteryLifeRemaining {
get; set;
}

/// <summary>
/// Power line status: Offline, Online, Unknown
/// </summary>
public string powerLineStatus {
get; set;
}
}
}
22 changes: 17 additions & 5 deletions Services/Hardware.Service.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.IO;
using Models;
using Newtonsoft.Json;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

Expand All @@ -7,13 +9,23 @@ namespace Services
internal class HardwareService
{
/// <summary>
/// Get battery level in percentage
/// Get battery info
/// </summary>
/// <returns>Battery level in percent</returns>
public string GetBatteryLevelPercentage()
/// <returns>Battery info</returns>
public string GetBatteryInfo()
{
PowerStatus powerStatus = SystemInformation.PowerStatus;
return powerStatus.BatteryLifePercent.ToString();

BatteryInfo batteryInfo = new BatteryInfo()
{
batteryChargeStatus = powerStatus.BatteryChargeStatus.ToString(),
batteryFullLifetime = powerStatus.BatteryFullLifetime.ToString(),
batteryLifePercent = (powerStatus.BatteryLifePercent * 100).ToString(),
batteryLifeRemaining = powerStatus.BatteryLifeRemaining.ToString(),
powerLineStatus = powerStatus.PowerLineStatus.ToString(),
};

return JsonConvert.SerializeObject(batteryInfo);
}

/// <summary>
Expand Down

0 comments on commit 8c235b0

Please sign in to comment.