# SPDX-FileCopyrightText: 2021 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: MIT

import array
import math
import time
import board
import digitalio
import rp2pio
import adafruit_pioasm

trigger = digitalio.DigitalInOut(board.D4)
trigger.switch_to_output(True)

# Generate one period of sine wav.
length = 8000 // 440

# signed 16 bit
s16 = array.array("h", [0] * length)
for i in range(length):
    s16[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15))
    print(s16[i])

program = """
.program i2s_with_hold
.side_set 2

; Load the next set of samples
                    ;        /--- LRCLK
                    ;        |/-- BCLK
                    ;        ||
    pull noblock      side 0b01 ; Loads OSR with the next FIFO value or X
    mov x osr         side 0b01 ; Save the new value in case we need it again

    set y 14          side 0b01
bitloop1:
    out pins 1        side 0b10 [2]
    jmp y-- bitloop1  side 0b11 [2]
    out pins 1        side 0b10 [2]

    set y 14          side 0b11 [2]
bitloop0:
    out pins 1        side 0b00 [2]
    jmp y-- bitloop0  side 0b01 [2]
    out pins 1        side 0b00 [2]
"""

assembled = adafruit_pioasm.assemble(program)

dac = rp2pio.StateMachine(
    assembled,
    frequency=800000 * 6,
    first_out_pin=board.D12,
    first_sideset_pin=board.D10,
    sideset_pin_count=2,
    auto_pull=False,
    out_shift_right=False,
    pull_threshold=32,
    wait_for_txstall=False,
)

trigger.value = False
dac.write(s16)
time.sleep(1)
dac.stop()
trigger.value = True

print("done")
