# STA-Server zum Schalten einer LED (an Pin 12)

# getestet am 29.06.2020; funktioniert!

# Der Parameter "/LED_AN" bzw. "/LED_AUS" bei href wird durch das HTTP-Protokoll als GET-Parameter 
# im Request an den ESP32 gesendet. Indem wir ihn aus der Zeichenkette "request" mit split extrahieren,
# können wir die LED ein- und ausschalten.
# Zum Beenden des Programms Ctrl-C eingeben

# Chrome-Browser des Handys baut nach dem Empfang des Response automatisch eine neue Verbindung zum Server auf;
# eine neuer Request wird natürlich erst abgesendet, wenn ein Link batätigt wird.
# Das blockiert den Server für andere Clients! Abhilfe mit timeout für recv. Siehe wlan_station_led_server_0_time_out.
# Später in Kapitel "... tunen" berücksichtigen!!!


import network
import socket
from machine import Pin
from time import time

# Wlan-Zugangsdaten; hier Ihre Wlan-Daten eintragen:
ssid = 'mipamipa'
password = 'Asdfghjkl1234'

# Konfiguration von LED
led=Pin(12, Pin.OUT)
led.value(1)  # einschalten

def getrequest(connection):
  result = ''
  block_size = 512
  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():
  return '''HTTP/1.1 200 OK\r
Content-Type: text/html\r
Connection: close\r
\r
'''

def html():
  if led.value() == 1:
    led_state = 'AN'
  else:
    led_state = 'AUS'  
  return '''<html>
              <body>
                 <p> <h1> <center> LED ein- und auschalten </center> </h1> </p>
                 <p> </p>
                 <p> <h2> Status: LED ist <font color='red'>
  '''                        + led_state +   '''
                                                     </font> </h2> </p>
                 <p> <h2>
                   Schalte LED <a href='/LED_AN'> <b>an</b> </a> / 
                   <a href='/LED_AUS'> <b>aus</b> </a> ! 
                 </h2> </p>
              </body>
            </html> 
  '''
# 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(station.ifconfig())

  # Server bereit stellen
  s = socket.socket()
  s.bind(('', 80)) 
  s.listen(5)
  print('Server ready...')

  # Daten holen
  while True:
    print('-----------------------------------------')  
    connection, addr = s.accept()
    print("Client connected: ", addr)

    # Request empfangen und auswerten
    request = getrequest(connection)
    print(request) # zum Testen
    getparam = request.split(' ')[1] # vgl. Kapitel 10    
    print('GET-Parameter: ', getparam) # zum Testen
    if getparam == '/LED_AN': 
      led.value(1)
      print('Now: LED on') # zum Testen
    if getparam == '/LED_AUS':
      led.value(0)
      print('Now: LED on')  # zum Testen
    if getparam == '/favicon.ico':  # zum Testen
      print('FAVICON')
    
    connection.send(http_header())
    connection.send(html())
    connection.close()

# station.active(False) #???????????
# print('Wlan deactivated') #??????????
print('Please reset!')





