All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.devices.waveshare.Oled.kt Maven / Gradle / Ivy

@file:OptIn(ExperimentalUnsignedTypes::class)

package ch.softappeal.konapi.devices.waveshare

import ch.softappeal.konapi.Closeable
import ch.softappeal.konapi.Gpio
import ch.softappeal.konapi.SPI_MODE_3
import ch.softappeal.konapi.SPI_MODE_4WIRE
import ch.softappeal.konapi.SPI_MODE_MSB_FIRST
import ch.softappeal.konapi.SpiDevice
import ch.softappeal.konapi.graphics.Graphics
import ch.softappeal.konapi.sleepMs
import ch.softappeal.konapi.tryCatch
import ch.softappeal.konapi.tryFinally

public interface Oled : Closeable {
    public val graphics: G
}

public interface OledWriter {
    public fun command(command: UByte)
    public fun data(data: UByte)
    public fun data(bytes: UByteArray)
}

public fun  Oled(
    gpio: Gpio, dcPin: Int, rstPin: Int,
    device: SpiDevice, speedHz: Int,
    initSequence: OledWriter.() -> Unit, getGraphics: OledWriter.() -> G,
): Oled {
    device.config = SpiDevice.Config(speedHz, 8, SPI_MODE_3 or SPI_MODE_4WIRE or SPI_MODE_MSB_FIRST)
    val dc = gpio.output(dcPin, false)
    val rst = tryCatch({
        gpio.output(rstPin, false)
    }) {
        dc.close()
    }

    fun reset() {
        rst.set(true)
        sleepMs(100)
        rst.set(false)
        sleepMs(100)
        rst.set(true)
        sleepMs(100)
    }

    fun closeOutputs() = tryFinally({
        reset()
    }) {
        tryFinally({
            dc.close()
        }) {
            rst.close()
        }
    }

    return tryCatch({
        reset()
        val writer = object : OledWriter {
            private val oneByte = UByteArray(1)
            private fun write(byte: UByte) {
                oneByte[0] = byte
                device.write(oneByte)
            }

            override fun command(command: UByte) {
                dc.set(false)
                write(command)
            }

            override fun data(data: UByte) {
                dc.set(true)
                write(data)
            }

            override fun data(bytes: UByteArray) {
                dc.set(true)
                device.write(bytes)
            }
        }
        writer.initSequence()
        val graphics = writer.getGraphics()
        object : Oled {
            override val graphics = graphics
            override fun close() {
                closeOutputs()
            }
        }
    }) {
        closeOutputs()
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy