/*
        Copyright 2012 bigbiff/Dees_Troy TeamWin
        This file is part of TWRP/TeamWin Recovery Project.

        TWRP is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.

        TWRP is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with TWRP.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __BLANKTIMER_HEADER_HPP
#define __BLANKTIMER_HEADER_HPP

#include <pthread.h>
#include <sys/time.h>

using namespace std;

class blanktimer {
	public:
		blanktimer(void);
		int setTimerThread(void);
		void resetTimerAndUnblank(void);

	private:
		void setBlank(int blank);
		int getBlank(void);
		void setTimer(void);
		timespec getTimer(void);
		int getBrightness(void);
		int setBrightness(int brightness);
		int setBlankTimer(void);
		int setClockTimer(void);
		typedef int (blanktimer::*ThreadPtr)(void);
		typedef void* (*PThreadPtr)(void*);
		pthread_mutex_t blankmutex;
		pthread_mutex_t timermutex;
		int conblank;
		timespec btimer;
		unsigned long long sleepTimer;
		int orig_brightness;
		int blanked;
};

extern blanktimer blankTimer;

#endif // __BLANKTIMER_HEADER_HPP
