Skip to content

Commit f8da36b

Browse files
camera: fix crash and other bugs
1 parent 858df97 commit f8da36b

File tree

2 files changed

+42
-39
lines changed

2 files changed

+42
-39
lines changed

c_mpos/src/webcam.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#define WIDTH 640
1616
#define HEIGHT 480
1717
#define NUM_BUFFERS 1
18-
#define OUTPUT_WIDTH 240
19-
#define OUTPUT_HEIGHT 240
2018

2119
#define WEBCAM_DEBUG_PRINT(...) mp_printf(&mp_plat_print, __VA_ARGS__)
2220

internal_filesystem/apps/com.micropythonos.camera/assets/camera_app.py

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ class CameraApp(Activity):
2222
width = 320
2323
height = 240
2424

25-
# Resolution preferences
26-
prefs = None
27-
2825
status_label_text = "No camera found."
2926
status_label_text_searching = "Searching QR codes...\n\nHold still and try varying scan distance (10-25cm) and QR size (4-12cm). Ensure proper lighting."
3027
status_label_text_found = "Decoding QR..."
@@ -41,6 +38,7 @@ class CameraApp(Activity):
4138
capture_timer = None
4239

4340
# Widgets:
41+
main_screen = None
4442
qr_label = None
4543
qr_button = None
4644
snap_button = None
@@ -49,10 +47,8 @@ class CameraApp(Activity):
4947

5048
def load_resolution_preference(self):
5149
"""Load resolution preference from SharedPreferences and update width/height."""
52-
if not self.prefs:
53-
self.prefs = SharedPreferences("com.micropythonos.camera")
54-
55-
resolution_str = self.prefs.get_string("resolution", "320x240")
50+
prefs = SharedPreferences("com.micropythonos.camera")
51+
resolution_str = prefs.get_string("resolution", "320x240")
5652
try:
5753
width_str, height_str = resolution_str.split('x')
5854
self.width = int(width_str)
@@ -66,62 +62,46 @@ def load_resolution_preference(self):
6662
def onCreate(self):
6763
self.load_resolution_preference()
6864
self.scanqr_mode = self.getIntent().extras.get("scanqr_mode")
69-
main_screen = lv.obj()
70-
main_screen.set_style_pad_all(0, 0)
71-
main_screen.set_style_border_width(0, 0)
72-
main_screen.set_size(lv.pct(100), lv.pct(100))
73-
main_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
74-
close_button = lv.button(main_screen)
65+
self.main_screen = lv.obj()
66+
self.main_screen.set_style_pad_all(0, 0)
67+
self.main_screen.set_style_border_width(0, 0)
68+
self.main_screen.set_size(lv.pct(100), lv.pct(100))
69+
self.main_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
70+
# Initialize LVGL image widget
71+
self.create_preview_image()
72+
close_button = lv.button(self.main_screen)
7573
close_button.set_size(60,60)
7674
close_button.align(lv.ALIGN.TOP_RIGHT, 0, 0)
7775
close_label = lv.label(close_button)
7876
close_label.set_text(lv.SYMBOL.CLOSE)
7977
close_label.center()
8078
close_button.add_event_cb(lambda e: self.finish(),lv.EVENT.CLICKED,None)
81-
8279
# Settings button
83-
settings_button = lv.button(main_screen)
80+
settings_button = lv.button(self.main_screen)
8481
settings_button.set_size(60,60)
8582
settings_button.align(lv.ALIGN.TOP_RIGHT, 0, 60)
8683
settings_label = lv.label(settings_button)
8784
settings_label.set_text(lv.SYMBOL.SETTINGS)
8885
settings_label.center()
8986
settings_button.add_event_cb(lambda e: self.open_settings(),lv.EVENT.CLICKED,None)
9087

