From f5f97e082282e44adb64c1c15e42c4611fd327c7 Mon Sep 17 00:00:00 2001 From: Ben de Roo Date: Wed, 10 Jun 2026 19:56:28 +0200 Subject: [PATCH] Update qr.py --- qr.py | 103 ++++++++++++++++++++++------------------------------------ 1 file changed, 39 insertions(+), 64 deletions(-) diff --git a/qr.py b/qr.py index d96bf32..457abb2 100644 --- a/qr.py +++ b/qr.py @@ -8,11 +8,8 @@ import random import string from io import BytesIO -def gen_id(): - return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10)) - def make_qr(data, size): - qr = qrcode.QRCode(box_size=8, border=2) + qr = qrcode.QRCode(box_size=6, border=2) qr.add_data(data) qr.make(fit=True) img = qr.make_image(fill="black", back_color="white").convert("RGB") @@ -22,13 +19,8 @@ def make_qr(data, size): buf.seek(0) return pygame.image.load(buf) -def pack(session, seq, msg): - payload = { - "s": session, - "q": seq, - "m": base64.b64encode(msg.encode()).decode() - } - return json.dumps(payload) +def chunk_string(s, n): + return [s[i:i+n] for i in range(0, len(s), n)] pygame.init() @@ -38,30 +30,36 @@ w, h = screen.get_size() cap = cv2.VideoCapture(0) detector = cv2.QRCodeDetector() -session_id = gen_id() - -seq = 0 -msg = "" - -qr = None - -last_decode = [] -stable = "" -last_seq = -1 - qr_size = h // 2 +clock = pygame.time.Clock() + +# STREAM STATE (geen chat, geen protocol) +counter = 0 +rx_buffer = "" + +tx_qr = None +last_frame = 0 + running = True while running: for e in pygame.event.get(): - if e.type == pygame.KEYDOWN: - if e.key == pygame.K_ESCAPE: - running = False + if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: + running = False - if e.key == pygame.K_RETURN: - msg = input("msg: ") - seq += 1 + # ===== TRANSMIT STREAM ===== + now = time.time() + if now - last_frame > 0.5: # stream rate + last_frame = now + payload = { + "d": str(counter) + } + counter += 1 + + tx_qr = make_qr(json.dumps(payload), qr_size) + + # ===== RECEIVE STREAM ===== ret, frame = cap.read() if ret: @@ -70,52 +68,29 @@ while running: if data: try: obj = json.loads(data) - - if obj.get("s"): - - if obj["s"] != session_id: - pass - else: - text = base64.b64decode(obj["m"]).decode() - - last_decode.append((obj["q"], text)) - if len(last_decode) > 5: - last_decode.pop(0) - - # stabiliteit check - counts = {} - for _, t in last_decode: - counts[t] = counts.get(t, 0) + 1 - - for t, c in counts.items(): - if c >= 3: - stable = t - + if "d" in obj: + rx_buffer = (rx_buffer + obj["d"])[-200:] except: pass - if msg: - qr = make_qr(pack(session_id, seq, msg), qr_size) - + # ===== RENDER ===== screen.fill((0,0,0)) - if qr: - screen.blit(qr, (w//4 - qr_size//2, h//4)) + if tx_qr: + screen.blit(tx_qr, (w//4 - qr_size//2, h//4)) - font = pygame.font.SysFont(None, 36) + if ret: + cam = cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB) + cam = pygame.surfarray.make_surface(cam.swapaxes(0,1)) + screen.blit(pygame.transform.scale(cam, (w//2, h)), (w//2,0)) - screen.blit(font.render("SESSION: " + session_id[:6], True, (0,255,0)), (20,20)) - screen.blit(font.render("SENT: " + msg[:30], True, (255,255,0)), (20,80)) - screen.blit(font.render("RECV: " + stable[:30], True, (0,255,0)), (w//2+20,20)) + font = pygame.font.SysFont(None, 40) - cam_surface = pygame.surfarray.make_surface( - cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB).swapaxes(0,1) - ) - - screen.blit(pygame.transform.scale(cam_surface, (w//2, h)), (w//2,0)) + screen.blit(font.render("STREAM OUT: " + str(counter), True, (255,255,0)), (20,20)) + screen.blit(font.render("STREAM IN BUFFER: " + rx_buffer[-30:], True, (0,255,0)), (20,80)) pygame.display.flip() - pygame.time.Clock().tick(30) + clock.tick(30) cap.release() pygame.quit() \ No newline at end of file