diff --git a/external/RTSSSharedMemoryNET/RTSSSharedMemoryNET.dll b/external/RTSSSharedMemoryNET/RTSSSharedMemoryNET.dll new file mode 100644 index 00000000..961e6f18 Binary files /dev/null and b/external/RTSSSharedMemoryNET/RTSSSharedMemoryNET.dll differ diff --git a/library/lcd/lcd_comm.py b/library/lcd/lcd_comm.py index ef6ccc43..9a03fcea 100644 --- a/library/lcd/lcd_comm.py +++ b/library/lcd/lcd_comm.py @@ -27,6 +27,11 @@ from enum import IntEnum from typing import Tuple +try: + from itertools import izip +except ImportError: # Python 3 + izip = zip + import serial from PIL import Image, ImageDraw, ImageFont @@ -321,6 +326,101 @@ def DisplayProgressBar(self, x: int, y: int, width: int, height: int, min_value: self.DisplayPILImage(bar_image, x, y) + def DisplayPlotGraph(self, x: int, y: int, width: int, height: int, min_value: int = 0, max_value: int = 100, + autoscale: bool = False, + values: list[float] = [], + line_color: Tuple[int, int, int] = (0, 0, 0), + graph_axis: bool = True, + background_color: Tuple[int, int, int] = (255, 255, 255), + background_image: str = None): + # Generate a plot graph and display it + # Provide the background image path to display plot graph with transparent background + + if isinstance(line_color, str): + line_color = tuple(map(int, line_color.split(', '))) + + if isinstance(background_color, str): + background_color = tuple(map(int, background_color.split(', '))) + + assert x <= self.get_width(), 'Progress bar X coordinate must be <= display width' + assert y <= self.get_height(), 'Progress bar Y coordinate must be <= display height' + assert x + width <= self.get_width(), 'Progress bar width exceeds display width' + assert y + height <= self.get_height(), 'Progress bar height exceeds display height' + + + if background_image is None: + # A bitmap is created with solid background + graph_image = Image.new('RGB', (width, height), background_color) + else: + # A bitmap is created from provided background image + graph_image = self.open_image(background_image) + + # Crop bitmap to keep only the plot graph background + graph_image = graph_image.crop(box=(x, y, x + width, y + height)) + + #if autoscale is enabled, define new min/max value to "zoom" the graph + if autoscale: + trueMin = max_value + trueMax = min_value + for value in values: + if value >= 0: + if trueMin > value: + trueMin = value + if trueMax < value: + trueMax = value + + if trueMin != max_value and trueMax != min_value: + min_value = max (trueMin-5, min_value) + max_value = min (trueMax+5, max_value) + + step = width / len(values) + #pre compute yScale multiplier value + yScale = height / (max_value - min_value) + + plotsX = [] + plotsY = [] + count = 0 + for value in values: + if value >= 0: + # Don't let the set value exceed our min or max value, this is bad :) + if value < min_value: + value = min_value + elif max_value < value: + value = max_value + + assert min_value <= value <= max_value, 'Plot point value shall be between min and max' + + plotsX.append(count * step) + plotsY.append(height - (value - min_value) * yScale) + + count += 1 + + + # Draw plot graph + draw = ImageDraw.Draw(graph_image) + draw.line(list(izip(plotsX, plotsY)), fill=line_color, width=2) + + if graph_axis: + # Draw axis + draw.line([0, height - 1, width - 1, height - 1], fill=line_color) + draw.line([0, 0, 0, height - 1], fill=line_color) + + # Draw Legend + draw.line([0, 0, 1, 0], fill=line_color) + text = f"{int(max_value)}" + font = ImageFont.truetype("./res/fonts/" + "roboto/Roboto-Black.ttf", 10) + left, top, right, bottom = font.getbbox(text) + draw.text((2, 0 - top), text, + font=font, fill=line_color) + + text = f"{int(min_value)}" + font = ImageFont.truetype("./res/fonts/" + "roboto/Roboto-Black.ttf", 10) + left, top, right, bottom = font.getbbox(text) + draw.text((width - 1 - right, height - 2 - bottom), text, + font=font, fill=line_color) + + self.DisplayPILImage(graph_image, x, y) + def DisplayRadialProgressBar(self, xc: int, yc: int, radius: int, bar_width: int, min_value: int = 0, max_value: int = 100, diff --git a/library/sensors/sensors_custom.py b/library/sensors/sensors_custom.py index 6eec81e1..78fa6c53 100644 --- a/library/sensors/sensors_custom.py +++ b/library/sensors/sensors_custom.py @@ -23,6 +23,86 @@ import platform from abc import ABC, abstractmethod +import ctypes +import math +import os +import sys +from statistics import mean +from typing import Tuple + +import clr # Clr is from pythonnet package. Do not install clr package +import psutil +from win32api import * + +import library.sensors.sensors as sensors +from library.log import logger + +# Import LibreHardwareMonitor dll to Python +lhm_dll = os.getcwd() + '\\external\\LibreHardwareMonitor\\LibreHardwareMonitorLib.dll' +# noinspection PyUnresolvedReferences +clr.AddReference(lhm_dll) +# noinspection PyUnresolvedReferences +clr.AddReference(os.getcwd() + '\\external\\LibreHardwareMonitor\\HidSharp.dll') +# noinspection PyUnresolvedReferences +from LibreHardwareMonitor import Hardware + +# Import RTSSSharedMemoryNET dll to Python +clr.AddReference(os.getcwd() + '\\external\\RTSSSharedMemoryNET\\RTSSSharedMemoryNET.dll') +from RTSSSharedMemoryNET import OSD + + +File_information = GetFileVersionInfo(lhm_dll, "\\") + +ms_file_version = File_information['FileVersionMS'] +ls_file_version = File_information['FileVersionLS'] + +logger.debug("Found LibreHardwareMonitorLib %s" % ".".join([str(HIWORD(ms_file_version)), str(LOWORD(ms_file_version)), + str(HIWORD(ls_file_version)), + str(LOWORD(ls_file_version))])) + +if ctypes.windll.shell32.IsUserAnAdmin() == 0: + logger.error( + "Program is not running as administrator. Please run with admin rights or choose another HW_SENSORS option in " + "config.yaml") + try: + sys.exit(0) + except: + os._exit(0) + +handle = Hardware.Computer() +handle.IsCpuEnabled = True +handle.IsGpuEnabled = True +handle.IsMemoryEnabled = True +handle.IsMotherboardEnabled = True +handle.IsControllerEnabled = False +handle.IsNetworkEnabled = True +handle.IsStorageEnabled = True +handle.Open() +for hardware in handle.Hardware: + if hardware.HardwareType == Hardware.HardwareType.Cpu: + logger.info("Found CPU: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.Memory: + logger.info("Found Memory: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.GpuNvidia: + logger.info("Found Nvidia GPU: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.GpuAmd: + logger.info("Found AMD GPU: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.GpuIntel: + logger.info("Found Intel GPU: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.Storage: + logger.info("Found Storage: %s" % hardware.Name) + elif hardware.HardwareType == Hardware.HardwareType.Network: + logger.info("Found Network interface: %s" % hardware.Name) + + +def get_hw_and_update(hwtype: Hardware.HardwareType, name: str = None) -> Hardware.Hardware: + for hardware in handle.Hardware: + if hardware.HardwareType == hwtype: + if (name and hardware.Name == name) or not name: + hardware.Update() + return hardware + return None + # Custom data classes must be implemented in this file, inherit the CustomDataSource and implement its 2 methods class CustomDataSource(ABC): @@ -40,6 +120,11 @@ def as_string(self) -> str: # If this function is empty, the numeric value will be used as string without formatting pass + @abstractmethod + def as_histo(self) -> list[float]: + # List of numeric values will be used for plot graph + # If there is no histo values, keep this function empty + pass # Example for a custom data class that has numeric and text values class ExampleCustomNumericData(CustomDataSource): @@ -61,6 +146,9 @@ def as_string(self) -> str: # --> return f'{self.as_numeric():>4}%' # Otherwise, part of the previous value can stay displayed ("ghosting") after a refresh + def as_histo(self) -> list[float]: + pass + # Example for a custom data class that only has text values class ExampleCustomTextOnlyData(CustomDataSource): @@ -71,3 +159,69 @@ def as_numeric(self) -> float: def as_string(self) -> str: # If a custom data class only has text values, it won't be possible to display graph or radial bars return "Python version: " + platform.python_version() + + def as_histo(self) -> list[float]: + pass + + +class GpuNvidiaFanPercent(CustomDataSource): + def as_numeric(self) -> float: + gpu = get_hw_and_update(Hardware.HardwareType.GpuNvidia) + for sensor in gpu.Sensors: + if sensor.SensorType == Hardware.SensorType.Control: + return float(sensor.Value) + #return float(50) + + logger.error("GPU Nvidia fan percent cannot be read") + return math.nan + + def as_string(self) -> str: + return f'{int(self.as_numeric())}%' + + def as_histo(self) -> list[float]: + pass + +class CpuFanPercent(CustomDataSource): + def as_numeric(self) -> float: + mb = get_hw_and_update(Hardware.HardwareType.Motherboard) + for sh in mb.SubHardware: + sh.Update() + for sensor in sh.Sensors: + if sensor.SensorType == Hardware.SensorType.Control and "#2" in str(sensor.Name): + return float(sensor.Value) + + logger.error("CPU fan percent cannot be read") + return math.nan + + def as_string(self) -> str: + return f'{int(self.as_numeric())}%' + + def as_histo(self) -> list[float]: + pass + +class RTSSFps(CustomDataSource): + + histo = [-1] * 100 + + def as_numeric(self) -> float: + appEntries = OSD.GetAppEntries() + for app in appEntries: + if app.InstantaneousFrames > 0: + return float(app.InstantaneousFrames) + + return float(0) + + def as_string(self) -> str: + return f'{int(self.as_numeric())}' + + def as_histo(self) -> list[float]: + appEntries = OSD.GetAppEntries() + for app in appEntries: + if app.InstantaneousFrames > 0: + RTSSFps.histo.append(app.InstantaneousFrames) + RTSSFps.histo.pop(0) + return RTSSFps.histo + + return RTSSFps.histo + + diff --git a/library/stats.py b/library/stats.py index b0bb70ee..9056366e 100644 --- a/library/stats.py +++ b/library/stats.py @@ -84,6 +84,9 @@ def display_themed_value(theme_data, value, min_size=0, unit=''): if not theme_data.get("SHOW", False): return + #overridable MIN_SIZE from theme with backward compatibility + min_size=theme_data.get("MIN_SIZE", min_size) + text = f"{{:>{min_size}}}".format(value) if theme_data.get("SHOW_UNIT", True) and unit: text += str(unit) @@ -157,6 +160,26 @@ def display_themed_radial_bar(theme_data, value, min_size=0, unit='', custom_tex ) +def display_themed_plot_graph(theme_data, values): + if not theme_data.get("SHOW", False): + return + + display.lcd.DisplayPlotGraph( + x=theme_data.get("X", 0), + y=theme_data.get("Y", 0), + width=theme_data.get("WIDTH", 1), + height=theme_data.get("HEIGHT", 1), + min_value=theme_data.get("MIN_VALUE", 0), + max_value=theme_data.get("MAX_VALUE", 100), + autoscale=theme_data.get("AUTOSCALE", False), + values=values, + line_color=theme_data.get("LINE_COLOR", (0, 0, 0)), + graph_axis=theme_data.get("AXIS", False), + background_color=theme_data.get("BACKGROUND_COLOR", (0, 0, 0)), + background_image=get_theme_file_path(theme_data.get("BACKGROUND_IMAGE", None)) + ) + + class CPU: @staticmethod def percentage(): @@ -242,18 +265,36 @@ def display_gpu_stats(load, memory_percentage, memory_used_mb, temperature, fps) gpu_percent_text_data['SHOW'] = False gpu_percent_radial_data['SHOW'] = False + #for backward compatibility gpu_mem_graph_data = theme_gpu_data['MEMORY']['GRAPH'] gpu_mem_radial_data = theme_gpu_data['MEMORY']['RADIAL'] + + gpu_mem_percent_graph_data = theme_gpu_data['MEMORY_PERCENT']['GRAPH'] + gpu_mem_percent_radial_data = theme_gpu_data['MEMORY_PERCENT']['RADIAL'] + gpu_mem_percent_text_data = theme_gpu_data['MEMORY_PERCENT']['TEXT'] if math.isnan(memory_percentage): memory_percentage = 0 + if gpu_mem_percent_graph_data['SHOW'] or gpu_mem_percent_radial_data['SHOW'] or gpu_mem_percent_text_data['SHOW']: + logger.warning("Your GPU memory relative usage (%) is not supported yet") + gpu_mem_percent_graph_data['SHOW'] = False + gpu_mem_percent_radial_data['SHOW'] = False + gpu_mem_percent_text_data['SHOW'] = False + #for backward compatibility if gpu_mem_graph_data['SHOW'] or gpu_mem_radial_data['SHOW']: logger.warning("Your GPU memory relative usage (%) is not supported yet") gpu_mem_graph_data['SHOW'] = False gpu_mem_radial_data['SHOW'] = False + #for backward compatibility gpu_mem_text_data = theme_gpu_data['MEMORY']['TEXT'] + + gpu_mem_used_text_data = theme_gpu_data['MEMORY_USED']['TEXT'] if math.isnan(memory_used_mb): memory_used_mb = 0 + if gpu_mem_used_text_data['SHOW']: + logger.warning("Your GPU memory absolute usage (M) is not supported yet") + gpu_mem_used_text_data['SHOW'] = False + #for backward compatibility if gpu_mem_text_data['SHOW']: logger.warning("Your GPU memory absolute usage (M) is not supported yet") gpu_mem_text_data['SHOW'] = False @@ -280,6 +321,7 @@ def display_gpu_stats(load, memory_percentage, memory_used_mb, temperature, fps) min_size=3, unit="%") + #for backward compatibility display_themed_progress_bar(gpu_mem_graph_data, memory_percentage) display_themed_radial_bar( @@ -289,6 +331,22 @@ def display_gpu_stats(load, memory_percentage, memory_used_mb, temperature, fps) unit="%" ) + display_themed_progress_bar(gpu_mem_percent_graph_data, memory_percentage) + + display_themed_radial_bar( + theme_data=gpu_mem_percent_radial_data, + value=int(memory_percentage), + min_size=3, + unit="%" + ) + + display_themed_value( + theme_data=gpu_mem_percent_text_data, + value=int(memory_percentage), + min_size=3, + unit="%" + ) + display_themed_value( theme_data=gpu_percent_text_data, value=int(load), @@ -296,6 +354,14 @@ def display_gpu_stats(load, memory_percentage, memory_used_mb, temperature, fps) unit="%" ) + #for backward compatibility + display_themed_value( + theme_data=gpu_mem_used_text_data, + value=int(memory_used_mb), + min_size=5, + unit=" M" + ) + display_themed_value( theme_data=gpu_mem_text_data, value=int(memory_used_mb), @@ -508,6 +574,7 @@ def stats(): custom_stat_class = getattr(sensors_custom, str(custom_stat))() string_value = custom_stat_class.as_string() numeric_value = custom_stat_class.as_numeric() + histo_values = custom_stat_class.as_histo() except: logger.error("Custom sensor class " + str(custom_stat) + " not found in sensors_custom.py") return @@ -522,14 +589,19 @@ def stats(): # Display graph from numeric value theme_data = config.THEME_DATA['STATS']['CUSTOM'][custom_stat].get("GRAPH", None) - if theme_data and numeric_value: + if theme_data and not math.isnan(numeric_value): display_themed_progress_bar(theme_data=theme_data, value=numeric_value) # Display radial from numeric and text value theme_data = config.THEME_DATA['STATS']['CUSTOM'][custom_stat].get("RADIAL", None) - if theme_data and numeric_value and string_value: + if theme_data and not math.isnan(numeric_value) and string_value: display_themed_radial_bar( theme_data=theme_data, value=numeric_value, custom_text=string_value ) + + # Display plot graph from histo values + theme_data = config.THEME_DATA['STATS']['CUSTOM'][custom_stat].get("PLOT", None) + if theme_data and histo_values: + display_themed_plot_graph(theme_data=theme_data, values=histo_values) diff --git a/res/themes/Cyberdeck/Credits.md b/res/themes/Cyberdeck/Credits.md new file mode 100644 index 00000000..3e614dba --- /dev/null +++ b/res/themes/Cyberdeck/Credits.md @@ -0,0 +1,7 @@ +### Credits for graphical resources used from freepik + +Acknowledgements for resources : + +- "Designed by pikisuperstar / Freepik" +- "Designed by Freepik" +- "Designed by macrovector / Freepik" \ No newline at end of file diff --git a/res/themes/Cyberdeck/background.png b/res/themes/Cyberdeck/background.png new file mode 100644 index 00000000..770f8e60 Binary files /dev/null and b/res/themes/Cyberdeck/background.png differ diff --git a/res/themes/Cyberdeck/preview.png b/res/themes/Cyberdeck/preview.png new file mode 100644 index 00000000..31f624a1 Binary files /dev/null and b/res/themes/Cyberdeck/preview.png differ diff --git a/res/themes/Cyberdeck/theme.yaml b/res/themes/Cyberdeck/theme.yaml new file mode 100644 index 00000000..cc5d0bf1 --- /dev/null +++ b/res/themes/Cyberdeck/theme.yaml @@ -0,0 +1,242 @@ +# This file is a sample theme that contains every possible data to be displayed on screen +# It can be used to start the development of a new theme: it should be copied to a sub-folder with its PNG resources +# See the wiki to edit this file: https://github.com/mathoudebine/turing-smart-screen-python/wiki/System-monitor-:-themes + +# NOTE: Every HW sensor is hidden in this example, to show a sensor change 'SHOW: False' to 'SHOW: True' +--- +# If you indicate @ with your GitHub username, there will be a hyperlink to your GitHub profile in the Config. Wizard +# Otherwise, you can just indicate any text e.g. author: "Your Name" +# You can also remove the line if you don't want to be credited +author: "@hicwic" + +display: + # Specify the display size in inch for this theme: 3.5" (default) or 5" + DISPLAY_SIZE: 3.5" + + # Specify the display orientation for this theme: portrait or landscape (reverse orientation is managed in config.yaml) + DISPLAY_ORIENTATION: landscape + + # Backplate RGB LED color (for HW revision 'flagship' devices only), set one that match your theme dominant color + DISPLAY_RGB_LED: 255, 0, 0 + +static_images: + BACKGROUND: + PATH: background.png + X: 0 + Y: 0 + WIDTH: 480 + HEIGHT: 320 + + +STATS: + CPU: + PERCENTAGE: + INTERVAL: 1 + RADIAL: + SHOW: True + X: 80 + Y: 70 + RADIUS: 39 + WIDTH: 15 + MIN_VALUE: 0 + MAX_VALUE: 100 + ANGLE_START: 60 + ANGLE_END: 420 + ANGLE_STEPS: 20 + ANGLE_SEP: 0 + CLOCKWISE: True + BAR_COLOR: 248, 177, 51 + SHOW_TEXT: True + SHOW_UNIT: True + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 20 + FONT_COLOR: 248, 177, 51 + #BACKGROUND_COLOR: 200, 200, 200 + BACKGROUND_IMAGE: background.png + TEMPERATURE: + INTERVAL: 5 + TEXT: + SHOW: True + SHOW_UNIT: True + X: 34 + Y: 135 + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 23 + FONT_COLOR: 248, 177, 51 + # BACKGROUND_COLOR: 132, 154, 165 + BACKGROUND_IMAGE: background.png + MEMORY: + INTERVAL: 5 + VIRTUAL: + RADIAL: + SHOW: True + X: 110 + Y: 211 + RADIUS: 31 + WIDTH: 13 + MIN_VALUE: 0 + MAX_VALUE: 100 + ANGLE_START: 20 + ANGLE_END: 20 + ANGLE_STEPS: 1 + ANGLE_SEP: 25 + CLOCKWISE: True + BAR_COLOR: 200, 100, 50 + SHOW_TEXT: True + SHOW_UNIT: True + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 13 + FONT_COLOR: 248, 177, 51 + # BACKGROUND_COLOR: 0, 0, 0 + BACKGROUND_IMAGE: background.png + GPU: + INTERVAL: 1 + PERCENTAGE: + RADIAL: + SHOW: True + X: 387 + Y: 166 + RADIUS: 51 + WIDTH: 25 + MIN_VALUE: 0 + MAX_VALUE: 100 + ANGLE_START: 110 + ANGLE_END: 110 + ANGLE_STEPS: 5 + ANGLE_SEP: 0 + CLOCKWISE: True + BAR_COLOR: 255, 0, 0 + SHOW_TEXT: True + SHOW_UNIT: True + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 20 + FONT_COLOR: 21, 176, 231 + # BACKGROUND_COLOR: 0, 0, 0 + BACKGROUND_IMAGE: background.png + MEMORY_PERCENT: + GRAPH: + SHOW: True + X: 349 + Y: 48 + WIDTH: 102 + HEIGHT: 9 + MIN_VALUE: 0 + MAX_VALUE: 100 + BAR_COLOR: 255, 0, 0 + BAR_OUTLINE: False + # BACKGROUND_COLOR: 0, 0, 0 + BACKGROUND_IMAGE: background.png + TEXT: + SHOW: True + SHOW_UNIT: True + X: 295 + Y: 46 + FONT: jetbrains-mono/JetBrainsMono-Bold.ttf + FONT_SIZE: 20 + FONT_COLOR: 21, 176, 231 + #BACKGROUND_COLOR: 132, 154, 165 + BACKGROUND_IMAGE: background.png + TEMPERATURE: + TEXT: + SHOW: True + SHOW_UNIT: True + X: 234 + Y: 158 + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 23 + FONT_COLOR: 248, 177, 51 + #BACKGROUND_COLOR: 100, 100, 100 + BACKGROUND_IMAGE: background.png + NET: + INTERVAL: 1 + ETH: + UPLOAD: + TEXT: + SHOW: True + X: 351 + Y: 293 + FONT: jetbrains-mono/JetBrainsMono-Bold.ttf + FONT_SIZE: 10 + FONT_COLOR: 255, 255, 255 + # BACKGROUND_COLOR: 132, 154, 165 + BACKGROUND_IMAGE: background.png + DOWNLOAD: + TEXT: + SHOW: True + X: 398 + Y: 257 + FONT: jetbrains-mono/JetBrainsMono-Bold.ttf + FONT_SIZE: 10 + FONT_COLOR: 255, 255, 255 + # BACKGROUND_COLOR: 132, 154, 165 + BACKGROUND_IMAGE: background.png + CUSTOM: + INTERVAL: 1 + GpuNvidiaFanPercent: + RADIAL: + SHOW: True + X: 233 + Y: 68 + RADIUS: 31 + WIDTH: 13 + MIN_VALUE: 0 + MAX_VALUE: 100 + ANGLE_START: 320 + ANGLE_END: 320 + ANGLE_STEPS: 20 + ANGLE_SEP: 0 + CLOCKWISE: False + BAR_COLOR: 200, 100, 50 + SHOW_TEXT: True + SHOW_UNIT: True + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 15 + FONT_COLOR: 248, 177, 51 + #BACKGROUND_COLOR: 200, 200, 200 + BACKGROUND_IMAGE: background.png + RTSSFps: + TEXT: + SHOW: True + X: 46 + Y: 279 + MIN_SIZE: 4 + FONT: jetbrains-mono/JetBrainsMono-Bold.ttf + FONT_SIZE: 27 + FONT_COLOR: 255, 255, 255 + #BACKGROUND_COLOR: 100, 100, 100 + BACKGROUND_IMAGE: background.png + PLOT: + SHOW: True + X: 180 + Y: 220 + WIDTH: 133 + HEIGHT: 82 + MIN_VALUE: 0 + MAX_VALUE: 144 + AUTOSCALE: True + LINE_COLOR: 255, 255, 255 + AXIS: True + BACKGROUND_IMAGE: background.png + CpuFanPercent: + RADIAL: + SHOW: True + X: 170 + Y: 130 + RADIUS: 31 + WIDTH: 13 + MIN_VALUE: 0 + MAX_VALUE: 100 + ANGLE_START: 220 + ANGLE_END: 220 + ANGLE_STEPS: 20 + ANGLE_SEP: 0 + CLOCKWISE: True + BAR_COLOR: 200, 100, 50 + SHOW_TEXT: True + SHOW_UNIT: True + FONT: roboto/Roboto-Bold.ttf + FONT_SIZE: 15 + FONT_COLOR: 248, 177, 51 + #BACKGROUND_COLOR: 200, 200, 200 + BACKGROUND_IMAGE: background.png + diff --git a/res/themes/default.yaml b/res/themes/default.yaml index 09b625d7..a695a8c1 100644 --- a/res/themes/default.yaml +++ b/res/themes/default.yaml @@ -38,6 +38,18 @@ STATS: SHOW: False TEXT: SHOW: False + MEMORY_PERCENT: + GRAPH: + SHOW: False + RADIAL: + SHOW: False + TEXT: + SHOW: False + SHOW_UNIT: False + MEMORY_USED: + TEXT: + SHOW: False + SHOW_UNIT: False MEMORY: GRAPH: SHOW: False