@@ -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 \n Hold 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