# Datei experiment_1.py, abgeleitet von ble_adv_1d.py

# TTGO als Peripheral/Slave
# Benutze nRF als Central/Master

# Während des Advertising (d. h. bis zum Connecting) blinkt LED1 an Pin 27

# Nach dem Aufbau der Verbindung gibt der TTGO auf dem Terminal "Central Connected" aus und die LED1 leuchtet dauerhaft
# Nach dem Lösen der Verbindung gibt der TTGO auf dem Terminal "Central disconnected" aus und die LED1 blinkt wieder.


from machine import Pin, Timer
from time import sleep_ms


# Periphal-Klasse BLE definieren:

import ubluetooth
from micropython import const

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)


class BLE():

    def __init__(self, name):
        
        self.name = name
        self.ble = ubluetooth.BLE()
        self.ble.active(True)

        self.led1 = Pin(27, Pin.OUT)
        self.timer1 = Timer(0)
        self.timer2 = Timer(1)
        
        self.disconnected()
        self.ble.irq(self.ble_irq)
        self.advertiser()
        self.getaddress()


    def connected(self):
        
        self.timer1.deinit() # timer1 deactivated
        self.timer2.deinit() # timer2 deactivated


    def disconnected(self):
        
        self.timer1.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: self.led1(1)) # led1(1) short for led1.value(1)
        sleep_ms(200)
        self.timer2.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: self.led1(0))
    

    def ble_irq(self, event, data):

        if event == _IRQ_CENTRAL_CONNECT: # A central has connected to this peripheral
            print('connected')
            conn_handle, addr_type, addr = data
            print('address_type:', addr_type,'; address: ', [hex(n) for n in list(bytes(addr))])
            print()
            self.connected() # LED1 on
            self.led1(1)
        
        elif event == _IRQ_CENTRAL_DISCONNECT: # A central has disconnected from this peripheral
            print('disconnected')            
            conn_handle, addr_type, addr = data
            print('address_type:', addr_type,'; address: ', [hex(n) for n in list(bytes(addr))])
            print()
            self.advertiser()
            self.disconnected() # LED1 blinking...


    def advertiser(self):
        
        name = bytes(self.name, 'UTF-8')
        self.ble.gap_advertise(60000, bytearray('\x02\x01\x06') + bytearray((len(name) + 1, 0x09)) + name) # 60000 us advertising interval


    def getaddress(self):
        
        mac = self.ble.config('mac')
        mac_type, addr = mac
        print('ESP32:')
        print('mac_type:', mac_type,'; address: ', [hex(n) for n in list(bytes(addr))])
        print()    

   
# Hauptprogramm:

print('Advertising gestartet und läuft (Interrupt-gesteuert) weiter,\nauch wenn das Prompt-Zeichen >>> erscheint...\n')
print('Dieser Vorgang lässt sich mit Hilfe des Reset-Buttons beenden.\n')
ble = BLE("ESP32") # jetzt sind BLE-Interrupts aktiviert





