#include "sms_spi.h"

void spi_init(SPI *spi, Tristate *TH, Tristate *TR, EXCH spixfn)
{
    spi->TH = TH;
    spi->TR = TR;
    spi->lastTH = *TH;
    spi->bitcnt = 0;
    spi->bit = false;
    spi->rx = 0;
    spi->tx = 0xff;
    spi->spixfn = spixfn;
}

byte spi_rd(SPI *spi)
{

    return (byte)spi->bit; // return in bit 0
}

void spi_pulse(SPI *spi)
{
    if (*spi->TH != spi->lastTH) {
        spi->lastTH = *spi->TH;
        if (spi->lastTH == TRI_HIGH) {
            spi->rx <<= 1;
            if (*spi->TR == TRI_HIGH) {
                spi->rx++;
            }
            spi->bit = spi->tx >> 7;
            spi->tx <<= 1;
            spi->bitcnt++;
            if (spi->bitcnt == 8) {
                spi->tx = spi->spixfn(spi->rx);
                spi->bitcnt = 0;
            }
        }
    }
}