# flash_to_wlan_4.py

# wie flash_to_wlan_3.py (kleine Änderung in Bezeichnungen, Kosmetik)
# getestet am 17.11.2023 funktioniert mit Handy (Chrome-Browser) und PC (Microsoft Edge / Chrome)

# LoRa-Nachricht zu einer Bestimmten Endgeräte-Adresse werden vom Flash abgefragt. 

# Eine Nachricht besteht aus drei Items, getrennt durch einen Delimiter
# 1. Absender (Adresse)
# 2. Text
# 3. Zeit-Datum-Stempel


###################### Display: Importe und Instanziierung #################################

from machine import UART, SPI, Pin, RTC
# from time import sleep
import vga1_16x16 as font1
import st7789

spi = SPI(1, baudrate = 20_000_000, polarity = 1, sck = Pin(18), mosi = Pin(19))
display = st7789.ST7789(spi, 135, 240, reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
display.init()
display.fill(0) # Display löschen

###################### Einstellungen und Funktionen für LoRaWAN-Daten #################################

delimiter = '/' # ggf. anderes Zeichen
data_fname = 'lorawan_data.txt'

def read_as_list(fname, delimiter): # liest alle Zeilen der Datei fname und gibt sie als Liste zurück
    liste = []
    f = open(fname, 'r')
    for x in f: # zeilenweise auswerten; entspricht readlines()
        x = x[0:len(x)-2] # \n\r abtrennen
        listen_element = x.split(delimiter)        
        liste.append(listen_element)
    return liste

###################### Server für LoRa-Nachrichten #################################

import network
import socket
from time import time

# Wlan-Zugangsdaten; hier Ihre Wlan-Daten eintragen:
ssid = 'SSID' # Hier die eigene SSID eintragen
password = 'PASSWORT' # Hier das zugehörige Passwort eintragen

# WLAN-Funktionen
def getrequest(connection): # blockweises Empfangen des Requests
    result = ''
    block_size = 64
    while True:
        data = connection.recv(block_size)
        result += str(data, 'UTF-8')        
        if result.find('\r\n\r\n') >= 0: # Ende des Requests gefunden
            break
    return result 

def http_header(): # zu sendende HTTP-Daten
    return '''HTTP/1.1 200 OK\r
Content-Type: text/html\r
Connection: close\r
\r
'''

def html(request, data_fname, delimiter): #  zu sendende HTML-Daten (nur BODY)
    getparam = request.split(' ')[1] # Element 1 von ['GET', '/name', ... ]
    lora_addr = getparam[1:] # '/' gehört nicht zum Namen
    if lora_addr != 'favicon.ico': # favicon.ico nicht auswerten!!!
        # HTML-Dokument erstellen und zurückgeben
        lorawan_liste = read_as_list(data_fname, delimiter) # zunächst Gateway-Datenliste auslesen
        body_content = 'Daten von Adresse ' + lora_addr + '<BR><BR>'
        count = 0 # zählt die zur eingegebenen Adresse gehörigen Datensätze
        for i in lorawan_liste:
            if i[0] == lora_addr:
                body_content = body_content + i[1] + '   [DT: ' + i[2] + ']<BR>' # Botschaft und Zeit-Datums-Stempel
                count += 1
        if count != 0:  # wenn Daten vorhanden...
            return '<html><body><h1> '+ body_content + '</h1></body></html>'
        else:
            return '<html><body><h1>' + body_content + 'Keine Daten vorhanden...'+ '</h1></body></html>' # keine Daten vorhanden 
    else:
        return '<html><body><h1>'+ 'favicon' +'</h1></body></html>' # favicon.ico (Icon); manche Browser fordern das Icon "favicon.ico" an. 

# Konfiguration des Wlans:
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password) 
time0 = time()
while (not station.isconnected()) and (time() - time0 < 5):
    pass

if station.isconnected():
    print('Wlan connected')
    print(station.ifconfig()) # zur Information
    s = socket.socket() # Socket des Servers
    s.bind(('', 80))
    s.listen(5) 
    print('Server listening')
    print('--------------------------------------')
  
    # Daten holen
    while True:
        connection, addr = s.accept() 
        print("Client connected: ", addr) # bei manchen Browser connected ohne Senden eines HTML-Requests!
        request = getrequest(connection)
        print('Request: ', request)
        connection.send(http_header())
        html_doc = html(request, data_fname, delimiter)
        connection.send(html_doc)
        # print('HTML-DOC: ', html_doc) # zur Kontrolle
        connection.close()
        display.fill(0)
        display.text(font1, 'Abfrage von', 5, 20)  # IP-Adresse des Abfragenden auf Display anzeigen   
        display.text(font1, addr[0], 5, 70)      
        print('--------------------------------------------')
 
station.active(False)
print('Wlan deactivated')
print('Please reset!')

