<?php

require_once('Tinkerforge/IPConnection.php');
require_once('Tinkerforge/BrickletOLED128x64.php');

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletOLED128x64;

const HOST = 'localhost';
const PORT = 4223;
const UID = '7xwQ9g'; // Change to your UID
const WIDTH = 128; // Pixels
const HEIGHT = 8; // Rows (8 Pixels high)

function drawMatrix($oled, $startColumn, $startRow, $pixels)
{
    $pages = array(array());
    $height = count($pixels) / 8;
    $width = count($pixels[0]);

    for ($row = 0; $row < $height; $row++)
    {
        for ($column = 0; $column < $width; $column++)
        {
            $pages[$row][$column] = 0;

            for ($bit = 0; $bit < 8; $bit++)
            {
                if ($pixels[($row * 8) + $bit][$column])
                {
                    $pages[$row][$column] |= 1 << $bit;
                }
            }
        }
    }

    $data = array();

    for ($i = 0, $row = 0; $row < $height; $row++)
    {
        for ($column = 0; $column < $width; $column++, $i++)
        {
            $data[$i] = $pages[$row][$column];
        }
    }

    $oled->newWindow($startColumn, $startColumn + $width - 1,
                     $startRow, $startRow + $height - 1);

    for ($i = 0; $i < count($data); $i += 64)
    {
        $oled->write(array_pad(array_slice($data, $i, 64), 64, 0));
    }
}

$ipcon = new IPConnection(); // Create IP connection
$oled = new BrickletOLED128x64(UID, $ipcon); // Create device object

$ipcon->connect(HOST, PORT); // Connect to brickd
// Don't use device before ipcon is connected

// Clear display
$oled->clearDisplay();

// Draw checkerboard pattern
$pixels = array(array());

for ($y = 0; $y < HEIGHT * 8; $y++)
{
    for ($x = 0; $x < WIDTH; $x++)
    {
        $pixels[$y][$x] = ($y / 8) % 2 == ($x / 8) % 2;
    }
}

drawMatrix($oled, 0, 0, $pixels);

echo "Press key to exit\n";
fgetc(fopen('php://stdin', 'r'));
$ipcon->disconnect();

?>
