| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- from keyb import Keyboard # type: ignore
- import json, wifi, os, socketpool, asyncio, sys, select # type: ignore
- import board, busio, terminalio, displayio # type: ignore
- from adafruit_display_text import label # type: ignore
- from adafruit_display_shapes.rect import Rect # type: ignore
-
-
- async def main():
- keyb_task = asyncio.create_task(keyb_scan())
- socket_task = asyncio.create_task(socket_recv())
-
- await asyncio.gather(keyb_task, socket_task)
-
- async def keyb_scan():
- while True:
- if select.select([sys.stdin,],[],[],0.1)[0]:
- code=hex(ord(sys.stdin.readline(1)))
- key = keyb.scan(keycode = code)
-
- if keyb.is_alphanumeric(key):
- if len(textbar.text) < 31:
- textbar.text += str(key)
- elif key == "\n":
- a = {"header":"message",
- "message":textbar.text,
- "client name":client_name}
- data = json.dumps(a)
- sock.sendto(data, address)
- textbar.text = ""
- elif key == "BACKSP":
- textbar.text = textbar.text[:-1]
- elif key == " ":
- if len(textbar.text) < 31:
- textbar.text += " "
- else:
- await asyncio.sleep(0.1)
-
- async def socket_recv():
- while True:
- try:
- buffer = bytearray(200)
- size, addr = sock.recvfrom_into(buffer)
- try:
- a = json.loads(buffer)
- header = a["header"]
-
- if header == "response":
- msg = a["message"]
- try:
- color = a["color"]
- except KeyError:
- color = 0xffffff
- try:
- recv_client_name = a["client name"]
- except KeyError:
- recv_client_name = "(unknown)"
- cmsg = recv_client_name + " >> " + msg
- messages_list.append([cmsg, color])
- update_gui()
-
- elif header == "connection":
- motd = a["motd"]
- conn_client = a["client name"]
- try:
- color = a["color"]
- except KeyError:
- color = 0xffffff
- con_msg = ">> " + conn_client + " <<"
- messages_list.append([con_msg, color])
- update_gui()
- except Exception as e:
- error_msg = str(e) + " (buffer size?)"
- color = 0xff0000
- messages_list.append([error_msg, color])
- update_gui()
-
- except OSError:
- pass
-
- await asyncio.sleep(0.1)
-
- def update_gui():
- x = 0
- for message in messages_list[-max_messages:]:
- messages_list_labels[x].text = message[0]
- messages_list_labels[x].color = message[1]
- x += 1
-
-
- keyb = Keyboard()
-
-
- # SET UP DISPLAY & WIFI
- display = board.DISPLAY
- display_group = displayio.Group()
- display.root_group = display_group
-
- wifi_options = [[os.getenv("WIFI1"),os.getenv("WIFIPW1")],
- [os.getenv("WIFI2"),os.getenv("WIFIPW2")],
- [os.getenv("WIFI3"),os.getenv("WIFIPW3")]]
-
-
- h1 = label.Label(terminalio.FONT, text="Hello!", color=0xffffff, scale=2)
- h1.x = 10
- h1.y = 15
-
- count = 0
- menu_labs = []
- for option in wifi_options:
- if count == 0:
- menu_lab = label.Label(terminalio.FONT, text = "> " + option[0], color=0xffffff, scale=1)
- else:
- menu_lab = label.Label(terminalio.FONT, text = option[0], color=0xffffff, scale=1)
- menu_lab.x = 10
- menu_lab.y = 35 + count * 10
- display.root_group.append(menu_lab)
- menu_labs.append(menu_lab)
- count+=1
-
- display.root_group.append(h1)
-
- pos = 0
- while True:
- key = keyb.scan()
- if key == "UP":
- if pos == 0:
- pass
- else:
- menu_labs[pos].text = wifi_options[pos][0]
- pos -= 1
- menu_labs[pos].text = "> " + wifi_options[pos][0]
- elif key == "DOWN":
- if pos == len(wifi_options)-1:
- pass
- else:
- menu_labs[pos].text = wifi_options[pos][0]
- pos += 1
- menu_labs[pos].text = "> " + wifi_options[pos][0]
- elif key == "\n":
- WIFI_SSID = wifi_options[pos][0]
- WIFI_PASS = wifi_options[pos][1]
- break
-
- try:
- for lab in menu_labs:
- display.root_group.remove(lab)
-
- txt = label.Label(terminalio.FONT, text = "", color=0x00ff00, scale=1)
- txt.text = "Connecting to " + WIFI_SSID + "..."
- txt.x = 10
- txt.y = 35
- display.root_group.append(txt)
-
- wifi.radio.connect(ssid=WIFI_SSID,
- password=WIFI_PASS)
- my_ip = str(wifi.radio.ipv4_address).strip()
-
- display.root_group.remove(h1)
- display.root_group.remove(txt)
- except ConnectionError as e:
- h1.text = "Aw..."
-
- txt.text = "Could not connect to " + WIFI_SSID
- txt.color = 0xff0000
- txt.x = 10
- txt.y = 35
-
- txt2 = label.Label(terminalio.FONT, text = "", color=0x89a0a8, scale=1)
- txt2.text = "Press CTRL + C followed by CTRL + D\nto soft-reboot"
- txt2.x = 10
- txt2.y = 100
-
- display.root_group.append(txt2)
-
- while True:
- pass
-
-
-
-
-
-
- # Header Bar
- header_bar = Rect(0, 0, 238, 30, fill=0x1f4476)
- display.root_group.append(header_bar)
-
- # Page Title
- title_label = label.Label(terminalio.FONT, text="Chat", color=0xffffff, scale=2)
- display.root_group.append(title_label)
- title_label.x = 10
- title_label.y = 15
-
- # IP Label
- ip_label = label.Label(terminalio.FONT, text=my_ip, color=0x89a0a8, scale=1)
- display.root_group.append(ip_label)
- ip_label.x = 150
- ip_label.y = 20
-
-
- pool = socketpool.SocketPool(wifi.radio)
- sock = pool.socket(pool.AF_INET, pool.SOCK_DGRAM)
- sock.settimeout(3)
- sock.setblocking(False)
- ip = "cubes.link"
- port = 1337
- address = (ip, port)
- client_name = "CARDPUTER"
- a = {"header":"connection",
- "client name":client_name}
- data = json.dumps(a)
- sock.sendto(data, address)
-
- textbar = label.Label(terminalio.FONT, text = "", color = 0x89a0a8, scale=1)
- display.root_group.append(textbar)
- textbar.x = 10
- textbar.y = 120
-
- messages_list = []
- messages_list_labels = []
- max_messages = 8
- for x in range(0, max_messages):
- mlab = label.Label(terminalio.FONT, text="", color=0xffffff, scale=1)
- mlab.x = 8
- mlab.y = 38 + (x * 10)
- display.root_group.append(mlab)
- messages_list_labels.append(mlab)
-
- asyncio.run(main())
|