diff --git a/src/boot.py b/src/boot.py index 83c8f14..f08d0fb 100644 --- a/src/boot.py +++ b/src/boot.py @@ -34,4 +34,3 @@ -import wifi \ No newline at end of file diff --git a/src/index.html b/src/index.html index b557c99..dfc68a4 100644 --- a/src/index.html +++ b/src/index.html @@ -53,6 +53,12 @@
+ + +
+ + +
diff --git a/src/main.js b/src/main.js index b33fcd7..f16d945 100644 --- a/src/main.js +++ b/src/main.js @@ -84,8 +84,17 @@ async function updateWifi(event) { event.preventDefault(); const ssid = document.getElementById('ssid').value; const password = document.getElementById('password').value; + const ip = document.getElementById('ip').value; + const gateway = document.getElementById('gateway').value; + if(!ssid || !password) { + alert("Missing ssid or password"); + return; + } console.log(ssid, password); - //await post('/num_leds', numLeds); + const response = await post('/wifi_settings', ssid+"\n"+password+"\n"+ip+"\n"+gateway); + if(response === 500) { + alert("Failed to connect to wifi"); + } } function createPatternButtons(patterns) { diff --git a/src/main.py b/src/main.py index 377924f..d4809e9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,4 +1,4 @@ -from machine import Pin +from machine import Pin, reset from patterns import Patterns from settings import Settings import socket @@ -7,6 +7,7 @@ import json import utime import sys import espnow +import wifi class LEDServer: SETTINGS_FILE = "/settings.json" # Path should be adjusted for MicroPython's filesystem @@ -47,7 +48,15 @@ class LEDServer: self.css = self.read_file("/main.css").encode('utf-8') self.patterns_json = json.dumps(list(self.patterns.patterns.keys())) - + ssid = self.settings["wifi"]["ssid"] + password = self.settings["wifi"]["password"] + ip = self.settings.get("wifi", {}).get("ip", None) + gateway = self.settings.get("wifi", {}).get("gateway", None) + + wifi.ap(password="qwerty") + config = wifi.do_connect(ssid, password, ip, gateway) + if config is not None: + print(config) @@ -67,7 +76,9 @@ class LEDServer: "/delay": self.delay, "/brightness": self.brightness, "/color": self.color, - "/color2": self.color2 + "/color2": self.color2, + "/wifi_settings": self.wifi_settings, + "set_leds": self.set_leds } if path in paths: @@ -130,6 +141,37 @@ class LEDServer: client_socket.send(b'HTTP/1.0 200 OK\r\n\r\n') except: client_socket.send(b'HTTP/1.0 400 Bad request\r\n\r\n') + + def wifi_settings(self, client_socket, post_data): + try: + lines = post_data.split('\n') + ssid, password, ip, gateway = (lines + ["", "", None, None])[:4] + + self.settings["wifi"]["ssid"] = ssid + self.settings["wifi"]["password"] = password + self.settings["wifi"]["ip"] = ip + self.settings["wifi"]["gateway"] = gateway + + self.settings.save() + self.settings.load() + print(self.settings) + print(ssid, password) + config = wifi.do_connect(ssid, password, ip ,gateway) + if config is not None: + print(config) + client_socket.send(b'HTTP/1.0 200 OK\r\n\r\n') + else: + client_socket.send(b'HTTP/1.0 500 Failed to connect to wifi\r\n\r\n') + + except ValueError: + client_socket.send(b'HTTP/1.0 400 Bad request\r\n\r\n') + + def set_leds(self, client_socket, post_data): + if len(post_data == self.settings["num_leds"]*3): + print(post_data) + self.patterns.set(0, (255,255,255)) + else: + print("Wrong number of leds") def handle_get(self, path, client_socket): if path == "/": @@ -141,7 +183,12 @@ class LEDServer: brightness=self.settings["brightness"], color=self.settings["color1"], color2=self.settings["color2"], - ssid=self.settings["wifi"]["ssid"]).encode()) + ssid=self.settings["wifi"]["ssid"], + password=self.settings["wifi"]["password"], + ip=self.settings.get("wifi", {}).get("ip", ""), + gateway=self.settings.get("wifi", {}).get("gateway", "").encode() # Only encode if it's a string + )) + elif path == "/main.js": client_socket.send(b'HTTP/1.0 200 OK\r\nContent-type: application/javascript\r\n\r\n') client_socket.send(self.js) @@ -195,7 +242,10 @@ class LEDServer: self.server_socket.close() self.settings.save() -# Example of creating and starting the server -if __name__ == "__main__": +def main(): server = LEDServer() server.start() + +# Example of creating and starting the server +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/patterns.py b/src/patterns.py index e399298..9100142 100644 --- a/src/patterns.py +++ b/src/patterns.py @@ -60,6 +60,12 @@ class Patterns: return True return False + def set(self, i, color): + self.n[i] = color + + def write(self): + self.n.write() + def fill(self): for i in range(self.num_leds): self.n[i] = self.color1 diff --git a/src/wifi.py b/src/wifi.py index a2954e2..9784c18 100644 --- a/src/wifi.py +++ b/src/wifi.py @@ -4,25 +4,36 @@ from config import * from time import sleep import ubinascii -def do_connect(): +def do_connect(ssid, password, ip=None, gateway=None): led = Pin(8, Pin.OUT) - sta_if = network.WLAN(network.STA_IF) - sta_if.ifconfig((ip, '255.255.255.0', gateway, '1.1.1.1')) - if not sta_if.isconnected(): - print('connecting to network...') - sta_if.active(True) - sta_if.connect(ssid, password) - led.on() - for i in range(10): - if sta_if.isconnected(): - print('network config:', sta_if.ifconfig()) - led.off() - break - sleep(1) - -do_connect() + try: + sta_if = network.WLAN(network.STA_IF) + sta_if.disconnect() + print(ip, gateway) + if ip and gateway: + print(ip, gateway) + sta_if.ifconfig((ip, '255.255.255.0', gateway, '1.1.1.1')) + if not sta_if.isconnected(): + print(f'connecting to network {ssid}') + sta_if.active(True) + sta_if.connect(ssid, password) + led.on() + for i in range(10): + print(f"Attempt {i}") + if sta_if.isconnected(): + led.off() + return sta_if.ifconfig() + sleep(0.5) + return None + + else: + return sta_if.ifconfig() + except Exception as e: + print(f"Failed to connect to wifi {e}") + return None def ap(password): + pass ap_if = network.WLAN(network.AP_IF) ap_if.active(True) ap_mac = ap_if.config('mac') @@ -35,3 +46,6 @@ def ap(password): + + +