@@ -185,15 +185,11 @@ class PyCameraBase: # pylint: disable=too-many-instance-attributes,too-many-pub
185
185
60 * 10 ,
186
186
60 * 15 ,
187
187
60 * 30 ,
188
- 60 * 60
188
+ 60 * 60 ,
189
189
)
190
190
191
- timelapse_submodes = (
192
- "HiPwr" ,
193
- "MedPwr" ,
194
- "LowPwr"
195
- )
196
-
191
+ timelapse_submodes = ("HiPwr" , "MedPwr" , "LowPwr" )
192
+
197
193
modes = ("JPEG" , "GIF" , "GBOY" , "STOP" , "LAPS" )
198
194
199
195
_INIT_SEQUENCE = (
@@ -213,6 +209,11 @@ def __init__(self) -> None: # pylint: disable=too-many-statements
213
209
self ._timestamp = time .monotonic ()
214
210
self ._bigbuf = None
215
211
self ._botbar = None
212
+ self ._timelapsebar = None
213
+ self .timelapse_rate_label = None
214
+ self ._timelapsestatus = None
215
+ self .timelapsestatus_label = None
216
+ self .timelapse_submode_label = None
216
217
self ._camera_device = None
217
218
self ._display_bus = None
218
219
self ._effect_label = None
@@ -295,19 +296,19 @@ def make_camera_ui(self):
295
296
self ._botbar .append (self ._mode_label )
296
297
297
298
self ._timelapsebar = displayio .Group (x = 0 , y = 180 )
298
- self ._timelapse_submode_label = label .Label (
299
- terminalio .FONT , text = "SubM" , color = 0xFFFFFF ,x = 160 , y = 10 , scale = 2
299
+ self .timelapse_submode_label = label .Label (
300
+ terminalio .FONT , text = "SubM" , color = 0xFFFFFF , x = 160 , y = 10 , scale = 2
300
301
)
301
- self ._timelapse_rate_label = label .Label (
302
- terminalio .FONT , text = "Time" , color = 0xFFFFFF ,x = 90 , y = 10 , scale = 2
302
+ self .timelapse_rate_label = label .Label (
303
+ terminalio .FONT , text = "Time" , color = 0xFFFFFF , x = 90 , y = 10 , scale = 2
303
304
)
304
- self ._timelapsestatus_label = label .Label (
305
+ self .timelapsestatus_label = label .Label (
305
306
terminalio .FONT , text = "Status" , color = 0xFFFFFF , x = 0 , y = 10 , scale = 2
306
307
)
307
- self ._timelapsebar .append (self ._timelapse_rate_label )
308
- self ._timelapsebar .append (self ._timelapsestatus_label )
309
- self ._timelapsebar .append (self ._timelapse_submode_label )
310
-
308
+ self ._timelapsebar .append (self .timelapse_rate_label )
309
+ self ._timelapsebar .append (self .timelapsestatus_label )
310
+ self ._timelapsebar .append (self .timelapse_submode_label )
311
+
311
312
self .splash .append (self ._topbar )
312
313
self .splash .append (self ._botbar )
313
314
self .splash .append (self ._timelapsebar )
@@ -504,9 +505,9 @@ def select_setting(self, setting_name):
504
505
self ._res_label .text = self .resolutions [self ._resolution ]
505
506
self ._mode_label .color = 0xFFFFFF
506
507
self ._mode_label .background_color = 0x0
507
- self ._timelapse_rate_label .color = 0xFFFFFF
508
- self ._timelapse_rate_label .background_color = None
509
-
508
+ self .timelapse_rate_label .color = 0xFFFFFF
509
+ self .timelapse_rate_label .background_color = None
510
+
510
511
if setting_name == "effect" :
511
512
self ._effect_label .color = 0x0
512
513
self ._effect_label .background_color = 0xFFFFFF
@@ -529,8 +530,8 @@ def select_setting(self, setting_name):
529
530
self ._res_label .color = 0x0
530
531
self ._res_label .background_color = 0xFFFFFF
531
532
elif setting_name == "timelapse_rate" :
532
- self ._timelapse_rate_label .color = 0x0
533
- self ._timelapse_rate_label .background_color = 0xFFFFFF
533
+ self .timelapse_rate_label .color = 0x0
534
+ self .timelapse_rate_label .background_color = 0xFFFFFF
534
535
self .display .refresh ()
535
536
536
537
@property
@@ -591,7 +592,6 @@ def resolution(self, res):
591
592
self ._res_label .text = self .resolutions [res ]
592
593
self .display .refresh ()
593
594
594
-
595
595
@property
596
596
def timelapse_rate (self ):
597
597
"""Get or set the amount of time between timelapse shots"""
@@ -602,23 +602,28 @@ def timelapse_rate(self, setting):
602
602
setting = (setting + len (self .timelapse_rates )) % len (self .timelapse_rates )
603
603
self ._timelapse_rate = setting
604
604
if self .timelapse_rates [setting ] < 60 :
605
- self ._timelapse_rate_label .text = "%d S" % self .timelapse_rates [setting ]
605
+ self .timelapse_rate_label .text = "%d S" % self .timelapse_rates [setting ]
606
606
else :
607
- self ._timelapse_rate_label .text = "%d M" % (self .timelapse_rates [setting ] / 60 )
607
+ self .timelapse_rate_label .text = "%d M" % (
608
+ self .timelapse_rates [setting ] / 60
609
+ )
608
610
microcontroller .nvm [_NVM_TIMELAPSE_RATE ] = setting
609
611
self .display .refresh ()
610
612
611
-
612
613
@property
613
614
def timelapse_submode (self ):
614
615
"""Get or set the power mode for timelapsing"""
615
616
return self ._timelapse_submode
616
617
617
618
@timelapse_submode .setter
618
619
def timelapse_submode (self , setting ):
619
- setting = (setting + len (self .timelapse_submodes )) % len (self .timelapse_submodes )
620
+ setting = (setting + len (self .timelapse_submodes )) % len (
621
+ self .timelapse_submodes
622
+ )
620
623
self ._timelapse_submode = setting
621
- self ._timelapse_submode_label .text = self .timelapse_submodes [self ._timelapse_submode ]
624
+ self .timelapse_submode_label .text = self .timelapse_submodes [
625
+ self ._timelapse_submode
626
+ ]
622
627
microcontroller .nvm [_NVM_TIMELAPSE_SUBMODE ] = setting
623
628
624
629
def init_display (self ):
@@ -883,54 +888,79 @@ def led_color(self, new_color):
883
888
self .pixels [:] = colors
884
889
885
890
def get_camera_autosettings (self ):
886
- exposure = (self .read_camera_register (0x3500 ) << 12 ) + \
887
- (self .read_camera_register (0x3501 ) << 4 ) + \
888
- (self .read_camera_register (0x3502 ) >> 4 );
889
- wb = [self .read_camera_register (x ) for x in \
890
- (0x3400 , 0x3401 , 0x3402 , 0x3403 , 0x3404 , 0x3405 )]
891
-
891
+ """Collect all the settings related to exposure and white balance"""
892
+ exposure = (
893
+ (self .read_camera_register (0x3500 ) << 12 )
894
+ + (self .read_camera_register (0x3501 ) << 4 )
895
+ + (self .read_camera_register (0x3502 ) >> 4 )
896
+ )
897
+ white_balance = [
898
+ self .read_camera_register (x )
899
+ for x in (0x3400 , 0x3401 , 0x3402 , 0x3403 , 0x3404 , 0x3405 )
900
+ ]
901
+
892
902
settings = {
893
- ' gain' : self .read_camera_register (0x350b ),
894
- ' exposure' : exposure ,
895
- 'wb' : wb
896
- }
903
+ " gain" : self .read_camera_register (0x350B ),
904
+ " exposure" : exposure ,
905
+ "wb" : white_balance ,
906
+ }
897
907
return settings
898
908
899
909
def set_camera_wb (self , wb_register_values = None ):
910
+ """Set the camera white balance.
911
+
912
+ The argument of `None` selects auto white balance, while
913
+ a list of 6 numbers sets a specific white balance.
914
+
915
+ The numbers can come from the datasheet or from
916
+ ``get_camera_autosettings()["wb"]``."""
900
917
if wb_register_values is None :
901
918
# just set to auto balance
902
919
self .camera .whitebal = True
903
920
return
904
-
921
+
905
922
if len (wb_register_values ) != 6 :
906
923
raise RuntimeError ("Please pass in 0x3400~0x3405 inclusive!" )
907
924
908
925
self .write_camera_register (0x3212 , 0x03 )
909
926
self .write_camera_register (0x3406 , 0x01 )
910
927
for i , reg_val in enumerate (wb_register_values ):
911
- self .write_camera_register (0x3400 + i , reg_val )
928
+ self .write_camera_register (0x3400 + i , reg_val )
912
929
self .write_camera_register (0x3212 , 0x13 )
913
- self .write_camera_register (0x3212 , 0xa3 )
930
+ self .write_camera_register (0x3212 , 0xA3 )
914
931
915
932
def set_camera_exposure (self , new_exposure = None ):
933
+ """Set the camera's exposure values
934
+
935
+ The argument of `None` selects auto exposure.
936
+
937
+ Otherwise, the new exposure data should come from
938
+ ``get_camera_autosettings()["exposure"]."""
916
939
if new_exposure is None :
917
940
# just set auto expose
918
941
self .camera .exposure_ctrl = True
919
942
return
920
- exposure_ctrl = False
943
+ self . camera . exposure_ctrl = False
921
944
922
945
self .write_camera_register (0x3500 , (new_exposure >> 12 ) & 0xFF )
923
946
self .write_camera_register (0x3501 , (new_exposure >> 4 ) & 0xFF )
924
947
self .write_camera_register (0x3502 , (new_exposure << 4 ) & 0xFF )
925
-
948
+
926
949
def set_camera_gain (self , new_gain = None ):
950
+ """Set the camera's exposure values
951
+
952
+ The argument of `None` selects auto gain control.
953
+
954
+ Otherwise, the new exposure data should come from
955
+ ``get_camera_autosettings()["gain"]."""
927
956
if new_gain is None :
928
957
# just set auto expose
929
958
self .camera .gain_ctrl = True
930
959
return
931
960
932
961
self .camera .gain_ctrl = False
933
- self .write_camera_register (0x350b , new_gain )
962
+ self .write_camera_register (0x350B , new_gain )
963
+
934
964
935
965
class PyCamera (PyCameraBase ):
936
966
"""Wrapper class for the PyCamera hardware"""
0 commit comments