Update qr.py
This commit is contained in:
@@ -8,11 +8,8 @@ import random
|
|||||||
import string
|
import string
|
||||||
from io import BytesIO
|
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):
|
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.add_data(data)
|
||||||
qr.make(fit=True)
|
qr.make(fit=True)
|
||||||
img = qr.make_image(fill="black", back_color="white").convert("RGB")
|
img = qr.make_image(fill="black", back_color="white").convert("RGB")
|
||||||
@@ -22,13 +19,8 @@ def make_qr(data, size):
|
|||||||
buf.seek(0)
|
buf.seek(0)
|
||||||
return pygame.image.load(buf)
|
return pygame.image.load(buf)
|
||||||
|
|
||||||
def pack(session, seq, msg):
|
def chunk_string(s, n):
|
||||||
payload = {
|
return [s[i:i+n] for i in range(0, len(s), n)]
|
||||||
"s": session,
|
|
||||||
"q": seq,
|
|
||||||
"m": base64.b64encode(msg.encode()).decode()
|
|
||||||
}
|
|
||||||
return json.dumps(payload)
|
|
||||||
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
|
|
||||||
@@ -38,30 +30,36 @@ w, h = screen.get_size()
|
|||||||
cap = cv2.VideoCapture(0)
|
cap = cv2.VideoCapture(0)
|
||||||
detector = cv2.QRCodeDetector()
|
detector = cv2.QRCodeDetector()
|
||||||
|
|
||||||
session_id = gen_id()
|
|
||||||
|
|
||||||
seq = 0
|
|
||||||
msg = ""
|
|
||||||
|
|
||||||
qr = None
|
|
||||||
|
|
||||||
last_decode = []
|
|
||||||
stable = ""
|
|
||||||
last_seq = -1
|
|
||||||
|
|
||||||
qr_size = h // 2
|
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
|
running = True
|
||||||
while running:
|
while running:
|
||||||
for e in pygame.event.get():
|
for e in pygame.event.get():
|
||||||
if e.type == pygame.KEYDOWN:
|
if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
|
||||||
if e.key == pygame.K_ESCAPE:
|
running = False
|
||||||
running = False
|
|
||||||
|
|
||||||
if e.key == pygame.K_RETURN:
|
# ===== TRANSMIT STREAM =====
|
||||||
msg = input("msg: ")
|
now = time.time()
|
||||||
seq += 1
|
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()
|
ret, frame = cap.read()
|
||||||
|
|
||||||
if ret:
|
if ret:
|
||||||
@@ -70,52 +68,29 @@ while running:
|
|||||||
if data:
|
if data:
|
||||||
try:
|
try:
|
||||||
obj = json.loads(data)
|
obj = json.loads(data)
|
||||||
|
if "d" in obj:
|
||||||
if obj.get("s"):
|
rx_buffer = (rx_buffer + obj["d"])[-200:]
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if msg:
|
# ===== RENDER =====
|
||||||
qr = make_qr(pack(session_id, seq, msg), qr_size)
|
|
||||||
|
|
||||||
screen.fill((0,0,0))
|
screen.fill((0,0,0))
|
||||||
|
|
||||||
if qr:
|
if tx_qr:
|
||||||
screen.blit(qr, (w//4 - qr_size//2, h//4))
|
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))
|
font = pygame.font.SysFont(None, 40)
|
||||||
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))
|
|
||||||
|
|
||||||
cam_surface = pygame.surfarray.make_surface(
|
screen.blit(font.render("STREAM OUT: " + str(counter), True, (255,255,0)), (20,20))
|
||||||
cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB).swapaxes(0,1)
|
screen.blit(font.render("STREAM IN BUFFER: " + rx_buffer[-30:], True, (0,255,0)), (20,80))
|
||||||
)
|
|
||||||
|
|
||||||
screen.blit(pygame.transform.scale(cam_surface, (w//2, h)), (w//2,0))
|
|
||||||
|
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
pygame.time.Clock().tick(30)
|
clock.tick(30)
|
||||||
|
|
||||||
cap.release()
|
cap.release()
|
||||||
pygame.quit()
|
pygame.quit()
|
||||||
Reference in New Issue
Block a user