91-
self.snap_button = lv.button(main_screen)
88+
self.snap_button = lv.button(self.main_screen)
9289
self.snap_button.set_size(60, 60)
9390
self.snap_button.align(lv.ALIGN.RIGHT_MID, 0, 0)
9491
self.snap_button.add_flag(lv.obj.FLAG.HIDDEN)
9592
self.snap_button.add_event_cb(self.snap_button_click,lv.EVENT.CLICKED,None)
9693
snap_label = lv.label(self.snap_button)
9794
snap_label.set_text(lv.SYMBOL.OK)
9895
snap_label.center()
99-
self.qr_button = lv.button(main_screen)
96+
self.qr_button = lv.button(self.main_screen)
10097
self.qr_button.set_size(60, 60)
10198
self.qr_button.add_flag(lv.obj.FLAG.HIDDEN)
10299
self.qr_button.align(lv.ALIGN.BOTTOM_RIGHT, 0, 0)
103100
self.qr_button.add_event_cb(self.qr_button_click,lv.EVENT.CLICKED,None)
104101
self.qr_label = lv.label(self.qr_button)
105102
self.qr_label.set_text(lv.SYMBOL.EYE_OPEN)
106103
self.qr_label.center()
107-
# Initialize LVGL image widget
108-
self.image = lv.image(main_screen)
109-
self.image.align(lv.ALIGN.LEFT_MID, 0, 0)
110-
# Create image descriptor once
111-
self.image_dsc = lv.image_dsc_t({
112-
"header": {
113-
"magic": lv.IMAGE_HEADER_MAGIC,
114-
"w": self.width,
115-
"h": self.height,
116-
"stride": self.width * 2,
117-
"cf": lv.COLOR_FORMAT.RGB565
118-
#"cf": lv.COLOR_FORMAT.L8
119-
},
120-
'data_size': self.width * self.height * 2,
121-
'data': None # Will be updated per frame
122-
})
123-
self.image.set_src(self.image_dsc)
124-
self.status_label_cont = lv.obj(main_screen)
104+
self.status_label_cont = lv.obj(self.main_screen)
125105
self.status_label_cont.set_size(lv.pct(66),lv.pct(60))
126106
self.status_label_cont.align(lv.ALIGN.LEFT_MID, lv.pct(5), 0)
127107
self.status_label_cont.set_style_bg_color(lv.color_white(), 0)
@@ -132,9 +112,10 @@ def onCreate(self):
132112
self.status_label.set_long_mode(lv.label.LONG_MODE.WRAP)
133113
self.status_label.set_width(lv.pct(100))
134114
self.status_label.center()
135-
self.setContentView(main_screen)
115+
self.setContentView(self.main_screen)
136116

137117
def onResume(self, screen):
118+
self.create_preview_image()
138119
self.cam = init_internal_cam(self.width, self.height)
139120
if not self.cam:
140121
# try again because the manual i2c poweroff leaves it in a bad state
@@ -191,6 +172,7 @@ def onPause(self, screen):
191172
print("camera app cleanup done.")
192173

193174
def set_image_size(self):
175+
#return
194176
disp = lv.display_get_default()
195177
target_h = disp.get_vertical_resolution()
196178
target_w = target_h
@@ -205,6 +187,26 @@ def set_image_size(self):
205187
#self.image.set_scale(max(scale_factor_w,scale_factor_h)) # fills the entire screen but cuts off borders
206188
self.image.set_scale(min(scale_factor_w,scale_factor_h))
207189

190+
def create_preview_image(self):
191+
self.image = lv.image(self.main_screen)
192+
self.image.align(lv.ALIGN.LEFT_MID, 0, 0)
193+
# Create image descriptor once
194+
self.image_dsc = lv.image_dsc_t({
195+
"header": {
196+
"magic": lv.IMAGE_HEADER_MAGIC,
197+
"w": self.width,
198+
"h": self.height,
199+
"stride": self.width * 2,
200+
"cf": lv.COLOR_FORMAT.RGB565
201+
#"cf": lv.COLOR_FORMAT.L8
202+
},
203+
'data_size': self.width * self.height * 2,
204+
'data': None # Will be updated per frame
205+
})
206+
self.image.set_src(self.image_dsc)
207+
#self.image.set_size(160, 120)
208+
209+
208210
def qrdecode_one(self):
209211
try:
210212
import qrdecode
@@ -277,11 +279,14 @@ def qr_button_click(self, e):
277279
self.stop_qr_decoding()
278280

279281
def open_settings(self):
282+
#self.main_screen.clean()
283+
self.image.delete()
280284
"""Launch the camera settings activity."""
281285
intent = Intent(activity_class=CameraSettingsActivity)
282286
self.startActivityForResult(intent, self.handle_settings_result)
283287

284288
def handle_settings_result(self, result):
289+
print(f"handle_settings_result: {result}")
285290
"""Handle result from settings activity."""
286291
if result.get("result_code") == True:
287292
print("Settings changed, reloading resolution...")
@@ -495,7 +500,7 @@ def onCreate(self):
495500
except:
496501
resolutions = self.ESP32_RESOLUTIONS
497502
print("Using ESP32 camera resolutions")
498-
503+
499504
# Create dropdown
500505
self.dropdown = lv.dropdown(screen)
501506
self.dropdown.set_size(200, 40)

0 commit comments

Comments
 (0)