<?

class Tempr_control {

	public $prog = false; // ссылка на класс Speedfan
	private $overlimit = false; //превышена ли нормальная температура
	private $init_step = ''; // запуск speedfan идет продолжительное время (особенно если это первый запуск где надо проставить галочки для сенсоров). Здесь хранится текущий этап инициализации
	private $init_error = ''; // ошибка произошедшая при иницилиализации

	private $is_pause = false; //когда true, значит поток на температурной паузе
	private $used_speedfan = true; // использовать ли speedfan
	private $visible_init_panel = true; // видимость панели инициализации. Это не настройка а статус!

	function __construct() {
		$this->prog = new Speedfan();
	}

	function is_pause() {
		return $this->is_pause;
	}

	function close() {
		return $this->prog->close();
	}

	function get_temp() {
		return $this->prog->get_temp();
	}

	// показывает скрывает панель на которой отображаются сообщения пока загружается speedfan
	public function visible_init_panel($visible) {
		STATIC $First_run=true;

		$this->visible_init_panel = $visible;

		$initPanel = get_ui('Fm->tempr_init_panel');
		$initPanel_bg = get_ui('Fm->tempr_init_panel_bg');

		$initPanel->visible = $visible;
		$initPanel->enabled = $visible;
		
		if($First_run) {
			$initPanel_bg->align = 'alClient';
			$initPanel->x = 10;
			$initPanel->y = 100;
			$First_run = false;
		}
	}

	function view_msg($text, $is_error=false) {
		cCache_text('Fm->tempr_init_msg', $text);

		if($is_error) {
			$label = c('Fm->tempr_init_msg');
			$label->font->color = 0x0000ff;
		}

	}

	// вызывается при старте программы
	function init() {	
		GLOBAL $log, $INFO;
		
		return true;

		if(!$this->init_step)
			$this->init_step = 'first_run';

		//if(file_exists('THIS_DEWELOPER'))
		$this->view_msg($this->init_step);
		//$log->line('speedfan: ' . $this->init_step);

		switch($this->init_step) {
			case 'first_run':
				$this->visible_init_panel(1);

				/* скорее это вредит, у одного человека точно так было
				// удаляем конфиг чтобы он гарантированно создался при закрытии окна конфигурации
				$fname = "SpeedFan/speedfansens.cfg";
				if(file_exists($fname)) {
					err_no();
					unlink($fname);
					err_yes();
				}*/

				// проверяем, установлен ли speedfan
				// если нет, выдаем сообщение что сейчас будет установлен спидфан
				// инсталируем
				if(!$this->prog->is_install())
					$this->prog->install();

				// создаем символьную ссылку в пустоту вместо debug.nfo. На медленных дисках это может ускорит загрузку speedfan и избавить от зависаний.
				$this->prog->replace_debug_nfo_simlink();

				// запускаем speedfan если не запущен
				if(!$this->prog->is_run()) {
					if(!$this->prog->run()) {
						$this->init_step = 'finish';
						$this->init_error = 'Не удалось запустить speedfan';
						break;
					}
				}

				$this->init_step = 'check_first_run';
				//break; не нужно останавливаться

			// проверяем что speedfan запустился
			case 'check_first_run':

				// удостоверились что он полностью запустился
				if(!$this->prog->is_run_complete())
					break;

				// проверяем, пошла ли запись в лог и не изменился ли состав дисков (кроме флеша)
				// программу то могли перенести на другой комп где совершенно другие датчики!
				// если есть косяк, значит надо править конфиг
				// открываем настройки программы
				if(!$this->prog->open_close_window_configure()) {
					$this->init_step = 'finish';
					$this->init_error = 'Не открылось окно конфигурации';
					//return false; нельзя делать return, надо делать break
					break;
				}
				$this->init_step = 'check_changed_sens';

				//break; не нужно останавливаться

			// проверка что файл сенсоров изменен speedfan-ом и можно его править
			case 'check_changed_sens':
				// если файл изменен, значит правим
				if($this->prog->is_changed_speedfansens_cfg()) {
					$this->prog->close();
					$this->prog->edit_speedfansens_cfg();
					$this->init_step = 'second_run';
				}
				break; // нужно остановиться, потому что после закрытия должно пройти какое то время перед тем как снова запускать speedfan

			case 'second_run':
				if($this->prog->is_run()) {
					break; // проверяем чтобы он закрылся с предыдущего раза
				}

				if(!$this->prog->run()) {
					$this->init_step = 'finish';
					$this->init_error = 'Не удалось запустить speedfan';
					break;
				}

				$this->init_step = 'check_get_temp';
				break;

			// ожидание когда пойдут данные в логе
			case 'check_get_temp':
				if($this->get_temp() > 0)
					$this->init_step = 'finish';
			break;
		}

		// выводим ошибку если есть
		if($this->init_error)
			$this->view_msg($this->init_error, 'ERROR');

		// скрываем панель инициализации
		if($this->init_step == 'finish' and !$this->init_error) {
			$this->visible_init_panel(0);
			$log->line("speedfan: ок");
			$INFO['speedfan_autosetting'] = true;
		}

		return true;
	}
	
