22# Probably because the double buffer copies.
33# With a direct buffer, it's still only 10 FPS. (and flickering buttons on black screen)
44# direct framebuffer + without self.canvas.invalidate() and self.canvas.center(), it's still only 13.5 FPS (and black screen)
5+ # AHA! with a send_to_display() it is running at 21.5 FPS but with heavy flicker
6+ # adding a wait for the render of 10ms gives a non-flicker 17.5 FPS
57
68import lvgl as lv
9+
10+ import time
11+
12+ import mpos .ui
713from mpos import Activity , DisplayMetrics , InputManager
814
915import sys
@@ -41,14 +47,17 @@ def onCreate(self):
4147 self .paddle_move_step = round (self .hor_res / 16 )
4248 self .ver_res = d .get_vertical_resolution ()
4349
50+ '''
4451 self.canvas = lv.canvas(self.screen)
4552 self.canvas.set_size(self.hor_res, self.ver_res)
46- self .buffer = bytearray (self .hor_res * self .ver_res * 2 )
47- self .canvas .set_buffer (self .buffer , self .hor_res , self .ver_res , lv .COLOR_FORMAT .NATIVE )
53+ #self.buffer = bytearray(self.hor_res * self.ver_res * 2)
54+ #self.canvas.set_buffer(self.buffer, self.hor_res, self.ver_res, lv.COLOR_FORMAT.NATIVE)
55+ #self.canvas.set_buffer(mpos.ui.main_display._frame_buffer1, self.hor_res, self.ver_res, lv.COLOR_FORMAT.NATIVE)
4856 #self.canvas.add_flag(lv.obj.FLAG.CLICKABLE)
4957 #self.canvas.add_event_cb(self.touch_cb, lv.EVENT.ALL, None)
5058 self.layer = lv.layer_t()
5159 self.canvas.init_layer(self.layer)
60+ '''
5261
5362 self .leftbutton = lv .button (self .screen )
5463 self .leftbutton .align (lv .ALIGN .BOTTOM_LEFT , 0 , 0 )
@@ -59,8 +68,8 @@ def onCreate(self):
5968
6069 # Invisible button, just for defocusing the left and right buttons:
6170 self .play_button = lv .button (self .screen )
62- self .play_button .align (lv .ALIGN .TOP_MID ,0 ,0 )
63- self .play_button .set_size (70 , 70 )
71+ self .play_button .align (lv .ALIGN .BOTTOM_MID ,0 ,0 )
72+ self .play_button .set_size (1 , 1 )
6473 self .play_button .set_style_opa (lv .OPA .TRANSP , lv .PART .MAIN )
6574
6675 self .rightbutton = lv .button (self .screen )
@@ -74,15 +83,16 @@ def onCreate(self):
7483
7584 def onResume (self , screen ):
7685 lv .log_register_print_cb (self .log_callback )
77- mpong .init (self .buffer , self .hor_res , self .ver_res )
86+ #mpong.init(self.buffer, self.hor_res, self.ver_res)
87+ mpong .init (mpos .ui .main_display ._frame_buffer1 , self .hor_res , self .ver_res ) # stays black
7888
79- import mpos .ui
80- #mpong.init(mpos.ui.main_display._frame_buffer1, self.hor_res, self.ver_res) # stays black
81-
82- self .refresh_timer = lv .timer_create (self .run_mpong , 32 , None ) # max 1000ms/60fps = 16ms/frame but gets no more than 10FPS
89+ #self.refresh_timer = lv.timer_create(self.run_mpong, 16, None) # max 1000ms/60fps = 16ms/frame
90+ self .refresh_timer = lv .timer_create (self .run_mpong , 33 , None ) # max 1000ms/30fps = 33ms/frame
8391 #mpos.ui.task_handler.add_event_cb(self.run_mpong, mpos.ui.task_handler.TASK_HANDLER_STARTED)
8492 #mpos.ui.task_handler.add_event_cb(self.run_mpong, mpos.ui.task_handler.TASK_HANDLER_FINISHED)
8593
94+ #mpos.ui.main_display.delete_refr_timer() # how to enable after? also it doesnt help
95+
8696 def onPause (self , screen ):
8797 if self .refresh_timer :
8898 self .refresh_timer .delete ()
@@ -126,6 +136,27 @@ def unfocus(self):
126136 else :
127137 print ("focus isn't on next or previous, leaving it..." )
128138
139+ def send_to_display (self ):
140+ # full-screen area
141+ x1 , y1 = 0 , 0
142+ x2 = mpos .ui .main_display .get_horizontal_resolution () - 1
143+ x2 = x2 + mpos .ui .main_display ._offset_x
144+ x1 = x1 + mpos .ui .main_display ._offset_x
145+ y2 = mpos .ui .main_display .get_vertical_resolution () - 1
146+ y2 = y2 + mpos .ui .main_display ._offset_y
147+ y1 = y1 + mpos .ui .main_display ._offset_y
148+
149+ cmd = mpos .ui .main_display ._set_memory_location (x1 , y1 , x2 , y2 )
150+ data_view = mpos .ui .main_display ._frame_buffer1
151+
152+ mpos .ui .main_display ._data_bus .tx_color (
153+ cmd ,
154+ data_view ,
155+ x1 , y1 , x2 , y2 ,
156+ mpos .ui .main_display ._rotation ,
157+ True ,
158+ )
159+
129160 def run_mpong (self , arg1 = None , arg2 = None ):
130161 mpong .render ()
131162 #self.play_button.set_style_opa(lv.OPA.TRANSP, lv.PART.MAIN) # works to force refresh on desktop but not esp32
@@ -134,7 +165,7 @@ def run_mpong(self, arg1=None, arg2=None):
134165 #self.canvas.invalidate() # force redraw
135166 #self.canvas.center()
136167 #self.canvas.refre
137- self .screen .invalidate ()
168+ # self.screen.invalidate()
138169 #self.screen.center()
139170 #mpong.render()
140171 '''
@@ -147,6 +178,8 @@ def run_mpong(self, arg1=None, arg2=None):
147178 import mpos.ui
148179 mpos.ui.main_display._flush_cb(None, area, mpos.ui.main_display._frame_buffer1) # color_p should be pointer, not memoryview
149180 '''
181+ self .send_to_display ()
182+ time .sleep_ms (10 ) # give it time to flush, otherwise there's heavy flicker. 5ms is fine!
150183
151184 def touch_cb (self , event ):
152185 event_code = event .get_code ()
0 commit comments