Skip to content

Commit 9bcff52

Browse files
breakout/mpong works okay now
1 parent a3ad6ac commit 9bcff52

2 files changed

Lines changed: 45 additions & 12 deletions

File tree

c_mpos/mpong/mpong.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ uint32_t g_last_tick_ms;
2828
uint32_t g_fps_last_ms;
2929
uint32_t g_fps_frames;
3030

31-
#define BRICK_ROWS 4
31+
#define BRICK_ROWS 12
3232
#define BRICK_COLS 8
3333
uint8_t g_bricks[BRICK_ROWS][BRICK_COLS];
3434

@@ -147,9 +147,9 @@ static mp_obj_t render(void) {
147147

148148
const size_t width = g_framebuffer_width;
149149
const size_t height = g_framebuffer_height;
150-
const size_t fill_pixels = framebuffer_max_pixels();
151150

152151
// Clear to black.
152+
const size_t fill_pixels = framebuffer_max_pixels();
153153
for (size_t i = 0; i < fill_pixels; i++) { g_framebuffer[i] = 0x0000; } // RGB565 black
154154

155155
g_fps_frames++;

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

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
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

68
import lvgl as lv
9+
10+
import time
11+
12+
import mpos.ui
713
from mpos import Activity, DisplayMetrics, InputManager
814

915
import 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

Comments
 (0)