#![no_std]
#![no_main]

use embedded_hal::spi::{self, SpiDevice};
use embedded_hal::digital;
use cortex_m_rt::entry;
use rtt_target::{rprintln, rtt_init_print};
use nrf52840_hal as hal;
use nrf52840_hal::{
    gpio::*,
    pac,
    spim::Spim,
};

type DeviceError<BUS, CS> = embedded_hal_bus::spi::
                              DeviceError<BUS, CS>;

fn spi_loopback<BUS: spi::Error, CS:
    digital::Error>(spi: &mut impl SpiDevice<Error =
    DeviceError<BUS, CS>>) -> Result<(),
    DeviceError<BUS, CS>> {
    let reference_data = b"Hello,echo Loopback!";
    // DMA を使用するので送信データを RAM に配置する
    let test_vec1: [u8; 20] = *reference_data;
    let mut readbuf = [0u8; 20];
    spi.transfer(&mut readbuf, &test_vec1)?;
    rprintln!("Read buffer: {}", core::str::
        from_utf8(&readbuf).unwrap());
    Ok(())
}

#[entry]
fn main() -> ! {
    // 中略

    let spi = Spim::new(p.SPIM2, pins, hal::spim::
        Frequency::K125, hal::spim::MODE_0, 0);
    rprintln!("SPI loopback example starting");
    let mut spi_device = embedded_hal_bus::spi::
        ExclusiveDevice::new(spi, cs, delay)
        .expect("Failed to create ExclusiveDevice");

    spi_loopback(&mut spi_device).expect(
                          "Error in spi_loopback");

    loop {}
}
