56 | {show && (
57 |
58 | {
64 | Settings.setEnableCustomTDPRange(val);
65 | }}
66 | />
67 |
68 | )}
69 | {show && enableCustomTDPRange && (
70 |
71 | {
80 | if (value > Settings.appCustomTDPRangeMin()) {
81 | Settings.setCustomTDPRangeMax(value);
82 | }
83 | }}
84 | />
85 |
86 | )}
87 | {/* {show && enableCustomTDPRange &&
88 |
89 | {
98 | if (value < Settings.appCustomTDPRangeMax()) {
99 | Settings.setCustomTDPRangeMin(value);
100 | }
101 | }}
102 | />
103 | } */}
104 |
105 | );
106 | };
107 |
--------------------------------------------------------------------------------
/py_modules/fan_config/hwmon/asus.yml:
--------------------------------------------------------------------------------
1 | # 略微修改的曲线 提高了高温点的转速
2 | hwmon_name: asus_custom_fan_curve
3 |
4 | fans:
5 | - fan_name: Fan1
6 | pwm_mode: 2
7 |
8 | pwm_enable:
9 | manual_value: 1
10 | auto_value: 2 # 设置自动模式会使用内置的曲线,会受到platform_profile影响,如果要在设置为自动的时候使用下面的曲线,需要设置为1
11 | pwm_enable_path: pwm1_enable
12 |
13 | pwm_write:
14 | pwm_write_max:
15 | default: 255
16 | ROG Ally RC71L_RC71L: 255
17 | curve_path: # 曲线写入路径
18 | temp_write:
19 | - pwm1_auto_point1_temp
20 | - pwm1_auto_point2_temp
21 | - pwm1_auto_point3_temp
22 | - pwm1_auto_point4_temp
23 | - pwm1_auto_point5_temp
24 | - pwm1_auto_point6_temp
25 | - pwm1_auto_point7_temp
26 | - pwm1_auto_point8_temp
27 | pwm_write:
28 | - pwm1_auto_point1_pwm
29 | - pwm1_auto_point2_pwm
30 | - pwm1_auto_point3_pwm
31 | - pwm1_auto_point4_pwm
32 | - pwm1_auto_point5_pwm
33 | - pwm1_auto_point6_pwm
34 | - pwm1_auto_point7_pwm
35 | - pwm1_auto_point8_pwm
36 | default_curve:
37 | temp:
38 | - 34
39 | - 40
40 | - 50
41 | - 60
42 | - 70
43 | - 80
44 | - 90
45 | - 100
46 | speed:
47 | - 1
48 | - 4
49 | - 8
50 | - 48
51 | - 74
52 | - 90
53 | - 95
54 | - 100
55 | pwm:
56 | - 3
57 | - 10
58 | - 20
59 | - 122
60 | - 189
61 | - 255
62 | - 255
63 | - 255
64 |
65 | pwm_input:
66 | hwmon_label: asus
67 | pwm_read_path: fan1_input
68 | pwm_read_max: 8200
69 |
70 | temp_mode: 0
71 |
72 | - fan_name: Fan2
73 | pwm_mode: 2
74 |
75 | pwm_enable:
76 | manual_value: 1
77 | auto_value: 2
78 | pwm_enable_path: pwm2_enable
79 |
80 | pwm_write:
81 | pwm_write_max:
82 | default: 255
83 | ROG Ally RC71L_RC71L: 255
84 | curve_path: # 曲线写入路径
85 | temp_write:
86 | - pwm2_auto_point1_temp
87 | - pwm2_auto_point2_temp
88 | - pwm2_auto_point3_temp
89 | - pwm2_auto_point4_temp
90 | - pwm2_auto_point5_temp
91 | - pwm2_auto_point6_temp
92 | - pwm2_auto_point7_temp
93 | - pwm2_auto_point8_temp
94 | pwm_write:
95 | - pwm2_auto_point1_pwm
96 | - pwm2_auto_point2_pwm
97 | - pwm2_auto_point3_pwm
98 | - pwm2_auto_point4_pwm
99 | - pwm2_auto_point5_pwm
100 | - pwm2_auto_point6_pwm
101 | - pwm2_auto_point7_pwm
102 | - pwm2_auto_point8_pwm
103 | default_curve:
104 | temp:
105 | - 39
106 | - 40
107 | - 50
108 | - 60
109 | - 70
110 | - 80
111 | - 90
112 | - 100
113 | speed:
114 | - 1
115 | - 1
116 | - 1
117 | - 45
118 | - 55
119 | - 65
120 | - 74
121 | - 90
122 | pwm:
123 | - 3
124 | - 3
125 | - 3
126 | - 115
127 | - 140
128 | - 165
129 | - 190
130 | - 229
131 |
132 | pwm_input:
133 | hwmon_label: asus
134 | pwm_read_path: fan2_input
135 | pwm_read_max: 8200
136 |
137 | temp_mode: 0
138 |
--------------------------------------------------------------------------------
/src/i18n/schinese.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"设置",
3 | "ENABLE_SETTINGS":"启用插件设置",
4 | "USE_PERGAME_PROFILE":"使用按游戏设置的配置文件",
5 | "USING":"正在使用",
6 | "DEFAULT":"默认",
7 | "PROFILE":"配置文件",
8 | "CPU_BOOST":"睿 频",
9 | "CPU_BOOST_DESC":"提升最大cpu频率",
10 | "HT_DESC":"启用超线程",
11 | "SMT_DESC":"启用同步多线程",
12 | "CPU_NUM":"核 心 数",
13 | "CPU_NUM_DESC":"设置启用的物理核心数量",
14 | "CPU_MAX_PERF":"最大性能百分比",
15 | "CPU_MAX_PERF_AUTO":"自动最大性能百分比",
16 | "CPU_GOVERNOR": "CPU 调度器",
17 | "CPU_GOVERNOR_DESC": "选择 CPU 频率调度器",
18 | "CPU_EPP": "能耗性能偏好",
19 | "CPU_EPP_DESC": "在节能和性能之间进行平衡",
20 | "CPU_SCHED_EXT": "SCX 调度器",
21 | "CPU_SCHED_EXT_DESC": "选择 CPU 的 sched_ext 调度器",
22 | "TDP":"热设计功耗 (TDP) 限制",
23 | "TDP_DESC":"限制处理器功耗以降低总功耗",
24 | "RYZENADJ_NOT_FOUND":"未检测到ryzenAdj",
25 | "WATTS":"瓦特",
26 | "GPU_FREQMODE":"GPU 频率模式",
27 | "UNLIMITED":"不限制",
28 | "FIXED_FREQ":"固定频率",
29 | "RANGE_FREQ":"范围频率",
30 | "AUTO_FREQ":"自适应",
31 | "GPU_FIX_FREQ":"GPU 频率",
32 | "GPU_MIN_FREQ":"GPU 最小频率限制",
33 | "GPU_MAX_FREQ":"GPU 最大频率限制",
34 | "FAN_SPEED":"风扇转速",
35 | "CREATE_FAN_PROFILE":"创建风扇配置文件",
36 | "GRID_ALIG":"网格对齐",
37 | "FAN_MODE":"风扇模式",
38 | "NOT_CONTROLLED":"系统",
39 | "FIXED":"固定",
40 | "CURVE":"曲线",
41 | "SNAP_GRIDLINE":"对齐到网格线交点",
42 | "FAN_SPEED_PERCENT":"风扇转速百分比",
43 | "SENSOR_TEMP":"传感器温度",
44 | "CREATE_FAN_PROFILE_TIP":"创建一个风扇配置文件",
45 | "SELECT_FAN_PROFILE_TIP":"选择一个风扇配置文件",
46 | "FAN_PROFILE_NAME":"配置文件名称",
47 | "USE":"使用",
48 | "DELETE":"删除",
49 | "CREATE":"创建",
50 | "CANCEL":"取消",
51 | "CURENT_STAT":"当前状态",
52 | "EDIT":"编辑",
53 | "SAVE":"保存",
54 | "NATIVE_FREQ":"原生设置",
55 | "MORE":"更多",
56 | "REINSTALL_PLUGIN": "重新安装插件",
57 | "UPDATE_PLUGIN": "更新到",
58 | "ROLLBACK_PLUGIN": "回滚到",
59 | "INSTALLED_VERSION": "当前版本",
60 | "LATEST_VERSION": "最新版本",
61 | "GPU_NATIVE_SLIDER": "原生控制条",
62 | "GPU_NATIVE_SLIDER_DESC": "修复并启用原生控制条",
63 | "USE_PERACMODE_PROFILE": "使用按充电状态设置的配置文件",
64 | "AC_MODE": "充电模式",
65 | "BAT_MODE": "电池模式",
66 | "CUSTOM_TDP_RANGE": "自定义 TDP 滑块范围(超出 BIOS 上限的值无效)",
67 | "RESET_ALL": "重置所有设置",
68 | "NATIVE_FREQ_DESC": "使用系统快捷菜单频率设置",
69 | "UNLIMITED_DESC": "不限制 GPU 频率, 系统默认调度",
70 | "FIXED_FREQ_DESC": "固定 GPU 频率",
71 | "RANGE_FREQ_DESC": "设置 GPU 频率范围",
72 | "AUTO_FREQ_DESC": "自适应 GPU 频率, 强制关闭 TDP 限制, 关闭 Boost",
73 | "AUTO_FREQ_TDP_NOTIF": "GPU 模式为{{mode}}, 关闭 TDP 限制",
74 | "NATIVE_TDP_SLIDER": "原生 TDP 滑块",
75 | "NATIVE_TDP_SLIDER_DESC": "启用原生 TDP 滑块, 启用和关闭需要重启系统生效。修改 TDP 范围最大值需要重启 Steam 生效。开启后 TDP 配置由 Steam 保存, 插件设置中的电源状态配置将不会处理 TDP 配置",
76 | "FORCE_SHOW_TDP": "强制显示 TDP 控制",
77 | "FORCE_SHOW_TDP_DESC": "默认情况下插件会对原生 TDP 滑动条进行处理, 如果原生滑动条异常, 打开此项使用插件内 TDP 控制",
78 | "MANUAL_BYPASS_CHARGE": "手动旁路供电",
79 | "MANUAL_BYPASS_CHARGE_DESC": "手动控制旁路供电开关",
80 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "开启后将暂时禁用充电限制功能",
81 | "CHARGE_LIMIT": "充电限制",
82 | "CHARGE_LIMIT_DESC": "设置电池充电限制,延长电池寿命",
83 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "手动旁路供电已开启,充电限制暂时无效",
84 | "USE_OLD_UI": "使用旧版 UI",
85 | "USE_OLD_UI_DESC": "使用旧的列表视图而不是新的标签视图",
86 | "CPU_FREQ_CONTROL": "CPU频率控制",
87 | "CPU_FREQ_CONTROL_DESC": "限制CPU最大频率以降低功耗和发热。架构:{{architecture}}",
88 | "CORE_FREQUENCY": "核心频率",
89 | "CPU_FREQUENCY": "CPU频率",
90 | "ALL_CORES": "所有核心",
91 | "CHECK_VERSION": "检查版本",
92 | "CHECKING_VERSION": "检查中...",
93 | "LAST_CHECK_TIME": "最后检查",
94 | "JUST_NOW": "刚刚",
95 | "MINUTES_AGO": "{{minutes}}分钟前",
96 | "HOURS_AGO": "{{hours}}小时前",
97 | "DAYS_AGO": "{{days}}天前",
98 | "CLICK_TO_CHECK": "点击检查最新版本"
99 | }
--------------------------------------------------------------------------------
/src/i18n/koreana.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"설정",
3 | "ENABLE_SETTINGS":"설정 활성화",
4 | "USE_PERGAME_PROFILE":"게임별 프로필 사용",
5 | "USING":"사용 중",
6 | "DEFAULT":"기본값",
7 | "PROFILE":"프로필",
8 | "CPU_BOOST":"CPU 부스트",
9 | "CPU_BOOST_DESC":"최대 CPU 주파수 증가",
10 | "HT_DESC":"인텔 하이퍼스레딩 활성화",
11 | "SMT_DESC":"동시 다중 스레딩 활성화",
12 | "CPU_NUM":"CPU 코어 수",
13 | "CPU_NUM_DESC":"활성화할 물리적 코어 설정",
14 | "CPU_MAX_PERF":"CPU 최대 성능",
15 | "CPU_MAX_PERF_AUTO":"자동 CPU 최대 성능",
16 | "CPU_GOVERNOR": "CPU 거버너",
17 | "CPU_GOVERNOR_DESC": "CPU 성능 스케줄링 정책 설정",
18 | "TDP":"열 설계 전력 (TDP) 제한",
19 | "TDP_DESC":"전체 전력 소비를 줄이기 위해 프로세서 전력 제한",
20 | "RYZENADJ_NOT_FOUND":"RyzenAdj를 찾을 수 없음",
21 | "WATTS":"와트",
22 | "GPU_FREQMODE":"GPU 클럭 주파수 모드",
23 | "UNLIMITED":"제한 없음",
24 | "FIXED_FREQ":"고정",
25 | "RANGE_FREQ":"범위",
26 | "AUTO_FREQ":"자동",
27 | "GPU_FIX_FREQ":"GPU 클럭 주파수",
28 | "GPU_MIN_FREQ":"최소 주파수 제한",
29 | "GPU_MAX_FREQ":"최대 주파수 제한",
30 | "FAN_SPEED":"팬 속도",
31 | "CREATE_FAN_PROFILE":"팬 프로필 생성",
32 | "GRID_ALIG":"그리드 정렬",
33 | "FAN_MODE":"팬 모드",
34 | "NOT_CONTROLLED":"제어 안 함",
35 | "FIXED":"고정",
36 | "CURVE":"곡선",
37 | "SNAP_GRIDLINE":"그리드 선 교차점에 스냅",
38 | "FAN_SPEED_PERCENT":"팬 속도 백분율",
39 | "SENSOR_TEMP":"센서 온도",
40 | "CREATE_FAN_PROFILE_TIP":"팬 프로필 생성",
41 | "SELECT_FAN_PROFILE_TIP":"팬 프로필 선택",
42 | "FAN_PROFILE_NAME":"프로필 이름",
43 | "USE":"사용",
44 | "DELETE":"삭제",
45 | "CREATE":"생성",
46 | "CANCEL":"취소",
47 | "CURENT_STAT":"현재 상태",
48 | "EDIT":"편집",
49 | "SAVE":"저장",
50 | "NATIVE_FREQ":"기본",
51 | "MORE":"더 보기",
52 | "REINSTALL_PLUGIN": "플러그인 재설치",
53 | "UPDATE_PLUGIN": "업데이트:",
54 | "ROLLBACK_PLUGIN": "롤백:",
55 | "INSTALLED_VERSION": "설치된 버전",
56 | "LATEST_VERSION": "최신 버전",
57 | "GPU_NATIVE_SLIDER": "기본 GPU 슬라이더",
58 | "GPU_NATIVE_SLIDER_DESC": "기본 GPU 제어 슬라이더 활성화",
59 | "USE_PERACMODE_PROFILE": "전원 모드별 프로필 사용",
60 | "AC_MODE": "AC 모드",
61 | "BAT_MODE": "배터리 모드",
62 | "CUSTOM_TDP_RANGE": "사용자 정의 TDP 슬라이더 범위",
63 | "RESET_ALL": "모두 초기화",
64 | "NATIVE_FREQ_DESC": "시스템 단축 메뉴로 주파수 설정",
65 | "UNLIMITED_DESC": "GPU 주파수 제한 없음, 시스템 기본 스케줄링",
66 | "FIXED_FREQ_DESC": "GPU 주파수 고정",
67 | "RANGE_FREQ_DESC": "GPU 주파수 범위 설정",
68 | "AUTO_FREQ_DESC": "GPU 주파수 자동 조정, TDP 제한 강제 비활성화, 부스트 비활성화",
69 | "AUTO_FREQ_TDP_NOTIF": "GPU 모드 {{mode}}, TDP 제한 비활성화",
70 | "NATIVE_TDP_SLIDER": "기본 TDP 슬라이더",
71 | "NATIVE_TDP_SLIDER_DESC": "기본 TDP 슬라이더 활성화, 활성화/비활성화에는 시스템 재시작이 필요합니다. TDP 범위 최대값 수정에는 Steam 재시작이 필요합니다. 활성화 후 TDP 설정은 Steam에서 저장되며, 플러그인 설정의 전원 상태 설정에서는 TDP 설정을 처리하지 않습니다",
72 | "FORCE_SHOW_TDP": "TDP 제어 강제 표시",
73 | "FORCE_SHOW_TDP_DESC": "기본적으로 플러그인은 기본 TDP 슬라이더를 처리합니다. 기본 슬라이더에 문제가 있는 경우 이 옵션을 활성화하여 플러그인 내부 TDP 제어 사용",
74 | "MANUAL_BYPASS_CHARGE": "우회 충전 수동 제어",
75 | "MANUAL_BYPASS_CHARGE_DESC": "우회 충전을 수동으로 제어합니다",
76 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "활성화하면 충전 제한이 일시적으로 비활성화됩니다",
77 | "CHARGE_LIMIT": "충전 제한",
78 | "CHARGE_LIMIT_DESC": "배터리 수명을 연장하기 위한 충전 제한 설정",
79 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "우회 충전이 활성화되어 충전 제한이 일시적으로 비활성화됨",
80 | "USE_OLD_UI": "이전 UI 사용",
81 | "USE_OLD_UI_DESC": "새로운 탭 보기 대신 이전 목록 보기 사용",
82 | "CPU_FREQ_CONTROL": "CPU 주파수 제어",
83 | "CPU_FREQ_CONTROL_DESC": "전력 소비와 발열을 줄이기 위해 CPU 최대 주파수를 제한합니다。아키텍처: {{architecture}}",
84 | "CORE_FREQUENCY": "코어 주파수",
85 | "CPU_FREQUENCY": "CPU 주파수",
86 | "ALL_CORES": "모든 코어",
87 | "CHECK_VERSION": "버전 확인",
88 | "CHECKING_VERSION": "확인 중...",
89 | "LAST_CHECK_TIME": "마지막 확인",
90 | "JUST_NOW": "방금 전",
91 | "MINUTES_AGO": "{{minutes}}분 전",
92 | "HOURS_AGO": "{{hours}}시간 전",
93 | "DAYS_AGO": "{{days}}일 전",
94 | "CLICK_TO_CHECK": "클릭하여 최신 버전 확인"
95 | }
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | permissions:
4 | contents: write
5 |
6 | on:
7 | workflow_dispatch:
8 | push:
9 | branches:
10 | - "main"
11 | tags:
12 | - "v*.*.*"
13 |
14 | jobs:
15 | build_plugin:
16 | runs-on: ubuntu-latest
17 | container:
18 | image: archlinux:latest
19 | steps:
20 | - name: set git global safe directory
21 | run: |
22 | pacman -Syu git npm tree zip unzip upx --noconfirm
23 | git config --global --add safe.directory $(realpath .)
24 |
25 | - uses: actions/checkout@v4
26 | with:
27 | submodules: true
28 |
29 | # - name: update submodules
30 | # run: git submodule update --init --recursive
31 |
32 | - name: build RyzenAdj
33 | run: |
34 | pacman -S base-devel pciutils cmake --noconfirm --needed --overwrite='*'
35 | cd submodule/RyzenAdj
36 | mkdir build && cd build
37 | cmake -DCMAKE_BUILD_TYPE=Release ..
38 | make
39 | upx -9 ryzenadj
40 | cp -f ryzenadj ../../../bin
41 |
42 | # - name: build python-fuse
43 | # run: |
44 | # PWD=$(pwd)
45 | # echo "PWD: $PWD"
46 | # mkdir -p py_modules/site-packages
47 | # pacman -S python-fuse python-setuptools python-wheel python-installer rsync --noconfirm --needed --overwrite='*'
48 | # cd ${PWD}/submodule/python-fuse && \
49 | # PYTHONPATH=${PWD}/py_modules/site-packages \
50 | # python3 setup.py install --prefix=${PWD} --install-lib=install
51 | # cd -
52 | # rsync -av --progress --exclude=*.pyc --exclude=__pycache__ ./submodule/python-fuse/install/fuse*/fuse* ./py_modules/site-packages/
53 |
54 | - name: change log level
55 | run: |
56 | sed -i 's/logging.DEBUG/logging.INFO/' py_modules/config.py
57 |
58 | - name: build plugin
59 | run: |
60 | npm i -g pnpm
61 | pnpm install --no-frozen-lockfile
62 | pnpm update
63 | pnpm run build
64 | rm -f dist/*.js.map
65 | tar -czvf PowerControl.tar.gz --transform 's,^,PowerControl/,' dist backend py_modules bin *.py *.json *.md *.js LICENSE
66 | # zip
67 | mkdir -p PowerControl
68 | cp -r dist backend py_modules bin *.py *.json *.md *.js LICENSE PowerControl
69 | zip -r PowerControl.zip PowerControl
70 | rm -rf PowerControl
71 |
72 | - name: show files
73 | run: |
74 | tar -tzvf PowerControl.tar.gz
75 | unzip -l PowerControl.zip
76 | - name: Publish Artifacts
77 | uses: actions/upload-artifact@v4
78 | with:
79 | name: PowerControl
80 | path: |
81 | PowerControl.tar.gz
82 | PowerControl.zip
83 |
84 | publish:
85 | if: startsWith(github.ref, 'refs/tags/v')
86 | runs-on: ubuntu-latest
87 | needs: build_plugin
88 | steps:
89 | - run: mkdir /tmp/artifacts
90 |
91 | - name: download artifact
92 | uses: actions/download-artifact@v4
93 | with:
94 | path: /tmp/artifacts
95 |
96 | - run: ls -R /tmp/artifacts
97 |
98 | - name: publish to github release
99 | uses: softprops/action-gh-release@v2
100 | with:
101 | files: |
102 | /tmp/artifacts/PowerControl/PowerControl.tar.gz
103 | /tmp/artifacts/PowerControl/PowerControl.zip
104 | tag_name: ${{ github.ref_name }}
105 | draft: false
106 | generate_release_notes: true
107 | prerelease: contains(github.ref, 'pre')
108 | env:
109 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
110 |
--------------------------------------------------------------------------------
/src/i18n/japanese.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"設定",
3 | "ENABLE_SETTINGS":"設定を有効にする",
4 | "USE_PERGAME_PROFILE":"ゲームごとのプロファイルを使用",
5 | "USING":"使用中",
6 | "DEFAULT":"デフォルト",
7 | "PROFILE":"プロファイル",
8 | "CPU_BOOST":"CPU ブースト",
9 | "CPU_BOOST_DESC":"CPU の最大周波数を上げる",
10 | "HT_DESC":"Intel ハイパースレッディングを有効にする",
11 | "SMT_DESC":"同時マルチスレッディングを有効にする",
12 | "CPU_NUM":"CPU コア数",
13 | "CPU_NUM_DESC":"有効な物理コアを設定",
14 | "CPU_MAX_PERF":"CPU 最大パフォーマンス",
15 | "CPU_MAX_PERF_AUTO":"自動 CPU 最大パフォーマンス",
16 | "CPU_GOVERNOR": "CPU ガバナー",
17 | "CPU_GOVERNOR_DESC": "CPU パフォーマンススケジューリングポリシーを設定",
18 | "TDP":"熱設計電力 (TDP) 制限",
19 | "TDP_DESC":"総消費電力を抑えるためにプロセッサの電力を制限",
20 | "RYZENADJ_NOT_FOUND":"RyzenAdj が見つかりません",
21 | "WATTS":"ワット",
22 | "GPU_FREQMODE":"GPU クロック周波数モード",
23 | "UNLIMITED":"制限なし",
24 | "FIXED_FREQ":"固定",
25 | "RANGE_FREQ":"範囲",
26 | "AUTO_FREQ":"自動",
27 | "GPU_FIX_FREQ":"GPU クロック周波数",
28 | "GPU_MIN_FREQ":"最小周波数制限",
29 | "GPU_MAX_FREQ":"最大周波数制限",
30 | "FAN_SPEED":"ファン速度",
31 | "CREATE_FAN_PROFILE":"ファンプロファイルを作成",
32 | "GRID_ALIG":"グリッド配置",
33 | "FAN_MODE":"ファンモード",
34 | "NOT_CONTROLLED":"制御なし",
35 | "FIXED":"固定",
36 | "CURVE":"カーブ",
37 | "SNAP_GRIDLINE":"グリッド線の交点にスナップ",
38 | "FAN_SPEED_PERCENT":"ファン速度パーセント",
39 | "SENSOR_TEMP":"センサー温度",
40 | "CREATE_FAN_PROFILE_TIP":"ファンプロファイルを作成",
41 | "SELECT_FAN_PROFILE_TIP":"ファンプロファイルを選択",
42 | "FAN_PROFILE_NAME":"プロファイル名",
43 | "USE":"使用",
44 | "DELETE":"削除",
45 | "CREATE":"作成",
46 | "CANCEL":"キャンセル",
47 | "CURENT_STAT":"現在の状態",
48 | "EDIT":"編集",
49 | "SAVE":"保存",
50 | "NATIVE_FREQ":"ネイティブ",
51 | "MORE":"その他",
52 | "REINSTALL_PLUGIN": "プラグインを再インストール",
53 | "UPDATE_PLUGIN": "更新:",
54 | "ROLLBACK_PLUGIN": "ロールバック:",
55 | "INSTALLED_VERSION": "インストール済みバージョン",
56 | "LATEST_VERSION": "最新バージョン",
57 | "GPU_NATIVE_SLIDER": "ネイティブ GPU スライダー",
58 | "GPU_NATIVE_SLIDER_DESC": "ネイティブ GPU 制御スライダーを有効にする",
59 | "USE_PERACMODE_PROFILE": "電源モードごとのプロファイルを使用",
60 | "AC_MODE": "AC モード",
61 | "BAT_MODE": "バッテリーモード",
62 | "CUSTOM_TDP_RANGE": "カスタム TDP スライダー範囲",
63 | "RESET_ALL": "すべてリセット",
64 | "NATIVE_FREQ_DESC": "システムショートカットメニューで周波数を設定",
65 | "UNLIMITED_DESC": "GPU 周波数制限なし、システムデフォルトのスケジューリング",
66 | "FIXED_FREQ_DESC": "GPU 周波数を固定",
67 | "RANGE_FREQ_DESC": "GPU 周波数範囲を設定",
68 | "AUTO_FREQ_DESC": "GPU 周波数を自動調整、TDP 制限を強制的に無効化、ブーストを無効化",
69 | "AUTO_FREQ_TDP_NOTIF": "GPU モード {{mode}}、TDP 制限無効",
70 | "NATIVE_TDP_SLIDER": "ネイティブ TDP スライダー",
71 | "NATIVE_TDP_SLIDER_DESC": "ネイティブTDPスライダーを有効化、有効/無効の切り替えにはシステムの再起動が必要です。TDP範囲の最大値を変更するにはSteamの再起動が必要です。有効化後、TDP設定はSteamによって保存され、プラグイン設定の電源状態設定ではTDP設定を処理しません",
72 | "FORCE_SHOW_TDP": "TDP 制御を強制表示",
73 | "FORCE_SHOW_TDP_DESC": "デフォルトでは、プラグインはネイティブ TDP スライダーを処理します。ネイティブスライダーに問題がある場合、このオプションを有効にしてプラグイン内部の TDP 制御を使用してください",
74 | "MANUAL_BYPASS_CHARGE": "手動バイパス充電",
75 | "MANUAL_BYPASS_CHARGE_DESC": "バイパス充電を手動で制御",
76 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "有効にすると充電制限が一時的に無効になります",
77 | "CHARGE_LIMIT": "充電制限",
78 | "CHARGE_LIMIT_DESC": "バッテリー寿命を延ばすために充電制限を設定",
79 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "手動バイパス充電が有効、充電制限は一時的に無効",
80 | "USE_OLD_UI": "旧UIを使用",
81 | "USE_OLD_UI_DESC": "新しいタブビューの代わりに旧リストビューを使用する",
82 | "CPU_FREQ_CONTROL": "CPU周波数制御",
83 | "CPU_FREQ_CONTROL_DESC": "CPU最大周波数を制限して消費電力と発熱を抑制。アーキテクチャ:{{architecture}}",
84 | "CORE_FREQUENCY": "コア周波数",
85 | "CPU_FREQUENCY": "CPU周波数",
86 | "ALL_CORES": "全コア",
87 | "CHECK_VERSION": "バージョン確認",
88 | "CHECKING_VERSION": "確認中...",
89 | "LAST_CHECK_TIME": "最終確認",
90 | "JUST_NOW": "たった今",
91 | "MINUTES_AGO": "{{minutes}}分前",
92 | "HOURS_AGO": "{{hours}}時間前",
93 | "DAYS_AGO": "{{days}}日前",
94 | "CLICK_TO_CHECK": "クリックして最新版を確認"
95 | }
--------------------------------------------------------------------------------
/py_modules/cpu.py:
--------------------------------------------------------------------------------
1 | import os
2 | import subprocess
3 |
4 | from config import CPU_VENDOR, SH_PATH, logger
5 | from utils import get_env, get_ryzenadj_path
6 |
7 | class CPUManager:
8 |
9 | def __init__(self) -> None:
10 | self.__init_cpu_info()
11 |
12 | def __init_cpu_info(self) -> None:
13 | self._init_hardware_detection()
14 |
15 | def _init_hardware_detection(self):
16 | logger.info('init_hardware_detection')
17 |
18 | def get_hasRyzenadj(self) -> bool:
19 | """检查系统是否安装了ryzenadj工具。
20 |
21 | Returns:
22 | bool: True如果ryzenadj可用,否则False
23 | """
24 | try:
25 | # 查看ryzenadj路径是否有该文件
26 | if os.path.exists(RYZENADJ_PATH) or os.path.exists("/usr/bin/ryzenadj"):
27 | logger.info("get_hasRyzenadj {}".format(True))
28 | return True
29 | else:
30 | logger.info("get_hasRyzenadj {}".format(False))
31 | return False
32 | except Exception:
33 | logger.error("Failed to check ryzenadj tool", exc_info=True)
34 | return False
35 |
36 | def is_intel(self):
37 | return CPU_VENDOR == "GenuineIntel"
38 |
39 | def is_amd(self):
40 | return CPU_VENDOR == "AuthenticAMD"
41 |
42 | def _read_sysfs_int(self, path: str) -> int:
43 | """读取sysfs整数值,失败时返回-1"""
44 | try:
45 | if os.path.exists(path):
46 | with open(path, "r") as f:
47 | return int(f.read().strip())
48 | except:
49 | pass
50 | return -1
51 |
52 | def get_ryzenadj_info(self) -> str:
53 | """获取Ryzenadj信息。
54 |
55 | Returns:
56 | str: Ryzenadj信息
57 | """
58 | try:
59 | sys_ryzenadj_path = get_ryzenadj_path()
60 | command = f"{sys_ryzenadj_path} -i"
61 | process = subprocess.run(
62 | command,
63 | shell=True,
64 | stdout=subprocess.PIPE,
65 | stderr=subprocess.PIPE,
66 | text=True,
67 | env=get_env(),
68 | )
69 | stdout, stderr = process.stdout, process.stderr
70 | if stderr and stdout == "":
71 | logger.error(f"get_ryzenadj_info error:\n{stderr}")
72 | return f"get_ryzenadj_info error:\n{stderr}"
73 | else:
74 | return stdout
75 | except Exception as e:
76 | logger.error(e)
77 | return f"get_ryzenadj_info error:\n{e}"
78 |
79 | def get_rapl_info(self) -> str:
80 | """获取RAPL信息。
81 |
82 | Returns:
83 | str: RAPL信息
84 | """
85 | rapl_base_path = "/sys/class/powercap/intel-rapl:0"
86 | # if os.path.exists("/sys/class/powercap/intel-rapl/intel-rapl-mmio:0"):
87 | # rapl_base_path = "/sys/class/powercap/intel-rapl-mmio/intel-rapl-mmio:0"
88 |
89 | rapl_info = {}
90 |
91 | for file in os.listdir(rapl_base_path):
92 | # 是文件并且可读
93 | if os.path.isfile(os.path.join(rapl_base_path, file)) and os.access(
94 | os.path.join(rapl_base_path, file), os.R_OK
95 | ):
96 | try:
97 | with open(os.path.join(rapl_base_path, file), "r") as file:
98 | rapl_info[file.name] = file.read().strip()
99 | except Exception as e:
100 | logger.debug(f"get_rapl_info error: {e}")
101 |
102 | # sort by key
103 | rapl_info = dict(sorted(rapl_info.items(), key=lambda x: x[0]))
104 |
105 | logger.info(f"rapl_info: {rapl_info}")
106 |
107 | rapl_info_str = ""
108 | for key, value in rapl_info.items():
109 | rapl_info_str += f"{key}: {value}\n"
110 |
111 | logger.info(f"rapl_info_str: {rapl_info_str}")
112 | return rapl_info_str
113 |
114 | cpuManager = CPUManager()
115 |
--------------------------------------------------------------------------------
/src/util/position.ts:
--------------------------------------------------------------------------------
1 | import { JsonObject, JsonProperty } from "typescript-json-serializer";
2 |
3 | @JsonObject()
4 | export class FanPosition {
5 | @JsonProperty()
6 | temperature?: number;
7 | @JsonProperty()
8 | fanRPMpercent?: number;
9 |
10 | static tempMax: number = 100;
11 | static fanMax: number = 100;
12 | static fanMin: number = 0;
13 | static tempMin: number = 0;
14 |
15 | constructor(temperature: number, fanRPMpercent: number) {
16 | this.fanRPMpercent = Math.min(
17 | Math.max(fanRPMpercent, FanPosition.fanMin),
18 | FanPosition.fanMax
19 | );
20 | this.temperature = Math.min(
21 | Math.max(temperature, FanPosition.tempMin),
22 | FanPosition.tempMax
23 | );
24 | }
25 |
26 | public getCanvasPos(canWidth: number, canHeight: number) {
27 | var canPosx = Math.min(
28 | Math.max((this.temperature!! / FanPosition.tempMax) * canWidth, 0),
29 | canWidth
30 | );
31 | var canPosy = Math.min(
32 | Math.max((1 - this.fanRPMpercent!! / FanPosition.fanMax) * canHeight, 0),
33 | canHeight
34 | );
35 | return [canPosx, canPosy];
36 | }
37 |
38 | public isCloseToOther(other: FanPosition, distance: number) {
39 | var getDis = Math.sqrt(
40 | Math.pow(other.temperature!! - this.temperature!!, 2) +
41 | Math.pow(other.fanRPMpercent!! - this.fanRPMpercent!!, 2)
42 | );
43 | return getDis <= distance;
44 | }
45 | public static createFanPosByCanPos(
46 | canx: number,
47 | cany: number,
48 | canWidth: number,
49 | canHeight: number
50 | ) {
51 | var temperature = Math.min(
52 | Math.max((canx!! / canWidth) * this.tempMax, this.tempMin),
53 | this.tempMax
54 | );
55 | var fanRPMpercent = Math.min(
56 | Math.max((1 - cany!! / canHeight) * this.fanMax, this.fanMin),
57 | this.fanMax
58 | );
59 | return new FanPosition(temperature, fanRPMpercent);
60 | }
61 | }
62 | /*
63 | export class canvasPosition {
64 | @JsonProperty()
65 | canx?:number;
66 | @JsonProperty()
67 | cany?:number;
68 | constructor(canx:number,cany:number){
69 | this.canx=canx;
70 | this.cany=cany;
71 | }
72 | public getFanPos(canWidth:number,canHeight:number)
73 | {
74 | const tempMax=100;
75 | const fanMax=100;
76 | const fanMin=0;
77 | const tempMin=0;
78 | var temperature=Math.min(Math.max(this.canx!!/canWidth*tempMax,tempMin),tempMax);
79 | var fanRPMpercent=Math.min(Math.max((1-this.cany!!/canHeight)*fanMax,fanMin),fanMax);
80 | return new fanPosition(temperature,fanRPMpercent)
81 | }
82 | }
83 | */
84 | //通过画布位置来调整文字位置
85 | export const getTextPosByCanvasPos = (
86 | canPosx: number,
87 | canPosy: number,
88 | canWidth: number,
89 | _canHeight: number
90 | ) => {
91 | var textlen = 55;
92 | var textheight = 12;
93 | var offsetX = 0;
94 | var offsetY = 0;
95 | if (canPosx + textlen / 2 >= canWidth - 5) {
96 | offsetX = canWidth - textlen - canPosx;
97 | } else if (canPosx - textlen / 2 <= 5) {
98 | offsetX = -canPosx;
99 | } else {
100 | offsetX = -textlen / 2 + 2;
101 | }
102 | if (canPosy - textheight <= 5) {
103 | offsetY = textheight + 5;
104 | } else {
105 | offsetY = -textheight;
106 | }
107 | return [canPosx + offsetX, canPosy + offsetY];
108 | };
109 |
110 | export const calPointInLine = (
111 | lineStart: FanPosition,
112 | lineEnd: FanPosition,
113 | calPointIndex: number
114 | ) => {
115 | if (lineStart.temperature!! > lineEnd.temperature!!) return null;
116 | if (
117 | calPointIndex < lineStart.temperature!! ||
118 | calPointIndex > lineEnd.temperature!!
119 | )
120 | return null;
121 | var deltaY = lineEnd.fanRPMpercent!! - lineStart.fanRPMpercent!!;
122 | var deltaX = lineEnd.temperature!! - lineStart.temperature!!;
123 | var calPointY =
124 | deltaX == 0
125 | ? deltaY
126 | : (calPointIndex - lineStart.temperature!!) * (deltaY / deltaX) +
127 | lineStart.fanRPMpercent!!;
128 | return new FanPosition(calPointIndex, calPointY);
129 | };
130 |
--------------------------------------------------------------------------------
/src/i18n/thai.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"การตั้งค่า",
3 | "ENABLE_SETTINGS":"เปิดใช้งานการตั้งค่า",
4 | "USE_PERGAME_PROFILE":"ใช้โปรไฟล์ตามเกม",
5 | "USING":"กำลังใช้งาน",
6 | "DEFAULT":"ค่าเริ่มต้น",
7 | "PROFILE":"โปรไฟล์",
8 | "CPU_BOOST":"เพิ่มประสิทธิภาพ CPU",
9 | "CPU_BOOST_DESC":"เพิ่มความถี่สูงสุดของ CPU",
10 | "HT_DESC":"เปิดใช้งาน Intel Hyper-Threading",
11 | "SMT_DESC":"เปิดใช้งานการประมวลผลแบบหลายเธรดพร้อมกัน",
12 | "CPU_NUM":"จำนวนคอร์ CPU",
13 | "CPU_NUM_DESC":"กำหนดคอร์กายภาพที่เปิดใช้งาน",
14 | "CPU_MAX_PERF":"ประสิทธิภาพสูงสุดของ CPU",
15 | "CPU_MAX_PERF_AUTO":"ประสิทธิภาพสูงสุดของ CPU อัตโนมัติ",
16 | "CPU_GOVERNOR": "ตัวควบคุม CPU",
17 | "CPU_GOVERNOR_DESC": "ตั้งค่านโยบายการจัดการประสิทธิภาพ CPU",
18 | "TDP":"ขีดจำกัดพลังงานความร้อน (TDP)",
19 | "TDP_DESC":"จำกัดกำลังของโปรเซสเซอร์เพื่อลดการใช้พลังงานรวม",
20 | "RYZENADJ_NOT_FOUND":"ไม่พบ RyzenAdj",
21 | "WATTS":"วัตต์",
22 | "GPU_FREQMODE":"โหมดความถี่ GPU",
23 | "UNLIMITED":"ไม่จำกัด",
24 | "FIXED_FREQ":"คงที่",
25 | "RANGE_FREQ":"ช่วง",
26 | "AUTO_FREQ":"อัตโนมัติ",
27 | "GPU_FIX_FREQ":"ความถี่ GPU",
28 | "GPU_MIN_FREQ":"ความถี่ต่ำสุด",
29 | "GPU_MAX_FREQ":"ความถี่สูงสุด",
30 | "FAN_SPEED":"ความเร็วพัดลม",
31 | "CREATE_FAN_PROFILE":"สร้างโปรไฟล์พัดลม",
32 | "GRID_ALIG":"การจัดตำแหน่งตาราง",
33 | "FAN_MODE":"โหมดพัดลม",
34 | "NOT_CONTROLLED":"ไม่ควบคุม",
35 | "FIXED":"คงที่",
36 | "CURVE":"เส้นโค้ง",
37 | "SNAP_GRIDLINE":"ดึงดูดไปที่จุดตัดของเส้นตาราง",
38 | "FAN_SPEED_PERCENT":"ความเร็วพัดลม (%)",
39 | "SENSOR_TEMP":"อุณหภูมิเซ็นเซอร์",
40 | "CREATE_FAN_PROFILE_TIP":"สร้างโปรไฟล์พัดลม",
41 | "SELECT_FAN_PROFILE_TIP":"เลือกโปรไฟล์พัดลม",
42 | "FAN_PROFILE_NAME":"ชื่อโปรไฟล์",
43 | "USE":"ใช้",
44 | "DELETE":"ลบ",
45 | "CREATE":"สร้าง",
46 | "CANCEL":"ยกเลิก",
47 | "CURENT_STAT":"สถานะปัจจุบัน",
48 | "EDIT":"แก้ไข",
49 | "SAVE":"บันทึก",
50 | "NATIVE_FREQ":"ดั้งเดิม",
51 | "MORE":"เพิ่มเติม",
52 | "REINSTALL_PLUGIN": "ติดตั้งปลั๊กอินใหม่",
53 | "UPDATE_PLUGIN": "อัปเดตเป็น",
54 | "ROLLBACK_PLUGIN": "ย้อนกลับเป็น",
55 | "INSTALLED_VERSION": "เวอร์ชันที่ติดตั้ง",
56 | "LATEST_VERSION": "เวอร์ชันล่าสุด",
57 | "GPU_NATIVE_SLIDER": "แถบเลื่อน GPU ดั้งเดิม",
58 | "GPU_NATIVE_SLIDER_DESC": "เปิดใช้งานแถบเลื่อนควบคุม GPU ดั้งเดิม",
59 | "USE_PERACMODE_PROFILE": "ใช้โปรไฟล์ตามโหมดพลังงาน",
60 | "AC_MODE": "โหมดไฟฟ้า",
61 | "BAT_MODE": "โหมดแบตเตอรี่",
62 | "CUSTOM_TDP_RANGE": "ช่วง TDP แบบกำหนดเอง",
63 | "RESET_ALL": "รีเซ็ตทั้งหมด",
64 | "NATIVE_FREQ_DESC": "ตั้งค่าความถี่ผ่านเมนูระบบ",
65 | "UNLIMITED_DESC": "ไม่จำกัดความถี่ GPU, ใช้การจัดการระบบเริ่มต้น",
66 | "FIXED_FREQ_DESC": "ความถี่ GPU คงที่",
67 | "RANGE_FREQ_DESC": "กำหนดช่วงความถี่ GPU",
68 | "AUTO_FREQ_DESC": "ความถี่ GPU แบบปรับตัว, บังคับปิดการจำกัด TDP, ปิด Boost",
69 | "AUTO_FREQ_TDP_NOTIF": "โหมด GPU {{mode}}, ปิดการจำกัด TDP",
70 | "NATIVE_TDP_SLIDER": "แถบเลื่อน TDP ดั้งเดิม",
71 | "NATIVE_TDP_SLIDER_DESC": "เปิดใช้งานแถบเลื่อน TDP แบบดั้งเดิม ต้องรีสตาร์ทระบบเพื่อให้การเปิด/ปิดมีผล การแก้ไขค่าสูงสุดของช่วง TDP ต้องรีสตาร์ท Steam เพื่อให้มีผล หลังจากเปิดใช้งาน การตั้งค่า TDP จะถูกบันทึกโดย Steam และการตั้งค่าสถานะพลังงานในปลั๊กอินจะไม่จัดการการตั้งค่า TDP",
72 | "FORCE_SHOW_TDP": "บังคับแสดงการควบคุม TDP",
73 | "FORCE_SHOW_TDP_DESC": "โดยค่าเริ่มต้น ปลั๊กอินจะประมวลผลแถบเลื่อน TDP ดั้งเดิม หากแถบเลื่อนดั้งเดิมมีปัญหา ให้เปิดใช้งานตัวเลือกนี้เพื่อใช้การควบคุม TDP ภายในของปลั๊กอิน",
74 | "MANUAL_BYPASS_CHARGE": "ควบคุมการชาร์จแบบบายพาสด้วยตนเอง",
75 | "MANUAL_BYPASS_CHARGE_DESC": "ควบคุมการชาร์จแบบบายพาสด้วยตนเอง",
76 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "การเปิดใช้งานจะปิดการจำกัดการชาร์จชั่วคราว",
77 | "CHARGE_LIMIT": "จำกัดการชาร์จ",
78 | "CHARGE_LIMIT_DESC": "ตั้งค่าการจำกัดการชาร์จเพื่อยืดอายุแบตเตอรี่",
79 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "เปิดใช้งานการชาร์จแบบบายพาสแล้ว การจำกัดการชาร์จถูกปิดชั่วคราว",
80 | "USE_OLD_UI": "ใช้ UI แบบเก่า",
81 | "USE_OLD_UI_DESC": "ใช้มุมมองรายการแบบเก่าแทนมุมมองแท็บใหม่",
82 | "CPU_FREQ_CONTROL": "การควบคุมความถี่ CPU",
83 | "CPU_FREQ_CONTROL_DESC": "จำกัดความถี่สูงสุดของ CPU เพื่อลดการใช้พลังงานและความร้อน สถาปัตยกรรม: {{architecture}}",
84 | "CORE_FREQUENCY": "ความถี่แกน",
85 | "CPU_FREQUENCY": "ความถี่ CPU",
86 | "ALL_CORES": "แกนทั้งหมด",
87 | "CHECK_VERSION": "ตรวจสอบเวอร์ชัน",
88 | "CHECKING_VERSION": "กำลังตรวจสอบ...",
89 | "LAST_CHECK_TIME": "การตรวจสอบครั้งล่าสุด",
90 | "JUST_NOW": "เมื่อกี้",
91 | "MINUTES_AGO": "{{minutes}} นาทีที่แล้ว",
92 | "HOURS_AGO": "{{hours}} ชั่วโมงที่แล้ว",
93 | "DAYS_AGO": "{{days}} วันที่แล้ว",
94 | "CLICK_TO_CHECK": "คลิกเพื่อตรวจสอบอัปเดต"
95 | }
--------------------------------------------------------------------------------
/py_modules/ec.py:
--------------------------------------------------------------------------------
1 | import time
2 |
3 | import portio
4 | from config import logger
5 |
6 | EC_CMD_STATUS_REGISTER_PORT = 0x66
7 | EC_DATA_REGISTER_PORT = 0x62
8 | EC_IBF_BIT = 1
9 | EC_OBF_BIT = 0
10 | RD_EC = 0x80 # Read Embedded Controller
11 | WR_EC = 0x81 # Write Embedded Controller
12 |
13 | # for register in [EC_DATA_REGISTER_PORT, EC_CMD_STATUS_REGISTER_PORT]:
14 | # status = portio.ioperm(register, 1, 1)
15 | status = portio.iopl(3)
16 |
17 |
18 | class EC:
19 | @staticmethod
20 | def Wait(port, flag, value):
21 | for i in range(200):
22 | data = portio.inb(port)
23 | if ((data >> flag) & 0x1) == value:
24 | condition = True
25 | break
26 | time.sleep(0.001)
27 |
28 | @staticmethod
29 | def Read(address: int):
30 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
31 | portio.outb(RD_EC, EC_CMD_STATUS_REGISTER_PORT)
32 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
33 | portio.outb(address, EC_DATA_REGISTER_PORT)
34 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_OBF_BIT, 1)
35 | result = portio.inb(EC_DATA_REGISTER_PORT)
36 | logger.debug(f"ECRead address:{hex(address)} value:{result}")
37 | return result
38 |
39 | @staticmethod
40 | def ReadLonger(address: int, length: int):
41 | sum = 0
42 | for len in range(length):
43 | value = EC.Read(address + len)
44 | sum = (sum << 8) + value
45 | # logger.debug(f"count={len} sum={sum} address={address+len} value={value}")
46 | logger.debug(f"ECReadLonger address:{hex(address)} value:{sum}")
47 | return sum
48 |
49 | @staticmethod
50 | def Write(address: int, data: int):
51 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
52 | portio.outb(WR_EC, EC_CMD_STATUS_REGISTER_PORT)
53 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
54 | portio.outb(address, EC_DATA_REGISTER_PORT)
55 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
56 | portio.outb(data, EC_DATA_REGISTER_PORT)
57 | EC.Wait(EC_CMD_STATUS_REGISTER_PORT, EC_IBF_BIT, 0)
58 | logger.debug(f"ECWrite address:{hex(address)} value:{data}")
59 |
60 | @staticmethod
61 | def RamWrite(comm_port: int, data_port: int, address: int, data: int):
62 | high_byte = (address >> 8) & 0xFF
63 | low_byte = address & 0xFF
64 | portio.outb(0x2E, comm_port)
65 | portio.outb(0x11, data_port)
66 | portio.outb(0x2F, comm_port)
67 | portio.outb(high_byte, data_port)
68 |
69 | portio.outb(0x2E, comm_port)
70 | portio.outb(0x10, data_port)
71 | portio.outb(0x2F, comm_port)
72 | portio.outb(low_byte, data_port)
73 |
74 | portio.outb(0x2E, comm_port)
75 | portio.outb(0x12, data_port)
76 | portio.outb(0x2F, comm_port)
77 | portio.outb(data, data_port)
78 | logger.debug(
79 | f"ECRamWrite high_byte={hex(high_byte)} low_byte={hex(low_byte)} address:{hex(address)} value:{data}"
80 | )
81 |
82 | @staticmethod
83 | def RamRead(comm_port: int, data_port: int, address: int):
84 | high_byte = (address >> 8) & 0xFF
85 | low_byte = address & 0xFF
86 | portio.outb(0x2E, comm_port)
87 | portio.outb(0x11, data_port)
88 | portio.outb(0x2F, comm_port)
89 | portio.outb(high_byte, data_port)
90 |
91 | portio.outb(0x2E, comm_port)
92 | portio.outb(0x10, data_port)
93 | portio.outb(0x2F, comm_port)
94 | portio.outb(low_byte, data_port)
95 |
96 | portio.outb(0x2E, comm_port)
97 | portio.outb(0x12, data_port)
98 | portio.outb(0x2F, comm_port)
99 | data = portio.inb(data_port)
100 | logger.debug(
101 | f"ECRamRead high_byte={hex(high_byte)} low_byte={hex(low_byte)} address:{hex(address)} value:{data}"
102 | )
103 | return data
104 |
105 | @staticmethod
106 | def RamReadLonger(reg_addr: int, reg_data: int, address: int, length: int):
107 | sum = 0
108 | for len in range(length):
109 | value = EC.RamRead(reg_addr, reg_data, address + len)
110 | sum = (sum << 8) + value
111 | # logger.debug(f"count={len} sum={sum} address={address+len} value={value}")
112 | logger.debug(f"ECReadLonger address:{hex(address)} value:{sum}")
113 | return sum
114 |
115 | def PrintAll():
116 | print("", "\t", end="")
117 | for z in range(0xF + 1):
118 | print(hex(z), "\t", end="")
119 | print()
120 | for x in range(0xF + 1):
121 | for y in range(0xF + 1):
122 | if y == 0x00:
123 | print(hex(x), "\t", end="")
124 | print(EC.Read((x << 4) + y), "\t", end="")
125 | print()
126 |
--------------------------------------------------------------------------------
/src/i18n/english.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"Settings",
3 | "ENABLE_SETTINGS":"Enable Settings",
4 | "USE_PERGAME_PROFILE":"Use per-game Profile",
5 | "USING":"Using",
6 | "DEFAULT":" default ",
7 | "PROFILE":"Profile",
8 | "CPU_BOOST":"CPU Boost",
9 | "CPU_BOOST_DESC":"Increase the maximum CPU frequency",
10 | "HT_DESC":"Enable Hyper-threading",
11 | "SMT_DESC":"Enable Simultaneous Multi-Threading",
12 | "CPU_NUM":"Number Of CPU Cores",
13 | "CPU_NUM_DESC":"Set the enabled physical core",
14 | "CPU_MAX_PERF":"CPU Maximum Performance",
15 | "CPU_MAX_PERF_AUTO":"Auto CPU Maximum Performance",
16 | "CPU_GOVERNOR": "CPU Governor",
17 | "CPU_GOVERNOR_DESC": "Select CPU frequency scaling governor",
18 | "CPU_EPP": "Energy Performance Preference",
19 | "CPU_EPP_DESC": "Balance between energy efficiency and performance",
20 | "CPU_SCHED_EXT": "SCX Scheduler",
21 | "CPU_SCHED_EXT_DESC": "Select sched_ext scheduler for CPU",
22 | "TDP":"Thermal Power (TDP) Limit",
23 | "TDP_DESC":"Limits processor power for less total power",
24 | "RYZENADJ_NOT_FOUND":"RyzenAdj Not Detected",
25 | "WATTS":"Watts",
26 | "GPU_FREQMODE":"GPU Clock Frequency Mode",
27 | "UNLIMITED":"Unlimited",
28 | "FIXED_FREQ":"Fixed",
29 | "RANGE_FREQ":"Range",
30 | "AUTO_FREQ":"Auto",
31 | "GPU_FIX_FREQ":"GPU Clock Frequency",
32 | "GPU_MIN_FREQ":"Minimum Frequency Limit",
33 | "GPU_MAX_FREQ":"Maximum Frequency Limit",
34 | "FAN_SPEED":"Fan Speed",
35 | "CREATE_FAN_PROFILE":"Create Fan Profile",
36 | "GRID_ALIG":"Grid Alignment",
37 | "FAN_MODE":"Fan Mode",
38 | "NOT_CONTROLLED":"Not Controlled",
39 | "FIXED":"Fixed",
40 | "CURVE":"Curve",
41 | "SNAP_GRIDLINE":"Snap To The Gridline Intersection",
42 | "FAN_SPEED_PERCENT":"Fan Speed Percentage",
43 | "SENSOR_TEMP":"Sensor Temperature",
44 | "CREATE_FAN_PROFILE_TIP":"Create a Fan Profile",
45 | "SELECT_FAN_PROFILE_TIP":"Select a Fan Profile",
46 | "FAN_PROFILE_NAME":"Profile Name",
47 | "USE":"Use",
48 | "DELETE":"Delete",
49 | "CREATE":"Create",
50 | "CANCEL":"Cancel",
51 | "CURENT_STAT":"Current status",
52 | "EDIT":"Edit",
53 | "SAVE":"Save",
54 | "NATIVE_FREQ":"Native",
55 | "MORE":"More",
56 | "REINSTALL_PLUGIN": "Reinstall Plugin",
57 | "UPDATE_PLUGIN": "Update to",
58 | "ROLLBACK_PLUGIN": "Rollback to",
59 | "INSTALLED_VERSION": "Installed Version",
60 | "LATEST_VERSION": "Latest Version",
61 | "GPU_NATIVE_SLIDER": "Native GPU Slider",
62 | "GPU_NATIVE_SLIDER_DESC": "Enable the native GPU control slider",
63 | "USE_PERACMODE_PROFILE": "Use per-AC Mode Profile",
64 | "AC_MODE": "AC Mode",
65 | "BAT_MODE": "Battery Mode",
66 | "CUSTOM_TDP_RANGE": "Custom TDP Slider Range",
67 | "RESET_ALL": "Reset All",
68 | "NATIVE_FREQ_DESC": "Set frequency using system shortcut menu",
69 | "UNLIMITED_DESC": "No limit on GPU frequency, system default scheduling",
70 | "FIXED_FREQ_DESC": "Fixed GPU frequency",
71 | "RANGE_FREQ_DESC": "Set GPU frequency range",
72 | "AUTO_FREQ_DESC": "Adaptive GPU frequency, forcibly disabled TDP limit, disabled Boost",
73 | "AUTO_FREQ_TDP_NOTIF": "GPU mode {{mode}}, TDP limit disabled",
74 | "NATIVE_TDP_SLIDER": "Native TDP Slider",
75 | "NATIVE_TDP_SLIDER_DESC": "Enable native TDP slider, requires system restart to take effect when enabling/disabling. Modifying TDP range maximum requires Steam restart to take effect. After enabling, TDP settings are saved by Steam, and power state settings in plugin will not handle TDP configuration",
76 | "FORCE_SHOW_TDP": "Force Show TDP Control",
77 | "FORCE_SHOW_TDP_DESC": "By default, the plugin will process the native TDP slider. If there is an issue with the native slider, enable this option to use the plugin's internal TDP control",
78 | "MANUAL_BYPASS_CHARGE": "Manual Bypass Charging",
79 | "MANUAL_BYPASS_CHARGE_DESC": "Manually control bypass charging",
80 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "Enabling this will temporarily disable charge limit",
81 | "CHARGE_LIMIT": "Charge Limit",
82 | "CHARGE_LIMIT_DESC": "Set battery charge limit to extend battery life",
83 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "Manual bypass charging is enabled, charge limit is temporarily disabled",
84 | "USE_OLD_UI": "Use Old UI",
85 | "USE_OLD_UI_DESC": "Use the old List View instead of the new Tab View",
86 | "CPU_FREQ_CONTROL": "CPU Frequency Control",
87 | "CPU_FREQ_CONTROL_DESC": "Limit maximum CPU frequency to reduce power consumption and heat. Architecture: {{architecture}}",
88 | "CORE_FREQUENCY": "Core Frequency",
89 | "CPU_FREQUENCY": "CPU Frequency",
90 | "ALL_CORES": "All Cores",
91 | "CHECK_VERSION": "Check Version",
92 | "CHECKING_VERSION": "Checking...",
93 | "LAST_CHECK_TIME": "Last check",
94 | "JUST_NOW": "just now",
95 | "MINUTES_AGO": "{{minutes}} minutes ago",
96 | "HOURS_AGO": "{{hours}} hours ago",
97 | "DAYS_AGO": "{{days}} days ago",
98 | "CLICK_TO_CHECK": "Click to check for updates"
99 | }
--------------------------------------------------------------------------------
/py_modules/inotify.py:
--------------------------------------------------------------------------------
1 | import ctypes
2 | import os
3 | import struct
4 | import sys
5 | from ctypes import CDLL, get_errno
6 | from threading import Thread, Timer
7 |
8 | from config import logger
9 |
10 | IN_ACCESS = 0x00000001 # 文件被访问
11 | IN_MODIFY = 0x00000002 # 文件被修改
12 | IN_ATTRIB = 0x00000004 # 元数据改变
13 | IN_CLOSE_WRITE = 0x00000008 # 可写文件被关闭
14 | IN_CLOSE_NOWRITE = 0x00000010 # 不可写文件被关闭
15 | IN_OPEN = 0x00000020 # 文件被打开
16 | IN_MOVED_FROM = 0x00000040 # 文件从X移动
17 | IN_MOVED_TO = 0x00000080 # 文件被移动到Y
18 | IN_CREATE = 0x00000100 # 子文件创建
19 | IN_DELETE = 0x00000200 # 子文件删除
20 | IN_DELETE_SELF = 0x00000400 # 自身(被监视的项本身)被删除
21 | IN_MOVE_SELF = 0x00000800 # 自身(被监视的项本身)被移动
22 |
23 |
24 | class Inotify:
25 | def __init__(self):
26 | try:
27 | self._libc = CDLL(None, use_errno=True)
28 | self._libc.inotify_init.argtypes = []
29 | self._libc.inotify_init.restype = ctypes.c_int
30 | self._libc.inotify_add_watch.argtypes = [
31 | ctypes.c_int,
32 | ctypes.c_char_p,
33 | ctypes.c_uint32,
34 | ]
35 | self._libc.inotify_add_watch.restype = ctypes.c_int
36 | self._libc.inotify_rm_watch.argtypes = [ctypes.c_int, ctypes.c_int]
37 | self._libc.inotify_rm_watch.restype = ctypes.c_int
38 |
39 | self.fd = self._libc.inotify_init()
40 |
41 | self._wdMap = {}
42 | self._delay = 0.5
43 | self._delaytimer = {}
44 | self._runThread = None
45 | except Exception as e:
46 | logger.error(e)
47 |
48 | def _process(self):
49 | try:
50 | if self._runThread:
51 | nowThread = self._runThread.name
52 | while self._runThread and self._runThread.name == nowThread:
53 | buf = os.read(self.fd, 4096)
54 | pos = 0
55 | wdMap = self._wdMap.copy()
56 | while pos < len(buf):
57 | (wd, mask, cookie, name_len) = struct.unpack(
58 | "iIII", buf[pos : pos + 16]
59 | )
60 | pos += 16
61 | (name,) = struct.unpack("%ds" % name_len, buf[pos : pos + name_len])
62 | pos += name_len
63 | item = wdMap.get(wd)
64 | if item and self._runThread and self._runThread.name == nowThread:
65 | self._delayCall(wd, item["callback"], item["path"], mask)
66 | except Exception as e:
67 | logger.error(e)
68 |
69 | def _delayCall(self, wd, callfunc, *args):
70 | try:
71 | if (
72 | wd in self._delaytimer
73 | and self._delaytimer[wd] is not None
74 | and self._delaytimer[wd].is_alive()
75 | ):
76 | self._delaytimer[wd].cancel()
77 | self._delaytimer[wd] = Timer(
78 | self._delay, lambda: self._onCallBack(callfunc, *args)
79 | )
80 | self._delaytimer[wd].start()
81 | except Exception as e:
82 | logger.error(e)
83 |
84 | def _onCallBack(self, callfunc, *args):
85 | logger.debug(f"callback path:{args[0]}, mask:{args[1]}")
86 | callfunc(*args)
87 |
88 | def add_watch(self, path, mask, callback):
89 | try:
90 | logger.debug(
91 | f"add_watch(self, path:{path}, mask:{mask}, callback:{callback})"
92 | )
93 | path_buf = ctypes.create_string_buffer(
94 | path.encode(sys.getfilesystemencoding())
95 | )
96 | wd = self._libc.inotify_add_watch(self.fd, path_buf, mask)
97 | self._wdMap[wd] = {"path": path, "callback": callback}
98 | if wd < 0:
99 | sys.stderr.write(
100 | f"can't add watch for {path_buf}: {os.strerror(get_errno())}\n"
101 | )
102 | return wd
103 | except Exception as e:
104 | logger.error(e)
105 |
106 | def remove_watch(self, path):
107 | try:
108 | for wd in list(self._wdMap):
109 | if path == self._wdMap[wd]["path"]:
110 | if self._libc.inotify_rm_watch(self.fd, wd) < 0:
111 | sys.stderr.write(
112 | f"can't remove watch: {os.strerror(get_errno())}\n"
113 | )
114 | else:
115 | self._wdMap.pop(wd)
116 | except Exception as e:
117 | logger.error(e)
118 |
119 | def run(self):
120 | try:
121 | if self._runThread:
122 | pass
123 | else:
124 | self._runThread = Thread(target=self._process)
125 | self._runThread.start()
126 | except Exception as e:
127 | logger.error(e)
128 |
129 | def stop(self):
130 | self._runThread = None
131 |
132 |
133 | notify = Inotify()
134 | notify.run()
135 |
--------------------------------------------------------------------------------
/src/i18n/german.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"Einstellungen",
3 | "ENABLE_SETTINGS":"Einstellungen aktivieren",
4 | "USE_PERGAME_PROFILE":"Spielbezogene Profil",
5 | "USING":"Verwendet",
6 | "DEFAULT":"Standard",
7 | "PROFILE":"Profil",
8 | "CPU_BOOST":"CPU Boost",
9 | "CPU_BOOST_DESC":"Maximale CPU Frequenz erhöhen",
10 | "HT_DESC":"Hyperthreading aktivieren",
11 | "SMT_DESC":"Simultanes Multithreading aktivieren",
12 | "CPU_NUM":"Anzahl CPU-Kerne",
13 | "CPU_NUM_DESC":"Anzahl physischer CPU-Kerne",
14 | "CPU_MAX_PERF":"CPU Maximale Leistung",
15 | "CPU_MAX_PERF_AUTO":"Automatische CPU Maximale Leistung",
16 | "CPU_GOVERNOR": "CPU-Taktgeber",
17 | "CPU_GOVERNOR_DESC": "CPU-Leistungsplanungsrichtlinie festlegen",
18 | "TDP":"Thermische Verlustleistung (TDP) Limit",
19 | "TDP_DESC":"CPU-Leistung einschränken um Strom zu sparen",
20 | "RYZENADJ_NOT_FOUND":"RyzenAdj nicht gefunden",
21 | "WATTS":"Watt",
22 | "GPU_FREQMODE":"GPU-Frequenzmodus",
23 | "UNLIMITED":"Unbeschränkt",
24 | "FIXED_FREQ":"Fest",
25 | "RANGE_FREQ":"Bereich",
26 | "AUTO_FREQ":"Automatisch",
27 | "GPU_FIX_FREQ":"GPU-Frequenz",
28 | "GPU_MIN_FREQ":"Minimale Frequenz",
29 | "GPU_MAX_FREQ":"Maximale Frequenz",
30 | "FAN_SPEED":"Lüftergeschwindigkeit",
31 | "CREATE_FAN_PROFILE":"Lüfterprofil erstellen",
32 | "GRID_ALIG":"Gitternetz-Ausrichtung",
33 | "FAN_MODE":"Lüftermodus",
34 | "NOT_CONTROLLED":"Nicht gesteuert",
35 | "FIXED":"Fest",
36 | "CURVE":"Kurve",
37 | "SNAP_GRIDLINE":"An Gitterlinien ausrichten",
38 | "FAN_SPEED_PERCENT":"Lüftergeschwindigkeit (%)",
39 | "SENSOR_TEMP":"Sensortemperatur",
40 | "CREATE_FAN_PROFILE_TIP":"Lüfterprofil erstellen",
41 | "SELECT_FAN_PROFILE_TIP":"Lüfterprofil auswählen",
42 | "FAN_PROFILE_NAME":"Profilname",
43 | "USE":"Verwenden",
44 | "DELETE":"Löschen",
45 | "CREATE":"Erstellen",
46 | "CANCEL":"Abbrechen",
47 | "CURENT_STAT":"Aktueller Status",
48 | "EDIT":"Bearbeiten",
49 | "SAVE":"Speichern",
50 | "NATIVE_FREQ":"Nativ",
51 | "MORE":"Mehr",
52 | "REINSTALL_PLUGIN": "Plugin neu installieren",
53 | "UPDATE_PLUGIN": "Aktualisieren auf",
54 | "ROLLBACK_PLUGIN": "Zurücksetzen auf",
55 | "INSTALLED_VERSION": "Installierte Version",
56 | "LATEST_VERSION": "Neueste Version",
57 | "GPU_NATIVE_SLIDER": "Nativer GPU-Schieberegler",
58 | "GPU_NATIVE_SLIDER_DESC": "Nativen GPU-Schieberegler aktivieren",
59 | "USE_PERACMODE_PROFILE": "Profil nach Stromversorgung",
60 | "AC_MODE": "Netzbetrieb",
61 | "BAT_MODE": "Akkubetrieb",
62 | "CUSTOM_TDP_RANGE": "Benutzerdefinierter TDP-Bereich",
63 | "RESET_ALL": "Alles zurücksetzen",
64 | "NATIVE_FREQ_DESC": "Frequenz über Systemmenü einstellen",
65 | "UNLIMITED_DESC": "Keine GPU-Frequenzbegrenzung, Standard-Systemplanung",
66 | "FIXED_FREQ_DESC": "Feste GPU-Frequenz",
67 | "RANGE_FREQ_DESC": "GPU-Frequenzbereich festlegen",
68 | "AUTO_FREQ_DESC": "Adaptive GPU-Frequenz, TDP-Limit deaktiviert, Boost deaktiviert",
69 | "AUTO_FREQ_TDP_NOTIF": "GPU-Modus {{mode}}, TDP-Limit deaktiviert",
70 | "NATIVE_TDP_SLIDER": "Nativer TDP-Schieberegler",
71 | "NATIVE_TDP_SLIDER_DESC": "Aktivieren Sie den nativen TDP-Schieberegler, ein Neustart des Systems ist erforderlich, um das Aktivieren/Deaktivieren wirksam zu machen. Die Änderung des TDP-Bereichsmaximums erfordert einen Steam-Neustart, um wirksam zu werden. Nach der Aktivierung werden die TDP-Einstellungen von Steam gespeichert, und die Stromzustandseinstellungen im Plugin werden die TDP-Konfiguration nicht verarbeiten",
72 | "FORCE_SHOW_TDP": "TDP-Steuerung erzwingen",
73 | "FORCE_SHOW_TDP_DESC": "Standardmäßig verarbeitet das Plugin den nativen TDP-Schieberegler. Bei Problemen mit dem nativen Schieberegler aktivieren Sie diese Option, um die interne TDP-Steuerung des Plugins zu verwenden",
74 | "MANUAL_BYPASS_CHARGE": "Manuelle Bypass-Ladung",
75 | "MANUAL_BYPASS_CHARGE_DESC": "Bypass-Ladung manuell steuern",
76 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "Bei Aktivierung wird die Ladelimitierung vorübergehend deaktiviert",
77 | "CHARGE_LIMIT": "Ladelimitierung",
78 | "CHARGE_LIMIT_DESC": "Ladelimitierung zum Schutz der Akkulebensdauer einstellen",
79 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "Bypass-Ladung ist aktiv, Ladelimitierung vorübergehend deaktiviert",
80 | "USE_OLD_UI": "Alte Benutzeroberfläche verwenden",
81 | "USE_OLD_UI_DESC": "Die alte Listenansicht anstelle der neuen Tab-Ansicht verwenden",
82 | "CPU_FREQ_CONTROL": "CPU-Frequenzsteuerung",
83 | "CPU_FREQ_CONTROL_DESC": "CPU-Maximalfrequenz begrenzen um Stromverbrauch und Hitze zu reduzieren. Architektur: {{architecture}}",
84 | "CORE_FREQUENCY": "Kernfrequenz",
85 | "CPU_FREQUENCY": "CPU-Frequenz",
86 | "ALL_CORES": "Alle Kerne",
87 | "CHECK_VERSION": "Version prüfen",
88 | "CHECKING_VERSION": "Prüfe...",
89 | "LAST_CHECK_TIME": "Letzte Prüfung",
90 | "JUST_NOW": "gerade eben",
91 | "MINUTES_AGO": "vor {{minutes}} Minuten",
92 | "HOURS_AGO": "vor {{hours}} Stunden",
93 | "DAYS_AGO": "vor {{days}} Tagen",
94 | "CLICK_TO_CHECK": "Klicken um nach Updates zu suchen"
95 | }
--------------------------------------------------------------------------------
/src/i18n/italian.json:
--------------------------------------------------------------------------------
1 | {
2 | "TITEL_SETTINGS":"Impostazioni",
3 | "ENABLE_SETTINGS":"Abilita impostazioni",
4 | "USE_PERGAME_PROFILE":"Usa profilo per gioco",
5 | "USING":"In uso",
6 | "DEFAULT":"Predefinito",
7 | "PROFILE":"Profilo",
8 | "CPU_BOOST":"Boost CPU",
9 | "CPU_BOOST_DESC":"Aumenta la frequenza massima della CPU",
10 | "HT_DESC":"Abilita Intel Hyper-Threading",
11 | "SMT_DESC":"Abilita il multithreading simultaneo",
12 | "CPU_NUM":"Numero di core CPU",
13 | "CPU_NUM_DESC":"Imposta i core fisici attivi",
14 | "CPU_MAX_PERF":"Prestazioni massime della CPU",
15 | "CPU_MAX_PERF_AUTO":"Auto prestazioni massime della CPU",
16 | "CPU_GOVERNOR": "Governatore CPU",
17 | "CPU_GOVERNOR_DESC": "Imposta la politica di pianificazione delle prestazioni della CPU",
18 | "TDP":"Limite di potenza termica (TDP)",
19 | "TDP_DESC":"Limita la potenza del processore per ridurre il consumo totale",
20 | "RYZENADJ_NOT_FOUND":"RyzenAdj non trovato",
21 | "WATTS":"Watt",
22 | "GPU_FREQMODE":"Modalità frequenza GPU",
23 | "UNLIMITED":"Illimitato",
24 | "FIXED_FREQ":"Fisso",
25 | "RANGE_FREQ":"Intervallo",
26 | "AUTO_FREQ":"Auto",
27 | "GPU_FIX_FREQ":"Frequenza GPU",
28 | "GPU_MIN_FREQ":"Frequenza minima",
29 | "GPU_MAX_FREQ":"Frequenza massima",
30 | "FAN_SPEED":"Velocità ventola",
31 | "CREATE_FAN_PROFILE":"Crea profilo ventola",
32 | "GRID_ALIG":"Allineamento griglia",
33 | "FAN_MODE":"Modalità ventola",
34 | "NOT_CONTROLLED":"Non controllato",
35 | "FIXED":"Fisso",
36 | "CURVE":"Curva",
37 | "SNAP_GRIDLINE":"Aggancia alle intersezioni della griglia",
38 | "FAN_SPEED_PERCENT":"Velocità ventola (%)",
39 | "SENSOR_TEMP":"Temperatura sensore",
40 | "CREATE_FAN_PROFILE_TIP":"Crea un profilo ventola",
41 | "SELECT_FAN_PROFILE_TIP":"Seleziona un profilo ventola",
42 | "FAN_PROFILE_NAME":"Nome profilo",
43 | "USE":"Usa",
44 | "DELETE":"Elimina",
45 | "CREATE":"Crea",
46 | "CANCEL":"Annulla",
47 | "CURENT_STAT":"Stato attuale",
48 | "EDIT":"Modifica",
49 | "SAVE":"Salva",
50 | "NATIVE_FREQ":"Nativo",
51 | "MORE":"Altro",
52 | "REINSTALL_PLUGIN": "Reinstalla plugin",
53 | "UPDATE_PLUGIN": "Aggiorna a",
54 | "ROLLBACK_PLUGIN": "Ripristina a",
55 | "INSTALLED_VERSION": "Versione installata",
56 | "LATEST_VERSION": "Ultima versione",
57 | "GPU_NATIVE_SLIDER": "Slider GPU nativo",
58 | "GPU_NATIVE_SLIDER_DESC": "Abilita lo slider di controllo GPU nativo",
59 | "USE_PERACMODE_PROFILE": "Usa profilo per modalità alimentazione",
60 | "AC_MODE": "Modalità AC",
61 | "BAT_MODE": "Modalità batteria",
62 | "CUSTOM_TDP_RANGE": "Intervallo TDP personalizzato",
63 | "RESET_ALL": "Ripristina tutto",
64 | "NATIVE_FREQ_DESC": "Imposta la frequenza tramite il menu di sistema",
65 | "UNLIMITED_DESC": "Nessun limite di frequenza GPU, pianificazione predefinita del sistema",
66 | "FIXED_FREQ_DESC": "Frequenza GPU fissa",
67 | "RANGE_FREQ_DESC": "Imposta intervallo di frequenza GPU",
68 | "AUTO_FREQ_DESC": "Frequenza GPU adattiva, limite TDP disabilitato forzatamente, Boost disabilitato",
69 | "AUTO_FREQ_TDP_NOTIF": "Modalità GPU {{mode}}, limite TDP disabilitato",
70 | "NATIVE_TDP_SLIDER": "Slider TDP nativo",
71 | "NATIVE_TDP_SLIDER_DESC": "Abilita il cursore TDP nativo, richiede il riavvio del sistema per rendere effettiva l'attivazione/disattivazione. La modifica del valore massimo dell'intervallo TDP richiede il riavvio di Steam per avere effetto. Dopo l'attivazione, le impostazioni TDP vengono salvate da Steam e le impostazioni dello stato di alimentazione nel plugin non gestiranno la configurazione TDP",
72 | "FORCE_SHOW_TDP": "Forza visualizzazione controllo TDP",
73 | "FORCE_SHOW_TDP_DESC": "Per impostazione predefinita, il plugin elabora lo slider TDP nativo. Se lo slider nativo presenta problemi, abilita questa opzione per utilizzare il controllo TDP interno del plugin",
74 | "MANUAL_BYPASS_CHARGE": "Carica bypass manuale",
75 | "MANUAL_BYPASS_CHARGE_DESC": "Controlla manualmente la carica bypass",
76 | "MANUAL_BYPASS_CHARGE_DESC_WITH_LIMIT": "L'attivazione disabiliterà temporaneamente il limite di carica",
77 | "CHARGE_LIMIT": "Limite di carica",
78 | "CHARGE_LIMIT_DESC": "Imposta un limite di carica per prolungare la durata della batteria",
79 | "CHARGE_LIMIT_DESC_WITH_BYPASS": "Carica bypass attiva, limite di carica temporaneamente disabilitato",
80 | "USE_OLD_UI": "Usa la vecchia interfaccia",
81 | "USE_OLD_UI_DESC": "Usa la vecchia visualizzazione a lista invece della nuova visualizzazione a schede",
82 | "CPU_FREQ_CONTROL": "Controllo frequenza CPU",
83 | "CPU_FREQ_CONTROL_DESC": "Limita la frequenza massima della CPU per ridurre consumo e calore. Architettura: {{architecture}}",
84 | "CORE_FREQUENCY": "Frequenza del core",
85 | "CPU_FREQUENCY": "Frequenza CPU",
86 | "ALL_CORES": "Tutti i core",
87 | "CHECK_VERSION": "Controlla versione",
88 | "CHECKING_VERSION": "Controllo...",
89 | "LAST_CHECK_TIME": "Ultimo controllo",
90 | "JUST_NOW": "proprio ora",
91 | "MINUTES_AGO": "{{minutes}} minuti fa",
92 | "HOURS_AGO": "{{hours}} ore fa",
93 | "DAYS_AGO": "{{days}} giorni fa",
94 | "CLICK_TO_CHECK": "Clicca per controllare gli aggiornamenti"
95 | }
--------------------------------------------------------------------------------
/src/components/fanCanvas.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import { FC } from "react";
3 | import { FanPosition } from "../util";
4 | export interface FanCanvasProps {
5 | width: number;
6 | height: number;
7 | style: any;
8 | initDraw?(canvasRef: any): void;
9 | onPointerDown?(position: any): void;
10 | onPointerMove?(position: any): void;
11 | onPointerUp?(position: any): void;
12 | onPointerShortPress?(position: any): void;
13 | onPointerLongPress?(position: any): void;
14 | onPointerDragDown?(position: any): boolean;
15 | onPointerDraging?(position: any): void;
16 | }
17 | export const FanCanvas: FC