Skip to content

Commit

Permalink
Added more configurable fields
Browse files Browse the repository at this point in the history
  • Loading branch information
crahan committed Sep 19, 2020
1 parent 6d0e295 commit b886b4e
Showing 1 changed file with 115 additions and 110 deletions.
225 changes: 115 additions & 110 deletions pwnagotchi/plugins/default/memtemp.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# memtemp shows memory infos and cpu temperature
#
# mem usage, cpu load, cpu temp
# mem usage, cpu load, cpu temp, cpu frequency
#
###############################################################
#
Expand All @@ -16,6 +16,13 @@
# - Added CPU load
# - Added horizontal and vertical orientation
#
# 19-09-2020 by crahan <[email protected]>
# - Added CPU frequency
# - Made field types and order configurable (max 3 fields)
# - Made line spacing and position configurable
# - Refactored to dynamically generate UI elements
# - Changed horizontal UI elements to Text
# - Updated to version 1.0.2
###############################################################
from pwnagotchi.ui.components import LabeledValue, Text
from pwnagotchi.ui.view import BLACK
Expand All @@ -31,149 +38,147 @@ class MemTemp(plugins.Plugin):
__license__ = 'GPL3'
__description__ = 'A plugin that will display memory/cpu usage and temperature'

ALLOWED_FIELDS = {
'mem': 'mem_usage',
'cpu': 'cpu_load',
'temp': 'cpu_temp',
'freq': 'cpu_freq'
}
DEFAULT_FIELDS = ['mem', 'cpu', 'temp']
LINE_SPACING = 10
LABEL_SPACING = 0
FIELD_WIDTH = 4

def on_loaded(self):
logging.info("memtemp plugin loaded.")

def mem_usage(self):
return int(pwnagotchi.mem_usage() * 100)
return f"{int(pwnagotchi.mem_usage() * 100)}%"

def cpu_load(self):
return int(pwnagotchi.cpu_load() * 100)
return f"{int(pwnagotchi.cpu_load() * 100)}%"

@staticmethod
def pad_text(width, data, symbol):
data = str(data) + symbol
return " " * (width - len(data)) + data
def cpu_temp(self):
if self.options['scale'] == "fahrenheit":
temp = (pwnagotchi.temperature() * 9 / 5) + 32
symbol = "f"
elif self.options['scale'] == "kelvin":
temp = pwnagotchi.temperature() + 273.15
symbol = "k"
else:
# default to celsius
temp = pwnagotchi.temperature()
symbol = "c"
return f"{temp}{symbol}"

def cpu_freq(self):
with open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq', 'rt') as fp:
return f"{round(float(fp.readline())/1000000, 1)}G"

def pad_text(self, data):
return " " * (self.FIELD_WIDTH - len(data)) + data

def on_ui_setup(self, ui):
if ui.is_waveshare_v2():
h_pos_line1 = (178, 84)
h_pos_line2 = (178, 94)
v_pos_line1 = (202, 74) # (127, 75)
v_pos_line2 = (202, 84) # (122, 84)
v_pos_line3 = (197, 94) # (127, 94)
elif ui.is_waveshare_v1():
h_pos_line1 = (170, 80)
h_pos_line2 = (170, 90)
v_pos_line1 = (170, 61) # (130, 70)
v_pos_line2 = (170, 71) # (125, 80)
v_pos_line3 = (165, 81) # (130, 90)
elif ui.is_waveshare144lcd():
h_pos_line1 = (53, 77)
h_pos_line2 = (53, 87)
v_pos_line1 = (78, 67) # (67, 73)
v_pos_line2 = (78, 77) # (62, 83)
v_pos_line3 = (73, 87) # (67, 93)
elif ui.is_inky():
h_pos_line1 = (140, 68)
h_pos_line2 = (140, 78)
v_pos_line1 = (165, 54) # (127, 60)
v_pos_line2 = (165, 64) # (122, 70)
v_pos_line3 = (160, 74) # (127, 80)
elif ui.is_waveshare27inch():
h_pos_line1 = (192, 138)
h_pos_line2 = (192, 148)
v_pos_line1 = (216, 122) # (6,120)
v_pos_line2 = (216, 132) # (1,135)
v_pos_line3 = (211, 142) # (6,150)
else:
h_pos_line1 = (155, 76)
h_pos_line2 = (155, 86)
v_pos_line1 = (180, 61) # (127, 51)
v_pos_line2 = (180, 71) # (127, 56)
v_pos_line3 = (175, 81) # (102, 71)
try:
# Configure field list
self.fields = self.options['fields'].split(',')
self.fields = [x.strip() for x in self.fields if x.strip() in self.ALLOWED_FIELDS.keys()]
self.fields = self.fields[:3] # limit to the first 3 fields
except Exception:
# Set default value
self.fields = self.DEFAULT_FIELDS

