About app: refactor more DRY

This commit is contained in:
Thomas Farstrike
2026-01-14 11:24:09 +01:00
parent 2debeca273
commit 0d422ec47c
@@ -5,6 +5,26 @@ import sys
class About(Activity):
def _add_label(self, parent, text):
"""Helper to create and add a label with text."""
label = lv.label(parent)
label.set_text(text)
return label
def _add_disk_info(self, screen, path):
"""Helper to add disk usage info for a given path."""
import os
try:
stat = os.statvfs(path)
total_space = stat[0] * stat[2]
free_space = stat[0] * stat[3]
used_space = total_space - free_space
self._add_label(screen, f"Total space {path}: {total_space} bytes")
self._add_label(screen, f"Free space {path}: {free_space} bytes")
self._add_label(screen, f"Used space {path}: {used_space} bytes")
except Exception as e:
print(f"About app could not get info on {path} filesystem: {e}")
def onCreate(self):
screen = lv.obj()
screen.set_style_border_width(0, 0)
@@ -15,20 +35,16 @@ class About(Activity):
if focusgroup:
focusgroup.add_obj(screen)
label0 = lv.label(screen)
label0.set_text(f"MicroPythonOS version: {mpos.info.CURRENT_OS_VERSION}")
label1 = lv.label(screen)
label1.set_text(f"Hardware ID: {mpos.info.get_hardware_id()}")
label2 = lv.label(screen)
label2.set_text(f"sys.version: {sys.version}")
label3 = lv.label(screen)
label3.set_text(f"sys.implementation: {sys.implementation}")
# Basic OS info
self._add_label(screen, f"MicroPythonOS version: {mpos.info.CURRENT_OS_VERSION}")
self._add_label(screen, f"Hardware ID: {mpos.info.get_hardware_id()}")
self._add_label(screen, f"sys.version: {sys.version}")
self._add_label(screen, f"sys.implementation: {sys.implementation}")
# MPY version info
sys_mpy = sys.implementation._mpy
label30 = lv.label(screen)
label30.set_text(f'mpy version: {sys_mpy & 0xff}')
label31 = lv.label(screen)
label31.set_text(f'mpy sub-version: {sys_mpy >> 8 & 3}')
self._add_label(screen, f'mpy version: {sys_mpy & 0xff}')
self._add_label(screen, f'mpy sub-version: {sys_mpy >> 8 & 3}')
arch = [None, 'x86', 'x64',
'armv6', 'armv6m', 'armv7m', 'armv7em', 'armv7emsp', 'armv7emdp',
'xtensa', 'xtensawin', 'rv32imc', 'rv64imc'][(sys_mpy >> 10) & 0x0F]
@@ -38,62 +54,51 @@ class About(Activity):
if (sys_mpy >> 16) != 0:
flags += ' -march-flags=' + (sys_mpy >> 16)
if len(flags) > 0:
label32 = lv.label(screen)
label32.set_text('mpy flags: ' + flags)
self._add_label(screen, 'mpy flags: ' + flags)
label4 = lv.label(screen)
label4.set_text(f"sys.platform: {sys.platform}")
label15 = lv.label(screen)
label15.set_text(f"sys.path: {sys.path}")
# Platform info
self._add_label(screen, f"sys.platform: {sys.platform}")
self._add_label(screen, f"sys.path: {sys.path}")
# MicroPython and memory info
import micropython
label16 = lv.label(screen)
label16.set_text(f"micropython.opt_level(): {micropython.opt_level()}")
self._add_label(screen, f"micropython.opt_level(): {micropython.opt_level()}")
import gc
label17 = lv.label(screen)
label17.set_text(f"Memory: {gc.mem_free()} free, {gc.mem_alloc()} allocated, {gc.mem_alloc()+gc.mem_free()} total")
self._add_label(screen, f"Memory: {gc.mem_free()} free, {gc.mem_alloc()} allocated, {gc.mem_alloc()+gc.mem_free()} total")
# These are always written to sys.stdout
#label16.set_text(f"micropython.mem_info(): {micropython.mem_info()}")
#label18 = lv.label(screen)
#label18.set_text(f"micropython.qstr_info(): {micropython.qstr_info()}")
label19 = lv.label(screen)
label19.set_text(f"mpos.__path__: {mpos.__path__}") # this will show .frozen if the /lib folder is frozen (prod build)
#self._add_label(screen, f"micropython.mem_info(): {micropython.mem_info()}")
#self._add_label(screen, f"micropython.qstr_info(): {micropython.qstr_info()}")
self._add_label(screen, f"mpos.__path__: {mpos.__path__}") # this will show .frozen if the /lib folder is frozen (prod build)
# Partition info (ESP32 only)
try:
from esp32 import Partition
label5 = lv.label(screen)
label5.set_text("") # otherwise it will show the default "Text" if there's an exception below
current = Partition(Partition.RUNNING)
label5.set_text(f"Partition.RUNNING: {current}")
self._add_label(screen, f"Partition.RUNNING: {current}")
next_partition = current.get_next_update()
label6 = lv.label(screen)
label6.set_text(f"Next update partition: {next_partition}")
self._add_label(screen, f"Next update partition: {next_partition}")
except Exception as e:
print(f"Partition info got exception: {e}")
# Machine info
try:
print("Trying to find out additional board info, not available on every platform...")
import machine
label7 = lv.label(screen)
label7.set_text("") # otherwise it will show the default "Text" if there's an exception below
label7.set_text(f"machine.freq: {machine.freq()}")
label8 = lv.label(screen)
label8.set_text(f"machine.unique_id(): {machine.unique_id()}")
label9 = lv.label(screen)
label9.set_text(f"machine.wake_reason(): {machine.wake_reason()}")
label10 = lv.label(screen)
label10.set_text(f"machine.reset_cause(): {machine.reset_cause()}")
self._add_label(screen, f"machine.freq: {machine.freq()}")
self._add_label(screen, f"machine.unique_id(): {machine.unique_id()}")
self._add_label(screen, f"machine.wake_reason(): {machine.wake_reason()}")
self._add_label(screen, f"machine.reset_cause(): {machine.reset_cause()}")
except Exception as e:
print(f"Additional board info got exception: {e}")
# Freezefs info (production builds only)
try:
print("Trying to find out freezefs info, this only works on production builds...") # dev builds already have the /builtin folder
import freezefs_mount_builtin
label11 = lv.label(screen)
label11.set_text(f"freezefs_mount_builtin.date_frozen: {freezefs_mount_builtin.date_frozen}")
label12 = lv.label(screen)
label12.set_text(f"freezefs_mount_builtin.files_folders: {freezefs_mount_builtin.files_folders}")
label13 = lv.label(screen)
label13.set_text(f"freezefs_mount_builtin.sum_size: {freezefs_mount_builtin.sum_size}")
label14 = lv.label(screen)
label14.set_text(f"freezefs_mount_builtin.version: {freezefs_mount_builtin.version}")
self._add_label(screen, f"freezefs_mount_builtin.date_frozen: {freezefs_mount_builtin.date_frozen}")
self._add_label(screen, f"freezefs_mount_builtin.files_folders: {freezefs_mount_builtin.files_folders}")
self._add_label(screen, f"freezefs_mount_builtin.sum_size: {freezefs_mount_builtin.sum_size}")
self._add_label(screen, f"freezefs_mount_builtin.version: {freezefs_mount_builtin.version}")
except Exception as e:
# This will throw an EEXIST exception if there is already a "/builtin" folder present
# It will throw "no module named 'freezefs_mount_builtin'" if there is no frozen filesystem
@@ -102,34 +107,10 @@ class About(Activity):
# BUT which will still have the frozen-inside /lib folder. So the user will be able to install apps into /builtin
# but they will not be able to install libraries into /lib.
print("main.py: WARNING: could not import/run freezefs_mount_builtin: ", e)
label11 = lv.label(screen)
label11.set_text(f"freezefs_mount_builtin exception (normal if internal storage partition has overriding /builtin folder): {e}")
# Disk usage:
import os
try:
stat = os.statvfs('/')
total_space = stat[0] * stat[2]
free_space = stat[0] * stat[3]
used_space = total_space - free_space
label20 = lv.label(screen)
label20.set_text(f"Total space in /: {total_space} bytes")
label21 = lv.label(screen)
label21.set_text(f"Free space in /: {free_space} bytes")
label22 = lv.label(screen)
label22.set_text(f"Used space in /: {used_space} bytes")
except Exception as e:
print(f"About app could not get info on / filesystem: {e}")
try:
stat = os.statvfs('/sdcard')
total_space = stat[0] * stat[2]
free_space = stat[0] * stat[3]
used_space = total_space - free_space
label23 = lv.label(screen)
label23.set_text(f"Total space /sdcard: {total_space} bytes")
label24 = lv.label(screen)
label24.set_text(f"Free space /sdcard: {free_space} bytes")
label25 = lv.label(screen)
label25.set_text(f"Used space /sdcard: {used_space} bytes")
except Exception as e:
print(f"About app could not get info on /sdcard filesystem: {e}")
self._add_label(screen, f"freezefs_mount_builtin exception (normal if internal storage partition has overriding /builtin folder): {e}")
# Disk usage info
self._add_disk_info(screen, '/')
self._add_disk_info(screen, '/sdcard')
self.setContentView(screen)