Go to file
2014-06-19 12:27:31 +02:00
bin Added lcdbridge 2014-06-15 00:34:33 +02:00
docs Fixed headers, added docs 2014-06-12 14:22:37 +02:00
examples cleaned up gpio and device code, implemented dummy/dry run mode 2014-06-19 12:27:31 +02:00
lcdbridge Added lcdbridge 2014-06-15 00:34:33 +02:00
lib cleaned up gpio and device code, implemented dummy/dry run mode 2014-06-19 12:27:31 +02:00
.gitignore Initial commit 2014-06-05 02:20:22 +02:00
composer.json Added lcdbridge 2014-06-15 00:34:33 +02:00
composer.lock cleaned up gpio and device code, implemented dummy/dry run mode 2014-06-19 12:27:31 +02:00
LICENSE Initial commit 2014-06-05 02:20:22 +02:00
README.md Added lcdbridge 2014-06-15 00:34:33 +02:00

Linux Userspace GPIO Library

Current and planned features:

  • Export and Unexport GPIO pins via sysfs
  • Interrupt support (*)
  • Hardware-neutral rewrite of NoccyLabs RaspIO
  • Compatible with psr/logs LoggerInterface for logging
  • Bit-banged SPI/I2C/1Wire

Gpio

Without a mapper active, the GPIOs adressed are the direct exported GPIO numbers, not necessarily in any logical order. Requesting $gpio[22] gives you GPIO22.

$gpio = new Gpio();
$gpio1 = $gpio[1];

With a Mapper

With a mapper the pins are arranged logically starting at 0. For example, with the WiringPi mapper, $gpio[0] would return GPIO17 and so on. The GpioPin#getPin() method will still return the actual GPIO (i.e. 17 rather than 0).

$gpio = new Gpio();
$mapper = new WiringPiMapper(2);
$gpio->setMapper($mapper);

$gpio17 = $gpio[0];

Interrupts

NOTE: Not implemented!

For interrupts to work, you need to first bind the interrupt handler, and then make sure to call on Gpio#refresh() every cycle to poll the interrupt flag on the selected pins. This is because the select() function is used.

$gpio = new Gpio();

// Set the handler on the Gpio object
$gpio->setInterruptHandler($gpio[4], function() { ... });
// Or like this on the GpioPin.
$gpio[4]
    ->setEdge("rising")
    ->setHandler(function() { ... });

while (..) {
    ..
    $gpio->refresh();
}

You can also be risky and use php ticks and timerfuncs (although that might not be portable/supported/efficient/a good idea):

declare(ticks=5);

$gpio = new Gpio();

$gpiotick = new GpioTickHandler();
$gpiotick->registerGpio($gpio);

// The interrupts will now be polled approx every 5th php vm "tick"

Parallel addressing of pins

Implemented in 0.1.x

$gpio = new Gpio();
$gpio->setMapper( new WiringPiMapper(2) );

$par = new BitmappedGpio();
for($n = 0; $n < 7; $n++) {
    $pin = $gpio[$n]->setDirection("out");
    $par->setGpioPin($n,$pin);
}
$par->write(0x55); // turn on 1, 3, 5, 7.

Buses

Not yet implemented

$bus = new NoccyLabs\Gpio\Bus\SoftwareSpiBus;
$bus->mosi = $gpio[2];
$bus->sclk = $gpio[9];
$bus->write("\0x10\0x20\0x40");
$r = $bus->read(3);

Devices

$lcd = new NoccyLabs\Gpio\Device\Display\Pcd8544Device;
// Set I/O pins
$lcd->res = $gpio[4];
$lcd->dc  = $gpio[8];
...
// Activate the device
$lcd->activate();
// Clear and draw text
$lcd->clear();
$lcd->writeAt(0,0,"Hello World");
echo $lcd->getRows(); // 5
echo $lcd->getCols(); // 19

LCD Bridge

The LCD bridge will be able to bridge any device class implementing LcdDeviceInterface to stdin or a named pipe. This basically creates a user-space daemon to interface with the display without having to fiddle with bits.

$ lcdbridge -t pcd8544 --stdin
CLR
LOC 0 0
FONT 0
MODE +BR
OUT "Hello World"
^C
$ 

Commands should include:

  • CLR - clears the display (LcdDeviceInterface#clear())
  • LOC n m - moves the cursor to line n column m (0-indexed) (LcdDeviceInterface#setCursorPos(n,m))
  • FONT n - loads the default font (0) or a custom font file (LcdDeviceInterface#setFont())
  • OUT s - Write text to the display (LcdDeviceInterface#write())
  • MODE s - Set text modes (LcdDeviceInterface#setTextMode())

Modes

As supported:

  • +R/-R - Set/clear inverse
  • +B/-B - Set/clear bold

Fonts

Location and write

Location is maintained and incremented after writes.

LOC 0 0
OUT "12345"
OUT "67890"    <-- continued at 0 5