Skip to content

Commit 5de7b30

Browse files
mpong: framerate logging, button handling
1 parent 9c859bd commit 5de7b30

1 file changed

Lines changed: 70 additions & 3 deletions

File tree

  • internal_filesystem/apps/com.micropythonos.mpong/assets

internal_filesystem/apps/com.micropythonos.mpong/assets/mpong.py

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ class MPong(Activity):
2121
buffer = None
2222
touch_active = False
2323
touch_last_x = None
24+
last_fps = 0
25+
average_fps = 0
2426

2527
# Widgets:
2628
screen = None
2729
canvas = None
2830
leftbutton = None
31+
playbutton = None
2932
rightbutton = None
3033

3134
def onCreate(self):
@@ -47,32 +50,69 @@ def onCreate(self):
4750
self.leftbutton.align(lv.ALIGN.BOTTOM_LEFT, 0, 0)
4851
leftlabel = lv.label(self.leftbutton)
4952
leftlabel.set_text("<")
50-
self.leftbutton.add_event_cb(lambda e: self.move_left(),lv.EVENT.FOCUSED,None)
53+
self.leftbutton.add_event_cb(lambda e: self.move_left_unfocus(),lv.EVENT.FOCUSED,None)
5154
self.leftbutton.add_event_cb(lambda e: self.move_left(),lv.EVENT.CLICKED,None)
5255

56+
# Invisible button, just for defocusing the left and right buttons:
57+
self.play_button = lv.button(self.screen)
58+
self.play_button.align(lv.ALIGN.BOTTOM_MID,0,0)
59+
self.play_button.set_style_opa(lv.OPA.TRANSP, lv.PART.MAIN)
60+
5361
self.rightbutton = lv.button(self.screen)
5462
self.rightbutton.align(lv.ALIGN.BOTTOM_RIGHT, 0, 0)
5563
rightlabel = lv.label(self.rightbutton)
5664
rightlabel.set_text(">")
57-
self.rightbutton.add_event_cb(lambda e: self.move_right(),lv.EVENT.FOCUSED,None)
65+
self.rightbutton.add_event_cb(lambda e: self.move_right_unfocus(),lv.EVENT.FOCUSED,None)
5866
self.rightbutton.add_event_cb(lambda e: self.move_right(),lv.EVENT.CLICKED,None)
5967

6068
self.setContentView(self.screen)
6169

6270
def onResume(self, screen):
71+
lv.log_register_print_cb(self.log_callback)
6372
mpong.init(self.buffer, self.hor_res, self.ver_res)
64-
self.refresh_timer = lv.timer_create(self.run_mpong, 10, None)
73+
self.refresh_timer = lv.timer_create(self.run_mpong, 1, None)
6574

6675
def onPause(self, screen):
6776
if self.refresh_timer:
6877
self.refresh_timer.delete()
78+
lv.log_register_print_cb(None)
6979

7080
def move_left(self):
7181
mpong.move_paddle(-self.paddle_move_step)
7282

7383
def move_right(self):
7484
mpong.move_paddle(self.paddle_move_step)
7585

86+
def move_left_unfocus(self):
87+
self.unfocus()
88+
mpong.move_paddle(-self.paddle_move_step)
89+
90+
def move_right_unfocus(self):
91+
self.unfocus()
92+
mpong.move_paddle(self.paddle_move_step)
93+
94+
def unfocus(self):
95+
focusgroup = lv.group_get_default()
96+
if not focusgroup:
97+
print("WARNING: imageview.py could not get default focus group")
98+
return
99+
focused = focusgroup.get_focused()
100+
if focused:
101+
print(f"got focus button: {focused}")
102+
label = focused.get_child(0)
103+
print(f"got label for button: {label.get_text()}")
104+
#focused.remove_state(lv.STATE.FOCUSED) # this doesn't seem to work to remove focus
105+
print("checking which button is focused")
106+
if focused == self.rightbutton:
107+
#print("next is focused")
108+
focusgroup.focus_prev()
109+
elif focused == self.leftbutton:
110+
#print("prev is focused")
111+
focusgroup.focus_next()
112+
else:
113+
print("focus isn't on next or previous, leaving it...")
114+
115+
76116
def run_mpong(self, timer=None):
77117
mpong.render()
78118
self.canvas.invalidate() # force redraw
@@ -103,3 +143,30 @@ def touch_cb(self, event):
103143
self.touch_active = False
104144
self.touch_last_x = None
105145
return
146+
147+
average_samples = 20
148+
fps_buffer = [0.0] * average_samples
149+
fps_index = 0
150+
fps_sum = 0.0
151+
fps_count = 0 # Number of valid samples (0 to average_samples)
152+
def moving_average(self, value):
153+
if self.fps_count == self.average_samples:
154+
self.fps_sum -= self.fps_buffer[self.fps_index]
155+
else:
156+
self.fps_count += 1
157+
self.fps_sum += value
158+
self.fps_buffer[self.fps_index] = value
159+
self.fps_index = (self.fps_index + 1) % self.average_samples
160+
return self.fps_sum / self.fps_count
161+
162+
# Custom log callback to capture FPS
163+
def log_callback(self, level, log_str):
164+
log_str = log_str.decode() if isinstance(log_str, bytes) else log_str
165+
if "sysmon:" in log_str and "FPS" in log_str:
166+
try:
167+
fps_part = log_str.split("FPS")[0].split("sysmon:")[1].strip()
168+
self.last_fps = int(fps_part)
169+
self.average_fps = self.moving_average(self.last_fps)
170+
print(f"Current FPS: {self.last_fps} - Average FPS: {self.average_fps}")
171+
except (IndexError, ValueError):
172+
pass

0 commit comments

Comments
 (0)