	// он публичный потому что его может вызвать кнопка паузы
	public function pause_off() {
		GLOBAL $log, $Ui_thread;

		$log->line('Восстанавливаем поток.');
		$Ui_thread->resume();
		get_ui('Fm->tempr_pause_msg')->visible = 0;
		$this->is_pause = false;
	}

	private function pause_on() {
		GLOBAL $log, $Ui_thread;

		$log->line('Тормозим поток чтобы винт остыл.');
		$Ui_thread->pause();
		get_ui('Fm->tempr_pause_msg')->visible = 1;
		$this->is_pause = true;
	}


	// вызывается из чекбокса disabled_speedfan\
	// спидфана то больше нет
	// function checkbox_used() {
	// 	GLOBAL $log;

	// 	if(c('disabled_speedfan')->state == 'cbChecked')
	// 		 $used_speedfan = 0;
	// 	else $used_speedfan = 1;

	// 	if($this->used_speedfan == $used_speedfan)
	// 		return true;

	// 	$this->used_speedfan = $used_speedfan;

	// 	if($this->used_speedfan == 1) {
	// 		// сбрасываем init, тем самым запустится по новой инициализация speedfan
	// 		$log->line("сбрасываем init_step");
	// 		$this->init_step = '';
	// 	}
	// 	else {
	// 		$this->visible_init_panel(0);
	// 		$this->close();	
	// 	}
	// }

	function tick() {
		GLOBAL $Ui_thread, $log;
		STATIC $First_run = true;

		// # отключаем speedfan если стоит галочка
		// if(c('disabled_speedfan')->state == 'cbChecked')
		// 	 return true;

		// // инициализация идет в течение нескольких вызовов
		// if(!file_exists('THIS_DEWELOPER')) {
		// 	if($this->init_step != 'finish') {
		// 		$this->init();
		// 	}
		// }

		
		// контроль температуры
		//$tempr = $this->prog->get_temp();
		//$log->line(var_dump_str($tempr));

		$tempr = MaxTemprAllDisk();

		$tempr = round_nobug($tempr);
		$tempr_display = get_ui('Fm->tempr_display');
		
		if($tempr == -1 or $tempr == 0)
			 $tempr_text = '0 °C';
		else $tempr_text = $tempr . ' °C';
		$tempr_display->text = $tempr_text;

		// скрываем панель инициализации если она открыта
		// нужно когда человек вручную настроил speedfan
		// if($tempr > 0 and $this->visible_init_panel)
		// 	$this->visible_init_panel(false);

		$tempr_max = get_ui('Fm->tempr_max')->text;

		$status = $Ui_thread->get_protect('status');

		// надо делать get_ui('tempr_pause_msg')->visible = 1; 

		if($tempr > $tempr_max) {
			if(!$Ui_thread->pause and $status == 'run') {
				// останавливаем пока не остынет
				$this->pause_on();
			}
			$new_overlimit = true;
		}
		else {
			/*
			if($this->is_pause) { //то есть он восстановит поток только если сам поставил на паузу
				$this->pause_off();
			}*/
			$new_overlimit = false;
		}

		// снимаем с паузы если он остал хотя бы на один градус меньше критического
		if($tempr <= $tempr_max - 1 and $this->is_pause)
			$this->pause_off();

		// цвет надписи с температурой
		if($this->overlimit != $new_overlimit) {
			if($new_overlimit)
				 $color = 0x0000FF;
			else $color = 0x008000;

			$tempr_display->font->color = $color;
			$this->overlimit = $new_overlimit;
		}

		// перемещаем сообщение о паузе на ее законное место
		if($First_run) {
			$First_run = false;
			//$info = get_ui('Fm->tempr_info');
			$msg = get_ui('Fm->tempr_pause_msg');
			$msg->x = 200; //170;
			$msg->y = 200; //$info->y  + $info->h + 20;
		}
	}
}



?>