namespace pins {

    let _spi: SPI;
    /**
    * Gets the default SPI driver
    */
    //%
    export function spi() {
        if (!_spi) {
            const mosi = pins.pinByCfg(DAL.CFG_PIN_MOSI);
            const miso = pins.pinByCfg(DAL.CFG_PIN_MISO);
            const sck = pins.pinByCfg(DAL.CFG_PIN_SCK);
            _spi = pins.createSPI(mosi, miso, sck);
        }
        return _spi;
    }

    /**
     * Write to the SPI slave and return the response
     * @param value Data to be sent to the SPI slave
     */
    //% help=pins/spi-write weight=5 advanced=true
    //% blockId=spi_write block="spi write %value"
    export function spiWrite(value: number) {
        return spi().write(value);
    }

    /**
     * Write a given command to SPI bus, and at the same time read the response.
     */
    //% help=pins/spi-transfer weight=4 advanced=true
    //% blockId=spi_transfer block="spi transfer %command into %response"
    export function spiTransfer(command: Buffer, response: Buffer) {
        spi().transfer(command, response);
    }

    /**
     * Set the SPI frequency
     * @param frequency the clock frequency, eg: 1000000
     */
    //% help=pins/spi-frequency weight=4 advanced=true
    //% blockId=spi_frequency block="spi frequency %frequency"
    export function spiFrequency(frequency: number) {
        spi().setFrequency(frequency);
    }

    /**
     * Set the SPI signal mode
     * @param mode the mode, eg: 3
     */
    //% help=pins/spi-mode weight=3 advanced=true
    //% blockId=spi_mode block="spi mode %mode"
    export function spiMode(mode: number) {
        spi().setMode(mode);
    }
}