From 26dc88d53f0f8cbda8d3cf8996fa4eaef590b9fd Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Sun, 27 Apr 2025 22:18:31 +0200 Subject: [PATCH] Update WiFiConf --- .../com.example.wificonf/assets/wificonf.py | 212 ++++++++++-------- 1 file changed, 115 insertions(+), 97 deletions(-) diff --git a/internal_filesystem/apps/com.example.wificonf/assets/wificonf.py b/internal_filesystem/apps/com.example.wificonf/assets/wificonf.py index 500ee8d5..9905c4e7 100644 --- a/internal_filesystem/apps/com.example.wificonf/assets/wificonf.py +++ b/internal_filesystem/apps/com.example.wificonf/assets/wificonf.py @@ -4,102 +4,120 @@ import os import time import lvgl as lv -class WiFiConf: - def __init__(self,subwindow): - self.subwindow=subwindow - self.wlan=network.WLAN(network.STA_IF) - self.wlan.active(True) - self.access_points={} - self.load_config() - self.selected_ssid=None - self.create_ui() - def load_config(self): - try: - os.stat('/data/com.example.wificonf') - except OSError: - os.makedirs('/data/com.example.wificonf') - try: - with open('/data/com.example.wificonf/conf.json','r') as f: - self.access_points=ujson.load(f) - except OSError: - self.access_points={} - def save_config(self): - with open('/data/com.example.wificonf/conf.json','w') as f: - ujson.dump(self.access_points,f) - def scan_networks(self): - networks=self.wlan.scan() - return [n[0].decode() for n in networks] - def attempt_connecting(self,ssid,password): - self.wlan.connect(ssid,password) - for _ in range(10): - if self.wlan.isconnected(): - return True - time.sleep(1) - return False - def create_ui(self): - self.list=lv.list(self.subwindow) - self.list.set_size(280,300) - self.list.center() - self.refresh_list() - scan_button=lv.button(self.subwindow) - scan_button.set_size(100,40) - scan_button.align(lv.ALIGN.TOP_MID,0,10) - label=lv.label(scan_button) - label.set_text("Scan") - scan_button.add_event_cb(self.scan_cb,lv.EVENT.CLICKED,None) - def refresh_list(self): - self.list.clean() - for ssid in self.scan_networks(): - button=self.list.add_button(None,ssid) - button.add_event_cb(self.select_ssid_cb,lv.EVENT.CLICKED,ssid) - status="connected" if self.wlan.isconnected() and self.wlan.config('essid')==ssid else \ - "failed" if ssid in self.access_points else "" - if status: - label=lv.label(button) - label.set_text(status) - label.align(lv.ALIGN.RIGHT_MID,-10,0) - def scan_cb(self,event): - self.refresh_list() - def select_ssid_cb(self,event,ssid): - self.selected_ssid=ssid - self.show_password_popup() - def show_password_popup(self): - self.popup=lv.obj(self.subwindow) - self.popup.set_size(260,200) - self.popup.center() - self.popup.add_flag(lv.OBJ_FLAG.CLICKABLE) - label=lv.label(self.popup) - label.set_text(f"Enter password for {self.selected_ssid}") - label.align(lv.ALIGN.TOP_MID,0,10) - self.password_ta=lv.textarea(self.popup) - self.password_ta.set_size(220,40) - self.password_ta.align(lv.ALIGN.CENTER,0,-20) - self.password_ta.set_placeholder_text("Password") - keyboard=lv.keyboard(self.popup) - keyboard.set_size(260,100) - keyboard.align(lv.ALIGN.BOTTOM_MID,0,0) - keyboard.set_textarea(self.password_ta) - connect_button=lv.button(self.popup) - connect_button.set_size(100,40) - connect_button.align(lv.ALIGN.BOTTOM_LEFT,10,-50) - label=lv.label(connect_button) - label.set_text("Connect") - connect_button.add_event_cb(self.connect_cb,lv.EVENT.CLICKED,None) - cancel_button=lv.button(self.popup) - cancel_button.set_size(100,40) - cancel_button.align(lv.ALIGN.BOTTOM_RIGHT,-10,-50) - label=lv.label(cancel_button) - label.set_text("Cancel") - cancel_button.add_event_cb(self.cancel_cb,lv.EVENT.CLICKED,None) - def connect_cb(self,event): - password=self.password_ta.get_text() - self.access_points[self.selected_ssid]=password - self.save_config() - self.popup.delete() - success=self.attempt_connecting(self.selected_ssid,password) - self.refresh_list() - def cancel_cb(self,event): - self.popup.delete() +wlan=network.WLAN(network.STA_IF) +wlan.active(True) +access_points={} +selected_ssid=None +list=None +password_ta=None +popup=None +def load_config(): + try: + os.stat('/data') + except OSError: + os.mkdir('/data') + try: + os.stat('/data/com.example.wificonf') + except OSError: + os.mkdir('/data/com.example.wificonf') + try: + with open('/data/com.example.wificonf/conf.json','r') as f: + global access_points + access_points=ujson.load(f) + except OSError: + access_points={} -app=WiFiConf(subwindow) +def save_config(): + with open('/data/com.example.wificonf/conf.json','w') as f: + ujson.dump(access_points,f) + +def scan_networks(): + networks=wlan.scan() + return [n[0].decode() for n in networks] + +def attempt_connecting(ssid,password): + wlan.connect(ssid,password) + for _ in range(10): + if wlan.isconnected(): + return True + time.sleep(1) + return False + +def refresh_list(): + list.clean() + for ssid in scan_networks(): + button=list.add_button(None,ssid) + button.add_event_cb(lambda e, s=ssid: select_ssid_cb(e,s),lv.EVENT.CLICKED,None) + status="connected" if wlan.isconnected() and wlan.config('essid')==ssid else "failed" if ssid in access_points else "" + if status: + label=lv.label(button) + label.set_text(status) + label.align(lv.ALIGN.RIGHT_MID,-10,0) + +def scan_cb(event): + refresh_list() + +def select_ssid_cb(event,ssid): + global selected_ssid + selected_ssid=ssid + show_password_popup() + +def show_password_popup(): + global popup,password_ta + popup=lv.obj(subwindow) + popup.set_size(260,200) + popup.center() + popup.add_flag(lv.obj.FLAG.CLICKABLE) + label=lv.label(popup) + label.set_text(f"Enter password for {selected_ssid}") + label.align(lv.ALIGN.TOP_MID,0,10) + password_ta=lv.textarea(popup) + password_ta.set_size(220,40) + password_ta.align(lv.ALIGN.CENTER,0,-20) + password_ta.set_placeholder_text("Password") + keyboard=lv.keyboard(popup) + keyboard.set_size(260,100) + keyboard.align(lv.ALIGN.BOTTOM_MID,0,0) + keyboard.set_textarea(password_ta) + connect_button=lv.button(popup) + connect_button.set_size(100,40) + connect_button.align(lv.ALIGN.BOTTOM_LEFT,10,-50) + label=lv.label(connect_button) + label.set_text("Connect") + connect_button.add_event_cb(connect_cb,lv.EVENT.CLICKED,None) + cancel_button=lv.button(popup) + cancel_button.set_size(100,40) + cancel_button.align(lv.ALIGN.BOTTOM_RIGHT,-10,-50) + label=lv.label(cancel_button) + label.set_text("Cancel") + cancel_button.add_event_cb(cancel_cb,lv.EVENT.CLICKED,None) + +def connect_cb(event): + global access_points + password=password_ta.get_text() + access_points[selected_ssid]=password + save_config() + popup.delete() + success=attempt_connecting(selected_ssid,password) + refresh_list() + +def cancel_cb(event): + popup.delete() + +def create_ui(subwindow): + global list + list=lv.list(subwindow) + list.set_size(280,300) + list.center() + refresh_list() + scan_button=lv.button(subwindow) + scan_button.set_size(100,40) + scan_button.align(lv.ALIGN.TOP_MID,0,10) + label=lv.label(scan_button) + label.set_text("Scan") + scan_button.add_event_cb(scan_cb,lv.EVENT.CLICKED,None) + load_config() + +subwindow.clean() +create_ui(subwindow)