add okay-ish files
This commit is contained in:
parent
5dbcc498ef
commit
7ce2a36b45
4 changed files with 108 additions and 0 deletions
6
includes/battery.h
Normal file
6
includes/battery.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
// Get the current battery level
|
||||||
|
int get_battery_level(const char *device_path, bool *is_charging);
|
7
includes/helper.h
Normal file
7
includes/helper.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define PID_WIRED 0x007A
|
||||||
|
#define PID_WIRELESS 0x007B
|
||||||
|
|
||||||
|
// Enumerate through HID devices and find device path
|
||||||
|
void find_device_path(int pid, char *device_path);
|
60
src/helper.c
Normal file
60
src/helper.c
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#include "../includes/helper.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <hidsdi.h>
|
||||||
|
#include <setupapi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define VID 0x1532
|
||||||
|
|
||||||
|
void find_device_path(int pid, char *device_path) {
|
||||||
|
GUID hidGuid;
|
||||||
|
HidD_GetHidGuid(&hidGuid);
|
||||||
|
|
||||||
|
HDEVINFO hDevInfo = SetupDiGetClassDevs(
|
||||||
|
&hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||||
|
if (hDevInfo == INVALID_HANDLE_VALUE) {
|
||||||
|
fprintf_s(stderr, "Failed to get device information.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
|
||||||
|
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||||
|
|
||||||
|
for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &hidGuid, i,
|
||||||
|
&deviceInterfaceData);
|
||||||
|
i++) {
|
||||||
|
DWORD requiredSize;
|
||||||
|
SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0,
|
||||||
|
&requiredSize, NULL);
|
||||||
|
|
||||||
|
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData =
|
||||||
|
(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);
|
||||||
|
detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||||
|
|
||||||
|
if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData,
|
||||||
|
detailData, requiredSize, NULL, NULL)) {
|
||||||
|
HANDLE hDevice = CreateFile(
|
||||||
|
detailData->DevicePath, GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||||
|
if (hDevice != INVALID_HANDLE_VALUE) {
|
||||||
|
// Get device attributes
|
||||||
|
HIDD_ATTRIBUTES attributes;
|
||||||
|
attributes.Size = sizeof(HIDD_ATTRIBUTES);
|
||||||
|
if (HidD_GetAttributes(hDevice, &attributes)) {
|
||||||
|
// Check VID and PID
|
||||||
|
if (attributes.VendorID == VID && attributes.ProductID == pid) {
|
||||||
|
strcpy(device_path, detailData->DevicePath);
|
||||||
|
CloseHandle(hDevice);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(detailData);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||||
|
}
|
35
src/main.c
Normal file
35
src/main.c
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#include "../includes/battery.h"
|
||||||
|
#include "../includes/helper.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
char device_path[2048];
|
||||||
|
|
||||||
|
// Try wired
|
||||||
|
find_device_path(PID_WIRED, device_path);
|
||||||
|
|
||||||
|
if (strlen(device_path) < 10) {
|
||||||
|
// Try wireless
|
||||||
|
find_device_path(PID_WIRELESS, device_path);
|
||||||
|
|
||||||
|
if (strlen(device_path) < 10) {
|
||||||
|
fprintf_s(stderr, "Can't find any compatible device.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Device: %s\n", device_path);
|
||||||
|
|
||||||
|
bool is_charging;
|
||||||
|
int battery_level;
|
||||||
|
if ((battery_level = get_battery_level(device_path, &is_charging)) < 0) {
|
||||||
|
fprintf_s(stderr, "Failed to get battery level.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Battery Level: %d%%\n", battery_level);
|
||||||
|
printf("Charging: %s\n", is_charging ? "Yes" : "No");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue