import network, socket, ujson, time
from machine import I2C, Pin

def set_mux_channel(channel):
    for i in range(8):
        mux_pins[i].value((channel >> i) & 1)

def read_ads1119_voltage(vref=2.048, gain=1):
    i2c.writeto(ADS1119_ADDR, b'\x10')
    raw = i2c.readfrom(ADS1119_ADDR, 2)
    adc = (raw[0] << 8) | raw[1]
    if adc & 0x8000:
        adc -= 0x10000
    voltage = (adc / 32768) * (vref / gain)
    return voltage

def acq():
    i2c.writeto(ADS1119_ADDR, b'\x08')
    time.sleep_ms(2)
    return read_ads1119_voltage()

def generate_temperature():
    voltage_matrix = [[0 for _ in range(16)] for _ in range(16)]
    for ch in range(256):
        set_mux_channel(ch)
        time.sleep_us(100)
        voltage = acq()
        row = ch // 16
        col = ch % 16
        voltage_matrix[row][col] = round(37.67 * voltage + 25, 3)
    return voltage_matrix[::-1]

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ssid', 'password') 
while not wlan.isconnected():
    pass

ip = wlan.ifconfig()[0]
print('Connected on', ip)
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(addr)
server.listen(1)
print('Listening on', addr)
i2c = I2C(1, scl=Pin(11), sda=Pin(10), freq=100_000)
ADS1119_ADDR = 0x40
EXTERNAL_VREF = 2.048
mux_pins = [Pin(i, Pin.OUT) for i in range(15, 23)]
voltage_matrix = [[0 for _ in range(16)] for _ in range(16)]
i2c.writeto(ADS1119_ADDR, b'\x06')
i2c.writeto_mem(ADS1119_ADDR, 0x40, b'\x0d')

while True:
    cl, addr = server.accept()
    request = cl.recv(1024).decode()

    if request.startswith('GET /data'):
        temp_data = generate_temperature()
        response = ujson.dumps(temp_data)
        cl.sendall(b'HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n')
        cl.sendall(response.encode())

    elif request.startswith('GET /'):
        try:
            with open('index.html', 'r') as f:
                html_content = f.read()
            cl.sendall(b'HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n')
            cl.sendall(html_content.encode())
        except:
            cl.sendall(b'HTTP/1.0 500 Internal Server Error\r\n\r\n')

    else:
        cl.sendall(b'HTTP/1.0 404 Not Found\r\n\r\n')

    cl.close()