Skip to content
Snippets Groups Projects
Commit b1fea554 authored by Arfouy's avatar Arfouy
Browse files

v2

parent 4563ef47
No related branches found
No related tags found
No related merge requests found
log.csv
\ No newline at end of file
# EHCI4Intel
## REQUIREMENTS
- PyQt5 `pip3 install PyQt5`
- [Intel® Power Gadget](https://www.intel.com/content/www/us/en/developer/articles/tool/power-gadget.html)
### Usage
**For now, each time the application is closed, these steps must be repeated**
- Set the install location of Intel® Power Gadget
- Create the log file
- Choose the application (.exe) to monitor
This will open the application automatically, when the application being monitored is closed, the logging will end.
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import os
import time
import win32com.client
import subprocess
import pyqtgraph as pg
class Window(QMainWindow):
POWER_GADGET_PATH = None
LOG_FILE = None
def __init__(self):
super().__init__()
self.setWindowTitle("EHCI")
self.setGeometry(50, 50, 400, 400)
self.show()
main_widget = QWidget()
main_layout = QGridLayout(main_widget)
self.setCentralWidget(main_widget)
self.energy_consumption_label = QLabel("", self)
main_layout.addWidget(self.energy_consumption_label, 9, 0, 1, 2) # Add the new QLabel to the layout
self.app_name_label = QLabel("", self)
main_layout.addWidget(self.app_name_label, 10, 0, 1, 2)
self.energy_consumption_graph = pg.PlotWidget(title="Energy Consumption")
main_layout.addWidget(self.energy_consumption_graph, 11, 0, 1, 2)
self.energy_data = []
power_gadget_path_button = QPushButton("Set PowerLog3.0 path", self)
power_gadget_path_button.clicked.connect(self.set_power_gadget_path)
main_layout.addWidget(power_gadget_path_button)
log_file_button = QPushButton("Chose log file", self)
log_file_button.clicked.connect(self.create_log)
main_layout.addWidget(log_file_button)
monitor_app_button = QPushButton("Monitor Application", self)
monitor_app_button.clicked.connect(self.monitor_app)
main_layout.addWidget(monitor_app_button)
self.battery_name_label = QLabel("", self)
main_layout.addWidget(self.battery_name_label)
self.estimated_charge_remaining_label = QLabel("", self)
main_layout.addWidget(self.estimated_charge_remaining_label)
self.design_capacity_label = QLabel("", self)
main_layout.addWidget(self.design_capacity_label)
self.full_charge_capacity_label = QLabel("", self)
main_layout.addWidget(self.full_charge_capacity_label)
self.device_id_label = QLabel("", self)
main_layout.addWidget(self.device_id_label)
self.power_label = QLabel("", self)
main_layout.addWidget(self.power_label)
exit_button = QPushButton("Exit", self)
exit_button.clicked.connect(self.exit_app)
main_layout.addWidget(exit_button)
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_data)
self.timer.start(1000) # Update every second (1000 ms)
def update_data(self):
self.get_battery_data()
if self.POWER_GADGET_PATH:
power_data = self.get_power_data(self.POWER_GADGET_PATH, 1)
if 'Processor Power_0(Watt)' in power_data:
power = float(power_data['Processor Power_0(Watt)'])
self.power_label.setText(f"Processor Power: {power:.2f} W")
energy_consumption = power * 1 / 3600
self.energy_consumption_label.setText(f"Energy Consumption: {energy_consumption:.5f} Wh")
self.energy_data.append(energy_consumption)
self.energy_consumption_graph.plot(self.energy_data, clear=True, pen="b")
def get_battery_data(self):
wmi = win32com.client.GetObject("winmgmts:")
battery_data = wmi.ExecQuery("Select * from Win32_Battery")
for battery in battery_data:
self.battery_name_label.setText(f"Battery Name: {battery.Name}")
self.estimated_charge_remaining_label.setText(f"Estimated Charge Remaining: {battery.EstimatedChargeRemaining}%")
self.design_capacity_label.setText(f"Design Capacity: {battery.DesignCapacity} mWh")
self.full_charge_capacity_label.setText(f"Full Charge Capacity: {battery.FullChargeCapacity} mWh")
def get_power_data(self, power_gadget_path, duration):
power_log_path = os.path.join(power_gadget_path, "PowerLog3.0.exe")
log_file = "power_log.csv"
command = f'"{power_log_path}" -duration {duration} -file "{log_file}"'
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(duration + 1) # Wait for the logging process to finish
process.terminate()
with open(log_file, "r") as f:
lines = f.readlines()
headers = lines[0].strip().split(',')
values = lines[1].strip().split(',')
power_data = {}
for i in range(len(headers)):
power_data[headers[i]] = values[i]
os.remove(log_file)
return power_data
def set_power_gadget_path(self):
folder_path = QFileDialog.getExistingDirectory(self, "Select directory")
if folder_path:
self.POWER_GADGET_PATH = folder_path
print(f"PowerLog3.0 path set to {self.POWER_GADGET_PATH}")
def create_log(self):
file_name, _ = QFileDialog.getSaveFileName(self, "Save file", "log.csv", "csv files (*.csv);;All Files (*)")
if file_name:
if (os.path.exists(file_name)):
os.remove(file_name)
f = open(file_name, "x")
f.close()
self.LOG_FILE = file_name
def monitor_app(self):
app_path, _ = QFileDialog.getOpenFileName(self, "Choose exe", "", "exe files (*.exe)")
if app_path:
print(f"Monitoring {app_path}")
os.system(f'powerlog.bat "{self.POWER_GADGET_PATH}" "{self.LOG_FILE}" "{app_path}"')
def run_monitoring(self, power_gadget_path, log_file, app_path):
powerlog_exe = os.path.join(power_gadget_path, "PowerLog3.0.exe")
command = f'"{powerlog_exe}" -duration 10 -file "{log_file}"'
batch_file_content = f"""
@echo off
start /b "" cmd /c "{command} >> {log_file}"
start /wait "" "{app_path}"
"""
batch_file_path = os.path.join(os.path.dirname(log_file), "monitoring.bat")
with open(batch_file_path, "w") as f:
f.write(batch_file_content)
try:
os.startfile(batch_file_path, "runas")
except Exception as e:
QMessageBox.critical(self, "Error", f"An error occurred while running the monitoring process: {e}")
finally:
os.remove(batch_file_path)
def exit_app(self):
sys.exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec())
\ No newline at end of file
CD %1
START .\PowerLog3.0.exe -file %2 -cmd %3
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment