import os, time, glob import numpy as np from PIL import Image from dlp6500 import dlp6500win # ============================================================ # 1️⃣ Binary Pattern Loader # ============================================================ def load_binary_patterns(pattern_dir, file_list=None, target_size=(1920,1080), thresh=128): if file_list is None: file_list = sorted(glob.glob(os.path.join(pattern_dir, "*.bmp"))) if not file_list: raise FileNotFoundError("❌ No BMP files found") patterns, names = [], [] for p in file_list: img = Image.open(p).convert("L") if img.size != target_size: img = img.resize(target_size) arr = np.asarray(img, dtype=np.uint8) bin_arr = (arr >= thresh).astype(np.uint8) patterns.append(bin_arr) names.append(os.path.basename(p)) print(f"Loaded {names[-1]} shape={bin_arr.shape}") return np.stack(patterns, axis=0), names # ============================================================ # 2️⃣ Manual LUT-based Sequence (GUI-style Play Once) # ============================================================ def gui_like_playonce(dmd, patterns, exposure_us=300000, dark_us=10000): n = len(patterns) print(f"🚀 Uploading {n} patterns (Manual LUT mode)...") # Stop & clear dmd.start_stop_sequence("stop") time.sleep(0.1) dmd.pattern_display_lut_configuration(num_patterns=0, num_repeat=0) print("🧹 LUT cleared") # Upload binary patterns to device memory print("💾 Uploading binary patterns...") img_inds = [] for i, patt in enumerate(patterns): img_inds.append(dmd.upload_pattern(patt, compression_mode='erle')) print(f" ↪ pattern {i} uploaded to index {img_inds[-1]}") # Build LUT entries manually for each pattern print("🧩 Defining LUT entries (like GUI)") for i in range(n): # (pattern_index, exposure, dark, trigger, clear, wait, bit_depth, led, pattern_number) dmd.pattern_display_lut_definition( i, exposure_us, dark_us, 0, 0, 0, 1, 0, i ) print(f" LUT entry {i} defined.") # Configure LUT (num_repeat=0 -> play once) dmd.pattern_display_lut_configuration( num_patterns=n, num_repeat=0, pattern_mode='PRESTORED', clear_pattern_after_trigger=True, trigger_in=0, trigger_out=0 ) print("✅ LUT configured (Play Once)") # Run sequence print("🟢 Starting sequence") dmd.start_stop_sequence("start") total_s = (exposure_us + dark_us) * n / 1_000_000.0 time.sleep(total_s + 0.5) dmd.start_stop_sequence("stop") print("✅ Done: all patterns played once (0→1→2)") # ============================================================ # 3️⃣ Run # ============================================================ if __name__ == "__main__": dmd = dlp6500win(debug=False) pattern_dir = r"C:\Users\user\Desktop\연구실" patterns, names = load_binary_patterns(pattern_dir) print(f"✅ Total patterns: {len(patterns)} -> {names}") gui_like_playonce(dmd, patterns, exposure_us=500_000, dark_us=10_000)