import board, time, busio, adafruit_lis3dh, digitalio
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService

receiver_name = "minigolf"

ble = BLERadio()
uart_connection = None

i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
accelerometer = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)

accelerometer.range = adafruit_lis3dh.RANGE_2_G

button_A = digitalio.DigitalInOut(board.BUTTON_A)
button_A.switch_to_input(pull=digitalio.Pull.DOWN)

button_B = digitalio.DigitalInOut(board.BUTTON_B)
button_B.switch_to_input(pull=digitalio.Pull.DOWN)

def map_accel_to_angle(x):
    return int(max(0, min(180, (x + 10) * 9)))

print("Running Sender Code!")
while True:
    if not uart_connection or not uart_connection.connected:  # If not connected...
        print("Scanning...")
        for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5):  # Scan...
            if UARTService in adv.services:  # If UARTService found...
                if adv.complete_name == receiver_name:
                    uart_connection = ble.connect(adv)  # Create a UART connection...
                    print(f"I've found and connected to {receiver_name}!")
                    break # MUST include this here or code will never continue after connection.
        # Stop scanning whether or not we are connected.
        ble.stop_scan()  # And stop scanning.

    while uart_connection and uart_connection.connected:
        x, y, z = accelerometer.acceleration
        club_angle = map_accel_to_angle(x)
        hole_command = ""
        if button_A.value:
            hole_command = "left"
        elif button_B.value:
            hole_command = "right"

        if hole_command:
            message = f"{club_angle},{hole_command}\n"
        else:
            message = f"{club_angle},\n"

        uart_connection[UARTService].write(message.encode("utf-8"))

