pogucam 0.1.14__py3-none-any.whl → 0.1.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -91,8 +91,8 @@ import datetime as dt
91
91
  import cv2
92
92
  import threading
93
93
 
94
-
95
-
94
+ import glob # look for bg fg
95
+ import shutil
96
96
 
97
97
  istrip = 0
98
98
  UPDATE_INTERVAL = 1
@@ -104,6 +104,69 @@ FILE_USERPASS = "~/.config/flashcam/.flashcam_upw" # will extend
104
104
  FILE_REDCROSS0 = "~/.config/pogucam/crossred" # will extend
105
105
  FILE_REDCROSS = "~/.config/pogucam/crossred" # will extend
106
106
 
107
+
108
+
109
+
110
+
111
+ # ================================================================================
112
+ #
113
+ # --------------------------------------------------------------------------------
114
+
115
+
116
+ # ================================================================================
117
+ #
118
+ # --------------------------------------------------------------------------------
119
+
120
+
121
+ # ================================================================================
122
+ #
123
+ # --------------------------------------------------------------------------------
124
+
125
+
126
+ # ================================================================================
127
+ #
128
+ # --------------------------------------------------------------------------------
129
+
130
+
131
+ # def parse_timestamp_in_saved_file(filename):
132
+ # # Extract timestamp part YYmmdd_HHMMSS.ff from filename
133
+ # parts = filename.split('_')
134
+ # if len(parts) < 5:
135
+ # return None
136
+ # timestamp_str = parts[3] + '_' + parts[4] # YYmmdd_HHMMSS.ff
137
+ # try:
138
+ # # Parse ignoring fractional seconds for sorting
139
+ # dt = datetime.strptime(timestamp_str.split('.')[0], "%Y%m%d_%H%M%S")
140
+ # return dt
141
+ # except ValueError:
142
+ # return None
143
+
144
+ def find_latest_bg_or_fg(new_name, foreground=False):
145
+ #
146
+ tag = "background"
147
+ if foreground:
148
+ tag = "foreground"
149
+ base, ext = os.path.splitext(new_name) #
150
+ parts = base.split('_')
151
+ pattern = f"{parts[0]}_{parts[1]}_{parts[2]}_"
152
+ copyfile = f"{pattern}{tag}{ext}"
153
+ #if not base.endswith(tag):
154
+ # print("Filename must end with '_background' before extension")
155
+ # return
156
+ #base_prefix = base[:-11] # remove '_background'
157
+ pattern2 = f"{pattern}20*{ext}" # 20ieth century
158
+ files = glob.glob(pattern2)
159
+ lastfile = None
160
+ if not files:
161
+ print("D... No matching files found for", pattern2)
162
+ else:
163
+ lastfile = sorted(files)[-1]
164
+ print(f"D... {len(files)} possible files" , lastfile)
165
+ if lastfile is None: print(f"{fg.red}X... no suitable saved file for {tag} ", fg.default)
166
+ return lastfile,copyfile
167
+
168
+
169
+
107
170
  # ================================================================================
108
171
  # RA "00 12 45.2"
109
172
  # --------------------------------------------------------------------------------
@@ -588,7 +651,14 @@ class StreamWidget(QLabel):
588
651
  # -------------------------------------------------
589
652
  #self.level2_buffer = None
590
653
  #self.level2_buffer_max_size = 10
591
-
654
+ #---------------------------------------------
655
+ self.filename_background = None
656
+ self.filename_foreground = None
657
+ self.image_background = None
658
+ self.image_foreground = None
659
+ self.l_timelaps = False
660
+ self.l_timelaps_seconds = 16 # initial 2^4
661
+ self.l_timelaps_last = dt.datetime.now() #
592
662
  # --------------------------------- I put it at the end so that it knows all attributes
593
663
  self.update_image()
594
664
 
@@ -613,7 +683,8 @@ class StreamWidget(QLabel):
613
683
  #print(self.internet_not_device, self.internet_not_device)
614
684
  # -------------------------------------------------------------- ACCUM -----------------
615
685
  if self.internet_not_device:
616
- # every internet call do here
686
+ #### every internet call do here
687
+ #### but skip anyting with ACCUM ACCUMTXT !!!!!!!!
617
688
  if ('accumtxt' in data) and int(data['accumtxt']) == 1: # skip Loop 1
618
689
  print("D... LOOP 1 skipped for remote send command - for some reason I send out 0 only,not 1")
619
690
  pass
@@ -622,7 +693,7 @@ class StreamWidget(QLabel):
622
693
  if val == 0: val = 1 # trying to fix
623
694
  if len(self.FABuffer) != val and val > 0:
