From 2e0319b1f3d519e993877e0f9b438ecb36e49197 Mon Sep 17 00:00:00 2001 From: T-Troll Date: Tue, 6 Sep 2022 07:54:55 +0700 Subject: [PATCH] SSD sensors, monitoring update. --- AlienFX-SDK/AlienFX_SDK.sln | 5 + AlienFX-SDK/AlienFX_SDK/AlienFX_SDK.cpp | 251 ++++++++---------- AlienFX-SDK/README.md | 19 +- AlienFx-Common/Common.cpp | 50 ++-- AlienFx-Common/common.h | 2 +- Doc/alienfx-gui.md | 4 +- Doc/alienfx-mon.md | 4 +- Doc/img/gui-settings-6.png | Bin 30743 -> 30743 bytes Doc/img/mon.png | Bin 40110 -> 40194 bytes Install/Install.vdproj | 52 +--- LightFX/LightFX.rc | 8 +- .../alienfan-SDK_v2/alienfan-SDK.cpp | 83 ++++-- alienfan-tools/alienfan-SDK_v2/alienfan-SDK.h | 6 +- alienfan-tools/alienfan-cli/alienfan-cli.cpp | 111 +++----- alienfan-tools/alienfan-gui/alienfan-gui.rc | Bin 15208 -> 15208 bytes alienfx-cli/alienfx-cli.cpp | 197 ++++++-------- alienfx-gui/EventDialog.cpp | 4 +- alienfx-gui/EventHandler.cpp | 58 ++-- alienfx-gui/EventHandler.h | 3 - alienfx-gui/FXHelper.cpp | 13 +- alienfx-gui/FXHelper.h | 4 +- alienfx-gui/SettingsDialog.cpp | 10 +- alienfx-gui/TabDevGrid.cpp | 18 +- alienfx-gui/alienfx-gui.cpp | 28 +- alienfx-gui/alienfx-gui.rc | Bin 67220 -> 67210 bytes alienfx-mon/SenMonHelper.cpp | 34 +-- alienfx-mon/alienfx-mon.cpp | 4 +- alienfx-mon/alienfx-mon.rc | Bin 15776 -> 15786 bytes 28 files changed, 466 insertions(+), 502 deletions(-) diff --git a/AlienFX-SDK/AlienFX_SDK.sln b/AlienFX-SDK/AlienFX_SDK.sln index b3076f68..e2e6aeea 100644 --- a/AlienFX-SDK/AlienFX_SDK.sln +++ b/AlienFX-SDK/AlienFX_SDK.sln @@ -18,6 +18,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AlienFX_SDK_noACPI", "Alien EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alienfan-low", "..\alienfan-tools\alienfan-SDK\alienfan-low\alienfan-low.vcxproj", "{CC889C0D-369A-46F0-87B2-956DA96DDEFD}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{71195927-9D2B-4898-96B8-4DB3296FA5C2}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution CheckDevices\CheckDevices.vcxitems*{685645dc-a6fb-47c6-a1bb-deed0d1b465c}*SharedItemsImports = 4 diff --git a/AlienFX-SDK/AlienFX_SDK/AlienFX_SDK.cpp b/AlienFX-SDK/AlienFX_SDK/AlienFX_SDK.cpp index c05059f9..b5c70913 100644 --- a/AlienFX-SDK/AlienFX_SDK/AlienFX_SDK.cpp +++ b/AlienFX-SDK/AlienFX_SDK/AlienFX_SDK.cpp @@ -148,104 +148,92 @@ namespace AlienFX_SDK { //Use this method for general devices, vid = 0 for any vid, pid = -1 for any pid. Do not use at the same time! int Functions::AlienFXInitialize(int vid, int pidd) { GUID guid; - bool flag = false; + bool flag = true; pid = -1; + DWORD dw = 0; + SP_DEVICE_INTERFACE_DATA deviceInterfaceData{ sizeof(SP_DEVICE_INTERFACE_DATA) }; HidD_GetHidGuid(&guid); HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if (hDevInfo == INVALID_HANDLE_VALUE) { - return pid; - } - unsigned int dw = 0; - SP_DEVICE_INTERFACE_DATA deviceInterfaceData{sizeof(SP_DEVICE_INTERFACE_DATA)}; - - while (!flag) { - if (!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dw, &deviceInterfaceData)) { - flag = true; - continue; - } - dw++; - DWORD dwRequiredSize = 0; - if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL)) { - continue; - } + if (hDevInfo != INVALID_HANDLE_VALUE) { + while (flag && SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dw, &deviceInterfaceData)) { + dw++; + DWORD dwRequiredSize = 0; + SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL); + + std::unique_ptr deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA*)new char[dwRequiredSize]); + deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) { + if ((devHandle = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, NULL)) != INVALID_HANDLE_VALUE) { + std::unique_ptr attributes(new HIDD_ATTRIBUTES); + attributes->Size = sizeof(HIDD_ATTRIBUTES); + if (HidD_GetAttributes(devHandle, attributes.get())) { + if (((!vid || attributes->VendorID == vid) && (pidd == -1 || attributes->ProductID == pidd))) { + // Check API version... + PHIDP_PREPARSED_DATA prep_caps; + HIDP_CAPS caps; + HidD_GetPreparsedData(devHandle, &prep_caps); + HidP_GetCaps(prep_caps, &caps); + HidD_FreePreparsedData(prep_caps); - std::unique_ptr deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA *)new char[dwRequiredSize]); - deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) { - string devicePath = deviceInterfaceDetailData->DevicePath; - devHandle = CreateFile(devicePath.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, NULL); - - if (devHandle != INVALID_HANDLE_VALUE) { - std::unique_ptr attributes(new HIDD_ATTRIBUTES); - attributes->Size = sizeof(HIDD_ATTRIBUTES); - if (HidD_GetAttributes(devHandle, attributes.get())) { - if (((!vid || attributes->VendorID == vid) && (pidd == -1 || attributes->ProductID == pidd))) { - // Check API version... - PHIDP_PREPARSED_DATA prep_caps; - HIDP_CAPS caps; - HidD_GetPreparsedData(devHandle, &prep_caps); - HidP_GetCaps(prep_caps, &caps); - HidD_FreePreparsedData(prep_caps); - - if (caps.OutputReportByteLength || caps.Usage == 0xcc) { - - // Yes, now so easy... - length = caps.OutputReportByteLength; - reportID = 0; - switch (caps.OutputReportByteLength) { - case 0: - length = caps.FeatureReportByteLength; - version = API_L_V5; - reportID = 0xcc; - break; - case 8: - version = API_L_V1; - reportID = 2; - break; - case 9: - version = API_L_V2; - reportID = 2; - break; - case 12: - version = API_L_V3; - reportID = 2; - break; - case 34: - version = API_L_V4; - break; - case 65: - switch (attributes->VendorID) { - case 0x0424: case 0x187c: - version = API_L_V6; - // device init - //PrepareAndSend(COMMV6.colorReset, sizeof(COMMV6.colorReset)); + if (caps.OutputReportByteLength || caps.Usage == 0xcc) { + length = caps.OutputReportByteLength; + reportID = 0; + switch (caps.OutputReportByteLength) { + case 0: + length = caps.FeatureReportByteLength; + version = API_L_V5; + reportID = 0xcc; break; - case 0x0461: - version = API_L_V7; + case 8: + version = API_L_V1; + reportID = 2; break; - case 0x04f2: - version = API_L_V8; - reportID = 0xe; + case 9: + version = API_L_V2; + reportID = 2; break; + case 12: + version = API_L_V3; + reportID = 2; + break; + case 34: + version = API_L_V4; + break; + case 65: + switch (attributes->VendorID) { + case 0x0424: case 0x187c: + version = API_L_V6; + // device init + PrepareAndSend(COMMV6.colorReset, sizeof(COMMV6.colorReset)); + break; + case 0x0461: + version = API_L_V7; + break; + case 0x04f2: + version = API_L_V8; + reportID = 0xe; + break; + } + break; + //default: length = caps.OutputReportByteLength; } - break; - //default: length = caps.OutputReportByteLength; - } - this->vid = attributes->VendorID; - pid = attributes->ProductID; - flag = true; + this->vid = attributes->VendorID; + pid = attributes->ProductID; + flag = false; + } } } + if (flag) + CloseHandle(devHandle); } - if (!flag) - CloseHandle(devHandle); } + deviceInterfaceDetailData.release(); } + SetupDiDestroyDeviceInfoList(hDevInfo); } - SetupDiDestroyDeviceInfoList(hDevInfo); return pid; } @@ -285,7 +273,7 @@ namespace AlienFX_SDK { bool result = false; switch (version) { case API_L_V6: - result = PrepareAndSend(COMMV6.colorReset, sizeof(COMMV6.colorReset)); + //result = PrepareAndSend(COMMV6.colorReset, sizeof(COMMV6.colorReset)); break; case API_L_V5: { @@ -503,6 +491,18 @@ namespace AlienFX_SDK { if (save) break; byte bPos = 5, cnt = 1; + // set indicators second light + // vector indi; + //for (auto nc = act->begin(); nc != act->end(); nc++) + // switch (nc->index) { + // case 0x19: case 0x28: case 0xb3: + // indi.push_back(nc->index); + // } + //if (indi.size()) { + // SetMultiLights(&indi, { 0,0,255 }); + // SetColor(0, { 0 }); + //} + PrepareAndSend(COMMV8.readyToColor, sizeof(COMMV8.readyToColor), { {2,(byte)act->size()} }); for (auto nc = act->begin(); nc != act->end(); nc++) if (bPos < length) { @@ -541,13 +541,6 @@ namespace AlienFX_SDK { mods.push_back({ 4, cnt }); val = PrepareAndSend(COMMV8.colorSet, sizeof(COMMV8.colorSet), &mods); } - // now set indicators second light - //for (auto nc = act->begin(); nc != act->end(); nc++) - // switch (nc->index) { - // case 0x19: case 0x28: case 0xb3: - // SetColor(nc->index, { nc->act[0].b, nc->act[0].g, nc->act[0].r }); - // } - } break; case API_L_V7: { @@ -1141,65 +1134,55 @@ namespace AlienFX_SDK { vector> Mappings::AlienFXEnumDevices() { vector> pids; GUID guid; - bool flag = false; HANDLE tdevHandle; HidD_GetHidGuid(&guid); HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if (hDevInfo == INVALID_HANDLE_VALUE) { - return pids; - } - unsigned int dw = 0; - SP_DEVICE_INTERFACE_DATA deviceInterfaceData; - - while (!flag) { + if (hDevInfo != INVALID_HANDLE_VALUE) { + DWORD dw = 0; + SP_DEVICE_INTERFACE_DATA deviceInterfaceData; deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dw, &deviceInterfaceData)) { - flag = true; - continue; - } - dw++; - DWORD dwRequiredSize = 0; - if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL)) { - continue; - } - std::unique_ptr deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA *)new char[dwRequiredSize]); - deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) { - string devicePath = deviceInterfaceDetailData->DevicePath; - tdevHandle = CreateFile(devicePath.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); - - if (tdevHandle != INVALID_HANDLE_VALUE) { - std::unique_ptr attributes(new HIDD_ATTRIBUTES); - attributes->Size = sizeof(HIDD_ATTRIBUTES); - if (HidD_GetAttributes(tdevHandle, attributes.get())) { - for (unsigned i = 0; i < NUM_VIDS; i++) { - if (attributes->VendorID == vids[i]) { - PHIDP_PREPARSED_DATA prep_caps; - HIDP_CAPS caps; - HidD_GetPreparsedData(tdevHandle, &prep_caps); - HidP_GetCaps(prep_caps, &caps); - HidD_FreePreparsedData(prep_caps); - if (caps.OutputReportByteLength || caps.Usage == 0xcc) { + while (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dw, &deviceInterfaceData)) { + dw++; + DWORD dwRequiredSize = 0; + SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL); + std::unique_ptr deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA*)new char[dwRequiredSize]); + deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) { + if ((tdevHandle = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) { + std::unique_ptr attributes(new HIDD_ATTRIBUTES); + attributes->Size = sizeof(HIDD_ATTRIBUTES); + if (HidD_GetAttributes(tdevHandle, attributes.get())) { + for (unsigned i = 0; i < NUM_VIDS; i++) { + if (attributes->VendorID == vids[i]) { + PHIDP_PREPARSED_DATA prep_caps; + HIDP_CAPS caps; + HidD_GetPreparsedData(tdevHandle, &prep_caps); + HidP_GetCaps(prep_caps, &caps); + HidD_FreePreparsedData(prep_caps); + + if (caps.OutputReportByteLength || caps.Usage == 0xcc) { #ifdef _DEBUG - char buff[2048]; - sprintf_s(buff, 2047, "Scan: VID: %#x, PID: %#x, Version: %d, Length: %d\n", - attributes->VendorID, attributes->ProductID, attributes->VersionNumber, attributes->Size); - OutputDebugString(buff); - printf("%s", buff); + char buff[2048]; + sprintf_s(buff, 2047, "Scan: VID: %#x, PID: %#x, Version: %d, Length: %d\n", + attributes->VendorID, attributes->ProductID, attributes->VersionNumber, attributes->Size); + OutputDebugString(buff); + printf("%s", buff); #endif - pids.push_back({attributes->VendorID,attributes->ProductID}); - break; + pids.push_back({ attributes->VendorID,attributes->ProductID }); + break; + } } } } + CloseHandle(tdevHandle); } - CloseHandle(tdevHandle); } + deviceInterfaceDetailData.release(); } + SetupDiDestroyDeviceInfoList(hDevInfo); } - SetupDiDestroyDeviceInfoList(hDevInfo); return pids; } diff --git a/AlienFX-SDK/README.md b/AlienFX-SDK/README.md index b8262f28..6e7e4aa5 100644 --- a/AlienFX-SDK/README.md +++ b/AlienFX-SDK/README.md @@ -2,19 +2,26 @@ Better AlienFX/LightFX SDK than Dell official's one without any limitations. Dell official SDK does a very terrible job if you want to change LED color in quick succession. Their official SDK comes with 3 seconds delay and behaves pretty weird in general. -This SDK not only fixes up its issue and performs better but is written from scratch by reverse engineerig USB protocol. It sends byte data directly to USB which then changes zones color. This also removes the dependency from their Command Center software and works irrespective of settings set in stock software. In other words, you can finally achieve Rainbow effect across all LED's like it was intended without any lag. This SDK also lets you change color of zones that are not possible with official SDK such as Macro keys, power button etc. +This SDK not only fixes up its issue and performs better but is written from scratch by reverse engineering USB protocol. It sends byte data directly to USB which then changes zones color. This also removes the dependency from their Command Center software and works irrespective of settings set in stock software. In other words, you can finally achieve Rainbow effect across all LED's like it was intended without any lag. This SDK also lets you change color of zones that are not possible with official SDK such as Macro keys, power button etc. Please checkout Sample App for reference. -**Currently tested on AW13/R2, AW13/R3, AWM14x, AW15R2/R3, AW17R3/R4, AWm15/R1-R4, AWm17/R1, Dell G5/G7, AWAurora/R7, but should work at any alienware laptop or desktop.** +### Supported devices: + +Any Alienware/Dell G-series hardware with RGB lights from 2010 to 2022. Including mouses, keyboards, monitors. +Read more details about supported devices and models [here](https://github.com/T-Troll/alienfx-tools/wiki/Supported-and-tested-devices-list) ### Supported device API versions: -- ACPI-controlled lights - 3 lights, 8 bit/color (v0) - using this API require low-level ACPI driver and library from [Alienfan](https://github.com/T-Troll/alienfan-tools) project. + +- ACPI-controlled lights - 3 lights, 8 bit/color (v0) - using this API require AlienFan-SDK library from [AlienFX-Tools](https://github.com/T-Troll/alienfx-tools) project. - 9 bytes 8 bit/color, reportID 2 control (v1) - 9 bytes 4 bit/color, reportID 2 control (v2) - 12 bytes 8 bit/color, reportID 2 control (v3) - 34 bytes 8 bit/color, reportID 0 control (v4) - 64 bytes 8 bit/color, featureID 0xcc control (v5) +- 65 bytes 8 bit/color, interrupt control (v6) +- 65 bytes 8 bit/color, featureID control (v7) +- 65 bytes 8 bit/color, Interrupt control (v8) Some notebooks have 2 devices - APIv4 (for logo, power button, etc) and APIv5 for keyboard. @@ -25,8 +32,8 @@ Some notebooks have 2 devices - APIv4 (for logo, power button, etc) and APIv5 fo - Change multiply lights color - Change light hardware effect (except APIv5) - Change multiply lights hardware effects (except APIv5) -- Hardware-backed global light off/on/dim (dim is software for APIv0-v3 and should be done by application) -- Global hardware light effects (APIv5) +- Hardware-backed global light off/on/dim (dim is software for APIv0-v3 and v6 and should be done by application) +- Global hardware light effects (APIv5, v8) ### Initialization ```C++ @@ -71,7 +78,7 @@ AlienFX_SDK::Functions::SetColor(6, 25, 114, 245); AlienFX_SDK::Functions::UpdateColors(); ``` ### Test app -After buildng, you can find simple probe app `AlienFXDeviceTester` - it shows information about device found into the system. If device supported, it reveals SDK type and version. +After building, you can find simple probe app `AlienFXDeviceTester` - it shows information about device found into the system. If device supported, it reveals SDK type and version. ### Projects using this SDK diff --git a/AlienFx-Common/Common.cpp b/AlienFx-Common/Common.cpp index 303cba82..ee596b10 100644 --- a/AlienFx-Common/Common.cpp +++ b/AlienFx-Common/Common.cpp @@ -8,45 +8,43 @@ using namespace std; extern HWND mDlg; extern bool needUpdateFeedback, isNewVersion, needRemove; -void EvaluteToAdmin() { +bool UACPassed = true; + +bool EvaluteToAdmin() { // Evaluation attempt... - char szPath[MAX_PATH]; - if (!IsUserAnAdmin()) { - if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath))) - { + if (UACPassed && !IsUserAnAdmin()) { + char szPath[MAX_PATH]; + GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)); // Launch itself as admin - SHELLEXECUTEINFO sei{ sizeof(sei), 0, NULL, "runas", szPath, NULL, NULL, SW_NORMAL }; - ShellExecuteEx(&sei); - if (mDlg) - SendMessage(mDlg, WM_CLOSE, 0, 0); - else + SHELLEXECUTEINFO sei{ sizeof(sei), 0, NULL, "runas", szPath, NULL, NULL, SW_NORMAL }; + if (UACPassed = ShellExecuteEx(&sei)) { + //if (mDlg) + // SendMessage(mDlg, WM_CLOSE, 0, 0); + //else _exit(1); // Quit itself } + return false; } + return UACPassed; } bool DoStopService(bool flag, bool kind) { - if (flag) { - EvaluteToAdmin(); - + if (flag && EvaluteToAdmin()) { SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, GENERIC_READ); SC_HANDLE schService = schSCManager ? OpenService(schSCManager, "AWCCService", SERVICE_ALL_ACCESS) : NULL; SERVICE_STATUS serviceStatus; bool rCode = false; - if (!schSCManager || !schService) - return false; - if (kind) { - // stop service - rCode = (BOOLEAN)ControlService(schService, SERVICE_CONTROL_STOP, &serviceStatus); - // ToDo: wait for stop - } - else { - // start service - /*rCode = (BOOLEAN)*/StartService(schService, 0, NULL); - /*if (!rCode && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) - rCode = true;*/ + if (schSCManager && schService) { + if (kind) { + // stop service + rCode = (BOOLEAN)ControlService(schService, SERVICE_CONTROL_STOP, &serviceStatus); + } + else { + // start service + StartService(schService, 0, NULL); + } + CloseServiceHandle(schService); } - CloseServiceHandle(schService); return rCode; } return false; diff --git a/AlienFx-Common/common.h b/AlienFx-Common/common.h index 94f9fa04..eab608f0 100644 --- a/AlienFx-Common/common.h +++ b/AlienFx-Common/common.h @@ -7,7 +7,7 @@ using namespace std; -void EvaluteToAdmin(); +bool EvaluteToAdmin(); bool DoStopService(bool flag, bool kind); void ResetDPIScale(); DWORD WINAPI CUpdateCheck(LPVOID); diff --git a/Doc/alienfx-gui.md b/Doc/alienfx-gui.md index 6a59e563..21e7f472 100644 --- a/Doc/alienfx-gui.md +++ b/Doc/alienfx-gui.md @@ -311,8 +311,8 @@ Application behavior control block at right: - "Check for update" - Enables online update check (default - on). - "Start minimized" - Hide application window in system tray after start (default - off). - "Disable AWCC" - Application will check active Alienware Control Center service at the each start and will try to stop it (and start back upon exit). It will require "Run as administrator" privilege (default - off). -- "ESIF sensors" - Read hardware data from ESIF WMI block. If disabled, Power measure and Thermal zone temperature sensors not available. It will require "Run as administrator" privilege (default - off). -- "Enable fan control" - Enables fan and power control functionality, if available for you hardware. +- "Use BIOS sensors" - Read additional hardware data from Windows WMI and Alienware BIOS (if fan control enabled). It will require "Run as administrator" privilege (default - off). +- "Enable fan control" - Enables fan and power control functionality, as well as some additional (Alienware BIOS) temperature sensors. It will require "Run as administrator" privilege (default - off). Light system control options at the left block: - "Turn on lights" - Global light control system switch. All lights will be off and black if disabled (default - on). diff --git a/Doc/alienfx-mon.md b/Doc/alienfx-mon.md index 5acf4252..c532adaf 100644 --- a/Doc/alienfx-mon.md +++ b/Doc/alienfx-mon.md @@ -16,8 +16,8 @@ By default, only Windows Performance-based sensors are enabled. It includes CPU load in percent, Memory load in percent, HDD load in percent, current Battery level, current GPU load (between all GPUs in system) and CPU/GPU temperatures (on some systems). You can enable 2 more sensor sources (but both of them will require Administrator rights): -- ESIF sensors. This includes additional temperature sensors, as well as power usage (total and per component) in Watt. -- BIOS sensors. The values come from AlienFan subsystem and includes even more temperature sensors, system fans RPMS and the percent of maximal RPM (not precise at some systems). +- BIOS sensors. This includes additional temperature sensors, as well as power usage (total and per component) in Watt. +- Alienware sensors. The values come from Fan control subsystem and includes even more temperature sensors, system fans RPMS and the percent of maximal RPM (not precise at some systems). You can edit sensor name by double-click on it into sensor list. You can hide sensor from active list pressing "Hide" button, assign try icon, it's color and style using "Sensor settings" block. diff --git a/Doc/img/gui-settings-6.png b/Doc/img/gui-settings-6.png index c70f35497afa05bad082d471b9e9559d465ce32b..9701f936c6c763082a84a00d49d1457266d09445 100644 GIT binary patch delta 28934 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 G)Bgggk-M<~ diff --git a/Doc/img/mon.png b/Doc/img/mon.png index 65f47033fac8d0d89c482aa9f76fff072673b827..c2301ac35be0808ef5d3a3597193b0ee374f1f3f 100644 GIT binary patch literal 40194 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

?#iIY6uk&aV;c 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 literal 40110 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 Y@lzKS)n{m|-dDkxQhZ{;KL^l105>O*y#N3J diff --git a/Install/Install.vdproj b/Install/Install.vdproj index 928e3646..0a9ec38e 100644 --- a/Install/Install.vdproj +++ b/Install/Install.vdproj @@ -13,12 +13,6 @@ "SccProvider" = "8:" "Hierarchy" { - "Entry" - { - "MsmKey" = "8:_0165E8EA63344119802E79B2B6C77D87" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } "Entry" { "MsmKey" = "8:_0207635732654CE6A87615796F8EEC39" @@ -408,15 +402,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:AlienFX Tools" - "ProductCode" = "8:{98F1B687-1646-447C-992F-F8E1B465C4CA}" - "PackageCode" = "8:{19C82AA1-479B-44FB-A174-0EF6296DF734}" + "ProductCode" = "8:{CB0E3A42-6FA3-45A6-B73F-F7305A864B6B}" + "PackageCode" = "8:{F927D6B3-BDD8-44E0-A67A-EB95B51D60B2}" "UpgradeCode" = "8:{EFC2D182-AE5E-4585-92D3-0759F77F59AA}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:FALSE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:7.1.0" + "ProductVersion" = "8:7.2.0" "Manufacturer" = "8:T-Troll" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:https://github.com/T-Troll/alienfx-tools/discussions" @@ -774,37 +768,9 @@ } "ProjectOutput" { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0165E8EA63344119802E79B2B6C77D87" - { - "SourcePath" = "8:..\\x64\\Debug\\alienfx-conv.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{2A69F644-02C6-4E27-A173-FF344172B5BD}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_1924518F6EA84AD696BCCE8E589E25C7" { - "SourcePath" = "8:..\\x64\\Debug\\alienfx-gui.exe" + "SourcePath" = "8:..\\x64\\Release\\alienfx-gui.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" @@ -832,7 +798,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_4B7975803E6C492C8F7D8B599766674C" { - "SourcePath" = "8:..\\x64\\Debug\\alienfan-gui.exe" + "SourcePath" = "8:..\\x64\\Release\\alienfan-gui.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" @@ -860,7 +826,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_AB07B12C770D4D4A9DE7E3A7F6280FFF" { - "SourcePath" = "8:..\\x64\\Debug\\LightFX.dll" + "SourcePath" = "8:..\\x64\\Release\\LightFX\\LightFX.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_39E2774D52CE4B619039352379796769" @@ -888,7 +854,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B829425435A04EFB81D071102204D8B4" { - "SourcePath" = "8:..\\x64\\Debug\\alienfan-cli.exe" + "SourcePath" = "8:..\\x64\\Release\\alienfan-cli.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" @@ -944,7 +910,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E287D1712A1A426DA4A815104949F017" { - "SourcePath" = "8:..\\x64\\Debug\\alienfx-cli.exe" + "SourcePath" = "8:..\\x64\\Release\\alienfx-cli.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" @@ -972,7 +938,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FA7989C51ECD437AB3316446FB849F60" { - "SourcePath" = "8:..\\x64\\Debug\\alienfx-mon.exe" + "SourcePath" = "8:..\\x64\\Release\\alienfx-mon.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_77CCC7F3944A4B009D9231F8B41DFD6D" diff --git a/LightFX/LightFX.rc b/LightFX/LightFX.rc index 08036bc3..8bd926dc 100644 --- a/LightFX/LightFX.rc +++ b/LightFX/LightFX.rc @@ -61,8 +61,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 7,1,0,0 - PRODUCTVERSION 7,1,0,0 + FILEVERSION 7,2,0,0 + PRODUCTVERSION 7,2,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -78,12 +78,12 @@ BEGIN BLOCK "040004b0" BEGIN VALUE "FileDescription", "LightFX emulator" - VALUE "FileVersion", "7.1.0.0" + VALUE "FileVersion", "7.2.0.0" VALUE "InternalName", "LightFX.dll" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "LightFX.dll" VALUE "ProductName", "AlienFX Tools" - VALUE "ProductVersion", "7.1.0.0" + VALUE "ProductVersion", "7.2.0.0" END END BLOCK "VarFileInfo" diff --git a/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.cpp b/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.cpp index f4b653b6..4dff1d90 100644 --- a/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.cpp +++ b/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.cpp @@ -24,11 +24,23 @@ namespace AlienFan_SDK { CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&m_WbemLocator); m_WbemLocator->ConnectServer((BSTR)L"ROOT\\WMI", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_WbemServices); - m_WbemLocator->ConnectServer((BSTR)L"ROOT\\OpenHardwareMonitor", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_OHMService); + // Windows bug with disk drives list + m_WbemLocator->ConnectServer((BSTR)L"ROOT\\Microsoft\\Windows\\Storage", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_DiskService); + if (m_DiskService) { + IWbemClassObject* spInstance = NULL; + m_DiskService->GetObject((BSTR)L"MSFT_PhysicalDisk", NULL, nullptr, &spInstance, nullptr); + spInstance->Release(); + m_DiskService->Release(); + } + // End Windows bugfix + m_WbemLocator->ConnectServer((BSTR)L"ROOT\\Microsoft\\Windows\\Storage\\Providers_v2", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_DiskService); + m_WbemLocator->ConnectServer((BSTR)L"ROOT\\LibreHardwareMonitor", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_OHMService); m_WbemLocator->Release(); } Control::~Control() { + if (m_DiskService) + m_DiskService->Release(); if (m_OHMService) m_OHMService->Release(); m_WbemServices->Release(); @@ -145,8 +157,7 @@ namespace AlienFan_SDK { devFlags |= DEV_FLAG_GMODE; } // ESIF temperature sensors - IWbemClassObject* m_ESIFObject = NULL; - if (m_WbemServices->GetObject((BSTR)L"EsifDeviceInformation", NULL, nullptr, &m_ESIFObject, nullptr) == S_OK) { + if (m_WbemServices->CreateInstanceEnum((BSTR)L"EsifDeviceInformation", WBEM_FLAG_FORWARD_ONLY, NULL, &enum_obj) == S_OK) { // Get sensor names array vector senNames; DWORD size = GetSystemFirmwareTable('ACPI', 'TDSS', NULL, 0); @@ -163,11 +174,11 @@ namespace AlienFan_SDK { } } delete[] buf; - m_WbemServices->CreateInstanceEnum((BSTR)L"EsifDeviceInformation", WBEM_FLAG_FORWARD_ONLY/*WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &enum_obj); + //m_WbemServices->CreateInstanceEnum((BSTR)L"EsifDeviceInformation", WBEM_FLAG_FORWARD_ONLY/*WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &enum_obj); enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); int numESIF = 0; + VARIANT instPath, cTemp; while (uNumOfInstances) { - VARIANT instPath, cTemp; spInstance->Get((BSTR)L"__Path", 0, &instPath, 0, 0); spInstance->Get((BSTR)L"Temperature", 0, &cTemp, 0, 0); spInstance->Release(); @@ -180,23 +191,41 @@ namespace AlienFan_SDK { enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); } enum_obj->Release(); - m_ESIFObject->Release(); + //m_ESIFObject->Release(); #ifdef _TRACE_ printf("ESIF data available, %d sensors (%d names) added!\n", numESIF, (int)senNames.size()); #endif } - if (m_WbemServices->GetObject((BSTR)L"AMD_ACPI", NULL, nullptr, &m_ESIFObject, nullptr) == S_OK) { - m_ESIFObject->Release(); +// if (m_WbemServices->GetObject((BSTR)L"AMD_ACPI", NULL, nullptr, &m_ESIFObject, nullptr) == S_OK) { +// m_ESIFObject->Release(); +//#ifdef _TRACE_ +// printf("AMD data available, %d sensors added!\n", 0); +//#endif +// } + if (m_DiskService && m_DiskService->CreateInstanceEnum((BSTR)L"MSFT_PhysicalDiskToStorageReliabilityCounter", WBEM_FLAG_FORWARD_ONLY, NULL, &enum_obj) == S_OK) { + IWbemClassObject* spInstance; + ULONG uNumOfInstances = 0; + enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); + short ssdsen = 0; + VARIANT instPath; + while (uNumOfInstances) { + spInstance->Get((BSTR)L"StorageReliabilityCounter", 0, &instPath, 0, 0); + sensors.push_back({ ssdsen, "SSD " + to_string(ssdsen + 1) + " Sensor", 2, instPath.bstrVal }); + spInstance->Release(); + enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); + ssdsen++; + } + enum_obj->Release(); #ifdef _TRACE_ - printf("AMD data available, %d sensors added!\n", 0); + printf("Disk data available, %d sensors added!\n", ssdsen); #endif } - if (m_OHMService && m_OHMService->GetObject((BSTR)L"Sensor", NULL, nullptr, &m_ESIFObject, nullptr) == S_OK) { - m_OHMService->CreateInstanceEnum((BSTR)L"Sensor", WBEM_FLAG_FORWARD_ONLY/*WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &enum_obj); + if (m_OHMService && m_OHMService->CreateInstanceEnum((BSTR)L"Sensor", WBEM_FLAG_FORWARD_ONLY, NULL, &enum_obj) == S_OK) { + //m_OHMService->CreateInstanceEnum((BSTR)L"Sensor", WBEM_FLAG_FORWARD_ONLY, NULL, &enum_obj); enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); - int numOHM = 0; + short numOHM = 0; + VARIANT instPath, type, name; while (uNumOfInstances) { - VARIANT instPath, type, name; spInstance->Get((BSTR)L"__Path", 0, &instPath, 0, 0); spInstance->Get((BSTR)L"SensorType", 0, &type, 0, 0); spInstance->Get((BSTR)L"Name", 0, &name, 0, 0); @@ -204,7 +233,7 @@ namespace AlienFan_SDK { wstring tn{ type.bstrVal }; if (tn == L"Temperature") { wstring sname{ name.bstrVal }; - sensors.push_back({ (short)numOHM, + sensors.push_back({ numOHM, string(sname.begin(), sname.end()), 4, instPath.bstrVal }); numOHM++; @@ -212,9 +241,9 @@ namespace AlienFan_SDK { enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); } enum_obj->Release(); - m_ESIFObject->Release(); + //m_ESIFObject->Release(); #ifdef _TRACE_ - printf("OHM data available, %d sensors added!\n", numOHM); + printf("LHM data available, %d sensors added!\n", numOHM); #endif } return true; @@ -250,25 +279,33 @@ namespace AlienFan_SDK { return -1; } int Control::GetTempValue(int TempID) { - IWbemClassObject* esifObject = NULL; + IWbemClassObject* sensorObject = NULL; if (TempID < sensors.size()) { switch (sensors[TempID].type) { case 1: // AWCC return CallWMIMethod(dev_controls.getTemp, (byte)sensors[TempID].senIndex); break; case 0: {// ESIF - if (m_WbemServices->GetObject(sensors[TempID].instance, NULL, nullptr, &esifObject, nullptr) == S_OK) { + if (m_WbemServices->GetObject(sensors[TempID].instance, NULL, nullptr, &sensorObject, nullptr) == S_OK) { VARIANT temp; - esifObject->Get((BSTR)L"Temperature", 0, &temp, 0, 0); - esifObject->Release(); + sensorObject->Get((BSTR)L"Temperature", 0, &temp, 0, 0); + sensorObject->Release(); return temp.uintVal; } } break; + case 2: // SSD + if (m_DiskService && m_DiskService->GetObject(sensors[TempID].instance, NULL, nullptr, &sensorObject, nullptr) == S_OK) { + VARIANT temp; + sensorObject->Get((BSTR)L"Temperature", 0, &temp, 0, 0); + sensorObject->Release(); + return temp.uintVal; + } + break; case 4: {// OHM - if (m_OHMService && m_OHMService->GetObject(sensors[TempID].instance, NULL, nullptr, &esifObject, nullptr) == S_OK) { + if (m_OHMService && m_OHMService->GetObject(sensors[TempID].instance, NULL, nullptr, &sensorObject, nullptr) == S_OK) { VARIANT temp; - esifObject->Get((BSTR)L"Value", 0, &temp, 0, 0); - esifObject->Release(); + sensorObject->Get((BSTR)L"Value", 0, &temp, 0, 0); + sensorObject->Release(); float t = temp.fltVal; return (int)temp.fltVal; } diff --git a/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.h b/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.h index 9dc60bcc..084616f3 100644 --- a/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.h +++ b/alienfan-tools/alienfan-SDK_v2/alienfan-SDK.h @@ -20,8 +20,8 @@ namespace AlienFan_SDK { struct ALIENFAN_SEN_INFO { SHORT senIndex = 0; string name; - byte type = 0; // 0 = TZ (ESIF), 1 = AWCC, 2 = ECDV1, 3 = ECDV 2, 4 = OHM - BSTR instance; // for ESIF/OHM sensors + byte type = 0; // 0 = TZ (ESIF), 1 = AWCC, 2 - Disk, 4 = OHM + BSTR instance; // for ESIF/OHM/SSD sensors }; struct ALIENFAN_COMMAND { @@ -51,7 +51,7 @@ namespace AlienFan_SDK { public: //VARIANT m_instancePath; - IWbemServices* m_WbemServices = NULL, *m_OHMService = NULL; + IWbemServices* m_WbemServices = NULL, * m_OHMService = NULL, * m_DiskService = NULL; Control(); ~Control(); diff --git a/alienfan-tools/alienfan-cli/alienfan-cli.cpp b/alienfan-tools/alienfan-cli/alienfan-cli.cpp index e9f24162..f316634c 100644 --- a/alienfan-tools/alienfan-cli/alienfan-cli.cpp +++ b/alienfan-tools/alienfan-cli/alienfan-cli.cpp @@ -144,7 +144,7 @@ setbrightness=,\tSet light system brightness and mode\n\ int main(int argc, char* argv[]) { - printf("AlienFan-CLI v7.0.4\n"); + printf("AlienFan-CLI v7.2.0\n"); AlienFan_SDK::Lights* lights = NULL; @@ -303,24 +303,6 @@ int main(int argc, char* argv[]) acpi->SetPower(acpi->powers[fan_conf->prof.powerStage]); continue; } - //if (command == "direct" && CheckArgs(command, 2, args.size())) { - // AlienFan_SDK::ALIENFAN_COMMAND comm; - // comm.com = (byte)strtoul(args[0].str.c_str(), NULL, 16); - // comm.sub = (byte)strtoul(args[1].str.c_str(), NULL, 16); - // byte value1 = 0, value2 = 0; - // if (args.size() > 2) - // value1 = (byte)strtol(args[2].str.c_str(), NULL, 16); - // if (args.size() > 3) - // value2 = (byte)strtol(args[3].str.c_str(), NULL, 16); - // printf("Direct call result: %d\n", acpi->CallWMIMethod(comm, value1, value2)); - // continue; - //} - //if (command == "directgpu" && CheckArgs(command, 2, args.size())) { - // USHORT command = (USHORT)strtoul(args[0].str.c_str(), NULL, 16); - // DWORD subcommand = strtoul(args[1].str.c_str(), NULL, 16); - // printf("DirectGPU call result: %d\n", acpi->RunGPUCommand(command, subcommand)); - // continue; - //} if (command == "resetcolor" && lights->IsActivated()) { // Reset color system for Aurora if (lights->Reset()) @@ -349,57 +331,46 @@ int main(int argc, char* argv[]) continue; } //if (command == "test") { // dump WMI functions - // printf("command %d arg %d - result %d\n", args[0].num, args[1].num, acpi->CallWMIMethod({ 3, (byte)args[0].num }, args[1].num)); - //// //DWORD size = EnumSystemFirmwareTables('ACPI', NULL, 0); - //// //byte* buf2 = new byte[size]; - //// //size = EnumSystemFirmwareTables('ACPI', buf2, size); - //// /*DWORD size = GetSystemFirmwareTable('ACPI', 'TDSS', NULL, 0); - //// byte* buf = new byte[size]; - //// size = GetSystemFirmwareTable('ACPI', 'TDSS', buf, size); - //// for (int i = 0; i < size - 5; i++) { - //// char name[5]{ 0 }; - //// memcpy(name, &buf[i], 4); - //// if (!strcmp(name, "_STR")) { - //// int sPos = i + 8; - //// wstring senName = (wchar_t*)&buf[sPos]; - //// wprintf(L"STR found - %s (size %d)!\n", senName.c_str(),(int)senName.length()); - //// i = sPos + senName.length() * 2; - //// } - //// } - //// delete[] buf;*/ - //// //// ESIF temperature sensors - //// IWbemClassObject* m_ESIFObject = NULL; - //// //IWbemLocator* m_WbemLocator; - //// //IWbemServices* m_WbemServices = NULL; - //// //CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&m_WbemLocator); - //// //m_WbemLocator->ConnectServer((BSTR)L"ROOT\\CIMV2", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_WbemServices); - //// //m_WbemLocator->Release(); - //// if (acpi->m_AWCCGetObj->GetObject((BSTR)L"MemoryOCControl", NULL, nullptr, &m_ESIFObject, nullptr) == S_OK) { - //// BSTR name; - //// //VARIANT m_instancePath; - //// // Command dump - //// //m_ESIFObject->GetObjectText(0, &name); - //// //wprintf(L"Names: %s\n", name); - //// //IEnumWbemClassObject* enum_obj; - //// //acpi->m_WbemServices->CreateInstanceEnum((BSTR)L"POWER_DATA", WBEM_FLAG_FORWARD_ONLY/*WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &enum_obj); - //// //IWbemClassObject* spInstance; - //// //ULONG uNumOfInstances = 0; - //// //enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); - //// //spInstance->Get((BSTR)L"__Path", 0, &m_instancePath, 0, 0); - //// //spInstance->Release(); - //// //enum_obj->Release(); - //// IWbemClassObject* m_outParameters = NULL; - //// if (acpi->m_WbemServices->ExecMethod(acpi->m_instancePath.bstrVal, - //// (BSTR)L"MemoryOCControl", 0, NULL, NULL, &m_outParameters, NULL) == S_OK && m_outParameters) { - //// //m_InParamaters->Release(); - //// VARIANT result; - //// m_outParameters->Get(L"Data", 0, &result, nullptr, nullptr); - //// m_outParameters->Release(); - //// printf("Result - %d", result.uintVal); - //// } - //// } - /* continue; - }*/ + // // SSD temperature sensors + // IWbemClassObject* driveObject = NULL, * instObj = NULL; + // IWbemLocator* m_WbemLocator; + // IWbemServices* m_WbemServices = NULL; + // CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&m_WbemLocator); + // m_WbemLocator->ConnectServer((BSTR)L"root\\Microsoft\\Windows\\Storage\\Providers_v2", nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &m_WbemServices); + // m_WbemLocator->Release(); + // if (m_WbemServices->GetObject((BSTR)L"MSFT_PhysicalDiskToStorageReliabilityCounter", NULL, nullptr, &driveObject, nullptr) == S_OK) { + // //BSTR name; + // VARIANT m_instancePath; + // // Command dump + // //m_ESIFObject->GetObjectText(0, &name); + // //wprintf(L"Names: %s\n", name); + // IEnumWbemClassObject* enum_obj; + // m_WbemServices->CreateInstanceEnum((BSTR)L"MSFT_PhysicalDiskToStorageReliabilityCounter", WBEM_FLAG_FORWARD_ONLY/*WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &enum_obj); + // IWbemClassObject* spInstance; + // ULONG uNumOfInstances = 0; + // enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); + // while (uNumOfInstances) { + // spInstance->Get((BSTR)L"StorageReliabilityCounter", 0, &m_instancePath, 0, 0); + // m_WbemServices->GetObject(m_instancePath.bstrVal, NULL, nullptr, &instObj, nullptr); + // instObj->Get((BSTR)L"Temperature", 0, &m_instancePath, 0, 0); + // wprintf(L"Temp: %d\n", m_instancePath.uintVal); + // instObj->Release(); + // spInstance->Release(); + // enum_obj->Next(10000, 1, &spInstance, &uNumOfInstances); + // } + // enum_obj->Release(); + // //IWbemClassObject* m_outParameters = NULL; + // //if (acpi->m_WbemServices->ExecMethod(acpi->m_instancePath.bstrVal, + // // (BSTR)L"MemoryOCControl", 0, NULL, NULL, &m_outParameters, NULL) == S_OK && m_outParameters) { + // // //m_InParamaters->Release(); + // // VARIANT result; + // // m_outParameters->Get(L"Data", 0, &result, nullptr, nullptr); + // // m_outParameters->Release(); + // // printf("Result - %d", result.uintVal); + // //} + // } + // continue; + //} printf("Unknown command - %s, use \"usage\" or \"help\" for information\n", command.c_str()); } } diff --git a/alienfan-tools/alienfan-gui/alienfan-gui.rc b/alienfan-tools/alienfan-gui/alienfan-gui.rc index e758248d748e0d0c8aed6a49819f66d89fe3f533..3a2f16b170921c9215609f48f4782e0c066faecf 100644 GIT binary patch delta 53 zcmaD+_M&Wo5u?#$Mk7N;qs_)fZ<&CUqNym5nyhFlKRLr(X!1NQuE`1J9Fud5`8Ic$ HKVSv`)wdAw delta 53 zcmaD+_M&Wo5u@Q`Mk7N;!_CG deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA*)new char[dwRequiredSize]); - deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); - if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) - { - string devicePath = deviceInterfaceDetailData->DevicePath; - tdevHandle = CreateFile(devicePath.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); - - if (tdevHandle != INVALID_HANDLE_VALUE) + dw++; + DWORD dwRequiredSize = 0; + SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL); { - std::unique_ptr attributes(new HIDD_ATTRIBUTES); - attributes->Size = sizeof(HIDD_ATTRIBUTES); - if (HidD_GetAttributes(tdevHandle, attributes.get())) - { - for (unsigned i = 0; i < NUM_VIDS; i++) { - if (attributes->VendorID == AlienFX_SDK::vids[i]) { - - PHIDP_PREPARSED_DATA prep_caps; - HIDP_CAPS caps; - HidD_GetPreparsedData(tdevHandle, &prep_caps); - HidP_GetCaps(prep_caps, &caps); - HidD_FreePreparsedData(prep_caps); - - string apiver; - bool supported = true; - - switch (caps.OutputReportByteLength) { - case 0: + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + unique_ptr deviceInterfaceDetailData((SP_DEVICE_INTERFACE_DETAIL_DATA*)new byte[dwRequiredSize]); + deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); + if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData.get(), dwRequiredSize, NULL, NULL)) { + if ((tdevHandle = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) + { + std::unique_ptr attributes(new HIDD_ATTRIBUTES); + attributes->Size = sizeof(HIDD_ATTRIBUTES); + if (HidD_GetAttributes(tdevHandle, attributes.get())) { - switch (caps.Usage) { - case 0xcc: apiver = "Keyboard, APIv5"; break; - default: supported = false; apiver = "Unknown"; - } - } break; - case 8: - apiver = "Notebook, APIv1"; - break; - case 9: - apiver = "Notebook, APIv2"; - break; - case 12: - apiver = "Notebook, APIv3"; - break; - case 34: - apiver = "Notebook/Desktop, APIv4"; - break; - case 65: - switch (i) { - case 0: case 2: - apiver = "Monitor, APIv6"; - break; - case 3: - apiver = "Mouse, APIv7"; - break; - case 4: - apiver = "Keyboard, APIv8"; - break; - } - break; - default: supported = false; apiver = "Unknown"; - } + for (unsigned i = 0; i < NUM_VIDS; i++) { + if (attributes->VendorID == AlienFX_SDK::vids[i]) { + + PHIDP_PREPARSED_DATA prep_caps; + HIDP_CAPS caps; + HidD_GetPreparsedData(tdevHandle, &prep_caps); + HidP_GetCaps(prep_caps, &caps); + HidD_FreePreparsedData(prep_caps); + + string apiver; + bool supported = true; + + switch (caps.OutputReportByteLength) { + case 0: + { + switch (caps.Usage) { + case 0xcc: apiver = "Keyboard, APIv5"; break; + default: supported = false; apiver = "Unknown"; + } + } break; + case 8: + apiver = "Notebook, APIv1"; + break; + case 9: + apiver = "Notebook, APIv2"; + break; + case 12: + apiver = "Notebook, APIv3"; + break; + case 34: + apiver = "Notebook/Desktop, APIv4"; + break; + case 65: + switch (i) { + case 0: case 2: + apiver = "Monitor, APIv6"; + break; + case 3: + apiver = "Mouse, APIv7"; + break; + case 4: + apiver = "Keyboard, APIv8"; + break; + } + break; + default: supported = false; apiver = "Unknown"; + } - if (show_all || supported) { + if (show_all || supported) { - printf("===== Device VID_%04x, PID_%04x =====\n", attributes->VendorID, attributes->ProductID); - printf("Version %d, block size %d\n", attributes->VersionNumber, attributes->Size); + printf("===== Device VID_%04x, PID_%04x =====\n", attributes->VendorID, attributes->ProductID); + printf("Version %d, block size %d\n", attributes->VersionNumber, attributes->Size); - printf("Report Lengths: Output %d, Input %d, Feature %d\n", caps.OutputReportByteLength, - caps.InputReportByteLength, - caps.FeatureReportByteLength); - printf("Usage ID %#x, Usage page %#x, Output caps %d, Index %d\n", caps.Usage, caps.UsagePage, - caps.NumberOutputButtonCaps, caps.NumberOutputDataIndices); + printf("Report Lengths: Output %d, Input %d, Feature %d\n", caps.OutputReportByteLength, + caps.InputReportByteLength, + caps.FeatureReportByteLength); + printf("Usage ID %#x, Usage page %#x, Output caps %d, Index %d\n", caps.Usage, caps.UsagePage, + caps.NumberOutputButtonCaps, caps.NumberOutputDataIndices); - printf("+++++ Detected as: "); + printf("+++++ Detected as: "); - switch (i) { - case 0: printf("Alienware,"); break; - case 1: printf("DARFON,"); break; - case 2: printf("Microchip,"); break; - case 3: printf("Primax,"); break; - case 4: printf("Chicony,"); break; - } + switch (i) { + case 0: printf("Alienware,"); break; + case 1: printf("DARFON,"); break; + case 2: printf("Microchip,"); break; + case 3: printf("Primax,"); break; + case 4: printf("Chicony,"); break; + } - printf(" %s +++++\n", apiver.c_str()); + printf(" %s +++++\n", apiver.c_str()); + } + } + } } + CloseHandle(tdevHandle); } } + deviceInterfaceDetailData.release(); } } - CloseHandle(tdevHandle); } } } @@ -213,7 +200,7 @@ int main(int argc, char* argv[]) int devType = -1; UINT sleepy = 0; - printf("alienfx-cli v7.1.0\n"); + printf("alienfx-cli v7.2.0\n"); if (argc < 2) { printUsage(); @@ -413,11 +400,6 @@ int main(int argc, char* argv[]) Update(); } break; - //case 7: - // // set-dev - // FindDevice(args[0].num); - // printf("Device #%d selected\n", cdev->GetPID()); - // break; case 8: // set-dim if (devType && args[0].num < afx_map->fxdevs.size()) @@ -429,11 +411,6 @@ int main(int argc, char* argv[]) afx_map->fxdevs[args[0].num].dev->SetGlobalEffects(args[1].num, args[2].num, sleepy, { 0,0,0, (byte)args[3].num, (byte)args[4].num, (byte)args[5].num }, { 0,0,0, (byte)args[6].num, (byte)args[7].num, (byte)args[8].num }); - //for (auto t = afx_map->fxdevs.begin(); t < afx_map->fxdevs.end(); t++) - // if (t->dev->GetVersion() == 5) - // t->dev->SetGlobalEffects(args[0].num, sleepy, - // { 0,0,0, (byte)args[1].num, (byte)args[2].num, (byte)args[3].num }, - // { 0,0,0, (byte)args[4].num, (byte)args[5].num, (byte)args[6].num }); break; case 10: // low-level @@ -460,7 +437,7 @@ int main(int argc, char* argv[]) case 0: typeName = "Desktop"; break; case 1: case 2: case 3: typeName = "Notebook"; break; case 4: typeName = "Desktop/Notebook"; break; - case 5: typeName = "Keyboard"; break; + case 5: case 8: typeName = "Keyboard"; break; case 6: typeName = "Display"; break; case 7: typeName = "Mouse"; break; } diff --git a/alienfx-gui/EventDialog.cpp b/alienfx-gui/EventDialog.cpp index a9d8438e..21b41cd3 100644 --- a/alienfx-gui/EventDialog.cpp +++ b/alienfx-gui/EventDialog.cpp @@ -229,7 +229,7 @@ void UpdateEventUI(LPVOID lpParam) { SetDlgItemText((HWND)lpParam, IDC_VAL_CPU, (to_string(fxhl->eData.CPU) + " (" + to_string(fxhl->maxData.CPU) + ")%").c_str()); SetDlgItemText((HWND)lpParam, IDC_VAL_RAM, (to_string(fxhl->eData.RAM) + " (" + to_string(fxhl->maxData.RAM) + ")%").c_str()); SetDlgItemText((HWND)lpParam, IDC_VAL_GPU, (to_string(fxhl->eData.GPU) + " (" + to_string(fxhl->maxData.GPU) + ")%").c_str()); - SetDlgItemText((HWND)lpParam, IDC_VAL_PWR, (to_string(fxhl->eData.PWR * fxhl->maxData.PWR / 100) + "W").c_str()); + SetDlgItemText((HWND)lpParam, IDC_VAL_PWR, (to_string(fxhl->eData.PWR * fxhl->maxData.PWR / 100) + " W").c_str()); if (mon) { int maxFans = 0; for (auto i = mon->fanRpm.begin(); i < mon->fanRpm.end(); i++) @@ -239,7 +239,7 @@ void UpdateEventUI(LPVOID lpParam) { else SetDlgItemText((HWND)lpParam, IDC_VAL_FAN, "disabled"); SetDlgItemText((HWND)lpParam, IDC_VAL_BAT, (to_string(fxhl->eData.Batt) + " %").c_str()); - SetDlgItemText((HWND)lpParam, IDC_VAL_NET, (to_string(fxhl->eData.NET * fxhl->maxData.NET / 102400) + " kb").c_str()); + SetDlgItemText((HWND)lpParam, IDC_VAL_NET, (to_string(fxhl->eData.NET) + " %").c_str()); SetDlgItemText((HWND)lpParam, IDC_VAL_TEMP, (to_string(fxhl->eData.Temp) + " (" + to_string(fxhl->maxData.Temp) + ")C").c_str()); } } diff --git a/alienfx-gui/EventHandler.cpp b/alienfx-gui/EventHandler.cpp index 01961dcc..3f567de1 100644 --- a/alienfx-gui/EventHandler.cpp +++ b/alienfx-gui/EventHandler.cpp @@ -96,7 +96,7 @@ void EventHandler::ChangeScreenState(DWORD state) void EventHandler::SwitchActiveProfile(profile* newID) { -if (!newID) newID = conf->FindDefaultProfile(); + if (!newID) newID = conf->FindDefaultProfile(); if (conf->foregroundProfile && newID->id != conf->foregroundProfile->id) conf->foregroundProfile = NULL; if (newID->id != conf->activeProfile->id) { @@ -367,20 +367,35 @@ void EventHandler::StopProfiles() } } -PDH_FMT_COUNTERVALUE_ITEM *counterValues = new PDH_FMT_COUNTERVALUE_ITEM[1]; DWORD counterSize = sizeof(PDH_FMT_COUNTERVALUE_ITEM); +PDH_FMT_COUNTERVALUE_ITEM* counterValues = new PDH_FMT_COUNTERVALUE_ITEM[1], * counterValuesMax = new PDH_FMT_COUNTERVALUE_ITEM[1]; -int GetValuesArray(HCOUNTER counter) { +int GetValuesArray(HCOUNTER counter, HCOUNTER c2 = NULL) { PDH_STATUS pdhStatus; DWORD count; - while ((pdhStatus = PdhGetFormattedCounterArray( counter, PDH_FMT_LONG, &counterSize, &count, counterValues )) == PDH_MORE_DATA) { + + if (c2) { + counterSize = sizeof(counterValuesMax); + while ((pdhStatus = PdhGetFormattedCounterArray(c2, PDH_FMT_LONG, &counterSize, &count, counterValuesMax)) == PDH_MORE_DATA) { + delete[] counterValuesMax; + counterValuesMax = new PDH_FMT_COUNTERVALUE_ITEM[counterSize / sizeof(PDH_FMT_COUNTERVALUE_ITEM) + 1]; + } + + if (pdhStatus != ERROR_SUCCESS) { + return -1; + } + } + + counterSize = sizeof(counterValues); + while ((pdhStatus = PdhGetFormattedCounterArray( counter, PDH_FMT_LONG, &counterSize, &count, counterValues)) == PDH_MORE_DATA) { delete[] counterValues; - counterValues = new PDH_FMT_COUNTERVALUE_ITEM[counterSize / sizeof(PDH_FMT_COUNTERVALUE_ITEM) + 1]; + counterValues = new PDH_FMT_COUNTERVALUE_ITEM[counterSize/sizeof(PDH_FMT_COUNTERVALUE_ITEM) + 1]; } if (pdhStatus != ERROR_SUCCESS) { return -1; } + return count - 1; } @@ -477,6 +492,7 @@ static DWORD WINAPI CEventProc(LPVOID param) LPCTSTR COUNTER_PATH_CPU = "\\Processor Information(_Total)\\% Processor Time", COUNTER_PATH_NET = "\\Network Interface(*)\\Bytes Total/sec", + COUNTER_PATH_NETMAX = "\\Network Interface(*)\\Current BandWidth", COUNTER_PATH_GPU = "\\GPU Engine(*)\\Utilization Percentage", COUNTER_PATH_HOT = "\\Thermal Zone Information(*)\\Temperature", COUNTER_PATH_HOT2 = "\\EsifDeviceInformation(*)\\Temperature", @@ -484,7 +500,7 @@ static DWORD WINAPI CEventProc(LPVOID param) COUNTER_PATH_HDD = "\\PhysicalDisk(_Total)\\% Idle Time"; HQUERY hQuery = NULL; - HCOUNTER hCPUCounter, hHDDCounter, hNETCounter, hGPUCounter, hTempCounter, hTempCounter2, hPwrCounter; + HCOUNTER hCPUCounter, hHDDCounter, hNETCounter, hNETMAXCounter, hGPUCounter, hTempCounter, hTempCounter2, hPwrCounter; MEMORYSTATUSEX memStat{ sizeof(MEMORYSTATUSEX) }; @@ -502,6 +518,7 @@ static DWORD WINAPI CEventProc(LPVOID param) PdhAddCounter(hQuery, COUNTER_PATH_CPU, 0, &hCPUCounter); PdhAddCounter(hQuery, COUNTER_PATH_HDD, 0, &hHDDCounter); PdhAddCounter(hQuery, COUNTER_PATH_NET, 0, &hNETCounter); + PdhAddCounter(hQuery, COUNTER_PATH_NETMAX, 0, &hNETMAXCounter); PdhAddCounter(hQuery, COUNTER_PATH_GPU, 0, &hGPUCounter); PdhAddCounter(hQuery, COUNTER_PATH_HOT, 0, &hTempCounter); PdhAddCounter(hQuery, COUNTER_PATH_HOT2, 0, &hTempCounter2); @@ -524,13 +541,11 @@ static DWORD WINAPI CEventProc(LPVOID param) PdhGetFormattedCounterValue( hHDDCounter, PDH_FMT_LONG, &cType, &cHDDVal ); // Network load - long totalNet = 0; - for (int i = GetValuesArray(hNETCounter); i >= 0; i--) { - totalNet += counterValues[i].FmtValue.longValue; + for (int i = GetValuesArray(hNETCounter, hNETMAXCounter); i >= 0; i--) { + if (counterValuesMax[i].FmtValue.longValue) + cData.NET = (byte) max(cData.NET, counterValues[i].FmtValue.longValue * 800 / counterValuesMax[i].FmtValue.longValue); } - fxhl->maxData.NET = max(fxhl->maxData.NET, totalNet); - // GPU load for (int i = GetValuesArray(hGPUCounter); i >= 0 && counterValues[i].szName != NULL; i--) { cData.GPU = (byte)max(cData.GPU, counterValues[i].FmtValue.longValue); @@ -538,7 +553,7 @@ static DWORD WINAPI CEventProc(LPVOID param) // Temperatures for (int i = GetValuesArray(hTempCounter); i >= 0 ; i--) { - if (((int)cData.Temp) + 273 < counterValues[i].FmtValue.longValue) + if (((int)cData.Temp) < counterValues[i].FmtValue.longValue - 273) cData.Temp = (byte) (counterValues[i].FmtValue.longValue - 273); } @@ -557,24 +572,22 @@ static DWORD WINAPI CEventProc(LPVOID param) for (unsigned i = 0; i < mon->senValues.size(); i++) cData.Temp = max(cData.Temp, mon->senValues[i]); } - - // Added other set maximum temp... - for (int i = GetValuesArray(hTempCounter2); i >= 0; i--) { - cData.Temp = (byte)max(cData.Temp, counterValues[i].FmtValue.longValue); + else { + // ESIF temps (already in fans) + for (int i = GetValuesArray(hTempCounter2); i >= 0; i--) { + cData.Temp = (byte)max(cData.Temp, counterValues[i].FmtValue.longValue); + } } // Powers for (int i = GetValuesArray(hPwrCounter); i >= 0; i--) { if (counterValues[i].FmtValue.longValue) { - totalPwr = (short)counterValues[i].FmtValue.longValue; - //break; + totalPwr += (short)counterValues[i].FmtValue.longValue / 10; } } - //src->fxhl->maxData.PWR = max(src->fxhl->maxData.PWR,(totalPwr & 0xff) << 1 + 1); + if (totalPwr > fxhl->maxData.PWR) fxhl->maxData.PWR = totalPwr; - //while (totalPwr >= fxhl->maxData.PWR) - // fxhl->maxData.PWR <<= 1; } GlobalMemoryStatusEx(&memStat); @@ -598,8 +611,9 @@ static DWORD WINAPI CEventProc(LPVOID param) cData.Fan = min(100, cData.Fan); cData.CPU = (byte) cCPUVal.longValue; cData.RAM = (byte) memStat.dwMemoryLoad; - cData.NET = (byte) totalNet ? max(totalNet * 100 / fxhl->maxData.NET, 1) : 0; + //cData.NET = (byte) totalNet ? max(totalNet * 100 / fxhl->maxData.NET, 1) : 0; cData.PWR = (byte) totalPwr * 100 / fxhl->maxData.PWR; + fxhl->maxData.NET = max(fxhl->maxData.NET, cData.NET); fxhl->maxData.GPU = max(fxhl->maxData.GPU, cData.GPU); fxhl->maxData.Temp = max(fxhl->maxData.Temp, cData.Temp); fxhl->maxData.RAM = max(fxhl->maxData.RAM, cData.RAM); diff --git a/alienfx-gui/EventHandler.h b/alienfx-gui/EventHandler.h index d83a06ae..f8af1472 100644 --- a/alienfx-gui/EventHandler.h +++ b/alienfx-gui/EventHandler.h @@ -41,7 +41,6 @@ class EventHandler EventHandler(); ~EventHandler(); - //MonHelper *mon = NULL; CaptureHelper *capt = NULL; GridHelper *grid = NULL; WSAudioIn *audio = NULL; @@ -49,6 +48,4 @@ class EventHandler HANDLE stopEvents = NULL; mutex modifyProfile; - - //bool profileChanged = false; }; diff --git a/alienfx-gui/FXHelper.cpp b/alienfx-gui/FXHelper.cpp index 14ff7970..cd2b07bd 100644 --- a/alienfx-gui/FXHelper.cpp +++ b/alienfx-gui/FXHelper.cpp @@ -1,5 +1,6 @@ #include "alienfx-gui.h" #include "FXHelper.h" +#include "EventHandler.h" extern AlienFX_SDK::afx_act* Code2Act(AlienFX_SDK::Colorcode* c); extern bool IsLightInGroup(DWORD lgh, AlienFX_SDK::group* grp); @@ -12,6 +13,7 @@ extern bool IsLightInGroup(DWORD lgh, AlienFX_SDK::group* grp); #endif extern ConfigHandler* conf; +extern EventHandler* eve; DWORD WINAPI CLightsProc(LPVOID param); @@ -463,6 +465,9 @@ size_t FXHelper::FillAllDevs(AlienFan_SDK::Control* acc) { numActiveDevs++; if (i->dev->IsHaveGlobal()) conf->haveGlobal = true; + if (i->dev->GetVersion() == API_L_V6) + // reset device will make all white... + Refresh(); } if (numActiveDevs) Start(); @@ -509,9 +514,15 @@ void FXHelper::Refresh(int forced) for (auto it = (*conf->active_set).begin(); it < (*conf->active_set).end(); it++) { RefreshOne(&(*it), forced, false); } - if (!forced) RefreshMon(); QueryUpdate(-1, forced == 2); + + if (!forced && eve) + switch (conf->GetEffect()) { + case 1: RefreshMon(); break; + case 2: RefreshAmbient(eve->capt->imgz); break; + case 3: RefreshHaptics(eve->audio->freqs); break; + } } bool FXHelper::SetPowerMode(int mode) diff --git a/alienfx-gui/FXHelper.h b/alienfx-gui/FXHelper.h index b490151e..cc8baa6b 100644 --- a/alienfx-gui/FXHelper.h +++ b/alienfx-gui/FXHelper.h @@ -11,8 +11,8 @@ #define MODE_LOW 4 struct EventData { - byte CPU = 0, RAM = 0, HDD = 0, GPU = 0, Temp = 0, Batt = 0, KBD = 0; - long NET = 1; + byte CPU = 0, RAM = 0, HDD = 0, GPU = 0, Temp = 0, Batt = 0, KBD = 0, NET = 0; + //long NET = 1; short PWR = 100, Fan = 0; }; diff --git a/alienfx-gui/SettingsDialog.cpp b/alienfx-gui/SettingsDialog.cpp index 80eac3bc..6495bf9e 100644 --- a/alienfx-gui/SettingsDialog.cpp +++ b/alienfx-gui/SettingsDialog.cpp @@ -3,11 +3,11 @@ extern void ReloadProfileList(); -extern bool DoStopService(bool kind); -extern HWND CreateToolTip(HWND hwndParent, HWND oldTip); -extern void SetSlider(HWND tt, int value); -extern void EvaluteToAdmin(); -extern bool WindowsStartSet(bool kind, string name); +//extern bool DoStopService(bool kind); +//extern HWND CreateToolTip(HWND hwndParent, HWND oldTip); +//extern void SetSlider(HWND tt, int value); +//extern bool EvaluteToAdmin(); +//extern bool WindowsStartSet(bool kind, string name); extern bool DetectFans(); extern EventHandler* eve; diff --git a/alienfx-gui/TabDevGrid.cpp b/alienfx-gui/TabDevGrid.cpp index 26a5df52..82983db2 100644 --- a/alienfx-gui/TabDevGrid.cpp +++ b/alienfx-gui/TabDevGrid.cpp @@ -232,12 +232,6 @@ BOOL CALLBACK TabGrid(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { case WM_INITDIALOG: { cgDlg = hDlg; - /*if (!conf->afx_dev.GetGrids()->size()) { - conf->afx_dev.GetGrids()->push_back({ 0, 20, 8, "Main" }); - conf->afx_dev.GetGrids()->back().grid = new DWORD[20 * 8]{ 0 }; - } - if (!conf->mainGrid) - conf->mainGrid = &conf->afx_dev.GetGrids()->front();*/ tipH = CreateToolTip(GetDlgItem(hDlg, IDC_SLIDER_HSCALE), tipH); tipV = CreateToolTip(GetDlgItem(hDlg, IDC_SLIDER_VSCALE), tipV); @@ -259,19 +253,19 @@ BOOL CALLBACK TabGrid(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDC_BUT_CLEARGRID: - if (tabLightSel == TAB_DEVICES) + if (tabLightSel == TAB_DEVICES) { if (eLid >= 0) { for (int ind = 0; ind < conf->mainGrid->x * conf->mainGrid->y; ind++) if (conf->mainGrid->grid[ind] == MAKELPARAM(devID, eLid)) conf->mainGrid->grid[ind] = 0; - RedrawGridButtonZone(); } + } else - if (eItem >= 0) { - dragZone = { 0, 0, conf->mainGrid->x + 1, conf->mainGrid->y + 1 }; - ModifyColorDragZone(true); + if (eItem > 0) { + conf->afx_dev.GetGroupById(eItem)->lights.clear(); UpdateZoneList(); } + RedrawGridButtonZone(); break; } } break; @@ -284,7 +278,6 @@ BOOL CALLBACK TabGrid(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { conf->mainGrid->grid[ind(x, y)] = 0; dragZone = { -1,-1,-1,-1 }; InitGridButtonZone(); - //RedrawGridButtonZone(&oldDragZone); } } break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: { @@ -328,6 +321,7 @@ BOOL CALLBACK TabGrid(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { dragZone = { -1,-1,-1,-1 }; UpdateZoneList(); RedrawGridButtonZone(NULL, true); + fxhl->Refresh(); } } break; diff --git a/alienfx-gui/alienfx-gui.cpp b/alienfx-gui/alienfx-gui.cpp index 518ab7ed..3be4d846 100644 --- a/alienfx-gui/alienfx-gui.cpp +++ b/alienfx-gui/alienfx-gui.cpp @@ -61,20 +61,20 @@ const vector effModes{ "Off", "Monitoring", "Ambient", "Haptics", "Grid" bool DetectFans() { conf->fanControl = true; - if (!IsUserAnAdmin()) { - conf->Save(); - EvaluteToAdmin(); - } - acpi = new AlienFan_SDK::Control(); - if (acpi->Probe()) { - conf->fan_conf->SetBoostsAndNames(acpi); - eve->StartFanMon(); - } - else { - ShowNotification(&conf->niData, "Error", "Compatible hardware not found, disabling fan control!", false); - delete acpi; - acpi = NULL; - conf->fanControl = false; + conf->Save(); + + if (EvaluteToAdmin()) { + acpi = new AlienFan_SDK::Control(); + if (acpi->Probe()) { + conf->fan_conf->SetBoostsAndNames(acpi); + eve->StartFanMon(); + } + else { + ShowNotification(&conf->niData, "Error", "Compatible hardware not found, disabling fan control!", false); + delete acpi; + acpi = NULL; + conf->fanControl = false; + } } return conf->fanControl; } diff --git a/alienfx-gui/alienfx-gui.rc b/alienfx-gui/alienfx-gui.rc index a5307c3f750ab98e5cb7c33574facd811fcbf5b3..bbc9840d8caf78eae4906cf68a16b842f811e8dd 100644 GIT binary patch delta 77 zcmbQz%hJ`$vZ0TQ(P(l%mm#Ck=7U@hnSh-A{PL3<_{BEg;C;pj6y48XXv-SPP|T1z g+1__DqxodRQ=*d{f|Mo~_^?b~5XiDw$ggP!00i(FrvLx| delta 74 zcmeC`Wtq~;vZ0TQ(QtASL&{`R-^q*?lRs9QZ}RKf0RY138I=G4 diff --git a/alienfx-mon/SenMonHelper.cpp b/alienfx-mon/SenMonHelper.cpp index 86a76ba3..26058baf 100644 --- a/alienfx-mon/SenMonHelper.cpp +++ b/alienfx-mon/SenMonHelper.cpp @@ -76,6 +76,10 @@ void AddUpdateSensor(ConfigMon* conf, int grp, byte type, DWORD id, long val, st sen->cur = val; sen->min = sen->min == NO_SEN_VALUE ? val : min(sen->min, val); sen->max = max(sen->max, val); + if (sen->name.empty()) { + sen->name = name; + conf->needFullUpdate = true; + } } else { // add sensor @@ -173,38 +177,28 @@ DWORD WINAPI CEventProc(LPVOID param) valCount = GetValuesArray(hGPUCounter); // GPU, code 4 long valLast = 0; for (unsigned i = 0; i < valCount && counterValues[i].szName != NULL; i++) { - if ((/*counterValues[i].FmtValue.CStatus == PDH_CSTATUS_NEW_DATA ||*/ - counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA)) + if ((counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA)) valLast = max(valLast, counterValues[i].FmtValue.longValue); } AddUpdateSensor(conf, 0, 4, 0, valLast, "GPU load"); valCount = GetValuesArray(hTempCounter); // Temps, code 5 for (unsigned i = 0; i < valCount; i++) { - if (/*counterValues[i].FmtValue.CStatus == PDH_CSTATUS_NEW_DATA ||*/ - counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) + if (counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) AddUpdateSensor(conf, 0, 5, i, counterValues[i].FmtValue.longValue - 273, counterValues[i].szName); } } if (conf->eSensors) { // group 1 // ESIF temperatures and power - valCount = GetValuesArray(hTempCounter2); // Esif temps, code 0 - // Added other tempset ... - for (unsigned i = 0; i < valCount; i++) { - if ((/*counterValues[i].FmtValue.CStatus == PDH_CSTATUS_NEW_DATA ||*/ - counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) && counterValues[i].FmtValue.longValue) - AddUpdateSensor(conf, 1, 0, i, counterValues[i].FmtValue.longValue, (string)"Temp " + to_string(i)); - } valCount = GetValuesArray(hPwrCounter); // Esif powers, code 1 for (unsigned i = 0; i < valCount; i++) { - if (/*counterValues[i].FmtValue.CStatus == PDH_CSTATUS_NEW_DATA ||*/ - counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) - AddUpdateSensor(conf, 1, 1, i, counterValues[i].FmtValue.longValue/2, (string)"Power " + to_string(i)/*counterValues[i].szName*/); + if (counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) + AddUpdateSensor(conf, 1, 1, i, counterValues[i].FmtValue.longValue/10, (string)"Power " + to_string(i)); } } - if (conf->bSensors && acpi) { // group 2 + if (acpi) { // group 2 // Fan data and BIOS temperatures int val; for (int i = 0; i < acpi->sensors.size(); i++) { // BIOS temps, code 0 @@ -217,7 +211,15 @@ DWORD WINAPI CEventProc(LPVOID param) AddUpdateSensor(conf, 2, 2, i, acpi->GetFanPercent(i), (string)"Fan " + to_string(i+1) + " percent"); AddUpdateSensor(conf, 2, 3, i, acpi->GetFanBoost(i, true), (string)"Fan " + to_string(i + 1) + " boost"); } - } + } else + if (conf->eSensors) { + // Added other tempset ... + valCount = GetValuesArray(hTempCounter2); // Esif temps, code 0 + for (unsigned i = 0; i < valCount; i++) { + if ((counterValues[i].FmtValue.CStatus == PDH_CSTATUS_VALID_DATA) && counterValues[i].FmtValue.longValue) + AddUpdateSensor(conf, 1, 0, i, counterValues[i].FmtValue.longValue, (string)"Temp " + to_string(i)); + } + } } cleanup: diff --git a/alienfx-mon/alienfx-mon.cpp b/alienfx-mon/alienfx-mon.cpp index 24c138cc..a5bf953c 100644 --- a/alienfx-mon/alienfx-mon.cpp +++ b/alienfx-mon/alienfx-mon.cpp @@ -542,8 +542,10 @@ BOOL CALLBACK DialogMain(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) conf->active_sensors[selSensor].name = sItem->item.pszText; ListView_SetItemText(senList, sItem->item.iItem, 3, sItem->item.pszText); } + else { + conf->active_sensors[selSensor].name.clear(); + } runUIUpdate = true; - //return false; } break; } } break; diff --git a/alienfx-mon/alienfx-mon.rc b/alienfx-mon/alienfx-mon.rc index 754cfc9085a5d859e7c3eaca69d96e0aa2026076..e0f5d0938e6e788ffaebde1ed61ca950392f8029 100644 GIT binary patch delta 121 zcmZ2by{dYHkIZBlS(V8JGI@-~llf(A1sxf37%~}B8S)s)84?+a7*Z!+l#`w8Ae+N% z!C)SxTF0 PvVl1Vh~8{qUcd$b9FHIp delta 83 zcmZ2gy`Xx7j|{sjLokCUgWF_XS=q@2GI^6H$k|Qykx`lKC7Z)+&R{%wqMYgGcd}1} m84V|2HZ){3+{|k9oC(PJZzezafSK54CDS{MK+*qZtJwf>SR51p