*/ namespace NoccyLabs\Gpio; use NoccyLabs\Sansi\Charset as CS; /** * GPIO pin implementation. This class wraps all interaction with a GPIO pin, * thus decoupling it from the main Gpio class. * */ class GpioPin { protected $fd; protected $pin; protected $value = 0; protected $direction; protected $edge; protected $handler; protected $label; public function __construct($pin) { $this->pin = (int)$pin; //$this->fd = fopen("/sys/class/gpio/gpio{$pin}/value", "rb"); } public function __destruct() { //fclose($this->fd); } public function setDirection($direction) { if (!in_array($direction, array("input", "output"))) { throw new \Exception; } $this->direction = $direction; //file_put_contents("/sys/class/gpio/{$this->pin}/direction", $direction); return $this; } public function getDirection() { return $this->direction; } public function setValue($value) { $this->value = (bool)$value; //file_put_contents("/sys/class/gpio/{$this->pin}/value", (int)$this->value); return $this; } public function getValue() { return $this->value; } public function setLabel($label) { $this->label = (string)$label; return $this; } public function getLabel() { return $this->label; } public function export() { /* file_put_contents("/sys/class/gpio/export", $this->pin); if (!file_exists("/sys/class/gpio/gpio{$this->pin}")) { throw new \Exception(); } */ return $this; } public function unexport() { //file_put_contents("/sys/class/gpio/unexport", $this->pin); return $this; } public function setEdge($edge) { if (!in_array($edge, array("rising", "falling", "both", "none"))) { throw new \Exception; } $this->edge = $edge; //file_put_contents("/sys/class/gpio/{$this->pin}/edge", $edge); return $this; } public function getEdge() { return $this->edge; } public function setHandler(callable $handler=null) { return $this; } public function doInterrupt() { fseek($this->fd,0,SEEK_SET); $val = fgets($this->fd); } public function dumpStatus($ansi=false) { if ($ansi) { $status = "\e[43;37;1m GPIO{$this->pin} \e[0m\n"; $direction = "\e[36;1m". ($this->direction=="input"?(CS::chr(0x2190)):(CS::chr(0x2192))). "\e[0m ".$this->direction; $edge = "\e[33;1m"; if ($this->edge == "rising") { $edge.= CS::chr(0x21A5)."\e[0m rising"; } elseif ($this->edge == "falling") { $edge.= CS::chr(0x21A7)."\e[0m falling"; } else { $edge.= "\e[0m".$this->edge; } } else { $status = "********** GPIO{$this->pin} **********\n"; $direction = $this->direction; } foreach(array( "Direction" => $direction, "Value" => ($this->value?1:0), "Edge" => $edge, "Label" => $this->label, "Hardware" => "unknown", "Int count" => 0 ) as $k=>$v) { if ($ansi) { $status.= sprintf(" \e[32;1m%10s\e[0m: \e[0m%s\e[0m\n", $k, $v); } else { $status.= sprintf(" %-10s: %s\n", $k, $v); } } error_log($status); return $this; } }