<?php
/**
 * PPController
 *
 * Power-Point Controller library, allowing for control of network-accessible power-point controllers.
 * Compatible with Arduino Firmware found here: https://tjone270.org/marc-controller/marc-controller.ino
 *
 * @author Thomas Jones <thomas@tomtecsolutions.com> 28/12/2016
 */
class PPController {
  protected 
$ip$port$baseUrl;
  private 
$curl;
  const 
MANUAL "MANUAL";
  const 
AUTO "AUTO";

  
/**
   * Constructor Function
   *
   * @param string $ip The IP address of the power-point controller. Can be a DNS name.
   * @param int $port The port that the TCP server is running from on the power-point controller. Preset to 80.
   */
  
final public function __construct($ip$port 80) {
    
$this->ip $ip;
    
$this->port $port;
    
$this->curl curl_init();
    
curl_setopt($this->curlCURLOPT_RETURNTRANSFER1);
    
$this->baseUrl = ("http://" $ip ":" $port);
  }

  
/**
   * Deconstructor Function
   *
   * Deconstructs all CURL resources.
   */
  
final public function __destruct() {
    
curl_close($this->curl);
  }

  
/**
   * Returns the state of the relay.
   *
   * @return boolean
   */
  
public function state() {
    
curl_setopt($this->curlCURLOPT_URL$this->baseUrl "/?state");
    
$state curl_exec($this->curl);
    if (
boolval($state)) {
      return 
true;
    }
    return 
false;
  }

  
/**
   * Returns the state of the manual switch.
   *
   * True if manual switch is engaged.
   *
   * @return boolean
   */
  
public function manual() {
    
curl_setopt($this->curlCURLOPT_URL$this->baseUrl "/?manual");
    
$manual curl_exec($this->curl);
    if (
$manual == self::MANUAL) {
      return 
true;
    }
    return 
false;
  }

  
/**
   * Toggles the state of the relay in the power-point controller.
   *
   * @param bool $state The state to switch the power-point to.
   * @return result of curl_exec()
   */
  
public function toggle($state) {
    try {
      
curl_setopt($this->curlCURLOPT_URL$this->baseUrl "/?relay=" intval($state));
      
curl_exec($this->curl);
    } catch (
Throwable $e) {
      throw new 
Exception($e->getMessage);
    }
  }
}

if (
realpath(__FILE__) == realpath($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
  
show_source(__FILE__);
}