# SPDX-FileCopyrightText: 2021 Jeff Epler, written for Adafruit Industries
#
# SPDX-License-Identifier: MIT

import rp2pio

import adafruit_pioasm

code = adafruit_pioasm.Program(
    """
.program uart_tx
.side_set 1 opt

; An 8n1 UART transmit program.
; OUT pin 0 and side-set pin 0 are both mapped to UART TX pin.

  pull side 1 [7] ; Assert stop bit, or stall with line in idle state
  set x, 7 side 0 [7] ; Preload bit counter, assert start bit for 8 clocks
bitloop: ; This loop will run 8 times (8n1 UART)
  out pins, 1 ; Shift 1 bit from OSR to the first OUT pin
  jmp x-- bitloop [6] ; Each loop iteration is 8 cycles.

"""
)


class TXUART:
    def __init__(self, *, tx, baudrate=9600):
        self.pio = rp2pio.StateMachine(
            code.assembled,
            first_out_pin=tx,
            first_sideset_pin=tx,
            frequency=8 * baudrate,
            initial_sideset_pin_state=1,
            initial_sideset_pin_direction=1,
            initial_out_pin_state=1,
            initial_out_pin_direction=1,
            **code.pio_kwargs,
        )

    @property
    def timeout(self):
        return 0

    @property
    def baudrate(self):
        return self.pio.frequency // 8

    @baudrate.setter
    def baudrate(self, frequency):
        self.pio.frequency = frequency * 8

    def write(self, buf):
        return self.pio.write(buf)