label_spacing = 0
try:
# Configure line_spacing
line_spacing = int(self.options['linespacing'])
except Exception:
# Set default value
line_spacing = self.LINE_SPACING

try:
# Configure position
pos = self.options['position'].split(',')
pos = [int(x.strip()) for x in pos]
if self.options['orientation'] == "vertical":
v_pos = (pos[0], pos[1])
else:
h_pos = (pos[0], pos[1])
except Exception:
# Set default position based on screen type
if ui.is_waveshare_v2():
h_pos = (178, 84)
v_pos = (197, 74)
elif ui.is_waveshare_v1():
h_pos = (170, 80)
v_pos = (165, 61)
elif ui.is_waveshare144lcd():
h_pos = (53, 77)
v_pos = (73, 67)
elif ui.is_inky():
h_pos = (140, 68)
v_pos = (160, 54)
elif ui.is_waveshare27inch():
h_pos = (192, 138)
v_pos = (211, 122)
else:
h_pos = (155, 76)
v_pos = (175, 61)

if self.options['orientation'] == "vertical":
ui.add_element(
'memtemp_line1',
LabeledValue(
color=BLACK,
label='mem:',
value='-',
position=v_pos_line1,
label_font=fonts.Small,
text_font=fonts.Small,
label_spacing=label_spacing,
for idx, field in enumerate(self.fields):
v_pos_x = v_pos[0]
v_pos_y = v_pos[1] + ((len(self.fields) - 3) * -1 * line_spacing)
ui.add_element(
f"memtemp_{field}",
LabeledValue(
color=BLACK,
label=f"{self.pad_text(field)}:",
value="-",
position=(v_pos_x, v_pos_y + (idx * line_spacing)),
label_font=fonts.Small,
text_font=fonts.Small,
label_spacing=self.LABEL_SPACING,
)
)
)
ui.add_element(
'memtemp_line2',
LabeledValue(
color=BLACK,
label='cpu:',
value='-',
position=v_pos_line2,
label_font=fonts.Small,
text_font=fonts.Small,
label_spacing=label_spacing,
)
)
ui.add_element(
'memtemp_line3',
LabeledValue(
color=BLACK,
label='temp:',
value='-',
position=v_pos_line3,
label_font=fonts.Small,
text_font=fonts.Small,
label_spacing=label_spacing,
)
)
logging.info(f"memtemp: created '{field}'")
else:
# default to horizontal
h_pos_x = h_pos[0]
h_pos_y = h_pos[1]
ui.add_element(
'memtemp_line1',
'memtemp_header',
Text(
color=BLACK,
value=' mem cpu temp',
position=h_pos_line1,
value=" ".join([self.pad_text(x) for x in self.fields]),
position=(h_pos_x, h_pos_y),
font=fonts.Small,
)
)
ui.add_element(
'memtemp_line2',
'memtemp_data',
Text(
color=BLACK,
value=' - - -',
position=h_pos_line2,
value=" ".join([self.pad_text("-") for x in self.fields]),
position=(h_pos_x, h_pos_y + line_spacing),
font=fonts.Small,
)
)

def on_unload(self, ui):
with ui._lock:
if self.options['orientation'] == "vertical":
ui.remove_element('memtemp_line1')
ui.remove_element('memtemp_line2')
ui.remove_element('memtemp_line3')
for idx, field in enumerate(self.fields):
ui.remove_element(f"memtemp_{field}")
else:
ui.remove_element('memtemp_line1')
ui.remove_element('memtemp_line2')
# default to horizontal
ui.remove_element('memtemp_header')
ui.remove_element('memtemp_data')

def on_ui_update(self, ui):
if self.options['scale'] == "fahrenheit":
temp = (pwnagotchi.temperature() * 9 / 5) + 32
symbol = "f"
elif self.options['scale'] == "kelvin":
temp = pwnagotchi.temperature() + 273.15
symbol = "k"
else:
# default to celsius
temp = pwnagotchi.temperature()
symbol = "c"

if self.options['orientation'] == "vertical":
ui.set('memtemp_line1', f"{self.mem_usage()}%")
ui.set('memtemp_line2', f"{self.cpu_load()}%")
ui.set('memtemp_line3', f"{temp}{symbol}")
for idx, field in enumerate(self.fields):
ui.set(f"memtemp_{field}", getattr(self, self.ALLOWED_FIELDS[field])())
else:
# default to horizontal
ui.set(
'memtemp_line2',
self.pad_text(4, self.mem_usage(), "%") +
self.pad_text(5, self.cpu_load(), "%") +
self.pad_text(5, temp, symbol)
)
data = " ".join([self.pad_text(getattr(self, self.ALLOWED_FIELDS[x])()) for x in self.fields])
ui.set('memtemp_data', data)

0 comments on commit b886b4e

Please sign in to comment.