import time
import board
import busio
import digitalio
import pwmio
import audioio
import audiomp3
from rainbowio import colorwheel
import neopixel
import adafruit_lis3dh

tap_count = 0
first_tap_time = 0
tap_cooldown = 50  # 50 milliseconds
last_tap_time = 0
tap_window = 1500  # 1.5 seconds in milliseconds

current_duty_cycle = 0
increment = 1024 
max_duty_cycle = 65535
min_duty_cycle = 0  

i2c = busio.I2C(board.SCL, board.SDA)
int1 = digitalio.DigitalInOut(board.D6)
accel = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
accel.range = adafruit_lis3dh.RANGE_4_G
accel.set_tap(1, 100)

button = digitalio.DigitalInOut(board.A1)
button.switch_to_input(pull=digitalio.Pull.UP)

enable = digitalio.DigitalInOut(board.D10)
enable.direction = digitalio.Direction.OUTPUT
enable.value = True

speaker = audioio.AudioOut(board.A0)

red = pwmio.PWMOut(board.D11, duty_cycle=0, frequency=20000)
green = pwmio.PWMOut(board.D12, duty_cycle=0, frequency=20000)
blue = pwmio.PWMOut(board.D13, duty_cycle=0, frequency=20000)

while True:
    current_duty_cycle += increment

    print("Current Duty Cycle:", current_duty_cycle)

    if current_duty_cycle >= max_duty_cycle or current_duty_cycle <= min_duty_cycle:
        increment = -increment  # Reverse the direction
        current_duty_cycle += 2 * increment  # This ensures that we don't get stuck at max/min

    red.duty_cycle = current_duty_cycle
    green.duty_cycle = current_duty_cycle
    blue.duty_cycle = current_duty_cycle

    time.sleep(0.005)  # Slow down the loop for observation
    
    now = time.monotonic() * 1000  # Current time in milliseconds

    if now - first_tap_time > tap_window:
        if first_tap_time != 0:
            if tap_count == 2:
                if not speaker.playing:
                    sample = "beeps.mp3"
                    mp3stream = audiomp3.MP3Decoder(open(sample, "rb"))
                    speaker.play(mp3stream)
            first_tap_time = 0
            tap_count = 0

    if accel.tapped:
        if now - last_tap_time > tap_cooldown:
            last_tap_time = now

            if first_tap_time == 0:
                first_tap_time = now

            tap_count += 1

            if tap_count == 3:
                if speaker.playing:
                    speaker.stop()
                else:
                    sample = "song.mp3"
                    mp3stream = audiomp3.MP3Decoder(open(sample, "rb"))
                    speaker.play(mp3stream)
                tap_count = 0
                first_tap_time = 0
