@@ -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