Compare commits
10 commits
ecbb5e8ede
...
953a64459a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
953a64459a | ||
![]() |
7775921a3d | ||
![]() |
6db1568718 | ||
![]() |
eb75090b37 | ||
![]() |
830cee6d72 | ||
![]() |
5711f591a3 | ||
![]() |
72063ba9c6 | ||
![]() |
69ca29e700 | ||
![]() |
2ebfc20537 | ||
![]() |
f4a8e05b90 |
11 changed files with 516 additions and 484 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
*.pyc
|
*.pyc
|
||||||
|
fwledmonitor.service
|
||||||
|
|
|
@ -187,7 +187,7 @@ def init_device(location = "1-4.2"):
|
||||||
# PID = 5678
|
# PID = 5678
|
||||||
device_list = list_ports.comports()
|
device_list = list_ports.comports()
|
||||||
for device in device_list:
|
for device in device_list:
|
||||||
if device.location == location:
|
if device.location and device.location.startswith(location):
|
||||||
s = serial.Serial(device.device, 115200)
|
s = serial.Serial(device.device, 115200)
|
||||||
return s
|
return s
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -195,10 +195,11 @@ def init_device(location = "1-4.2"):
|
||||||
|
|
||||||
|
|
||||||
class DrawingThread(threading.Thread):
|
class DrawingThread(threading.Thread):
|
||||||
def __init__(self, serial_port, input_queue):
|
def __init__(self, port_location, input_queue):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.daemon = True
|
self.daemon = True
|
||||||
self.serial_port = init_device(serial_port)
|
self.port_location = port_location
|
||||||
|
self.serial_port = init_device(self.port_location)
|
||||||
self.input_queue = input_queue
|
self.input_queue = input_queue
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -210,5 +211,5 @@ class DrawingThread(threading.Thread):
|
||||||
print(f"Error in DrawingThread: {e}")
|
print(f"Error in DrawingThread: {e}")
|
||||||
del self.serial_port
|
del self.serial_port
|
||||||
time.sleep(1.0)
|
time.sleep(1.0)
|
||||||
self.serial_port = init_device(self.serial_port)
|
self.serial_port = init_device(self.port_location)
|
||||||
|
|
||||||
|
|
21
install_as_service.sh
Normal file
21
install_as_service.sh
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
chmod +x run.sh
|
||||||
|
rm -f fwledmonitor.service || true
|
||||||
|
cat <<EOF >>./fwledmonitor.service
|
||||||
|
[Unit]
|
||||||
|
Description=Framework 16 LED System Monitor
|
||||||
|
After=network.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Restart=always
|
||||||
|
WorkingDirectory=$PWD
|
||||||
|
ExecStart=sh -c "'$PWD/run.sh'"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo systemctl stop fwledmonitor
|
||||||
|
sudo cp fwledmonitor.service /lib/systemd/system
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable fwledmonitor
|
|
@ -7,18 +7,7 @@ from drawing import draw_cpu, draw_memory, draw_battery, draw_borders_left, draw
|
||||||
from monitors import CPUMonitor, MemoryMonitor, BatteryMonitor, DiskMonitor, NetworkMonitor, get_monitor_brightness
|
from monitors import CPUMonitor, MemoryMonitor, BatteryMonitor, DiskMonitor, NetworkMonitor, get_monitor_brightness
|
||||||
|
|
||||||
# External Dependencies
|
# External Dependencies
|
||||||
try:
|
import numpy as np
|
||||||
# These are used in later scripts, but imported here to test if missing
|
|
||||||
import serial # pyserial
|
|
||||||
from serial.tools import list_ports
|
|
||||||
import numpy as np
|
|
||||||
except ImportError:
|
|
||||||
import pip
|
|
||||||
for dependency in ["numpy", "pyserial"]:
|
|
||||||
pip.main(['install', '--user', dependency])
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
# print(sbc.get_brightness())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -26,9 +15,9 @@ if __name__ == "__main__":
|
||||||
# Right LED Matrix location: "1-3.3"
|
# Right LED Matrix location: "1-3.3"
|
||||||
|
|
||||||
# Set up monitors and serial for left LED Matrix
|
# Set up monitors and serial for left LED Matrix
|
||||||
min_background_brightness = 8
|
min_background_brightness = 12
|
||||||
max_background_brightness = 35
|
max_background_brightness = 35
|
||||||
min_foreground_brightness = 30
|
min_foreground_brightness = 24
|
||||||
max_foreground_brightness = 160
|
max_foreground_brightness = 160
|
||||||
|
|
||||||
cpu_monitor = CPUMonitor()
|
cpu_monitor = CPUMonitor()
|
||||||
|
@ -51,8 +40,8 @@ if __name__ == "__main__":
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
screen_brightness = get_monitor_brightness()
|
screen_brightness = get_monitor_brightness()
|
||||||
background_value = int(screen_brightness / 100 * (max_background_brightness - min_background_brightness) + min_background_brightness)
|
background_value = int(screen_brightness * (max_background_brightness - min_background_brightness) + min_background_brightness)
|
||||||
foreground_value = int(screen_brightness / 100 * (max_foreground_brightness - min_foreground_brightness) + min_foreground_brightness)
|
foreground_value = int(screen_brightness * (max_foreground_brightness - min_foreground_brightness) + min_foreground_brightness)
|
||||||
|
|
||||||
left_start_time = time.time()
|
left_start_time = time.time()
|
||||||
# Draw to left LED Matrix
|
# Draw to left LED Matrix
|
||||||
|
@ -78,9 +67,13 @@ if __name__ == "__main__":
|
||||||
draw_bar(grid, last_network_download, foreground_value, bar_x_offset=5, draw_at_bottom=True) # Download
|
draw_bar(grid, last_network_download, foreground_value, bar_x_offset=5, draw_at_bottom=True) # Download
|
||||||
draw_borders_right(grid, background_value)
|
draw_borders_right(grid, background_value)
|
||||||
right_drawing_queue.put(grid)
|
right_drawing_queue.put(grid)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
import traceback
|
import traceback
|
||||||
print(f"Error in main loop: {e}")
|
print(f"Error in main loop: {e}")
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
time.sleep(1.0)
|
time.sleep(1.0)
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
print("Exiting")
|
Binary file not shown.
33
monitors.py
33
monitors.py
|
@ -5,14 +5,12 @@ import os
|
||||||
|
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
import wmi
|
import wmi
|
||||||
else:
|
|
||||||
raise Exception("This script is not supported on this OS")
|
|
||||||
|
|
||||||
class DiskMonitor:
|
class DiskMonitor:
|
||||||
def __init__(self, hysterisis_time = 20):
|
def __init__(self, hysterisis_time = 20):
|
||||||
self.read_usage_history = []
|
self.read_usage_history = [0]
|
||||||
self.write_usage_history = []
|
self.write_usage_history = [0]
|
||||||
self.history_times = []
|
self.history_times = [0]
|
||||||
self.highest_read_rate = 0.00001
|
self.highest_read_rate = 0.00001
|
||||||
self.highest_write_rate = 0.00001
|
self.highest_write_rate = 0.00001
|
||||||
self.max_history_size = hysterisis_time
|
self.max_history_size = hysterisis_time
|
||||||
|
@ -46,9 +44,9 @@ class DiskMonitor:
|
||||||
|
|
||||||
class NetworkMonitor:
|
class NetworkMonitor:
|
||||||
def __init__(self, hysterisis_time = 20):
|
def __init__(self, hysterisis_time = 20):
|
||||||
self.sent_usage_history = []
|
self.sent_usage_history = [0]
|
||||||
self.recv_usage_history = []
|
self.recv_usage_history = [0]
|
||||||
self.history_times = []
|
self.history_times = [0]
|
||||||
self.highest_sent_rate = 0.00001
|
self.highest_sent_rate = 0.00001
|
||||||
self.highest_recv_rate = 0.00001
|
self.highest_recv_rate = 0.00001
|
||||||
self.max_history_size = hysterisis_time
|
self.max_history_size = hysterisis_time
|
||||||
|
@ -119,12 +117,25 @@ class BatteryMonitor:
|
||||||
battery = psutil.sensors_battery()
|
battery = psutil.sensors_battery()
|
||||||
if battery is not None:
|
if battery is not None:
|
||||||
battery_percentage = battery.percent / 100.0
|
battery_percentage = battery.percent / 100.0
|
||||||
|
if os.name == "nt":
|
||||||
battery_plugged = battery.power_plugged
|
battery_plugged = battery.power_plugged
|
||||||
|
else:
|
||||||
|
bat_status = open('/sys/class/power_supply/BAT1/status', 'r').read().strip()
|
||||||
|
battery_plugged = (bat_status != 'Discharging')
|
||||||
return battery_percentage, battery_plugged
|
return battery_percentage, battery_plugged
|
||||||
|
|
||||||
|
|
||||||
def get_monitor_brightness():
|
def get_monitor_brightness():
|
||||||
try:
|
try:
|
||||||
return wmi.WMI(namespace='wmi').WmiMonitorBrightness()[0].CurrentBrightness
|
if os.name == 'nt':
|
||||||
except:
|
return wmi.WMI(namespace='wmi').WmiMonitorBrightness()[0].CurrentBrightness / 100.0
|
||||||
return 50
|
else:
|
||||||
|
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:
|
||||||
|
return 1.0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(get_monitor_brightness())
|
3
run.bat
Normal file
3
run.bat
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
py -3 -m pip install pyserial numpy wmi psutil
|
||||||
|
|
||||||
|
py -3 led_system_monitor.py
|
3
run.sh
Normal file
3
run.sh
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
sudo apt install python3-numpy python3-psutil
|
||||||
|
|
||||||
|
python3 ./led_system_monitor.py
|
|
@ -1 +0,0 @@
|
||||||
py -3 led_system_monitor.py
|
|
Loading…
Add table
Reference in a new issue