<?php
namespace ZM;

require_once('database.php');
require_once('Object.php');

class Control extends ZM_Object {
  protected static $table = 'Controls';

  protected $defaults = array(
    'Id'  =>  null,
    'CanMove' => 0,
    'CanMoveDiag' => 0,
    'CanMoveMap' => 0,
    'CanMoveAbs' => 0,
    'CanMoveRel' => 0,
    'CanMoveCon' => 0,
    'CanPan' => 0,
    'CanReset' => 0,
    'CanReboot' =>  0,
    'CanSleep' => 0,
    'CanWake' => 0,
    'MinPanRange' => NULL,
    'MaxPanRange' => NULL,
    'MinPanStep' => NULL,
    'MaxPanStep' => NULL,
    'HasPanSpeed' => 0,
    'MinPanSpeed' => NULL,
    'MaxPanSpeed' => NULL,
    'HasTurboPan' => 0,
    'TurboPanSpeed' => NULL,
    'CanTilt' => 0,
    'MinTiltRange' => NULL,
    'MaxTiltRange' => NULL,
    'MinTiltStep' => NULL,
    'MaxTiltStep' => NULL,
    'HasTiltSpeed' => 0,
    'MinTiltSpeed' => NULL,
    'MaxTiltSpeed' => NULL,
    'HasTurboTilt' => 0,
    'TurboTiltSpeed' => NULL,
    'CanZoom' => 0,
    'CanZoomAbs' => 0,
    'CanZoomRel' => 0,
    'CanZoomCon' => 0,
    'MinZoomRange' => NULL,
    'MaxZoomRange' => NULL,
    'MinZoomStep' => NULL,
    'MaxZoomStep' => NULL,
    'HasZoomSpeed' => 0,
    'MinZoomSpeed' => NULL,
    'MaxZoomSpeed' => NULL,
    'CanFocus' => 0,
    'CanAutoFocus' => 0,
    'CanFocusAbs' => 0,
    'CanFocusRel' => 0,
    'CanFocusCon' => 0,
    'MinFocusRange' => NULL,
    'MaxFocusRange' => NULL,
    'MinFocusStep' => NULL,
    'MaxFocusStep' => NULL,
    'HasFocusSpeed' => 0,
    'MinFocusSpeed' => NULL,
    'MaxFocusSpeed' => NULL,
    'CanIris' => 0,
    'CanAutoIris' => 0,
    'CanIrisAbs' => 0,
    'CanIrisRel' => 0,
    'CanIrisCon' => 0,
    'MinIrisRange' => NULL,
    'MaxIrisRange' => NULL,
    'MinIrisStep' => NULL,
    'MaxIrisStep' => NULL,
    'HasIrisSpeed' => 0,
    'MinIrisSpeed' => NULL,
    'MaxIrisSpeed' => NULL, 
    'CanGain' => 0,
    'CanAutoGain' => 0,
    'CanGainAbs' => 0,
    'CanGainRel' => 0,
    'CanGainCon' => 0,
    'MinGainRange' => NULL,
    'MaxGainRange' => NULL, 
    'MinGainStep' => NULL,
    'MaxGainStep' => NULL,
    'HasGainSpeed' => 0,
    'MinGainSpeed' => NULL,
    'MaxGainSpeed' => NULL,
    'CanWhite' => 0,
    'CanAutoWhite' => 0,
    'CanWhiteAbs' => 0,
    'CanWhiteRel' => 0,
    'CanWhiteCon' => 0, 
    'MinWhiteRange' => NULL,
    'MaxWhiteRange' => NULL,
    'MinWhiteStep' => NULL,
    'MaxWhiteStep' => NULL,
    'HasWhiteSpeed' => 0, 
    'MinWhiteSpeed' => NULL,
    'MaxWhiteSpeed' => NULL,
    'HasPresets' => 0,
    'NumPresets' => 0,
    'HasHomePreset' => 0,
    'CanSetPresets' => 0,
    'Name' => 'New',
    'Type' => 'Local',
    'Protocol' => NULL
    );

  public static function find( $parameters = array(), $options = array() ) {
    return ZM_Object::_find(self::class, $parameters, $options);
  }

  public static function find_one( $parameters = array(), $options = array() ) {
    return ZM_Object::_find_one(self::class, $parameters, $options);
  }

