<?
function DEVICE(){ if (!is_object($GLOBALS['DEVICE'])) $GLOBALS['DEVICE']=new i_device();return($GLOBALS['DEVICE']);}

class i_device
{

	function get_list_terminals($group_id,$type,$usl='')
    { if (!$group_id) $group_id=MEMBER()->cur_group_id ;

      $usl_group=($group_id>0)? ' and t1.parent in ('.ACCOUNTS()->tree[$group_id]->get_list_child().') ':'' ;
      $usl_group='' ;
      $usl_type=' and t1.terminal_type="'.$type.'" ' ;
      $dop_usl=($usl)? ' and '.$usl.' ':'' ;
      if ($type=='kt') {
          $recs=execSQL('select t1.*,t2.obj_name as _group_name 
                       from obj_site_device t1 
                       left join obj_site_skd t2 on t2.pkey=t1.zone_id
                       where  t1.enabled=1 and t1.id>0 '.$usl_group.$usl_type.$dop_usl.' 
                       order by t1.id') ;
      } else {
          $recs=execSQL('select t1.*
                       from obj_site_device t1 
                       where  t1.enabled=1 and t1.id>0 '.$usl_group.$usl_type.$dop_usl.' 
                       order by t1.id') ;
      }
      if (_sizeof($recs)) foreach($recs as $id=>$rec) $this->prepare_public_info_to_terminal($recs[$id]) ;

      return($recs) ;
    }

    function get_count_diabled_terminals($terminal_type)
    {   $usl_type=' and terminal_type="'.$terminal_type.'" ' ;
        $cnt=execSQL_value('select count(pkey) from obj_site_account where clss=203 and enabled=0 '.$usl_type) ;
        return($cnt) ;
    }

 function get_terminals_ids($group_id,$type)
 { $ids=array() ;
   $usl_group=($group_id>0)? ' and parent in ('.ACCOUNTS()->tree[$group_id]->get_list_child().') ':'' ;
   $usl_group='' ;
   $usl_type=' and terminal_type="'.$type.'" ' ;
   //$dop_usl=($usl)? ' and '.$usl.' ':'' ;

   //if (isset(ACCOUNTS()->tree[$group_id]))
   //{   //$child_ids=ACCOUNTS()->tree[$group_id]->get_list_child() ;
   // $child_ids=1 ;
    $recs=execSQL_line('select id from obj_site_device where enabled=1 and t1.id>0 '.$usl_group.$usl_type.' order by id') ;
    if (_sizeof($recs)) $ids=implode(',',$recs) ;  else $ids='' ;
   //}
   return($ids) ;
 }

  // получение информации по прсоналу АСПМО
  function get_terminal_by_id($id,$options=array())
  { //$options['debug']=2 ;
    $rec=execSQL_van('select * from obj_site_account where id="'.$id.'" and clss=203 and enabled=1',$options) ;
    if ($rec['pkey'])
     { $this->prepare_public_info_to_terminal($rec,$options) ;
       $rec['_rec_source']='account_table' ;
     }
    // если терминал не найден - ищем в новой таблице устройств
    else
    {  $rec=execSQL_van('select * from obj_site_device where id="'.$id.'" and enabled=1',$options) ;
       if ($rec['pkey']) $this->prepare_public_info_to_terminal($rec,$options) ;
    }
    if (!$rec['pkey']) $rec=$this->get_device_by_id($id) ;
    return($rec);
  }

  function get_device_by_id($id,$options=array())
  { //$options['debug']=2 ;
    $rec=execSQL_van('select * from device where id="'.$id.'"',$options) ;
    if ($rec['pkey'])
     { $this->prepare_public_info_to_device($rec,$options) ;
       $rec['_rec_source']='device_table' ;
     }
    return($rec);
  }

  // получение информации по терминалу
  // самая первая таблица - obj_site_account
  // вторая версия        - obj_site_device
  // последняя версия     - device
  function get_terminal($usl,$options=array())
  { //$options['debug']=2 ;
    // ищем сначала в старой таблице аккаунтов (v1)
    if (!$options['device']) $rec=execSQL_van('select * from obj_site_account where '.$usl.' and clss=203',$options) ;
    if ($rec['pkey'])
    { $this->prepare_public_info_to_device($rec,$options) ; // prepare_public_info_to_terminal = prepare_public_info_to_device
      $rec['_rec_source']='account_table' ;
    }
    // если терминал не найден - ищем в таблице устойств (v2)
    else
    {  $rec=execSQL_van('select * from obj_site_device where '.$usl,$options) ;
       if ($rec['pkey']) $this->prepare_public_info_to_device($rec,$options) ;
    }
    // если снова не найден - ищем в таблице девайсов (v3)
    if (!$rec['pkey'])
    {   $rec=execSQL_van('select * from device where '.$usl,$options) ;
        if ($rec['pkey']) $this->prepare_public_info_to_device($rec,$options) ;
    }
    return($rec);
    }

  function get_terminal_by_pkey($id,$options=array())
  { //$options['debug']=2 ;
    $rec=$this->get_terminal('pkey="'.$id.'"',$options) ;
    return($rec);
  }

  function get_device_by_pkey($id,$options=array())
  { $rec=execSQL_van('select * from device where pkey="'.$id.'"',$options) ;
    if ($rec['pkey'])
     { $this->prepare_public_info_to_device($rec,$options) ;
       $rec['_rec_source']='device_table' ;
     }
    return($rec);
  }

  // получение информации по прсоналу АСПМО
  function get_terminal_by_ip($ip,$options=array())
  { $rec=$this->get_terminal('ip="'.$ip.'"',$options) ;
    return($rec);
  }

  function get_devices_by_parent($parent)
  {
      $rec = execSQL('select * from obj_site_device where parent="'.$parent.'"');
      return($rec);
  }

  function prepare_public_info_to_terminal(&$rec,$options=array()){$this->prepare_public_info_to_device($rec,$options);}
  function prepare_public_info_to_device(&$rec,$options=array())
  {	 switch($rec['terminal_type'])
	 { case 'kt': KT()->prepare_public_info_to_terminal($rec,$options) ; break ;
       case 'kz': QUIZ()->prepare_public_info_to_terminal($rec,$options) ; break ;
       default:   ESMO()->prepare_public_info_to_terminal($rec,$options) ; break ;
	 }
  }

  function prepare_terminal_status_to_xmpp($group_id)
  { $group_id=1 ;
    $recs=execSQL_row('select id,status from obj_site_device where parent="'.$group_id.'" and enabled=1') ;
    return($recs) ;
  }

    function device_send_async_cmd($terminal_id,$cmd,$options=array())
    { $__times['start']=get_formatted_microtime() ;
      $sleep=($options['pause'])? $options['pause']:0 ;
      $params=array() ;
      $params['terminal_id']=$terminal_id ;
      $params['cmd']=$cmd ;
      $params['sleep']=$sleep ;
      if ($options['device']) $params['device']=$options['device'] ;

      if (is_array($options['params'])) $params=array_merge($params,$options['params']) ;
      $url=_MAIN_PROTOCOL._MAIN_DOMAIN.'/services/esmo/terminal/?'.http_build_query($params) ;
      if ($GLOBALS['LS_use_localhost_in_pdf']) $url=str_replace(_PATH_TO_SITE,_MAIN_PROTOCOL.'127.0.0.1',$url);

      //$command='curl -k "'.$url.'"' ;

      //$command='/usr/bin/wget -O /dev/null --no-check-certificate "'._MAIN_PROTOCOL._MAIN_DOMAIN.'/services/esmo/terminal/?'.http_build_query($params).'"' ;
              //exec('bash -c "/usr/bin/wget --timeout=4 --connect-timeout=1 \"'.$comm.'\" > /dev/null 2>&1 &"',$output); // тоже работает но не async
              //exec('bash -c "/usr/bin/wget \"'.$comm.'\" > /dev/null 2>&1 &"',$output); // тоже работает но не async
              exec('bash -c "/usr/bin/wget -O /dev/null --no-check-certificate \"'.$url.'\" > /dev/null 2>&1 &"',$output); // тоже работает но не async
             // exec('bash -c "'.$command.'" > /dev/null 2>&1 &"',$output); // тоже работает но не async
              //exec('bash -c "/usr/bin/wget  \"'.$comm.'\" > /dev/null 2>&1 &"',$output); // тоже работает но не async
              //$output=shell_exec('bash -c "/usr/bin/wget  \"'.$comm.'\" "'); // тоже работает но не async
                //$output = shell_exec('./script.sh var1 var2');


        $command='' ; $result='' ;
      //$result = ENGINE()->liveExecuteCommand($command);
//      var_dump($output) ;
      $__times['end']=get_formatted_microtime() ;
      $time_int=$__times['end']-$__times['start'] ;
      $text='<strong>'.$cmd.'</strong><br>'.$command.'<br>' ;
      if ($sleep) $text.=' (пауза '.$sleep.' сек)' ;
      if ($options['text_log']) $text.=$options['text_log'] ;
      //$text.='<br>'.$url ; //.'<br>'.print_r($output,true) ;
      $term_reffer=$terminal_id.'.'._DOT('obj_site_account')->pkey  ;
      if ($GLOBALS['LS_term_logging_full'])LOGS()->reg_log('Асинхронная команда терминалу',$text,array('data'=>$result,'time_exec'=>$time_int,'reffers'=>array($term_reffer))) ;
    }

    function terminal_send_data($terminal_rec,$cmd,$send_array,$options=array())
        {  if (is_int($options)) $options=array('debug'=>$options)  ;
           $port=($terminal_rec['port'])? $terminal_rec['port']:_TERMINAL_PORT ;
           $put_server=(!$terminal_rec['virt'])?  $terminal_rec['ip'].':'.$port:_MAIN_DOMAIN ;

           if (!$terminal_rec['virt']) $put_req='/' ;
           else switch($terminal_rec['terminal_type'])
           { case 'mt':   $put_req='/' ; break ;
             case 'kt':   $put_req='/equipment_api_kt' ; break ;
             case 'kz':   $put_req='/equipment-api-kz.php' ; break ;
           }
           $put_params=(!$terminal_rec['virt'])?  'operation='.$cmd:'cmd='.$cmd ;

           $text_json=json_encode($send_array) ;
           ob_start() ;

           $result=IO()->doPut_v2(_MAIN_PROTOCOL,
                                      $put_server,
                                      $put_req,
                                      $put_params,
                                      $text_json,
                                      array('cmd'=>$cmd,
                                            'terminal_id'=>$terminal_rec['id'],
                                            'reffers'=>array($terminal_rec['_reffer']),
                                            'use_sertifikat'=>$GLOBALS['LS_use_sertificat_to_req_term'],
                                            'debug'=>0,
                                            'log_request'=>(!$options['no_req_log'] and $GLOBALS['LS_trace_term']),
                                            'timeout'=>($GLOBALS['LS_esmo_terminal_timeout'])? $GLOBALS['LS_esmo_terminal_timeout']:10, // LS_esmo_terminal_timeout
                                            'content_type'=>'json'
                                            )) ;

            //damp_array($result,1,-1)  ;
           if ($result['status']==200) $result['response']=json_decode($result['content'],true);
           if ($options['debug'])
           {  echo 'URL: <strong>'.$result['server_url'].'</strong>' ;
              ?><table class="basic fz_small full fixed" id="terminal_request">
                 <tr><th>ОТПРАВЛЕНО НА ТЕРМИНАЛ #<?echo $terminal_rec['id']?></th><th>ПОЛУЧЕНО С ТЕРМИНАЛА</th></tr>
                 <tr><td><? damp_array($send_array,1,-1) ;?></td>
                     <td class="left"><? if ($result['status']==200) damp_array($result['response'],1,-1) ;
                                  else
                                  { ?>Статус ответа: <span class="red"><?echo $result['status']?></span><br><?
                                    ?>Время ожидания ответа: <span class="red"><?echo round($result['time_exec'],5)?> сек.</span><br><?
                                    ?>Ответ сервера: <span class="red"><?echo $result['send_error']?></span><br><?
                                    ?><a href="<?echo $result['log_url']?>" class="new_window">Лог обмена:</a> <div class=""><?echo nl2br($result['send_response'])?></div><?
                                  }
                         ?>
                     </td>
                 </tr>
               </table>
               <!--<div class="center"><button class="button cancel">Закрыть</button></div>-->
               <style type="text/css">
                   table#terminal_request{margin:10px 0;}
                   table#terminal_request td{vertical-align:top;text-align:left;}
               </style>
               <?
           }
           if ($result['status']!=200 or $GLOBALS['LS_trace_term'])
           {   $text=$result['server_url'] ;
               if ($result['log_url']) $text.='<br><a href="'.$result['log_url'].'" class="new_window">Лог обмена</a>' ;
               $data=array('status'=>$result['status']) ;
               if ($result['send_error'])  $data['error']=$result['send_error'] ;
               LOGS()->reg_log('terminal_send_data',$text,array('data'=>$data,'terminal_id'=>$terminal_rec['id'],'time_exec'=>$result['time_exec'],'reffers'=>array($terminal_rec['_reffer']))) ;
           }
           if ($result['log_url']) echo '<br><a href="'.$result['log_url'].'" class="new_window">Лог обмена</a>' ;
           $text=ob_get_clean() ;
           $result['debug']=$text ;

           return($result) ;
        }

    function send_terminal_command($terminal_pkey,$cmd,$options=array())
      {  $result=array() ;
         ob_start() ;
         $get_terminal_options=[];
         if ($options['device']) $get_terminal_options['device']=$options['device'];
         $__times['start']=get_formatted_microtime() ;
         $rec_terminal=DEVICE()->get_terminal_by_pkey($terminal_pkey,$get_terminal_options) ;
         if (!$rec_terminal['pkey']) return(array('error'=>'Терминал с pkey='.$terminal_pkey.' не найден')) ;
         if (!$rec_terminal['enabled']) return(array('error'=>'Терминал с pkey='.$terminal_pkey.' заблокирован')) ;
         //$options['async']=1 ; !!! ни в коем случае не ставить тут, иначе будет цикл

         switch($cmd)
         { case 'set_sleep':    $result=$this->terminal_send_sleep($rec_terminal,$options)  ; break ;
           case 'set_fault':    $result=$this->terminal_set_fault($rec_terminal,$options)  ; break ;
           case 'reboot':       $result=$this->terminal_reboot($rec_terminal,$options)  ; break ;
           case 'poweroff':     $result=$this->terminal_poweroff($rec_terminal,$options)  ; break ;
           case 'check_status': $result=$this->terminal_check_status($rec_terminal,$options)  ; break ;
           case 'check_update': $result=$this->terminal_check_update($rec_terminal,$options)  ; break ;
         }
         $__times['end']=get_formatted_microtime() ;
         $time_int=$__times['end']-$__times['start'] ;

         $text=ob_get_clean() ;
         $reffers=array() ;
         if ($rec_terminal) $reffers[]=$rec_terminal['_reffer'] ;
         if ($GLOBALS['LS_term_logging_full'] and $text) LOGS()->reg_log('send_terminal_command',$text,array('terminal_id'=>$rec_terminal['id'],'time_exec'=>$time_int,'reffers'=>$reffers)) ;
         return($result) ;
      }

        /*0=>'Выключен',
          1=>'Сон',
          2=>'Готов к работе',
          3=>'Идут измерения',
          4=>'check_status',
          5=>'reboot',
          8=>'Нет связи',
          9=>'Неисправен' */


      function terminal_send_sleep($rec_terminal,$options=array())
      {  if ($options['async']==1) { $this->device_send_async_cmd($rec_terminal['pkey'],'set_sleep') ; return(array()) ; }
         $result=array() ;
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$rec_terminal['terminal_type'] ;
         $var['args']['id']['terminal']=$rec_terminal['id'] ;
         // комнада терминала
         if ($rec_terminal['status']!=1 or $options['no_check_cur_status'])
         { $result=$this->terminal_send_data($rec_terminal,'set_sleep',$var,$options) ;
           if ($result['status']==200) ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>1)) ;
           else                        ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>8)) ;
         }
         else $result['comment']='Терминал уже в режиме сна, команда не отравлена' ;
         return($result) ;
      }

      function terminal_set_fault($rec_terminal,$options=array())
      {  if ($options['async']==1) { $this->device_send_async_cmd($rec_terminal['pkey'],'set_fault') ; return(array()) ; }
         $result=array() ;
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$rec_terminal['terminal_type'] ;
         $var['args']['id']['terminal']=$rec_terminal['id'] ;
         // комнада терминала
         if ($rec_terminal['status']!=9 or $options['no_check_cur_status'])
         { $result=$this->terminal_send_data($rec_terminal,'set_fault',$var,$options) ;
           if ($result['status']==200) ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>9)) ;
           else                        ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>8)) ;
           LOGS()->reg_log('Переход в режим неисправности','',array('terminal'=>$rec_terminal,'reffers'=>array($rec_terminal['_reffer']))) ;
         }
         else $result['comment']='Терминал уже в режиме неисправности, команда не отравлена' ;
         return($result) ;
      }

      function terminal_reboot($rec_terminal,$options=array())
      {  if ($options['async']==1) { $this->device_send_async_cmd($rec_terminal['pkey'],'reboot') ; return(array()) ; }
         $result=array() ;
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$rec_terminal['terminal_type'] ;
         $var['args']['id']['terminal']=$rec_terminal['id'] ;
         $var['args']['type']='reboot' ;
         // комнада терминала
         if ($rec_terminal['status']!=5 or $options['no_check_cur_status'])
         { $result=$this->terminal_send_data($rec_terminal,'shutdown',$var,$options) ;
           if ($result['status']==200) ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>5)) ;
           else                        ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>8)) ;
           LOGS()->reg_log('Перезагрузка терминала','',array('terminal'=>$rec_terminal,'reffers'=>array($rec_terminal['_reffer']))) ;
         }
         else $result['comment']='Терминал уже отправлен в перезагрузку, команда не отравлена' ;
         return($result) ;
      }

      function terminal_poweroff($rec_terminal,$options=array())
      {  if ($options['async']==1) { $this->device_send_async_cmd($rec_terminal['pkey'],'poweroff') ; return(array()) ; }
         $result=array() ;
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$rec_terminal['terminal_type'] ;
         $var['args']['id']['terminal']=$rec_terminal['id'] ;
         $var['args']['type']='poweroff' ;
         // комнада терминала
         if ($rec_terminal['status']!=0 or $options['no_check_cur_status'])
         { $result=$this->terminal_send_data($rec_terminal,'shutdown',$var,$options) ;
           if ($result['status']==200) ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>0)) ;
           else                        ESMO()->terminal_save($rec_terminal['pkey'],array('status'=>8)) ;
           LOGS()->reg_log('Переход в режим неисправности','',array('terminal'=>$rec_terminal,'reffers'=>array($rec_terminal['_reffer']))) ;
         }
         else $result['comment']='Терминал уже выключен, команда не отравлена' ;
         return($result) ;
      }

      function terminal_check_update($rec_terminal,$options=array())
      {  if ($options['async']==1) { $this->device_send_async_cmd($rec_terminal['pkey'],'check_update') ; return(array()) ; }
         $result=array() ;
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$rec_terminal['terminal_type'] ;
         $var['args']['id']['terminal']=$rec_terminal['id'] ;
         $var['args']['type']='check_update' ;
         // комнада терминала
         $result=$this->terminal_send_data($rec_terminal,'shutdown',$var,$options) ;
         return($result) ;
      }

	// операция проверки терминала с занесением результатов в базу
   // решает несколько задач
   // - получить список исправного оборудования на терминале
   // - получить информацию текущего действия терминала
   //
      function terminal_check_status($terminal_rec,$options=array())
       { $terminal_id=$terminal_rec['id'];
      // готовим строку запроса
      $var = array();
      $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$terminal_rec['terminal_type']  ;
      $var['args']['id']['terminal']=$terminal_rec['id'] ;
      ///$options['debug']=0 ;
      //$options['no_log_request']=1 ; // не убирать, иначе в журнал будут писаться два запроса  - первый в doPut, когда запрос отправляется на терминал
         $result_array=$this->terminal_send_data($terminal_rec,'check_status',$var,$options['debug']) ;
      $result=$result_array['response'] ;

      //LOGS()->reg_log('terminal_check_status','',array('data'=>$result)) ;
      if ($result_array['status']==200) $this->terminal_save_chech_status($terminal_rec['pkey'],$result['args']['data']) ;
      else // ответ терминала не 200
      {
          $terminal_data['temp']=0 ;
          $terminal_data['status']=8 ;  // устанавливаем состояние - не соединения
          $terminal_data['ext_info']=array('code'=>$result_array['status'],'response'=>$result_array['send_error'],'time'=>round($result_array['time_exec'],5).' сек.') ;
          $this->terminal_save($terminal_rec['pkey'],$terminal_data) ;
      }
         return($result_array)  ;
    }

    // обработка результатов check_access
    function terminal_save_chech_status($terminal_pkey,$data_status)
    {   ob_start() ;
        $terminal_rec=DEVICE()->get_terminal_by_pkey($terminal_pkey) ;
        ?><strong>terminal profil</strong><?
        damp_array($terminal_rec['_profil'],1,-1);
        ?><strong>terminal data</strong><?
        damp_array($data_status,1,-1);
         // фиксируем результаты проверки терминала в базу
      // если поле оборудования будет задано в ответе - то смотрим success или нет.
      // если поле оборудования не задано в ответе - ничего не делаем
             $terminal_data=array('ext_info'=>array()) ;
          if (isset($data_status['video'])) $terminal_data['video']=($data_status['video']=='success')? 1:0 ;
          if (isset($data_status['tonometer'])) $terminal_data['tonometer']=($data_status['tonometer']=='success')? 1:0 ;
          if (isset($data_status['thermometer'])) $terminal_data['thermometer']=($data_status['thermometer']=='success')? 1:0 ;
          if (isset($data_status['alcotester'])) $terminal_data['alcotester']=($data_status['alcotester']=='success')? 1:0 ;
          if (isset($data_status['pupilometer'])) $terminal_data['pupilometer']=($data_status['pupilometer']=='success')? 1:0 ;

      // сейчас в массиве у нас только то оборудование, по которому тепрминал ответил что-то конктетное (success/failed)
      // смотрим профиль, и если по профилю есть, и оборудование неисправно - фиксируем ошибку
          $arr_errors=array() ;
          //if (isset($terminal_data['video']) and $terminal_rec['_profil']['video'] and !$terminal_data['video']) $arr_errors[]='видео' ;
          if (isset($terminal_data['tonometer']) and $terminal_rec['_profil']['tonometer'] and !$terminal_data['tonometer']) $arr_errors[]='тонометр' ;
          if (isset($terminal_data['thermometer']) and $terminal_rec['_profil']['thermometer'] and !$terminal_data['thermometer']) $arr_errors[]='термометр' ;
          if (isset($terminal_data['alcotester']) and $terminal_rec['_profil']['alcotester'] and !$terminal_data['alcotester']) $arr_errors[]='алкотестер' ;
          if (isset($terminal_data['pupilometer']) and $terminal_rec['_profil']['pupilometer'] and !$terminal_data['pupilometer']) $arr_errors[]='пупилометр' ;

          //$terminal_data['terminal_type']=($data_status['terminal_type'])? $data_status['terminal_type']:$result['args']['terminal_type'];

          // если что-то нерабочее - режим неисправности, на основании набора оборудования в профиле терминала
          if (!_sizeof($arr_errors))
             {  $terminal_data['temp']=0 ;
                 $terminal_data['status']=2 ;  // устанавливаем состояние - готов к работе
                 $terminal_data['ext_info']='' ;
         }
               else // иначе сразу переводим терминал в статус - терминал неисправен
             {   $terminal_data['temp']=0 ;    // сбрасываем счетчик
                  $terminal_data['status']=9 ;    // терминал неисправен
               LOGS()->reg_log('Неисправность оборудования терминала','',array('data'=>$arr_errors,'terminal'=>$terminal_rec,'reffers'=>array($terminal_rec['_reffer']))) ;
      }

          ?><strong>terminal save</strong><?
          damp_array($terminal_data,1,-1);

          $this->terminal_save($terminal_rec['pkey'],$terminal_data) ;

          $text=ob_get_clean() ;
         LOGS()->reg_log('terminal_save_chech_status',$text,array('terminal'=>$terminal_rec,'reffers'=>array($terminal_rec['_reffer']))) ;
    }

      function terminal_check_status2($terminal_rec,$options=array())
       { $terminal_id=$terminal_rec['id'];
         // готовим строку запроса
         $var = array();
         $var['date'] = date('Y-m-d H:i:s');
         $var['args']['terminal_type']=$terminal_rec['terminal_type']  ;
         $var['args']['id']['terminal']=$terminal_rec['id'] ;
         ///$options['debug']=0 ;
         //$options['no_log_request']=1 ; // не убирать, иначе в журнал будут писаться два запроса  - первый в doPut, когда запрос отправляется на терминал
         $result_array=$this->terminal_send_data($terminal_rec,'check_status',$var,$options['debug']) ;
         $result=$result_array['response'] ;


         //LOGS()->reg_log('terminal_check_status','',array('data'=>$result)) ;
         if ($result_array['status']==200)
         {   // фиксируем результаты проверки терминала в базу
         // если поле оборудования будет задано в ответе - то смотрим success или нет.
         // если поле оборудования не задано в ответе - ничего не делаем
             $terminal_data=array('ext_info'=>array()) ;
             if (isset($result['args']['data']['video'])) $terminal_data['video']=($result['args']['data']['video']=='success')? 1:0 ;
             if (isset($result['args']['data']['tonometer'])) $terminal_data['tonometer']=($result['args']['data']['tonometer']=='success')? 1:0 ;
             if (isset($result['args']['data']['thermometer'])) $terminal_data['thermometer']=($result['args']['data']['thermometer']=='success')? 1:0 ;
             if (isset($result['args']['data']['alcotester'])) $terminal_data['alcotester']=($result['args']['data']['alcotester']=='success')? 1:0 ;
             if (isset($result['args']['data']['pupilometer'])) $terminal_data['pupilometer']=($result['args']['data']['pupilometer']=='success')? 1:0 ;

         // сейчас в массиве у нас только то оборудование, по которому тепрминал ответил что-то конктетное (success/failed)
         // смотрим профиль, и если по профилю есть, и оборудование неисправно - фиксируем ошибку
             $arr_errors=array() ;
             //if (isset($terminal_data['video']) and $terminal_rec['_profil']['video'] and !$terminal_data['video']) $arr_errors[]='видео' ;
             if (isset($terminal_data['tonometer']) and $terminal_rec['_profil']['tonometer'] and !$terminal_data['tonometer']) $arr_errors[]='тонометр' ;
             if (isset($terminal_data['thermometer']) and $terminal_rec['_profil']['thermometer'] and !$terminal_data['thermometer']) $arr_errors[]='термометр' ;
             if (isset($terminal_data['alcotester']) and $terminal_rec['_profil']['alcotester'] and !$terminal_data['alcotester']) $arr_errors[]='алкотестер' ;
             if (isset($terminal_data['pupilometer']) and $terminal_rec['_profil']['pupilometer'] and !$terminal_data['pupilometer']) $arr_errors[]='пупилометр' ;

             $terminal_data['terminal_type']=($result['args']['data']['terminal_type'])? $result['args']['data']['terminal_type']:$result['args']['terminal_type'];

             // если что-то нерабочее - режим неисправности, на основании набора оборудования в профиле терминала
             if (!_sizeof($arr_errors))
             {  $terminal_data['temp']=0 ;
                 $terminal_data['status']=2 ;  // устанавливаем состояние - готов к работе
                 $terminal_data['ext_info']='' ;
                   $this->terminal_save($terminal_rec['pkey'],$terminal_data) ;
             }
             else
             {   // если стоит опция отправлять в перезагрузку при неисправности
                 if ($GLOBALS['LS_term_send_reboot_by_dev_error'])
                  { // если не превышено максимальное число перезагрузок
                    if ($terminal_rec['temp']<$GLOBALS['LS_term_cnt_reboot_by_dev_error'])
                  { // отправляем команду на перезагрузку, пять раз потом "аппарат неисправен"
                    $cnt_reboot=$terminal_rec['temp'] ;
                    $cnt_reboot++ ;
                    $this->device_send_async_cmd($terminal_rec['pkey'],'reboot',array('pause'=>1,'reffers'=>array($terminal_rec['_reffer']),'text_log'=>'Попытка № '.$cnt_reboot)) ;
                          $terminal_data['temp']=$cnt_reboot ; // обновляем счетчик перезагрузок
                  }
                  else
                  { $this->device_send_async_cmd($terminal_rec['pkey'],'set_fault',array('pause'=>1,'reffers'=>array($terminal_rec['_reffer']))) ;
                          $terminal_data['temp']=0 ;    // сбрасываем счетчик
                          $terminal_data['status']=9 ;    // терминал неисправен
                  }
             }
             else // иначе сразу переводим терминал в статус - терминал неисправен
             {   $this->device_send_async_cmd($terminal_rec['pkey'],'set_fault',array('pause'=>1,'reffers'=>array($terminal_rec['_reffer']))) ;
                 $terminal_data['temp']=0 ;    // сбрасываем счетчик
                 $terminal_data['status']=9 ;    // терминал неисправен
             }
             $this->terminal_save($terminal_rec['pkey'],$terminal_data) ;
             LOGS()->reg_log('Неисправность оборудования терминала','',array('data'=>$arr_errors,'terminal'=>$terminal_rec,'reffers'=>array($terminal_rec['_reffer']))) ;
         }
       }
         else // ответ терминала не 200
         {
             $terminal_data['temp']=0 ;
             $terminal_data['status']=8 ;  // устанавливаем состояние - не соединения
             $terminal_data['ext_info']=array('code'=>$result_array['status'],'response'=>$result_array['send_error'],'time'=>round($result_array['time_exec'],5).' сек.') ;
             $this->terminal_save($terminal_rec['pkey'],$terminal_data) ;
         }
         return($result_array)  ;
    }



	function terminal_create($form_data){$result=$this->device_create($form_data);return($result);}
	function device_create($form_data)
         { //if (!isset($form_data['rol']))  return(array('error'=>'rol_not_set')) ;
           //if (!$form_data['login'])  $form_data['login']=safe_text_to_url($form_data['name']) ;
           //if ($form_data['rol']==6) $data['parent']=_CLIENT_GROUP_ID ; // клиентов в отдельную папку
           //if (!$form_data['parent'])  $form_data['parent']=MEMBER()->cur_group_id ;
           if (!$form_data['clss']) $form_data['clss']=241;
           if (!$form_data['terminal_type']) $form_data['terminal_type']='kt';


           $id_exist=execSQL_value('select pkey from obj_site_device where id="'.$form_data['id'].'"') ;
           if ($id_exist)  return(array('error'=>'Устройство с данным ID уже зарегистрировано в системе')) ;

           $id_exist=execSQL_value('select pkey from obj_site_device where ip="'.$form_data['ip'].'"') ;
           if ($id_exist)  return(array('error'=>'Устройство с данным IP уже зарегистрировано в системе')) ;

           $data=array() ;
           $data['clss']=$form_data['clss'] ;
           if ($form_data['zone_id']) {
               $data['parent']=$form_data['zone_id'] ;
               $data['zone_id']=$form_data['zone_id'] ;
           }
           if ($form_data['parent']) $data['parent']=$form_data['parent'] ;
           $data['obj_name']=($form_data['name'])? $form_data['name']:'Терминал КТ';
           if ($form_data['terminal_type']) $data['terminal_type']=$form_data['terminal_type'] ;
           $data['id']=$form_data['id'] ;
           $data['ip']=$form_data['ip'] ;
           $data['virt']=($form_data['virt'])? 1:0 ;
           if ($form_data['kt_type']) $data['kt_type']=$form_data['kt_type'] ;
           //$data['profil']=$form_data['profil'] ;

           $id=adding_rec_to_table('obj_site_device',$data) ;
           $result['info']='Терминал успешно добавлен, ID='.$id ;
           $result['pkey']=$id ;
           $result['id']=$data['id'] ;
           $result['reffer']=$id.'.'._DOT('obj_site_device')->pkey ;
           if ($form_data['terminal_type']=='kt') {
               LOGS()->reg_log('Конфигурация ЭСМО','Добавление нового терминала КТ "'.$form_data['name'].'" ['.$form_data['id'].'/'.$form_data['ip'].'] в зону доступа '.SKD()->get_full_zone_path($form_data['zone_id']),array('reffers'=>array($result['reffer']))) ;
           } else {
               LOGS()->reg_log('Конфигурация ЭСМО','Добавление нового устройства "'.$form_data['name'].'" ['.$form_data['id'].'/'.$form_data['ip'].'] в группу '.$form_data['parent'],array('reffers'=>array($result['reffer']))) ;
           }
           return($result) ;
         }

	function terminal_save($terminal_pkey,$rec,$options=array())
	  {  $rec_terminal=$this->get_terminal_by_pkey($terminal_pkey) ;
	     $res=0 ; $arr_changes=array() ; $options_log=array() ;
	     if ($rec_terminal['pkey'])
	     { if (_sizeof($rec)) foreach($rec as $id=>$value)
	         if ($rec_terminal[$id]!=$value) switch($id)
               { case 'status': $arr_changes[]=$id.': '.$_SESSION['ARR_terminal_status'][$rec_terminal[$id]].' => '.$_SESSION['ARR_terminal_status'][$value] ; break  ;
                 case 'ext_info': break  ;
                 default:       $arr_changes[]=$id.': '.$rec_terminal[$id].' => '.$value ;
	       }
	       $options_log['terminal']=$rec_terminal ;
           $options_log['reffers']=array($rec_terminal['_reffer']) ;
           $options_log['data']=$arr_changes ;
           ob_start() ;
           if ($rec_terminal['_rec_source']=='account_table')
           {
                 $res=update_rec_in_table('obj_site_account',$rec,'pkey='.$rec_terminal['pkey'],array('debug'=>$options['debug'],'no_append_serialize_data'=>1)) ;
                 if ($rec_terminal['vers']!=$rec['vers'])
                 {
                     $this->terminal_save_history($rec_terminal['pkey'],$rec,['rec_source'=>'account_table']);
                 }
           }
           else
           {
                 $res=update_rec_in_table('obj_site_device',$rec,'pkey='.$rec_terminal['pkey'],array('debug'=>$options['debug'],'no_append_serialize_data'=>1)) ;
                 if ($rec_terminal['vers']!=$rec['vers'])
                 {
                     $this->terminal_save_history($rec_terminal['pkey'],$rec);
                 }
           }
	       $text=ob_get_clean() ;
	       if (_sizeof($arr_changes)) LOGS()->reg_log('Изменение данных терминала (DEVICE)',
                                                     'terminal_id='.$rec_terminal['id'].'<br>terminal_pkey='.$rec_terminal['pkey'].$rec_terminal['_rec_source'].'<br>'.$text,$options_log) ;
	                                }
	     return($res) ;
	  }

    function terminal_save_history($terminal_pkey,$rec,$options=[])
    {
        if ($rec['vers']) {
            $data=[];
            $data['clss']=293;
            $data['terminal_pkey']=$terminal_pkey;
            $data['terminal_id']=$rec['id'];
            $data['vers']=$rec['vers'];
            if ($options['rec_source']) $data['rec_source']=$options['rec_source'];
            adding_rec_to_table('device_history',$data);
        }
    }

	function terminal_delete($id)
    {  $rec_terminal=$this->get_terminal_by_pkey($id) ;
        if ($rec_terminal['_rec_source']=='account_table') execSQL_update('delete from obj_site_account where pkey='.$rec_terminal['pkey']) ;
        else                                               execSQL_update('delete from obj_site_device where pkey='.$rec_terminal['pkey']) ;
    }

    function terminal_edit($form_data)
    {
        $old_data = execSQL_van('select obj_name,id,ip from obj_site_device where pkey='.$form_data['terminal_id']);
        if ($old_data['device_ID']!=$form_data['id']) {
            $id_exist = execSQL_value('select pkey from obj_site_device where id="' . $form_data['id'] . '" and pkey!='.$form_data['terminal_id']);
            if ($id_exist) return (array('error' => 'Терминал с данным ID уже зарегистрирован в системе'));
        }
        if ($old_data['ip']!=$form_data['ip']) {
            $id_exist = execSQL_value('select pkey from obj_site_device where ip="' . $form_data['ip'] . '" and pkey!='.$form_data['terminal_id']);
            if ($id_exist) return (array('error' => 'Терминал с данным IP уже зарегистрирован в системе'));
        }

        $res=execSQL_update('update obj_site_device set obj_name="'.$form_data['new_name'].'", id='.$form_data['id'].', ip="'.$form_data['ip'].'", parent="'.$form_data['parent'].'", zone_id="'.$form_data['parent'].'", kt_type='.$form_data['kt_type'].' where pkey='.$form_data['terminal_id']);

        if ($res) $result['info']='Терминал успешно изменен, ID='.$form_data['terminal_id'] ;
        $result['reffer']=$form_data['terminal_id'].'.'._DOT('obj_site_skd')->pkey ;
        LOGS()->reg_log('Конфигурация устройств КТ','Изменения в терминале №'.$form_data['terminal_id'].
            ' name: "'.$old_data['obj_name'].'" => "'.$form_data['new_name'].
            '"; device_ID: "'.$old_data['device_ID'].'" => "'.$form_data['id'].
            '"; ip: "'.$old_data['ip'].'" => "'.$form_data['ip'].
            '"; version: "'.$old_data['version'].'" => "'.$form_data['version'].'"',array('reffers'=>array($result['reffer']))) ;
        return $result;
    }

	function get_available_terminal_firmware()
	{ $recs=execSQL('select * from obj_site_terminal_firmware as a order by pkey') ;
     return($recs) ;
 }




}

?>
