namespace i2c_fram {
    const devaddr = 0x50;
    const memend = 0x7fff;

    //% shim=pxtrt::panic
    function panic(code: number) { }

    function die() { panic(142) }

    export function readByte(addr: number) {
        if (addr < 0 || addr > memend)
            die();

        let buf = pins.createBuffer(2)
        buf[0] = (addr >> 8) & 0xff;
        buf[1] = addr & 0xff;

        pins.i2cWriteBuffer(devaddr, buf);
        buf = pins.i2cReadBuffer(devaddr, 1);

        return buf[0];
    }

    export function writeByte(addr: number, val: number) {
        if (addr < 0 || addr > memend)
            die();

        if (val < 0 || val > 0xff)
            die();

        let buf = pins.createBuffer(3)

        buf[0] = (addr >> 8) & 0xff;
        buf[1] = addr & 0xff;
        buf[2] = val;

        pins.i2cWriteBuffer(devaddr, buf)
    }

    export function readBuffer(addr: number, length: number) {
        if (addr < 0 || length < 0 || (addr + length) > memend)
            die();
        let buf = pins.createBuffer(length)
        for (let i = 0; i < length; ++i)
            buf[i] = readByte(addr + i)
        return buf
    }

    export function writeBuffer(addr: number, buf: Buffer) {
        if (addr < 0 || (addr + buf.length) > memend)
            die();
        for (let i = 0; i < buf.length; ++i)
            writeByte(addr + i, buf[i])
    }
}