624
695
  self.FABuffer.set_max_frames(val)
625
- else:
696
+ else:#### HERE REALLY ######--------------------------------------------------
626
697
  post_response = requests.post(url=self.post_addr, data=data )
627
698
  else:
628
699
  # --------------------------------------------------------- JUST LOCAL DEVICE ----------------
@@ -965,7 +1036,7 @@ class StreamWidget(QLabel):
965
1036
  SAV = f" "
966
1037
  if self.saving_all:
967
1038
  SAV = f"SAVING"
968
- LAPS = f"LOO:{self.saving_laps:3d}"
1039
+ LAPS = f"LAPS:{self.saving_laps:3d}"
969
1040
  #
970
1041
  FIT = f" "
971
1042
  if self.saving_fits_only:
@@ -988,6 +1059,10 @@ class StreamWidget(QLabel):
988
1059
  bufshow = "(SUM)"
989
1060
  else:
990
1061
  bufshow = "( )"
1062
+ bgfg1 = " "
1063
+ bgfg2 = " "
1064
+ if self.image_foreground is not None: bgfg1 = "FG"
1065
+ if self.image_background is not None: bgfg2 = "BG"
991
1066
 
992
1067
  BUF = f"BUF{bufshow}={cur_size:3d}/{max_size:3d} {total_size/1024/1024:5.0f} MB"
993
1068
  #
@@ -995,9 +1070,11 @@ class StreamWidget(QLabel):
995
1070
  #
996
1071
  #overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {ROO} . {LGA} . {SAV} {FIT} . {BUF}. {LAPS}"
997
1072
  # SAVING is already red
998
- overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {ROO} . {LGA} . {FIT} . {BUF}. {LAPS}"
1073
+ #overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {ROO} . {LGA} . {FIT} . {BUF}. {LAPS}"
999
1074
  # ROTATE IS LOCAL
1000
- overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {LGA} . {FIT} . {BUF}. {LAPS}"
1075
+ #overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {LGA} . {FIT} . {BUF}. {LAPS}"
1076
+ # I add BG-FG
1077
+ overtext = f"{self.frame_time} # {self.frame_num} # {self.l_frame_num:6d} # {RXT} . {ZOO} . {LGA} . {FIT} . {bgfg1}{bgfg2} . {BUF}. {LAPS}"
1001
1078
  #
1002
1079
  position = ( 0, selfimg.shape[0]-1 ) # 480 on x-axis
1003
1080
  #
@@ -1032,6 +1109,7 @@ class StreamWidget(QLabel):
1032
1109
  # ----------------------------------------------------------------------
1033
1110
 
1034
1111
  def prepare_save(self, png=False, time_tag=None):
1112
+ # ..... self.saving_fits_only is not necessary, handled elsewhere
1035
1113
  dir2create = os.path.expanduser("~/DATA/")
1036
1114
  if not os.path.isdir(os.path.expanduser(dir2create)):
1037
1115
  print(f"D... trying to create directory {dir2create} for saving")
@@ -1039,12 +1117,13 @@ class StreamWidget(QLabel):
1039
1117
  os.mkdir(os.path.expanduser(dir2create))
1040
1118
  now = time_tag
1041
1119
  if time_tag is None:
1042
- now = dt.datetime.now().strftime( '%Y%m%d_%H%M%S_%f')[:-4]
1120
+ now = dt.datetime.now().strftime( '%Y%m%d_%H%M%S.%f')[:-4] # dot fraction - should be conform with other parts
1043
1121
  else:
1044
1122
  # 20:23:46.12
1045
1123
  now = dt.datetime.now().strftime( '%Y%m%d_')+now.replace(":", "")
1046
1124
  ext = "jpg"
1047
1125
  if png:ext = "png"
1126
+ #if self.saving_fits_only:ext = "fits" # not necessary here...
1048
1127
  host = socket.gethostname()
1049
1128
  murl = ""
1050
1129
  if self.url.find("http://") >= 0:
@@ -1160,7 +1239,9 @@ class StreamWidget(QLabel):
1160
1239
  dumpbuffer:
1161
1240
  use_buffer is None OR THE BUFFER TO USE (level2)
1162
1241
  """
1163
- fname1 = self.prepare_save( time_tag=time_tag)
1242
+ fname1 = fname
1243
+ if fname is None:
1244
+ fname1 = self.prepare_save( time_tag=time_tag)
1164
1245
  if not silent: print(fname1)
1165
1246
  #---------- FITS *****
1166
1247
  if use_fits: # --------- FITS CASE --- more complex -------------------------------
@@ -1516,6 +1597,12 @@ class StreamWidget(QLabel):
1516
1597
  ret_val = False
1517
1598
  if True:# self.img.shape == self.frame.shape:
1518
1599
  self.img = self.frame.copy()
1600
+ if not self.image_background is None:
1601
+ #self.img = self.img - self.image_background
1602
+ self.img = cv2.subtract(self.img , self.image_background )
1603
+ if not self.image_foreground is None:
1604
+ #self.img = self.img + self.image_foreground
1605
+ self.img = 0.5*self.img + 0.5*self.image_foreground
1519
1606
  if stripes: # These are thin gray
1520
1607
  #self.vcr_pal_style(["NO SIGNAL"])
1521
1608
  for y in range(0, self.img.shape[0], 16):
@@ -1989,9 +2076,15 @@ class StreamWidget(QLabel):
1989
2076
  # print(fg.red, f"L{self.saving_laps}{fitag}", fg.default, end="")
1990
2077
  # self.saving_laps_last_save = now
1991
2078
  # self.save_img( time_tag=self.frame_time , savingjpg=False) #
1992
-
2079
+ DO_TIMELAPS = False
2080
+ if self.l_timelaps:
2081
+ if dt.datetime.now() > self.l_timelaps_last + dt.timedelta(seconds=self.l_timelaps_seconds):
2082
+ print(f"\ni... {fg.cyan} TIMELAPS saving now {fg.default} ... every {fg.orange} {self.l_timelaps_seconds} s. {fg.defaiult}")
2083
+ self.l_timelaps_last = dt.datetime.now()
2084
+ DO_TIMELAPS = True
1993
2085
  # ---- just save once -------------------- ************ "s" ***********
1994
- if self.saving_once:
2086
+ if self.saving_once or DO_TIMELAPS:
2087
+ DO_TIMELAPS = False
1995
2088
  # jpg and NO AVG --------- No difference show_accum_not_showaccum if frabuffer ==1
1996
2089
  if (len(self.FABuffer) < 2) and (not self.l_show_accum) and (not self.saving_fits_only):
1997
2090
  # no bufffer no loopshow no fits
@@ -2068,6 +2161,7 @@ class StreamWidget(QLabel):
2068
2161
 
2069
2162
 
2070
2163
  # ---- save ALL ----------------- -------------------------------------------- ************ "shift-s" ***********
2164
+ #
2071
2165
  # ---- save ALL ----------------- -------------------------------------------- ************ "shift-s" ***********
2072
2166
  if self.saving_all: # --------------- Shift-S------- ALWAYS PUT RED
2073
2167
 
@@ -2260,20 +2354,26 @@ class StreamWidget(QLabel):
2260
2354
  print('kstars (but press revert)')
2261
2355
  print()
2262
2356
  elif (parts_set == {'Ctrl'}) :
2263
- self.saving_fits_only = not self.saving_fits_only
2264
- self.saving_all = False
2265
- if self.saving_fits_only:
2266
- print(f"i... {fg.orange}FITS_ONLY set to {self.saving_fits_only}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2267
- else:
2268
- print(f"i... FITS_ONLY set to {fg.cyan}{self.saving_fits_only}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2357
+ pass
2269
2358
 
2270
2359
  elif (parts_set == {'Ctrl', 'Shift'}) :
2360
+ # --------------
2271
2361
  self.saving_jpg = not self.saving_jpg
2272
2362
  self.saving_all = False
2273
2363
  if self.saving_jpg:
2274
2364
  print(f"i... {fg.green}SAVING_JPG set to {self.saving_jpg}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2275
2365
  else:
2276
2366
  print(f"i... {fg.orange}PNG!{fg.default} SAVING_JPG set to {fg.cyan}{self.saving_jpg}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2367
+ elif (parts_set == {'Alt'}) :
2368
+ # FITS / JPEG saving !!!
2369
+ self.saving_fits_only = not self.saving_fits_only
2370
+ self.saving_all = False
2371
+ if self.saving_fits_only:
2372
+ print(f"i... {fg.orange}FITS_ONLY set to {self.saving_fits_only}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2373
+ else:
2374
+ print(f"i... FITS_ONLY set to {fg.cyan}{self.saving_fits_only}{fg.default} (interval is {self.FITS_INTERVAL_SECONDS}) ; but 'SAVING_all' SET TO ", self.saving_all)
2375
+
2376
+
2277
2377
 
2278
2378
  # ------------------------------ xtend x2 ot switchres resolution--- x XRES SWITCH - REMOTE - **SEND_COMMAND**
2279
2379
  if (key == Qt.Key.Key_X):
@@ -2463,7 +2563,7 @@ class StreamWidget(QLabel):
2463
2563
  elif (parts_set == {'Ctrl'}) :
2464
2564
  print( "i... reset position red cross")
2465
2565
  self.redcross = [0, 0]
2466
- # ----------------------------------------------------------------- i integrate accumulate - LOCAL ONLY ! **SEND_COMMAND**
2566
+ # ----------------------------------------------------------------- i integrate accumulate - LOCAL ONLY ! tricky**SEND_COMMAND**
2467
2567
  if (key == Qt.Key.Key_I): # i:inc shift-i:dec Ctrl-i:reset Ctrl-Shift-i:watch Alt-i: SUM vs. AVG
2468
2568
  # 4.6GB / 1000 640x480
2469
2569
  if ( len(parts_set) == 0):
@@ -2505,18 +2605,49 @@ class StreamWidget(QLabel):
2505
2605
  # ----------------------------------------------------------------- b BACKGROUND - REMOTE **SEND_COMMAND**
2506
2606
  if (key == Qt.Key.Key_B):
2507
2607
  if ( len(parts_set) == 0):
2508
- self.send_command( data= {"subbg": "SUBBG"})
2608
+ #self.send_command( data= {"subbg": "SUBBG"})
2609
+ fname1 = self.prepare_save( time_tag=None)
2610
+ #print(fg.green, f"D... looking for like {fname1}", fg.default)
2611
+ bgfilename, copyname= find_latest_bg_or_fg(fname1, foreground=False)
2612
+ self.filename_background = copyname
2613
+ if os.path.exists(self.filename_background):
2614
+ print(f"{fg.green}D... BG= {self.filename_background}", fg.default)
2615
+ self.image_background = cv2.imread(self.filename_background)
2616
+ pass
2509
2617
  elif (parts_set == {'Shift'}) :
2510
- self.send_command( data= {"savebg": "SAVEBG"})
2618
+ fname1 = self.prepare_save( time_tag=None)
2619
+ #print(fg.green, f"D... looking for like {fname1}", fg.default)
2620
+ bgfilename, copyname= find_latest_bg_or_fg(fname1, foreground=False)
2621
+ if not bgfilename is None:
2622
+ print(f"{fg.green}D... copying:", bgfilename, copyname, fg.default)
2623
+ shutil.copy(bgfilename, copyname)
2624
+ #self.send_command( data= {"savebg": "SAVEBG"})
2625
+ pass
2511
2626
  elif (parts_set == {'Ctrl'}) :
2627
+ self.filename_background = None
2628
+ self.image_background = None
2512
2629
  pass
2513
- # ----------------------------------------------------------------- f FOREGROUND - REMOTE **SEND_COMMAND**
2630
+ # ----------------------------------------------------------------- f FOREGROUND - LOCAL ONLY !
2514
2631
  if (key == Qt.Key.Key_F):
2515
2632
  if ( len(parts_set) == 0):
2516
- self.send_command( data= {"mixfg": "MIXFG"})
2633
+ #self.send_command( data= {"mixfg": "MIXFG"})
2634
+ fname1 = self.prepare_save( time_tag=None)
2635
+ bgfilename, copyname= find_latest_bg_or_fg(fname1, foreground=True)
2636
+ self.filename_foreground = copyname
2637
+ if os.path.exists(self.filename_foreground):
2638
+ print(f"{fg.green}D... FG= {self.filename_foreground}", fg.default)
2639
+ self.image_foreground = cv2.imread(self.filename_foreground)
2517
2640
  elif (parts_set == {'Shift'}) :
2518
- self.send_command( data= {"savefg": "SAVEFG"})
2641
+ #self.send_command( data= {"savefg": "SAVEFG"})
2642
+ fname1 = self.prepare_save( time_tag=None)
2643
+ #print(fg.green, f"D... looking for like {fname1}", fg.default)
2644
+ bgfilename, copyname= find_latest_bg_or_fg(fname1, foreground=True)
2645
+ if not bgfilename is None:
2646
+ print(f"{fg.green}D... copying:", bgfilename, copyname, fg.default)
2647
+ shutil.copy(bgfilename, copyname)
2519
2648
  elif (parts_set == {'Ctrl'}) :
2649
+ self.filename_foreground = None
2650
+ self.image_foreground = None
2520
2651
  pass
2521
2652
 
2522
2653
  # ----------------------------------------------------------------- r ROTATE - LOCAL ONLY !
@@ -2581,7 +2712,7 @@ class StreamWidget(QLabel):
2581
2712
  self.setup("q") # quit-resetall
2582
2713
 
2583
2714
 
2584
- # ----------------------------------------------------------------- t tests whatever
2715
+ # ----------------------------------------------------------------- [ ] tests whatever
2585
2716
  if (key == Qt.Key.Key_T):
2586
2717
  if ( len(parts_set) == 0):
2587
2718
  #self.send_command( data= {"gaint": "GAINT", "gaintxt": float(0.123)})
@@ -2594,6 +2725,30 @@ class StreamWidget(QLabel):
2594
2725
  elif (parts_set == {'Ctrl'}) :
2595
2726
  #self.send_command( data= {"expot": "EXPOT", "expotxt": float(-1.0)})
2596
2727
  pass
2728
+
2729
+ # ----------------------------------------------------------------- [ ] tests whatever A timelaps LOCAL
2730
+ if (key == Qt.Key.Key_A):
2731
+ if ( len(parts_set) == 0):
2732
+ self.l_timelaps = True
2733
+ if self.l_timelaps_seconds == 0:
2734
+ self.l_timelaps_seconds = 1
2735
+ else:
2736
+ self.l_timelaps_seconds = self.l_timelaps_seconds * 2
2737
+ self.l_timelaps_last = dt.datetime.now()- dt.timedelta(seconds=self.l_timelaps_seconds)
2738
+ pass
2739
+ elif (parts_set == {'Shift'}) :
2740
+ if self.l_timelaps_seconds > 1:
2741
+ self.l_timelaps_seconds = int(self.l_timelaps_seconds / 2)
2742
+ else:
2743
+ self.l_timelaps_seconds = 1
2744
+ self.l_timelaps_last = dt.datetime.now()- dt.timedelta(seconds=self.l_timelaps_seconds)
2745
+ pass
2746
+ elif (parts_set == {'Ctrl'}) :
2747
+ self.l_timelaps = False
2748
+ print(f"{fg.cyan}i... NO TIMELAPS from now {fg.default}")
2749
+ pass
2750
+ elif (parts_set == {'Alt'}) :
2751
+ pass
2597
2752
  # ----------------------------------------------------------------- t tests whatever REMOTE ! **SEND_COMMAND**
2598
2753
  if (key == Qt.Key.Key_T):
2599
2754
  if ( len(parts_set) == 0):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pogucam
3
- Version: 0.1.14
3
+ Version: 0.1.15
4
4
  Summary: Add your description here
5
5
  Author-email: jaromrax <jaromrax@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -1,11 +1,11 @@
1
1
  pogucam/__init__.py,sha256=Iij7VvXCrFPMtTia41mQ7LxFLaulf_fD5cb-AyjpUo0,53
2
2
  pogucam/buffers.py,sha256=1JLkuenkHoA-K-uZAlNV7chHQDZLrspgT5_XOY-E-34,6692
3
- pogucam/explore_u24_uni.py,sha256=MtAQ0httaCtSBtYquD1ElXak9k7TC12v-R07kzjQroU,126592
3
+ pogucam/explore_u24_uni.py,sha256=y0YmH_RLhtSlHv3i6g-PvvKeTd1Yx0dylTulncFlSO0,134104
4
4
  pogucam/installation.md,sha256=8qspiLlYjEBx5CedRfBU7Mm0A2pz0lfAnaupZyBm5Eo,128
5
5
  pogucam/mqimr.py,sha256=f48gTXng5vM-1RiNPXSA-IvAc3y6WMStbvfQ8rUV7l0,1727
6
6
  pogucam/mqims.py,sha256=_G8AdfrbTrkIm2MOsq3tFOBYpiD4o58JUIvnZt0Sm7A,3293
7
7
  pogucam/text_write.py,sha256=hyRyA1M5z-pda963T-k0i8fvvAlv1p3YBTZtYNdOeoE,19304
8
- pogucam-0.1.14.dist-info/METADATA,sha256=-0fHR7SySxz9vmujJaNMLUUtDxILCPC_6eAoWUYzruQ,499
9
- pogucam-0.1.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
- pogucam-0.1.14.dist-info/entry_points.txt,sha256=-97N0LsXIR8h0rJMzIMuNeNwuY8LvPYPTqnXsuAnVsM,63
11
- pogucam-0.1.14.dist-info/RECORD,,
8
+ pogucam-0.1.15.dist-info/METADATA,sha256=5TiiypRFdtco8r3Rg1m76MXhsh07vIdK3QrsPQxdX_w,499
9
+ pogucam-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
+ pogucam-0.1.15.dist-info/entry_points.txt,sha256=-97N0LsXIR8h0rJMzIMuNeNwuY8LvPYPTqnXsuAnVsM,63
11
+ pogucam-0.1.15.dist-info/RECORD,,