from machine import Pin, I2C
from time import sleep
from steptime import STEPTIME
from ssd1306 import SSD1306_I2C
# stole from examples from Quentin

i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000) # Again may not need the pin number?
oled = SSD1306_I2C(128, 64, i2c)

# QPAD touch pins
PADS = {
    "UP":    26, # magical GPIO numbers
    "DOWN":  2,
    "RIGHT": 1,
    "LEFT":  27,
    "A":     4,
    "B":     3,
}

LOOP = 200
SETTLE = 10000 # tried halving this to speed things up

# the touch threshold
TOUCH_DELTA = 1000

sensors = {}

for sm_id, (name, pin_num) in enumerate(PADS.items()):
    Pin(pin_num, Pin.IN, Pin.PULL_UP)
    sensors[name] = STEPTIME(sm_id, pin_num)
    
def read_sensor(sensor):
    sensor.put(LOOP)
    sensor.put(SETTLE)

    raw = sensor.get()

    return 0xFFFFFFFF - raw

# new function to speed things up
def read_all_sensors():

    # Start every measurement
    for sensor in sensors.values():
        sensor.put(LOOP)
        sensor.put(SETTLE)

    values = {}

    # Now collect the completed measurements
    for name, sensor in sensors.items():

        raw = sensor.get()

        # TODO: same 32-bit conversion you've used before
        values[name] = 0xFFFFFFFF - raw

    return values

def calibrate(samples=10):

    baseline = {}

    print("Init...")
    sleep(0.05)

    for name, sensor in sensors.items():

        total = 0

        for i in range(samples):
            total += read_sensor(sensor)

        baseline[name] = total // samples

    return baseline

class TouchInput:

    def __init__(self):
        self.baseline = calibrate()

        self.was_down = {
            name: False
            for name in PADS
        }
        
    def is_down(self, name):

        sensor = sensors[name]

        value = read_sensor(sensor)
        delta = value - self.baseline[name]

        return delta > TOUCH_DELTA
    
    def get_press(self):

        values = read_all_sensors()

        pressed = None

        for name in PADS:

            delta = values[name] - self.baseline[name]

            down_now = delta > TOUCH_DELTA
            down_before = self.was_down[name]

            if (not down_before) and down_now:
                pressed = name

            self.was_down[name] = down_now

        return pressed
    


#     # temp for debug
#     def get_deltas(self):
# 
#         deltas = {}
# 
#         for name in PADS:
# 
#             value = read_sensor(sensors[name])
# 
#             delta = value - self.baseline[name]
# 
#             deltas[name] = delta
# 
#         return deltas
