# Zahlen_Sender_3c.py (mit Display)
# neuer TTGO; funktioniert auch im stand-alone-Modus mit Firmware v1.14
# getestet am 10.08.2023

#####################################################################################
#                            Import und Instanziierungen                            #
#####################################################################################

from time import sleep     
from machine import UART, SPI, Pin
import vga1_bold_16x32 as font2
import vga1_8x8 as font1
import st7789
import sys

# Display:
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

# UART:
uart1 = UART(1, baudrate = 57600, tx = 12, rx = 13)

#################################################################################
#                 Funktionen zur Kommunikation mit dem LORA-Modul               #
#################################################################################

def send_command(uart, cmd):       # cmd ist vom Typ String 
    c = bytes(cmd, 'UTF-8') + b'\r\n'       # c ist vom Typ Byte-String (Bytes)
    anzahl_der_gesendeten_bytes = uart.write(c)
    print(anzahl_der_gesendeten_bytes, 'Bytes gesendet:', c)

def read_response(uart):
    print('auf Nachricht warten...')
    while not uart.any(): # warten, bis (mindestens) ein Byte im Lesepuffer ist
        pass
    return uart.readline()

def reponse_to_list(r): # Liste von Zeichenketten
    r = str(r, 'UTF-8')
    r = r.split(',')
    r0 = r[0].split('=') # Adresse isolieren
    r[0] = r0[1]
    r4 = r[4].split('\r') # CR-LF abtrennen
    r[4] = r4[0]
    return r

def lora_init(uart):    
    # Prüfe nach, ob LoRa-Modul antwortet...
    lora_address = '???'
    send_command(uart, 'AT')
    r = read_response(uart)
    print(r)
    if r == b'+OK\r\n': # Wenn r=OK, dann...
        # LoRa-Adresse ermitteln und anzeigen    
        send_command(uart, 'AT+ADDRESS?')
        lora_address = read_response(uart) # Rückgabewert ist vom Typ Bytes
        lora_address = str(lora_address, 'UTF-8') # umwandeln in Typ String
        lora_address = lora_address[9:]
        print('Eigene LORA-Adresse:', lora_address)
    return lora_address

def send_message(uart, addr, msg): # addr: Adresse; msg: Botschaft
    payload_length = len(msg)
    cmd = 'AT+SEND='+str(addr)+','+str(payload_length)+','+msg
    print('send_message:', cmd)
    send_command(uart, cmd)

#######################################################################################
#                                                                                     #
#                         Hauptprogramm: Zahlen-Sender.py                             #
#                                                                                     #
#######################################################################################

lora_address = lora_init(uart1)
display.text(font2, 'LORA-ADR: ' + lora_address, 5, 10)
if lora_address == '???':
    display.text(font2, 'Resetten!', 5, 80, st7789.RED)
    print('Keine Verbindung zum LORA-Modul!')
    print('RESET-Knopf am TTGO betätigen!')
    sys.exit() # Programm beenden, wenn keine Antwort vom LoRa-Modul

print('Die Sende-Schleife kann mit Strg-C beendet werden')
print()

for zaehler in range(100, 1000):
    print('jetzt senden: ', zaehler)
    z_str = str(zaehler)
    display.text(font2, 'senden: '+ z_str, 10, 60)
    send_message(uart1, 16, z_str)  # Zahl an Addr 123 senden
    print(read_response(uart1))
    sleep(3)  # Wartezeit zwischen zwei Botschaften (größer???!!!)
    print()
