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