*/ 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[44;37;1m GPIO{$this->pin} \e[0m\n"; $direction = ($this->direction=="input"?(CS::chr(0x2190)):(CS::chr(0x2192))). " ".$this->direction; $edge = $this->edge; //""; /*if ($this->edge == "rising") { $edge.= CS::chr(0x21A5)." rising"; } elseif ($this->edge == "falling") { $edge.= CS::chr(0x21A7)." 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; } }