Compare commits
No commits in common. "main" and "main" have entirely different histories.
7 changed files with 30 additions and 110 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,2 @@
|
|||
*.pyc
|
||||
fwledmonitor.service
|
||||
venv/
|
||||
16
.vscode/launch.json
vendored
Normal file
16
.vscode/launch.json
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Current File",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "integratedTerminal",
|
||||
"justMyCode": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ from commands import Commands, send_command
|
|||
|
||||
# External Dependencies
|
||||
import numpy as np
|
||||
import serial # pip install pyserial, apt install python3-serial
|
||||
import serial # pyserial
|
||||
from serial.tools import list_ports
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,31 +1,6 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
INSTALL_DIR="/opt/fw-led-monitor"
|
||||
|
||||
echo "Installing to $INSTALL_DIR..."
|
||||
|
||||
sudo mkdir -p "$INSTALL_DIR"
|
||||
sudo cp "$SCRIPT_DIR/led_system_monitor.py" "$INSTALL_DIR/"
|
||||
sudo cp "$SCRIPT_DIR/drawing.py" "$INSTALL_DIR/"
|
||||
sudo cp "$SCRIPT_DIR/monitors.py" "$INSTALL_DIR/"
|
||||
sudo cp "$SCRIPT_DIR/commands.py" "$INSTALL_DIR/"
|
||||
sudo cp "$SCRIPT_DIR/requirements.txt" "$INSTALL_DIR/"
|
||||
sudo cp "$SCRIPT_DIR/run.sh" "$INSTALL_DIR/"
|
||||
sudo chmod +x "$INSTALL_DIR/run.sh"
|
||||
sudo chown -R root:root "$INSTALL_DIR"
|
||||
|
||||
VENV_DIR="$INSTALL_DIR/venv"
|
||||
if [ ! -d "$VENV_DIR" ]; then
|
||||
sudo python3 -m venv "$VENV_DIR"
|
||||
fi
|
||||
|
||||
sudo "$VENV_DIR/bin/pip" install --upgrade pip
|
||||
sudo "$VENV_DIR/bin/pip" install -r "$INSTALL_DIR/requirements.txt"
|
||||
|
||||
rm -f "$SCRIPT_DIR/fwledmonitor.service" || true
|
||||
cat <<EOF > "$SCRIPT_DIR/fwledmonitor.service"
|
||||
chmod +x run.sh
|
||||
rm -f fwledmonitor.service || true
|
||||
cat <<EOF >>./fwledmonitor.service
|
||||
[Unit]
|
||||
Description=Framework 16 LED System Monitor
|
||||
After=network.service
|
||||
|
|
@ -33,25 +8,14 @@ After=network.service
|
|||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
WorkingDirectory=$INSTALL_DIR
|
||||
ExecStart=/bin/bash $INSTALL_DIR/run.sh
|
||||
WorkingDirectory=$PWD
|
||||
ExecStart=sh -c "'$PWD/run.sh'"
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
|
||||
sudo systemctl stop fwledmonitor || true
|
||||
|
||||
SERVICE_DIR="/etc/systemd/system"
|
||||
if ! sudo cp "$SCRIPT_DIR/fwledmonitor.service" "$SERVICE_DIR" 2>/dev/null; then
|
||||
SERVICE_DIR="/lib/systemd/system"
|
||||
sudo cp "$SCRIPT_DIR/fwledmonitor.service" "$SERVICE_DIR"
|
||||
fi
|
||||
|
||||
sudo systemctl stop fwledmonitor
|
||||
sudo cp fwledmonitor.service /lib/systemd/system
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable fwledmonitor
|
||||
|
||||
echo "Installation complete. Service installed to $INSTALL_DIR"
|
||||
|
||||
sudo service fwledmonitor start
|
||||
51
monitors.py
51
monitors.py
|
|
@ -16,14 +16,6 @@ class DiskMonitor:
|
|||
self.max_history_size = hysterisis_time
|
||||
|
||||
def get(self):
|
||||
"""
|
||||
Gets the percentage of the system's disk throughput for reading and writing.
|
||||
|
||||
Returns:
|
||||
A tuple containing the percentages of the system's disk throughput for reading
|
||||
and writing data as floats between 0.0 and 1.0. This is a ratio based on
|
||||
the highest disk throughput rate over the history of the monitor.
|
||||
"""
|
||||
try:
|
||||
disk_io = psutil.disk_io_counters()
|
||||
read_usage = disk_io.read_bytes
|
||||
|
|
@ -60,14 +52,6 @@ class NetworkMonitor:
|
|||
self.max_history_size = hysterisis_time
|
||||
|
||||
def get(self):
|
||||
"""
|
||||
Gets the percentage of the system's network usage.
|
||||
|
||||
Returns:
|
||||
A tuple containing the percentages of the system's network usage for sending
|
||||
and receiving data as floats between 0.0 and 1.0. This is a ratio based on
|
||||
the highest network usage rate over the history of the monitor.
|
||||
"""
|
||||
try:
|
||||
net_io = psutil.net_io_counters()
|
||||
sent_usage = net_io.bytes_sent
|
||||
|
|
@ -102,12 +86,6 @@ class CPUMonitor:
|
|||
self.max_history_size = hysterisis_time
|
||||
|
||||
def get(self):
|
||||
"""
|
||||
Gets the percentage of the system's CPU usage per core.
|
||||
|
||||
Returns:
|
||||
A list of values between 0.0 and 1.0 which is scaled to the CPU usage per core
|
||||
"""
|
||||
try:
|
||||
cpu_usage = psutil.cpu_percent(percpu=True)
|
||||
for i in range(self.cpu_count):
|
||||
|
|
@ -130,24 +108,12 @@ class CPUMonitor:
|
|||
class MemoryMonitor:
|
||||
@staticmethod
|
||||
def get():
|
||||
"""
|
||||
Gets the percentage of the system's memory usage.
|
||||
|
||||
Returns:
|
||||
A value between 0.0 and 1.0 which is scaled to the memory usage
|
||||
"""
|
||||
return psutil.virtual_memory().percent / 100.0
|
||||
|
||||
|
||||
class BatteryMonitor:
|
||||
@staticmethod
|
||||
def get():
|
||||
"""
|
||||
Gets the percentage of the battery's charge and whether it is plugged in.
|
||||
|
||||
Returns:
|
||||
A tuple containing the battery percentage as a float between 0.0 and 1.0 and whether it is plugged in
|
||||
"""
|
||||
battery = psutil.sensors_battery()
|
||||
if battery is not None:
|
||||
battery_percentage = battery.percent / 100.0
|
||||
|
|
@ -160,25 +126,16 @@ class BatteryMonitor:
|
|||
|
||||
|
||||
def get_monitor_brightness():
|
||||
"""
|
||||
Gets the brightness of the main laptop display so that we can scale the LED Matrix
|
||||
brightness to match. Handles operating system or configuration specific logic to
|
||||
retrieve the brightness value.
|
||||
|
||||
Returns:
|
||||
A value between 0.0 and 1.0 which is scaled to the monitor's brightness
|
||||
"""
|
||||
try:
|
||||
if os.name == 'nt':
|
||||
return wmi.WMI(namespace='wmi').WmiMonitorBrightness()[0].CurrentBrightness / 100.0
|
||||
else:
|
||||
gpu_designator = os.listdir('/sys/class/backlight')[0] # Get the gpu designator
|
||||
brightness_max = int(open(f'/sys/class/backlight/{gpu_designator}/max_brightness', 'r').read())
|
||||
return int(open(f'/sys/class/backlight/{gpu_designator}/brightness', 'r').read()) / brightness_max
|
||||
try: # First try the dGPU brightness
|
||||
return int(open('/sys/class/backlight/amdgpu_bl2/brightness', 'r').read()) / 255.0
|
||||
except: # If that doesn't work, try the iGPU brightness
|
||||
return int(open('/sys/class/backlight/amdgpu_bl1/brightness', 'r').read()) / 255.0
|
||||
except Exception as e:
|
||||
print(f"Error in get_monitor_brightness(): {e}")
|
||||
return 1.0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(get_monitor_brightness())
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
pyserial
|
||||
numpy
|
||||
psutil
|
||||
wmi # only for windows
|
||||
16
run.sh
16
run.sh
|
|
@ -1,15 +1,3 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
sudo apt install python3-numpy python3-psutil
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
VENV_DIR="$SCRIPT_DIR/venv"
|
||||
|
||||
if [ ! -d "$VENV_DIR" ]; then
|
||||
python3 -m venv "$VENV_DIR"
|
||||
fi
|
||||
|
||||
source "$VENV_DIR/bin/activate"
|
||||
pip install --upgrade pip
|
||||
pip install -r "$SCRIPT_DIR/requirements.txt"
|
||||
|
||||
python "$SCRIPT_DIR/led_system_monitor.py"
|
||||
python3 ./led_system_monitor.py
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue