Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8810aa01e5 | ||
|
|
1fc4b94237 | ||
|
|
90a994a685 | ||
|
|
7b123da001 | ||
|
|
c8fd626446 | ||
|
|
0f6fee40ae | ||
|
|
4a788c2395 | ||
|
|
d2f34c9b5a | ||
|
|
4958722edd | ||
|
|
23b54ee397 | ||
|
|
73bb7abf6e | ||
|
|
9f0fabb91f | ||
|
|
a31f851707 | ||
|
|
70d3788dd6 | ||
|
|
f3b74ccc02 | ||
|
|
335a0881b3 | ||
|
|
c39a88b7db | ||
|
|
ba78392b24 |
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
github: [Steve-Tech]
|
||||||
|
thanks_dev: u/gh/steve-tech
|
||||||
2
.github/workflows/flatpak.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
flatpak:
|
flatpak:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-48
|
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-49
|
||||||
options: --privileged
|
options: --privileged
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
2
.github/workflows/pyinstaller-linux.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
run: pip install .
|
run: pip install .
|
||||||
- name: Build with PyInstaller
|
- name: Build with PyInstaller
|
||||||
# pyinstaller doesn't find the GTK libraries after caching?
|
# pyinstaller doesn't find the GTK libraries after caching?
|
||||||
run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec
|
run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec -- --onefile
|
||||||
working-directory: pyinstaller
|
working-directory: pyinstaller
|
||||||
- name: Upload PyInstaller Artifact
|
- name: Upload PyInstaller Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
|||||||
20
.github/workflows/pyinstaller-windows.yml
vendored
@@ -19,11 +19,11 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: C:\gtk
|
path: C:\gtk
|
||||||
key: Gvsbuild_2025.8.0
|
key: Gvsbuild_2025.9.0
|
||||||
|
|
||||||
- name: Download GTK4 Gvsbuild zip
|
- name: Download GTK4 Gvsbuild zip
|
||||||
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
||||||
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.8.0/GTK4_Gvsbuild_2025.8.0_x64.zip -Destination Gvsbuild.zip
|
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.9.0/GTK4_Gvsbuild_2025.9.0_x64.zip -Destination Gvsbuild.zip
|
||||||
|
|
||||||
- name: Extract Gvsbuild zip
|
- name: Extract Gvsbuild zip
|
||||||
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
||||||
@@ -41,12 +41,22 @@ jobs:
|
|||||||
- name: Build YAFI via Pip
|
- name: Build YAFI via Pip
|
||||||
run: pip install .
|
run: pip install .
|
||||||
|
|
||||||
- name: Build with PyInstaller
|
- name: Build with PyInstaller (ZIP)
|
||||||
run: python -m PyInstaller yafi.spec
|
run: python -m PyInstaller yafi.spec
|
||||||
working-directory: pyinstaller
|
working-directory: pyinstaller
|
||||||
|
|
||||||
- name: Upload PyInstaller Artifact
|
- name: Upload PyInstaller Artifact (ZIP)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
path: pyinstaller/dist/YAFI/*
|
||||||
|
name: yafi-windows-${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Build with PyInstaller (Standalone)
|
||||||
|
run: python -m PyInstaller yafi.spec --noconfirm -- --onefile
|
||||||
|
working-directory: pyinstaller
|
||||||
|
|
||||||
|
- name: Upload PyInstaller Artifact (Standalone)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: pyinstaller/dist/YAFI.exe
|
path: pyinstaller/dist/YAFI.exe
|
||||||
name: yafi-windows-${{ github.sha }}
|
name: yafi-windows-standalone-${{ github.sha }}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# CrOS_EC_Python udev rules
|
|
||||||
|
|
||||||
# LPC Access
|
|
||||||
KERNEL=="port", TAG+="uaccess"
|
|
||||||
|
|
||||||
# /dev/cros_ec Access
|
|
||||||
KERNEL=="cros_ec", TAG+="uaccess"
|
|
||||||
16
README.md
@@ -11,9 +11,13 @@ You can download the latest release from the [Releases page](https://github.com/
|
|||||||
|
|
||||||
There are builds for Flatpak, and PyInstaller for portable execution on Linux or Windows.
|
There are builds for Flatpak, and PyInstaller for portable execution on Linux or Windows.
|
||||||
|
|
||||||
|
YAFI is also available on [Flathub](https://flathub.org/en/apps/au.stevetech.yafi): `flatpak install flathub au.stevetech.yafi`.
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
To allow YAFI to communicate with the EC, you need to copy the [`60-cros_ec_python.rules`](60-cros_ec_python.rules) file to `/etc/udev/rules.d/` and reload the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`.
|
To allow YAFI to communicate with the EC, you will need to enable user access to the `/dev/cros_ec` device. You can do this by running `echo KERNEL=="cros_ec", TAG+="uaccess" | sudo tee /etc/udev/rules.d/60-yafi.rules`, and then reload the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`.
|
||||||
|
|
||||||
|
You can also do this by running `curl -fL yafi.stevetech.au/udev.sh | sudo sh` which will run the [`add-udev-rules.sh`](add-udev-rules.sh) script.
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
@@ -21,6 +25,8 @@ If your Laptop's BIOS supports Framework's EC driver, there is no need to instal
|
|||||||
|
|
||||||
Otherwise, YAFI supports the [PawnIO](https://pawnio.eu/) driver, and will be automatically used if installed and there is no Framework driver available. YAFI will need to be run as administrator to communicate with the driver.
|
Otherwise, YAFI supports the [PawnIO](https://pawnio.eu/) driver, and will be automatically used if installed and there is no Framework driver available. YAFI will need to be run as administrator to communicate with the driver.
|
||||||
|
|
||||||
|
Currently the PawnIO driver does not support Framework 13 mainboards with 11th, 12th, or 13th Gen Intel CPUs.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
### Flatpak
|
### Flatpak
|
||||||
@@ -80,7 +86,7 @@ It is possible to run YAFI on Windows using [gvsbuild](https://github.com/wingtk
|
|||||||
|
|
||||||
### `[Errno 13] Permission denied: '/dev/cros_ec'`
|
### `[Errno 13] Permission denied: '/dev/cros_ec'`
|
||||||
|
|
||||||
This error occurs when the udev rules are not installed or not working. Make sure you have copied the `60-cros_ec_python.rules` file to `/etc/udev/rules.d/` and reloaded the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`.
|
This error occurs when the udev rules are not installed or not working. Make sure you have installed the udev rules as described in the [Linux Installation](#linux) section.
|
||||||
|
|
||||||
### `Could not auto detect device, check you have the required permissions, or specify manually.`
|
### `Could not auto detect device, check you have the required permissions, or specify manually.`
|
||||||
|
|
||||||
@@ -88,3 +94,9 @@ This error occurs when `/dev/cros_ec` is not found, and the `CrOS_EC_Python` lib
|
|||||||
You can either update your kernel to have a working `cros_ec_dev` driver, or run YAFI as root.
|
You can either update your kernel to have a working `cros_ec_dev` driver, or run YAFI as root.
|
||||||
|
|
||||||
It can also occur if you do not have a CrOS EC, like on non Framework laptops.
|
It can also occur if you do not have a CrOS EC, like on non Framework laptops.
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
YAFI is not affiliated with Framework Computer Inc. in any way.
|
||||||
|
|
||||||
|
YAFI is licensed under the [GPL-2.0-or-later license](COPYING), and comes with no warranty or guarantee of any kind. Use at your own risk.
|
||||||
|
|||||||
7
add-udev-rules.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
echo Installing udev rules for YAFI to /etc/udev/rules.d/60-yafi.rules
|
||||||
|
echo KERNEL=="cros_ec", TAG+="uaccess" > /etc/udev/rules.d/60-yafi.rules
|
||||||
|
udevadm control --reload-rules
|
||||||
|
udevadm trigger
|
||||||
|
echo udev rules installed successfully.
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
{
|
{
|
||||||
"id" : "au.stevetech.yafi",
|
"id" : "au.stevetech.yafi",
|
||||||
"runtime" : "org.gnome.Platform",
|
"runtime" : "org.gnome.Platform",
|
||||||
"runtime-version" : "48",
|
"runtime-version" : "49",
|
||||||
"sdk" : "org.gnome.Sdk",
|
"sdk" : "org.gnome.Sdk",
|
||||||
"command" : "yafi",
|
"command" : "yafi",
|
||||||
"finish-args" : [
|
"finish-args" : [
|
||||||
"--device=all",
|
"--device=all",
|
||||||
"--socket=fallback-x11",
|
"--socket=fallback-x11",
|
||||||
"--socket=wayland"
|
"--socket=wayland",
|
||||||
|
"--share=ipc"
|
||||||
],
|
],
|
||||||
"cleanup" : [
|
"cleanup" : [
|
||||||
"/include",
|
"/include",
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
"*.a"
|
"*.a"
|
||||||
],
|
],
|
||||||
"modules" : [
|
"modules" : [
|
||||||
|
"python3-cros_ec_python.json",
|
||||||
{
|
{
|
||||||
"name" : "yafi",
|
"name" : "yafi",
|
||||||
"builddir" : true,
|
"builddir" : true,
|
||||||
@@ -31,18 +33,6 @@
|
|||||||
"path" : "."
|
"path" : "."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cros_ec_python",
|
|
||||||
"buildsystem": "simple",
|
|
||||||
"build-options": {
|
|
||||||
"build-args": [
|
|
||||||
"--share=network"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"build-commands": [
|
|
||||||
"pip3 install --prefix=${FLATPAK_DEST} --no-cache-dir \"cros_ec_python>=0.2.0\""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ Comment=Yet Another Framework Interface
|
|||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=Utility;
|
Categories=Utility;
|
||||||
Keywords=GTK;
|
Keywords=Framework;EC;Embedded Controller;
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
DBusActivatable=true
|
DBusActivatable=true
|
||||||
|
|||||||
@@ -7,11 +7,25 @@
|
|||||||
<name>Yet Another Framework Interface</name>
|
<name>Yet Another Framework Interface</name>
|
||||||
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
|
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
|
||||||
<description>
|
<description>
|
||||||
<p>It is written in Python with a GTK4 Adwaita theme, and uses the `CrOS_EC_Python` library to communicate with the EC.</p>
|
<p>It is written in Python with a GTK4 Adwaita theme, and uses the CrOS_EC_Python library to communicate with the EC.</p>
|
||||||
|
<p>YAFI has the capability for the following features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fan control and temperature monitoring</li>
|
||||||
|
<li>LED control</li>
|
||||||
|
<li>Battery statistics</li>
|
||||||
|
<li>Battery limiting</li>
|
||||||
|
<li>Hardware information</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>You will need to install the udev rules to allow non-root access to the EC device. See the README for more information.</p>
|
||||||
|
|
||||||
|
<p>Alternatively, you can run <code>curl -fL yafi.stevetech.au/udev.sh | sudo sh</code> to install the udev rules.</p>
|
||||||
|
|
||||||
|
<p>YAFI is not affiliated with Framework Computer Inc. in any way.</p>
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<developer id="au.stevetech">
|
<developer id="au.stevetech">
|
||||||
<name>Stephen Horvath</name>
|
<name translate="no">Stephen Horvath</name>
|
||||||
</developer>
|
</developer>
|
||||||
|
|
||||||
<!-- Required: Should be a link to the upstream homepage for the component -->
|
<!-- Required: Should be a link to the upstream homepage for the component -->
|
||||||
@@ -42,35 +56,86 @@
|
|||||||
|
|
||||||
<!-- Applications should set a brand color in both light and dark variants like so -->
|
<!-- Applications should set a brand color in both light and dark variants like so -->
|
||||||
<branding>
|
<branding>
|
||||||
<color type="primary" scheme_preference="light">#ff00ff</color>
|
<color type="primary" scheme_preference="light">#7c916f</color>
|
||||||
<color type="primary" scheme_preference="dark">#993d3d</color>
|
<color type="primary" scheme_preference="dark">#282000</color>
|
||||||
</branding>
|
</branding>
|
||||||
|
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermals.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/1-thermals.png</image>
|
||||||
<caption>Fan Control and Temperature Monitoring</caption>
|
<caption>Fan Control and Temperature Monitoring</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/2-leds.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/2-leds.png</image>
|
||||||
<caption>LED Control</caption>
|
<caption>LED Control</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/3-battery.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/3-battery.png</image>
|
||||||
<caption>Battery Statistics</caption>
|
<caption>Battery Statistics</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-battery-limit.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/4-battery-limit.png</image>
|
||||||
<caption>Battery Limiting</caption>
|
<caption>Battery Limiting</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4a-battery-ext.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/4a-battery-ext.png</image>
|
||||||
<caption>Battery Extender</caption>
|
<caption>Battery Extender</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/5-hardware.png</image>
|
<image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/5-hardware.png</image>
|
||||||
<caption>Hardware Info</caption>
|
<caption>Hardware Info</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
|
<releases>
|
||||||
|
<release version="0.6" date="2025-09-28">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.6</url>
|
||||||
|
<description>
|
||||||
|
<p>The following changes have been made:</p>
|
||||||
|
<ul>
|
||||||
|
<li>YAFI now has a new logo!</li>
|
||||||
|
<li>The advanced LED settings now detect available LEDs.</li>
|
||||||
|
<li>The ALS and lid open sensor has been added.</li>
|
||||||
|
<li>Stuttering has been reduced when opening the about dialog.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.5" date="2025-09-16">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.5</url>
|
||||||
|
<description>
|
||||||
|
<p>The following bugs have been fixed:</p>
|
||||||
|
<ul>
|
||||||
|
<li>LED page crashing when encountering unsupported LEDs.</li>
|
||||||
|
<li>Scaling issues on Windows.</li>
|
||||||
|
<li>Minimum charge limiter doesn't work.</li>
|
||||||
|
</ul>
|
||||||
|
<p>This release also adds a traceback to the debug info, when there is an error during initialisation.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.4" date="2025-09-06">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.4</url>
|
||||||
|
<description>
|
||||||
|
<p>This release also adds a new battery statistics page.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.3" date="2025-04-13">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.3</url>
|
||||||
|
<description>
|
||||||
|
<p>YAFI now shows the battery limiter value.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.2" date="2025-03-24">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.2</url>
|
||||||
|
<description>
|
||||||
|
<p>This fixes an LED list bug.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="0.1" date="2025-03-20">
|
||||||
|
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.1</url>
|
||||||
|
<description>
|
||||||
|
<p>This is the first release of YAFI.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
</releases>
|
||||||
|
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
r="2" /></g><path
|
r="2" /></g><path
|
||||||
id="cog"
|
id="cog"
|
||||||
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||||
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path
|
d="m 47.818359,18 2.542969,2.630859 c -2.531091,-2.605911 -6.371601,-0.420022 -6.429687,-0.386718 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 C 33.755122,44.16501 31.7167,47.65852 30.302828,51.455131 l -10.679687,2.671875 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 47.818359,110 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 108.37109,73.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 97.697266,51.455078 C 96.283273,47.658406 94.245149,44.164957 91.708984,41.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 80.181641,18 l -2.550782,2.636719 -7.65039,7.912109 C 68.035313,28.223033 66.037713,28.054688 64,28.054688 c -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z M 64,36 A 27.999999,27.999997 0 0 1 92,64 27.999999,27.999997 0 0 1 64,92 27.999999,27.999997 0 0 1 36,64 27.999999,27.999997 0 0 1 64,36 Z" /><path
|
||||||
id="Y"
|
id="Y"
|
||||||
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
||||||
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>
|
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 6.7 KiB |
@@ -2,9 +2,9 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
width="128"
|
width="96"
|
||||||
height="128"
|
height="96"
|
||||||
viewBox="0 0 128 128"
|
viewBox="0 0 96 96"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg1"
|
id="svg1"
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
id="icon"><path
|
id="icon"><path
|
||||||
id="cog"
|
id="cog"
|
||||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||||
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path
|
d="m 31.818314,2 2.542969,2.630859 C 31.830192,2.024948 27.989682,4.210837 27.931596,4.244141 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 c -2.535988,3.065348 -4.57441,6.558858 -5.988282,10.355469 L 3.623096,38.127006 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 31.818314,94 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 92.371045,57.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 81.697221,35.455078 C 80.283228,31.658406 78.245104,28.164957 75.708939,25.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 64.181596,2 l -2.550782,2.636719 -7.65039,7.912109 c -1.945156,-0.325795 -3.942756,-0.49414 -5.980469,-0.49414 -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z m 16.181641,18 a 27.999999,27.999997 0 0 1 28,28 27.999999,27.999997 0 0 1 -28,28 27.999999,27.999997 0 0 1 -28,-28 27.999999,27.999997 0 0 1 28,-28 z" /><path
|
||||||
id="Y"
|
id="Y"
|
||||||
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
||||||
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>
|
d="M 48.000002,46.00022 34.000001,32.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 86 KiB |
BIN
docs/2-leds.png
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 104 KiB |
3
flathub.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"only-arches": ["x86_64"]
|
||||||
|
}
|
||||||
17
logo.svg
@@ -26,21 +26,24 @@
|
|||||||
inkscape:pagecheckerboard="0"
|
inkscape:pagecheckerboard="0"
|
||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:zoom="2"
|
inkscape:zoom="5.6568542"
|
||||||
inkscape:cx="37.25"
|
inkscape:cx="38.802485"
|
||||||
inkscape:cy="109"
|
inkscape:cy="83.261824"
|
||||||
inkscape:window-width="1876"
|
inkscape:window-width="1876"
|
||||||
inkscape:window-height="1025"
|
inkscape:window-height="1025"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="0"
|
inkscape:window-y="0"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="layer1" /><defs
|
inkscape:current-layer="icon" /><defs
|
||||||
id="defs1" /><g
|
id="defs1" /><g
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"><g
|
id="layer1"><g
|
||||||
id="icon"
|
id="icon"
|
||||||
inkscape:label="icon"><g
|
inkscape:label="icon"
|
||||||
|
inkscape:export-filename="icon.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"><g
|
||||||
id="chip"
|
id="chip"
|
||||||
inkscape:label="chip"
|
inkscape:label="chip"
|
||||||
style="stroke-width:0;stroke-dasharray:none"><path
|
style="stroke-width:0;stroke-dasharray:none"><path
|
||||||
@@ -150,8 +153,8 @@
|
|||||||
inkscape:label="dot" /></g><path
|
inkscape:label="dot" /></g><path
|
||||||
id="cog"
|
id="cog"
|
||||||
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||||
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z"
|
inkscape:label="cog"
|
||||||
inkscape:label="cog" /><path
|
d="M 47.818359 18 L 50.361328 20.630859 C 47.830237 18.024948 43.989727 20.210837 43.931641 20.244141 L 43.927734 20.246094 L 36.144531 24.740234 C 36.106488 24.762299 32.281781 26.992617 33.255859 30.486328 L 33.257812 30.498047 L 33.263672 30.513672 L 36.291016 41.099609 C 33.755028 44.164957 31.716606 47.658467 30.302734 51.455078 L 19.623047 54.126953 C 16.073152 55.021138 16.072266 59.507721 16.072266 59.507812 L 16.072266 68.492188 C 16.072266 68.492279 16.073278 72.985361 19.630859 73.875 L 30.302734 76.544922 C 31.716606 80.341412 33.755028 83.833445 36.291016 86.898438 L 33.263672 97.484375 L 33.257812 97.501953 C 33.257633 97.502589 33.257991 97.50327 33.257812 97.503906 C 32.269112 101.02109 36.144531 103.25977 36.144531 103.25977 L 43.927734 107.75391 C 43.927734 107.75391 43.931579 107.75582 43.931641 107.75586 C 43.953413 107.7684 47.82009 109.98943 50.363281 107.36719 L 47.818359 110 L 50.367188 107.36523 L 58.019531 99.451172 C 59.964687 99.777081 61.962283 99.945313 64 99.945312 C 66.037713 99.945312 68.035313 99.777081 69.980469 99.451172 L 77.630859 107.36328 L 77.632812 107.36523 L 80.181641 110 L 77.636719 107.36719 C 80.159522 109.96841 83.985855 107.80302 84.068359 107.75586 L 91.855469 103.25977 C 91.855469 103.25977 95.730889 101.02109 94.742188 97.503906 L 94.742188 97.501953 L 94.736328 97.484375 L 91.708984 86.898438 C 94.245149 83.833445 96.283273 80.341412 97.697266 76.544922 L 108.37109 73.875 C 111.92871 72.985352 111.92773 68.492188 111.92773 68.492188 L 111.92773 59.507812 C 111.92773 59.507813 111.92871 55.014649 108.37109 54.125 L 97.697266 51.455078 C 96.283273 47.658406 94.245149 44.164957 91.708984 41.099609 L 94.736328 30.513672 L 94.742188 30.498047 L 94.744141 30.486328 C 95.720526 26.984137 91.875035 24.751558 91.855469 24.740234 L 84.072266 20.246094 C 84.072175 20.246042 84.068504 20.244224 84.068359 20.244141 C 84.01404 20.212982 80.171032 18.023649 77.638672 20.630859 L 80.181641 18 L 77.630859 20.636719 L 69.980469 28.548828 C 68.035313 28.223033 66.037713 28.054688 64 28.054688 C 61.962283 28.054688 59.964687 28.223025 58.019531 28.548828 L 50.369141 20.636719 L 47.818359 18 z M 64 36 A 27.999999 27.999997 0 0 1 92 64 A 27.999999 27.999997 0 0 1 64 92 A 27.999999 27.999997 0 0 1 36 64 A 27.999999 27.999997 0 0 1 64 36 z " /><path
|
||||||
id="Y"
|
id="Y"
|
||||||
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
||||||
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003"
|
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 9.4 KiB |
@@ -1,5 +1,5 @@
|
|||||||
project('yafi',
|
project('yafi',
|
||||||
version: '0.5',
|
version: '0.6',
|
||||||
meson_version: '>= 1.0.0',
|
meson_version: '>= 1.0.0',
|
||||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||||
)
|
)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB |
@@ -8,7 +8,7 @@
|
|||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg1"
|
id="svg1"
|
||||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
sodipodi:docname="spash.svg"
|
sodipodi:docname="splash.svg"
|
||||||
inkscape:export-filename="splash.png"
|
inkscape:export-filename="splash.png"
|
||||||
inkscape:export-xdpi="180"
|
inkscape:export-xdpi="180"
|
||||||
inkscape:export-ydpi="180"
|
inkscape:export-ydpi="180"
|
||||||
@@ -27,11 +27,11 @@
|
|||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
showguides="false"
|
showguides="false"
|
||||||
inkscape:zoom="2"
|
inkscape:zoom="2.8284271"
|
||||||
inkscape:cx="36.25"
|
inkscape:cx="118.26361"
|
||||||
inkscape:cy="178.75"
|
inkscape:cy="131.87541"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1876"
|
||||||
inkscape:window-height="1052"
|
inkscape:window-height="1025"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="0"
|
inkscape:window-y="0"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
@@ -127,79 +127,79 @@
|
|||||||
x="0"
|
x="0"
|
||||||
y="0" />
|
y="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 0,117.875 H 23.874996 L 43.75,97.999992 H 76"
|
d="M 0,117.875 H 23.874996 L 43.75,97.999992 H 76"
|
||||||
id="path4"
|
id="path4"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 0,97.875016 H 23.874996 L 43.75,78.000008 H 76"
|
d="M 0,97.875016 H 23.874996 L 43.75,78.000008 H 76"
|
||||||
id="path4-4"
|
id="path4-4"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 0,77.875008 H 23.874996 L 43.75,58 H 76"
|
d="M 0,77.875008 H 23.874996 L 43.75,58 H 76"
|
||||||
id="path4-9"
|
id="path4-9"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 0,57.875008 H 23.874996 L 43.75,38 H 76"
|
d="M 0,57.875008 H 23.874996 L 43.75,38 H 76"
|
||||||
id="path4-2"
|
id="path4-2"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 97.999999,0 V 16.000001"
|
d="M 97.999999,0 V 16.000001"
|
||||||
id="path5"
|
id="path5"
|
||||||
sodipodi:nodetypes="cc" />
|
sodipodi:nodetypes="cc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 118,0 V 16.000001"
|
d="M 118,0 V 16.000001"
|
||||||
id="path5-8"
|
id="path5-8"
|
||||||
sodipodi:nodetypes="cc" />
|
sodipodi:nodetypes="cc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 138.00001,0 V 16.000001"
|
d="M 138.00001,0 V 16.000001"
|
||||||
id="path5-4"
|
id="path5-4"
|
||||||
sodipodi:nodetypes="cc" />
|
sodipodi:nodetypes="cc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 157.99999,0 V 16.000001"
|
d="M 157.99999,0 V 16.000001"
|
||||||
id="path5-89"
|
id="path5-89"
|
||||||
sodipodi:nodetypes="cc" />
|
sodipodi:nodetypes="cc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 256,117.87502 H 232.125 L 212.25,98.000008 H 180"
|
d="M 256,117.87502 H 232.125 L 212.25,98.000008 H 180"
|
||||||
id="path4-1"
|
id="path4-1"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 255.625,97.875035 H 231.75 L 211.875,78.000023 H 180"
|
d="M 255.625,97.875035 H 231.75 L 211.875,78.000023 H 180"
|
||||||
id="path4-1-5"
|
id="path4-1-5"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 255.625,77.875012 H 231.75 L 211.875,58 H 180"
|
d="M 255.625,77.875012 H 231.75 L 211.875,58 H 180"
|
||||||
id="path4-1-6"
|
id="path4-1-6"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 255.625,57.875012 H 231.75 L 211.875,38 H 180"
|
d="M 255.625,57.875012 H 231.75 L 211.875,38 H 180"
|
||||||
id="path4-1-63"
|
id="path4-1-63"
|
||||||
sodipodi:nodetypes="cccc" />
|
sodipodi:nodetypes="cccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="m 192.16536,142.16357 -9.15729,-9.15728 H 163.00629 L 158.00001,128 l 0,-8"
|
d="m 192.16536,142.16357 -9.15729,-9.15728 H 163.00629 L 158.00001,128 l 0,-8"
|
||||||
id="path9" />
|
id="path9" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="m 147.1875,143.0625 v -5.875 L 138.00001,128 l 0,-8"
|
d="m 147.1875,143.0625 v -5.875 L 138.00001,128 l 0,-8"
|
||||||
id="path10" />
|
id="path10" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="M 119.98796,141.81833 118,139.83037 V 128 120"
|
d="M 119.98796,141.81833 118,139.83037 V 128 120"
|
||||||
id="path11" />
|
id="path11" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
|
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||||
d="m 101,142.125 -3.000001,-3 V 128 120"
|
d="m 101,142.125 -3.000001,-3 V 128 120"
|
||||||
id="path12" />
|
id="path12" />
|
||||||
<text
|
<text
|
||||||
@@ -232,7 +232,7 @@
|
|||||||
<g
|
<g
|
||||||
id="icon"
|
id="icon"
|
||||||
inkscape:label="icon"
|
inkscape:label="icon"
|
||||||
transform="translate(63.999998,4)">
|
transform="translate(63.999984,4)">
|
||||||
<g
|
<g
|
||||||
id="chip"
|
id="chip"
|
||||||
inkscape:label="chip"
|
inkscape:label="chip"
|
||||||
@@ -364,8 +364,8 @@
|
|||||||
<path
|
<path
|
||||||
id="cog"
|
id="cog"
|
||||||
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||||
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z"
|
inkscape:label="cog"
|
||||||
inkscape:label="cog" />
|
d="m 47.818359,18 2.542969,2.630859 c -2.531091,-2.605911 -6.371601,-0.420022 -6.429687,-0.386718 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 C 33.755122,44.16501 31.7167,47.65852 30.302828,51.455131 l -10.679687,2.671875 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 47.818359,110 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 108.37109,73.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 97.697266,51.455078 C 96.283273,47.658406 94.245149,44.164957 91.708984,41.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 80.181641,18 l -2.550782,2.636719 -7.65039,7.912109 C 68.035313,28.223033 66.037713,28.054688 64,28.054688 c -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z M 64,36 A 27.999999,27.999997 0 0 1 92,64 27.999999,27.999997 0 0 1 64,92 27.999999,27.999997 0 0 1 36,64 27.999999,27.999997 0 0 1 64,36 Z" />
|
||||||
<path
|
<path
|
||||||
id="Y"
|
id="Y"
|
||||||
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 149 KiB |
@@ -1,11 +1,15 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
from PyInstaller.utils.hooks import collect_data_files
|
from PyInstaller.utils.hooks import collect_data_files
|
||||||
import os
|
import os
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--onefile", action="store_true")
|
||||||
|
options = parser.parse_args()
|
||||||
|
|
||||||
datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else []
|
datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else []
|
||||||
datas += collect_data_files('yafi')
|
datas += collect_data_files('yafi')
|
||||||
|
|
||||||
|
|
||||||
a = Analysis(
|
a = Analysis(
|
||||||
['entrypoint.py'],
|
['entrypoint.py'],
|
||||||
pathex=[],
|
pathex=[],
|
||||||
@@ -20,6 +24,8 @@ a = Analysis(
|
|||||||
optimize=2,
|
optimize=2,
|
||||||
)
|
)
|
||||||
pyz = PYZ(a.pure)
|
pyz = PYZ(a.pure)
|
||||||
|
|
||||||
|
if options.onefile:
|
||||||
splash = Splash(
|
splash = Splash(
|
||||||
'splash.png',
|
'splash.png',
|
||||||
binaries=a.binaries,
|
binaries=a.binaries,
|
||||||
@@ -31,14 +37,22 @@ splash = Splash(
|
|||||||
always_on_top=True,
|
always_on_top=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
exe = EXE(
|
exe_args = (
|
||||||
pyz,
|
[
|
||||||
a.scripts,
|
a.scripts,
|
||||||
a.binaries,
|
a.binaries,
|
||||||
a.datas,
|
a.datas,
|
||||||
splash,
|
splash,
|
||||||
splash.binaries,
|
splash.binaries,
|
||||||
[],
|
]
|
||||||
|
if options.onefile
|
||||||
|
else [a.scripts]
|
||||||
|
)
|
||||||
|
|
||||||
|
exe = EXE(
|
||||||
|
pyz,
|
||||||
|
*exe_args,
|
||||||
|
exclude_binaries=not options.onefile,
|
||||||
name='YAFI',
|
name='YAFI',
|
||||||
debug=False,
|
debug=False,
|
||||||
bootloader_ignore_signals=False,
|
bootloader_ignore_signals=False,
|
||||||
@@ -54,3 +68,14 @@ exe = EXE(
|
|||||||
entitlements_file=None,
|
entitlements_file=None,
|
||||||
icon=['yafi.ico'],
|
icon=['yafi.ico'],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not options.onefile:
|
||||||
|
coll = COLLECT(
|
||||||
|
exe,
|
||||||
|
a.binaries,
|
||||||
|
a.datas,
|
||||||
|
strip=False,
|
||||||
|
upx=True,
|
||||||
|
upx_exclude=[],
|
||||||
|
name='YAFI',
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "yafi"
|
name = "yafi"
|
||||||
version = "0.5"
|
version = "0.6"
|
||||||
authors = [
|
authors = [
|
||||||
{ name="Steve-Tech" }
|
{ name="Steve-Tech" }
|
||||||
]
|
]
|
||||||
|
|||||||
14
python3-cros_ec_python.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "python3-cros_ec_python",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [
|
||||||
|
"pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"cros_ec_python\" --no-build-isolation"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"url": "https://files.pythonhosted.org/packages/33/11/c23a7acaa333589921a2f524517eb719dfb72628153ae22fcdf2e9052ac6/cros_ec_python-0.2.0-py3-none-any.whl",
|
||||||
|
"sha256": "d38e493fbcaf23bc4b613d1342a036cecc6506284afc74f37013a3eac85a01b9"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -27,17 +27,24 @@ import cros_ec_python.exceptions as ec_exceptions
|
|||||||
class HardwarePage(Gtk.Box):
|
class HardwarePage(Gtk.Box):
|
||||||
__gtype_name__ = 'HardwarePage'
|
__gtype_name__ = 'HardwarePage'
|
||||||
|
|
||||||
|
hw_als = Gtk.Template.Child()
|
||||||
|
hw_als_label = Gtk.Template.Child()
|
||||||
|
|
||||||
hw_chassis = Gtk.Template.Child()
|
hw_chassis = Gtk.Template.Child()
|
||||||
hw_chassis_label = Gtk.Template.Child()
|
hw_chassis_label = Gtk.Template.Child()
|
||||||
|
|
||||||
|
hw_fp_pwr = Gtk.Template.Child()
|
||||||
|
hw_fp_pwr_en = Gtk.Template.Child()
|
||||||
|
hw_fp_pwr_dis = Gtk.Template.Child()
|
||||||
|
|
||||||
hw_priv_cam = Gtk.Template.Child()
|
hw_priv_cam = Gtk.Template.Child()
|
||||||
hw_priv_cam_sw = Gtk.Template.Child()
|
hw_priv_cam_sw = Gtk.Template.Child()
|
||||||
hw_priv_mic = Gtk.Template.Child()
|
hw_priv_mic = Gtk.Template.Child()
|
||||||
hw_priv_mic_sw = Gtk.Template.Child()
|
hw_priv_mic_sw = Gtk.Template.Child()
|
||||||
|
hw_lid_open = Gtk.Template.Child()
|
||||||
hw_fp_pwr = Gtk.Template.Child()
|
hw_lid_open_sw = Gtk.Template.Child()
|
||||||
hw_fp_pwr_en = Gtk.Template.Child()
|
hw_pwr_btn = Gtk.Template.Child()
|
||||||
hw_fp_pwr_dis = Gtk.Template.Child()
|
hw_pwr_btn_sw = Gtk.Template.Child()
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
@@ -66,7 +73,13 @@ class HardwarePage(Gtk.Box):
|
|||||||
GLib.timeout_add_seconds(1, self._update_hardware, app)
|
GLib.timeout_add_seconds(1, self._update_hardware, app)
|
||||||
|
|
||||||
def _update_hardware(self, app):
|
def _update_hardware(self, app):
|
||||||
success = False
|
# Memmap (ALS and Lid Open)
|
||||||
|
als = ec_commands.memmap.get_als(app.cros_ec)
|
||||||
|
self.hw_als_label.set_label(f"{als[0]} lux" if als[0] != 65535 else "MAX")
|
||||||
|
switches = ec_commands.memmap.get_switches(app.cros_ec)
|
||||||
|
self.hw_lid_open_sw.set_active(switches["lid_open"])
|
||||||
|
self.hw_pwr_btn_sw.set_active(switches["power_button_pressed"])
|
||||||
|
|
||||||
# Chassis
|
# Chassis
|
||||||
if not ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION in app.no_support:
|
if not ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION in app.no_support:
|
||||||
try:
|
try:
|
||||||
@@ -82,8 +95,6 @@ class HardwarePage(Gtk.Box):
|
|||||||
self.hw_chassis.set_subtitle(
|
self.hw_chassis.set_subtitle(
|
||||||
"Currently " + ("Open" if ec_chassis_open else "Closed")
|
"Currently " + ("Open" if ec_chassis_open else "Closed")
|
||||||
)
|
)
|
||||||
|
|
||||||
success = True
|
|
||||||
except ec_exceptions.ECError as e:
|
except ec_exceptions.ECError as e:
|
||||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||||
app.no_support.append(
|
app.no_support.append(
|
||||||
@@ -104,8 +115,6 @@ class HardwarePage(Gtk.Box):
|
|||||||
)
|
)
|
||||||
self.hw_priv_cam_sw.set_active(ec_privacy["camera"])
|
self.hw_priv_cam_sw.set_active(ec_privacy["camera"])
|
||||||
self.hw_priv_mic_sw.set_active(ec_privacy["microphone"])
|
self.hw_priv_mic_sw.set_active(ec_privacy["microphone"])
|
||||||
|
|
||||||
success = True
|
|
||||||
except ec_exceptions.ECError as e:
|
except ec_exceptions.ECError as e:
|
||||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||||
app.no_support.append(
|
app.no_support.append(
|
||||||
@@ -116,4 +125,4 @@ class HardwarePage(Gtk.Box):
|
|||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
return app.current_page == 4 and success
|
return app.current_page == 4
|
||||||
|
|||||||
138
yafi/leds.py
@@ -27,35 +27,78 @@ import cros_ec_python.exceptions as ec_exceptions
|
|||||||
class LedsPage(Gtk.Box):
|
class LedsPage(Gtk.Box):
|
||||||
__gtype_name__ = 'LedsPage'
|
__gtype_name__ = 'LedsPage'
|
||||||
|
|
||||||
|
first_run = True
|
||||||
|
fp_led_version = 1
|
||||||
|
|
||||||
led_pwr = Gtk.Template.Child()
|
led_pwr = Gtk.Template.Child()
|
||||||
led_pwr_scale = Gtk.Template.Child()
|
led_pwr_scale = Gtk.Template.Child()
|
||||||
|
led_pwr_scale_adj = Gtk.Template.Child()
|
||||||
|
|
||||||
led_kbd = Gtk.Template.Child()
|
led_kbd = Gtk.Template.Child()
|
||||||
led_kbd_scale = Gtk.Template.Child()
|
led_kbd_scale = Gtk.Template.Child()
|
||||||
|
|
||||||
led_advanced = Gtk.Template.Child()
|
led_advanced = Gtk.Template.Child()
|
||||||
|
|
||||||
led_pwr_colour = Gtk.Template.Child()
|
|
||||||
|
|
||||||
led_chg_colour = Gtk.Template.Child()
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
def setup(self, app):
|
def setup(self, app):
|
||||||
# Power LED
|
# Power LED
|
||||||
|
fp_led_level_text = ["High", "Medium", "Low", "Ultra Low"]
|
||||||
try:
|
try:
|
||||||
|
|
||||||
def handle_led_pwr(scale):
|
def handle_led_pwr(scale):
|
||||||
|
match self.fp_led_version:
|
||||||
|
case 0:
|
||||||
value = int(abs(scale.get_value() - 2))
|
value = int(abs(scale.get_value() - 2))
|
||||||
ec_commands.framework_laptop.set_fp_led_level(app.cros_ec, value)
|
ec_commands.framework_laptop.set_fp_led_level(
|
||||||
self.led_pwr.set_subtitle(["High", "Medium", "Low"][value])
|
app.cros_ec, value
|
||||||
|
)
|
||||||
|
self.led_pwr.set_subtitle(fp_led_level_text[value])
|
||||||
|
case 1:
|
||||||
|
value = int(scale.get_value())
|
||||||
|
ec_commands.framework_laptop.set_fp_led_percent(
|
||||||
|
app.cros_ec, value
|
||||||
|
)
|
||||||
|
self.led_pwr.set_subtitle(f"{value}%")
|
||||||
|
|
||||||
|
if self.fp_led_version == 1:
|
||||||
|
try:
|
||||||
|
current_fp_levels = (
|
||||||
|
ec_commands.framework_laptop.get_fp_led_levels_v1(
|
||||||
|
app.cros_ec
|
||||||
|
).value
|
||||||
|
)
|
||||||
|
self.led_pwr_scale.set_value(current_fp_levels["percentage"])
|
||||||
|
if current_fp_levels["level"] < len(fp_led_level_text):
|
||||||
|
self.led_pwr.set_subtitle(
|
||||||
|
f"{fp_led_level_text[current_fp_levels['level']]} ({current_fp_levels['percentage']}%)"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.led_pwr.set_subtitle(f"{current_fp_levels['percentage']}%")
|
||||||
|
|
||||||
|
except ec_exceptions.ECError as e:
|
||||||
|
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_VERSION:
|
||||||
|
self.fp_led_version = 0
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
if self.fp_led_version == 0:
|
||||||
current_fp_level = ec_commands.framework_laptop.get_fp_led_level(
|
current_fp_level = ec_commands.framework_laptop.get_fp_led_level(
|
||||||
app.cros_ec
|
app.cros_ec
|
||||||
).value
|
).value
|
||||||
|
if current_fp_level < len(fp_led_level_text):
|
||||||
|
self.led_pwr_scale_adj.set_upper(2)
|
||||||
self.led_pwr_scale.set_value(abs(current_fp_level - 2))
|
self.led_pwr_scale.set_value(abs(current_fp_level - 2))
|
||||||
self.led_pwr.set_subtitle(["High", "Medium", "Low"][current_fp_level])
|
self.led_pwr.set_subtitle(f"{fp_led_level_text[current_fp_level]}")
|
||||||
|
else:
|
||||||
|
# Disable if an unsupported level is set
|
||||||
|
self.led_pwr_scale.set_sensitive(False)
|
||||||
|
current_fp_percent = (
|
||||||
|
ec_commands.framework_laptop.get_fp_led_percent(app.cros_ec)
|
||||||
|
)
|
||||||
|
self.led_pwr_scale.set_value(current_fp_percent)
|
||||||
|
self.led_pwr.set_subtitle(f"Custom {current_fp_percent}%")
|
||||||
|
|
||||||
self.led_pwr_scale.connect("value-changed", handle_led_pwr)
|
self.led_pwr_scale.connect("value-changed", handle_led_pwr)
|
||||||
except ec_exceptions.ECError as e:
|
except ec_exceptions.ECError as e:
|
||||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||||
@@ -84,31 +127,38 @@ class LedsPage(Gtk.Box):
|
|||||||
self.led_kbd.set_visible(False)
|
self.led_kbd.set_visible(False)
|
||||||
|
|
||||||
# Advanced options
|
# Advanced options
|
||||||
if ec_commands.general.get_cmd_versions(
|
if (
|
||||||
|
ec_commands.general.get_cmd_versions(
|
||||||
app.cros_ec, ec_commands.leds.EC_CMD_LED_CONTROL
|
app.cros_ec, ec_commands.leds.EC_CMD_LED_CONTROL
|
||||||
|
)
|
||||||
|
and self.first_run
|
||||||
):
|
):
|
||||||
|
|
||||||
# Advanced: Power LED
|
|
||||||
led_pwr_colour_strings = self.led_pwr_colour.get_model()
|
|
||||||
|
|
||||||
all_colours = ["Red", "Green", "Blue", "Yellow", "White", "Amber"]
|
all_colours = ["Red", "Green", "Blue", "Yellow", "White", "Amber"]
|
||||||
|
led_names = {
|
||||||
def add_colours(strings, led_id):
|
ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED: "Battery LED",
|
||||||
# Auto and Off should already be present
|
ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED: "Power LED",
|
||||||
if strings.get_n_items() <= 2:
|
ec_commands.leds.EcLedId.EC_LED_ID_ADAPTER_LED: "Adapter LED",
|
||||||
supported_colours = ec_commands.leds.led_control_get_max_values(
|
ec_commands.leds.EcLedId.EC_LED_ID_LEFT_LED: "Left LED",
|
||||||
|
ec_commands.leds.EcLedId.EC_LED_ID_RIGHT_LED: "Right LED",
|
||||||
|
ec_commands.leds.EcLedId.EC_LED_ID_RECOVERY_HW_REINIT_LED: "Recovery LED",
|
||||||
|
ec_commands.leds.EcLedId.EC_LED_ID_SYSRQ_DEBUG_LED: "SysRq LED",
|
||||||
|
}
|
||||||
|
leds = {}
|
||||||
|
for i in range(ec_commands.leds.EcLedId.EC_LED_ID_COUNT.value):
|
||||||
|
try:
|
||||||
|
led_id = ec_commands.leds.EcLedId(i)
|
||||||
|
leds[led_id] = ec_commands.leds.led_control_get_max_values(
|
||||||
app.cros_ec, led_id
|
app.cros_ec, led_id
|
||||||
)
|
)
|
||||||
for i, colour in enumerate(all_colours):
|
|
||||||
if supported_colours[i]:
|
|
||||||
strings.append(colour)
|
|
||||||
|
|
||||||
try:
|
|
||||||
add_colours(
|
|
||||||
led_pwr_colour_strings, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED
|
|
||||||
)
|
|
||||||
except ec_exceptions.ECError as e:
|
except ec_exceptions.ECError as e:
|
||||||
self.led_pwr_colour.set_sensitive(False)
|
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_PARAM:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
# Power LED does not support Blue, even though Intel models think they do
|
||||||
|
leds[ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED][2] = 0
|
||||||
|
|
||||||
def handle_led_colour(combobox, led_id):
|
def handle_led_colour(combobox, led_id):
|
||||||
colour = combobox.get_selected() - 2
|
colour = combobox.get_selected() - 2
|
||||||
@@ -132,30 +182,20 @@ class LedsPage(Gtk.Box):
|
|||||||
100,
|
100,
|
||||||
ec_commands.leds.EcLedColors(colour_idx),
|
ec_commands.leds.EcLedColors(colour_idx),
|
||||||
)
|
)
|
||||||
|
for led_id, supported_colours in leds.items():
|
||||||
self.led_pwr_colour.connect(
|
if any(supported_colours):
|
||||||
|
combo = Adw.ComboRow(title=led_names[led_id])
|
||||||
|
model = Gtk.StringList.new(["Auto", "Off"])
|
||||||
|
for i, colour in enumerate(all_colours):
|
||||||
|
if supported_colours[i]:
|
||||||
|
model.append(colour)
|
||||||
|
combo.set_model(model)
|
||||||
|
combo.connect(
|
||||||
"notify::selected",
|
"notify::selected",
|
||||||
lambda combo, _: handle_led_colour(
|
lambda combobox, _, led_id=led_id: handle_led_colour(
|
||||||
combo, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED
|
combobox, led_id
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.led_advanced.add_row(combo)
|
||||||
|
|
||||||
# Advanced: Charging LED
|
self.first_run = False
|
||||||
led_chg_colour_strings = self.led_chg_colour.get_model()
|
|
||||||
|
|
||||||
try:
|
|
||||||
add_colours(
|
|
||||||
led_chg_colour_strings,
|
|
||||||
ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED,
|
|
||||||
)
|
|
||||||
except ec_exceptions.ECError as e:
|
|
||||||
self.led_chg_colour.set_sensitive(False)
|
|
||||||
|
|
||||||
self.led_chg_colour.connect(
|
|
||||||
"notify::selected",
|
|
||||||
lambda combo, _: handle_led_colour(
|
|
||||||
combo, ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED
|
|
||||||
),
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.led_advanced.set_visible(False)
|
|
||||||
|
|||||||
19
yafi/main.py
@@ -18,6 +18,7 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
import threading
|
import threading
|
||||||
@@ -67,7 +68,8 @@ class YafiApplication(Adw.Application):
|
|||||||
self.win = YafiWindow(application=self)
|
self.win = YafiWindow(application=self)
|
||||||
|
|
||||||
# Update the splash screen
|
# Update the splash screen
|
||||||
if getattr(sys, 'frozen', False):
|
splash = getattr(sys, 'frozen', False) and '_PYI_SPLASH_IPC' in os.environ
|
||||||
|
if splash:
|
||||||
import pyi_splash
|
import pyi_splash
|
||||||
pyi_splash.update_text("Detecting EC")
|
pyi_splash.update_text("Detecting EC")
|
||||||
|
|
||||||
@@ -87,13 +89,13 @@ class YafiApplication(Adw.Application):
|
|||||||
)
|
)
|
||||||
self.show_error("EC Initalisation Error", message)
|
self.show_error("EC Initalisation Error", message)
|
||||||
|
|
||||||
if getattr(sys, 'frozen', False):
|
if splash:
|
||||||
pyi_splash.close()
|
pyi_splash.close()
|
||||||
|
|
||||||
self.win.present()
|
self.win.present()
|
||||||
return
|
return
|
||||||
|
|
||||||
if getattr(sys, 'frozen', False):
|
if splash:
|
||||||
pyi_splash.update_text("Building Interface")
|
pyi_splash.update_text("Building Interface")
|
||||||
|
|
||||||
self.change_page(self.win.content, ThermalsPage())
|
self.change_page(self.win.content, ThermalsPage())
|
||||||
@@ -103,7 +105,7 @@ class YafiApplication(Adw.Application):
|
|||||||
("LEDs", LedsPage()),
|
("LEDs", LedsPage()),
|
||||||
("Battery", BatteryPage()),
|
("Battery", BatteryPage()),
|
||||||
("Battery Limiter", BatteryLimiterPage()),
|
("Battery Limiter", BatteryLimiterPage()),
|
||||||
("Hardware", HardwarePage()),
|
("Sensors", HardwarePage()),
|
||||||
("About", None),
|
("About", None),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -123,7 +125,7 @@ class YafiApplication(Adw.Application):
|
|||||||
|
|
||||||
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
|
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
|
||||||
|
|
||||||
if getattr(sys, 'frozen', False):
|
if splash:
|
||||||
pyi_splash.close()
|
pyi_splash.close()
|
||||||
|
|
||||||
self.win.present()
|
self.win.present()
|
||||||
@@ -133,14 +135,15 @@ class YafiApplication(Adw.Application):
|
|||||||
about = Adw.AboutDialog(
|
about = Adw.AboutDialog(
|
||||||
application_icon="au.stevetech.yafi",
|
application_icon="au.stevetech.yafi",
|
||||||
application_name="Yet Another Framework Interface",
|
application_name="Yet Another Framework Interface",
|
||||||
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n"
|
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n\n"
|
||||||
+ "It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.",
|
+ "It is written in Python with a GTK4 Adwaita theme, and uses the CrOS_EC_Python library to communicate with the EC.\n\n"
|
||||||
|
+ "YAFI is not affiliated with Framework Computer Inc. in any way.",
|
||||||
copyright="© 2025 Stephen Horvath",
|
copyright="© 2025 Stephen Horvath",
|
||||||
developer_name="Stephen Horvath",
|
developer_name="Stephen Horvath",
|
||||||
developers=["Stephen Horvath https://github.com/Steve-Tech"],
|
developers=["Stephen Horvath https://github.com/Steve-Tech"],
|
||||||
issue_url="https://github.com/Steve-Tech/YAFI/issues",
|
issue_url="https://github.com/Steve-Tech/YAFI/issues",
|
||||||
license_type=Gtk.License.GPL_2_0,
|
license_type=Gtk.License.GPL_2_0,
|
||||||
version="0.5",
|
version="0.6",
|
||||||
website="https://github.com/Steve-Tech/YAFI",
|
website="https://github.com/Steve-Tech/YAFI",
|
||||||
)
|
)
|
||||||
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])
|
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<!-- Created with Cambalache 0.96.1 -->
|
<!-- Created with Cambalache 0.96.1 -->
|
||||||
<interface>
|
<interface>
|
||||||
<!-- interface-name hardware.ui -->
|
<!-- interface-name hardware.ui -->
|
||||||
<!-- interface-description The Hardware page for YAFI -->
|
<!-- interface-description The Sensors page for YAFI -->
|
||||||
<!-- interface-copyright Steve-Tech -->
|
<!-- interface-copyright Steve-Tech -->
|
||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<requires lib="libadwaita" version="1.0"/>
|
<requires lib="libadwaita" version="1.0"/>
|
||||||
@@ -15,7 +15,15 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow">
|
<object class="AdwActionRow">
|
||||||
<property name="selectable">False</property>
|
<property name="selectable">False</property>
|
||||||
<property name="title">Hardware Status</property>
|
<property name="title">Sensors</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow" id="hw_als">
|
||||||
|
<property name="title">Ambient Light Sensor</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="hw_als_label"/>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -26,6 +34,30 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwActionRow" id="hw_fp_pwr">
|
||||||
|
<property name="title">Fingerprint</property>
|
||||||
|
<property name="visible">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
<property name="spacing">5</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="hw_fp_pwr_en">
|
||||||
|
<property name="label">Enable</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="hw_fp_pwr_dis">
|
||||||
|
<property name="label">Disable</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow" id="hw_priv_cam">
|
<object class="AdwActionRow" id="hw_priv_cam">
|
||||||
<property name="subtitle">Use Privacy Switch</property>
|
<property name="subtitle">Use Privacy Switch</property>
|
||||||
@@ -65,23 +97,35 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow" id="hw_fp_pwr">
|
<object class="AdwActionRow" id="hw_lid_open">
|
||||||
<property name="title">Fingerprint</property>
|
<property name="title">Lid Open</property>
|
||||||
<property name="visible">False</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
<property name="spacing">5</property>
|
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="hw_fp_pwr_en">
|
<object class="GtkSwitch" id="hw_lid_open_sw">
|
||||||
<property name="label">Enable</property>
|
<property name="active">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="hw_fp_pwr_dis">
|
<object class="AdwActionRow" id="hw_pwr_btn">
|
||||||
<property name="label">Disable</property>
|
<property name="title">Power Button Pressed</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSwitch" id="hw_pwr_btn_sw">
|
||||||
|
<property name="active">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
6
yafi/ui/leds.cmb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
||||||
|
<!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd">
|
||||||
|
<!-- Created with Cambalache 0.96.1 -->
|
||||||
|
<cambalache-project version="0.96.0" target_tk="gtk-4.0">
|
||||||
|
<ui template-class="LedsPage" filename="leds.ui" sha256="a52e82a54a64ff7e5ca5a83af2ee096c1be44c379cc286c65fbee8eaf2400324"/>
|
||||||
|
</cambalache-project>
|
||||||
@@ -26,11 +26,10 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkScale" id="led_pwr_scale">
|
<object class="GtkScale" id="led_pwr_scale">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment" id="led_pwr_scale_adj">
|
||||||
<property name="page-increment">1.0</property>
|
<property name="page-increment">1.0</property>
|
||||||
<property name="step-increment">1.0</property>
|
<property name="step-increment">1.0</property>
|
||||||
<property name="upper">2.0</property>
|
<property name="upper">100.0</property>
|
||||||
<property name="value">2.0</property>
|
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
@@ -69,52 +68,6 @@
|
|||||||
<property name="selectable">False</property>
|
<property name="selectable">False</property>
|
||||||
<property name="subtitle">These options break normal functionality</property>
|
<property name="subtitle">These options break normal functionality</property>
|
||||||
<property name="title">Advanced Options</property>
|
<property name="title">Advanced Options</property>
|
||||||
<child>
|
|
||||||
<object class="AdwPreferencesGroup">
|
|
||||||
<property name="description">When using these options, the power LED may not turn off with the computer.</property>
|
|
||||||
<property name="margin-bottom">5</property>
|
|
||||||
<property name="margin-end">5</property>
|
|
||||||
<property name="margin-start">5</property>
|
|
||||||
<property name="margin-top">5</property>
|
|
||||||
<property name="title">Power Button LED</property>
|
|
||||||
<child>
|
|
||||||
<object class="AdwComboRow" id="led_pwr_colour">
|
|
||||||
<property name="model">
|
|
||||||
<object class="GtkStringList">
|
|
||||||
<items>
|
|
||||||
<item>Auto</item>
|
|
||||||
<item>Off</item>
|
|
||||||
</items>
|
|
||||||
</object>
|
|
||||||
</property>
|
|
||||||
<property name="title">Colour</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="AdwPreferencesGroup">
|
|
||||||
<property name="description">When using these options, the charging indicator will no longer indicate charging.</property>
|
|
||||||
<property name="margin-bottom">5</property>
|
|
||||||
<property name="margin-end">5</property>
|
|
||||||
<property name="margin-start">5</property>
|
|
||||||
<property name="margin-top">5</property>
|
|
||||||
<property name="title">Charging Indicators</property>
|
|
||||||
<child>
|
|
||||||
<object class="AdwComboRow" id="led_chg_colour">
|
|
||||||
<property name="model">
|
|
||||||
<object class="GtkStringList">
|
|
||||||
<items>
|
|
||||||
<item>Auto</item>
|
|
||||||
<item>Off</item>
|
|
||||||
</items>
|
|
||||||
</object>
|
|
||||||
</property>
|
|
||||||
<property name="title">Colour</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
<cambalache-project version="0.96.0" target_tk="gtk-4.0">
|
<cambalache-project version="0.96.0" target_tk="gtk-4.0">
|
||||||
<ui template-class="YafiWindow" filename="yafi.ui" sha256="9d1b2f030e4a816eb0b1aa53ae1d80c5b50a2f4646e32c7a64803eb6f6ed3947"/>
|
<ui template-class="YafiWindow" filename="yafi.ui" sha256="9d1b2f030e4a816eb0b1aa53ae1d80c5b50a2f4646e32c7a64803eb6f6ed3947"/>
|
||||||
<ui template-class="ThermalsPage" filename="thermals.ui" sha256="e301e65649005315ff60d250b60a47f6250ad6feb27db104051fcf0143cde173"/>
|
<ui template-class="ThermalsPage" filename="thermals.ui" sha256="e301e65649005315ff60d250b60a47f6250ad6feb27db104051fcf0143cde173"/>
|
||||||
<ui template-class="LedsPage" filename="leds.ui" sha256="0350d22d570de039d63602ba40925f17fff6680fd5909d2ebf19600f351eb0f2"/>
|
<ui template-class="LedsPage" filename="leds.ui" sha256="abc3ee759974a5c92feb48cc258dbe7271d0402facf71fd5e779f2bb1a277e16"/>
|
||||||
<ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="b5d41b19cb1fb7ca5b4bcfae43244e54111f5e8d8c51d95448d6a92b5185d2c4"/>
|
<ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="b5d41b19cb1fb7ca5b4bcfae43244e54111f5e8d8c51d95448d6a92b5185d2c4"/>
|
||||||
<ui template-class="HardwarePage" filename="hardware.ui" sha256="f4deec4e38e683fde97656802dbfb2a638ab46a0e36af5c9a37f277f49e2aabb"/>
|
<ui template-class="HardwarePage" filename="hardware.ui" sha256="37ea282198d9f60435f80e4adf8256cd2249e590dcad4b63af634d828673f1bf"/>
|
||||||
<ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/>
|
<ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/>
|
||||||
</cambalache-project>
|
</cambalache-project>
|
||||||
|
|||||||