78 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Linux Userspace GPIO Library
 | |
| ============================
 | |
| 
 | |
|  * Export and Unexport GPIO pins
 | |
|  * Interrupt support (*)
 | |
|  * Hardware-neutral rewrite of NoccyLabs RaspIO 
 | |
|  * Compatible with psr/logs LoggerInterface for logging
 | |
| 
 | |
| ## 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"
 | |
| 
 | |
| ## 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
 | |
|     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` Write text to the display (`LcdDeviceInterface#write()`)
 |