mpong: framerate logging, button handling

This commit is contained in:
Thomas Farstrike
2026-03-09 21:08:36 +01:00
parent 9c859bdfe9
commit 5de7b30a12
@@ -21,11 +21,14 @@ class MPong(Activity):
buffer = None
touch_active = False
touch_last_x = None
last_fps = 0
average_fps = 0
# Widgets:
screen = None
canvas = None
leftbutton = None
playbutton = None
rightbutton = None
def onCreate(self):
@@ -47,25 +50,32 @@ class MPong(Activity):
self.leftbutton.align(lv.ALIGN.BOTTOM_LEFT, 0, 0)
leftlabel = lv.label(self.leftbutton)
leftlabel.set_text("<")
self.leftbutton.add_event_cb(lambda e: self.move_left(),lv.EVENT.FOCUSED,None)
self.leftbutton.add_event_cb(lambda e: self.move_left_unfocus(),lv.EVENT.FOCUSED,None)
self.leftbutton.add_event_cb(lambda e: self.move_left(),lv.EVENT.CLICKED,None)
# Invisible button, just for defocusing the left and right buttons:
self.play_button = lv.button(self.screen)
self.play_button.align(lv.ALIGN.BOTTOM_MID,0,0)
self.play_button.set_style_opa(lv.OPA.TRANSP, lv.PART.MAIN)
self.rightbutton = lv.button(self.screen)
self.rightbutton.align(lv.ALIGN.BOTTOM_RIGHT, 0, 0)
rightlabel = lv.label(self.rightbutton)
rightlabel.set_text(">")
self.rightbutton.add_event_cb(lambda e: self.move_right(),lv.EVENT.FOCUSED,None)
self.rightbutton.add_event_cb(lambda e: self.move_right_unfocus(),lv.EVENT.FOCUSED,None)
self.rightbutton.add_event_cb(lambda e: self.move_right(),lv.EVENT.CLICKED,None)
self.setContentView(self.screen)
def onResume(self, screen):
lv.log_register_print_cb(self.log_callback)
mpong.init(self.buffer, self.hor_res, self.ver_res)
self.refresh_timer = lv.timer_create(self.run_mpong, 10, None)
self.refresh_timer = lv.timer_create(self.run_mpong, 1, None)
def onPause(self, screen):
if self.refresh_timer:
self.refresh_timer.delete()
lv.log_register_print_cb(None)
def move_left(self):
mpong.move_paddle(-self.paddle_move_step)
@@ -73,6 +83,36 @@ class MPong(Activity):
def move_right(self):
mpong.move_paddle(self.paddle_move_step)
def move_left_unfocus(self):
self.unfocus()
mpong.move_paddle(-self.paddle_move_step)
def move_right_unfocus(self):
self.unfocus()
mpong.move_paddle(self.paddle_move_step)
def unfocus(self):
focusgroup = lv.group_get_default()
if not focusgroup:
print("WARNING: imageview.py could not get default focus group")
return
focused = focusgroup.get_focused()
if focused:
print(f"got focus button: {focused}")
label = focused.get_child(0)
print(f"got label for button: {label.get_text()}")
#focused.remove_state(lv.STATE.FOCUSED) # this doesn't seem to work to remove focus
print("checking which button is focused")
if focused == self.rightbutton:
#print("next is focused")
focusgroup.focus_prev()
elif focused == self.leftbutton:
#print("prev is focused")
focusgroup.focus_next()
else:
print("focus isn't on next or previous, leaving it...")
def run_mpong(self, timer=None):
mpong.render()
self.canvas.invalidate() # force redraw
@@ -103,3 +143,30 @@ class MPong(Activity):
self.touch_active = False
self.touch_last_x = None
return
average_samples = 20
fps_buffer = [0.0] * average_samples
fps_index = 0
fps_sum = 0.0
fps_count = 0 # Number of valid samples (0 to average_samples)
def moving_average(self, value):
if self.fps_count == self.average_samples:
self.fps_sum -= self.fps_buffer[self.fps_index]
else:
self.fps_count += 1
self.fps_sum += value
self.fps_buffer[self.fps_index] = value
self.fps_index = (self.fps_index + 1) % self.average_samples
return self.fps_sum / self.fps_count
# Custom log callback to capture FPS
def log_callback(self, level, log_str):
log_str = log_str.decode() if isinstance(log_str, bytes) else log_str
if "sysmon:" in log_str and "FPS" in log_str:
try:
fps_part = log_str.split("FPS")[0].split("sysmon:")[1].strip()
self.last_fps = int(fps_part)
self.average_fps = self.moving_average(self.last_fps)
print(f"Current FPS: {self.last_fps} - Average FPS: {self.average_fps}")
except (IndexError, ValueError):
pass