  public function commands() {
    $cmds = array();

    $cmds['Wake'] = 'wake';
    $cmds['Sleep'] = 'sleep';
    $cmds['Reset'] = 'reset';
    $cmds['Reboot'] = 'reboot';

    $cmds['PresetSet'] = 'presetSet';
    $cmds['PresetGoto'] = 'presetGoto';
    $cmds['PresetHome'] = 'presetHome';

    if ( $this->CanZoom() ) {
      if ( $this->CanZoomCon() ) {
        $cmds['ZoomRoot'] = 'zoomCon';
      } else if ( $this->CanZoomRel() ) {
        $cmds['ZoomRoot'] = 'zoomRel';
      } else if ( $this->CanZoomAbs() ) {
        $cmds['ZoomRoot'] = 'zoomAbs';
      } else {
        $cmds['ZoomRoot'] = '';
        Error('No zoom type selected. Please select Continuous, Relative, Absolute');
      }
      $cmds['ZoomTele'] = $cmds['ZoomRoot'].'Tele';
      $cmds['ZoomWide'] = $cmds['ZoomRoot'].'Wide';
      $cmds['ZoomStop'] = 'zoomStop';
      $cmds['ZoomAuto'] = 'zoomAuto';
      $cmds['ZoomMan'] = 'zoomMan';
    }

    if ( $this->CanFocus() ) {
      if ( $this->CanFocusCon() ) {
        $cmds['FocusRoot'] = 'focusCon';
      } else if ( $this->CanFocusRel() ) {
        $cmds['FocusRoot'] = 'focusRel';
      } else if ( $this->CanFocusAbs() ) {
        $cmds['FocusRoot'] = 'focusAbs';
      } else {
        $cmds['FocusRoot'] = '';
        Error('No focus type selected. Please select Continuous, Relative, Absolute');
      }
      $cmds['FocusFar'] = $cmds['FocusRoot'].'Far';
      $cmds['FocusNear'] = $cmds['FocusRoot'].'Near';
      $cmds['FocusStop'] = 'focusStop';
      $cmds['FocusAuto'] = 'focusAuto';
      $cmds['FocusMan'] = 'focusMan';
    }

    if ( $this->CanIris() ) {
      if ( $this->CanIrisCon() ) {
        $cmds['IrisRoot'] = 'irisCon';
      } else if ( $this->CanIrisRel() ) {
        $cmds['IrisRoot'] = 'irisRel';
      } else if ( $this->CanIrisAbs() ) {
        $cmds['IrisRoot'] = 'irisAbs';
      } else {
        $cmds['IrisRoot'] = '';
        Error('No iris type selected. Please select Continuous, Relative, Absolute');
      }
      $cmds['IrisOpen'] = $cmds['IrisRoot'].'Open';
      $cmds['IrisClose'] = $cmds['IrisRoot'].'Close';
      $cmds['IrisStop'] = 'irisStop';
      $cmds['IrisAuto'] = 'irisAuto';
      $cmds['IrisMan'] = 'irisMan';
    }

    if ( $this->CanWhite() ) {
      if ( $this->CanWhiteCon() ) {
        $cmds['WhiteRoot'] = 'whiteCon';
      } else if ( $this->CanWhiteRel() ) {
        $cmds['WhiteRoot'] = 'whiteRel';
      } else if ( $this->CanWhiteAbs() ) {
        $cmds['WhiteRoot'] = 'whiteAbs';
      } else {
        Error('No White type selected. Please select Continuous, Relative, Absolute');
        $cmds['WhiteRoot'] = '';
      }
      $cmds['WhiteIn'] = $cmds['WhiteRoot'].'In';
      $cmds['WhiteOut'] = $cmds['WhiteRoot'].'Out';
      $cmds['WhiteAuto'] = 'whiteAuto';
      $cmds['WhiteMan'] = 'whiteMan';
    }

    if ( $this->CanGain() ) {
      if ( $this->CanGainCon() ) {
        $cmds['GainRoot'] = 'gainCon';
      } else if ( $this->CanGainRel() ) {
        $cmds['GainRoot'] = 'gainRel';
      } else if ( $this->CanGainAbs() ) {
        $cmds['GainRoot'] = 'gainAbs';
      } else {
        Error('No Gain type selected');
        $cmds['GainRoot'] = '';
      }
      $cmds['GainUp'] = $cmds['GainRoot'].'Up';
      $cmds['GainDown'] = $cmds['GainRoot'].'Down';
      $cmds['GainAuto'] = 'gainAuto';
      $cmds['GainMan'] = 'gainMan';
    }

    if ( $this->CanMove() ) {
      if ( $this->CanMoveCon() ) {
        $cmds['MoveRoot'] = 'moveCon';
        $cmds['Center'] = 'moveStop';
      } elseif ( $this->CanMoveRel() ) {
        $cmds['MoveRoot'] = 'moveRel';
        $cmds['Center'] = $cmds['PresetHome'];
      } elseif ( $this->CanMoveAbs() ) {
        $cmds['MoveRoot'] = 'moveAbs';
        $cmds['Center'] = $cmds['PresetHome'];
      } else {
        $cmds['MoveRoot'] = '';
        Error('No move type selected. Please select Continuous, Relative, Absolute');
      }

      $cmds['MoveUp'] = $cmds['MoveRoot'].'Up';
      $cmds['MoveDown'] = $cmds['MoveRoot'].'Down';
      $cmds['MoveLeft'] = $cmds['MoveRoot'].'Left';
      $cmds['MoveRight'] = $cmds['MoveRoot'].'Right';
      $cmds['MoveUpLeft'] = $cmds['MoveRoot'].'UpLeft';
      $cmds['MoveUpRight'] = $cmds['MoveRoot'].'UpRight';
      $cmds['MoveDownLeft'] = $cmds['MoveRoot'].'DownLeft';
      $cmds['MoveDownRight'] = $cmds['MoveRoot'].'DownRight';
    }
    return $cmds;
  } // end public function commands
} // end class Control
?>
