# THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
# APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
# HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
# IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
# ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
# THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
# GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
# USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
# DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
# PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
# EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGES.

# Copyright (c) 2018 Dr. Oliver Barth <info@drb-electronic.de>
# Frame for controlling miscellaneous modules

import ttk
import Tkinter as tk
from drblayout import *
from settings import *
from datetime import datetime, date
import re
import tkFileDialog

#
class FrameETC():

	#
	def __init__(self, frmETC, hwmng):
		self.settings = hwmng.getSettings()
		self.rtclock = hwmng.getRTC()
		self.logToUI = tk.BooleanVar()
		self.displayUpdateInterval = 100
		
		# autostart		
		self.autostart_active = []
		for i in range(0, 8):
			self.autostart_active.append(tk.BooleanVar())
			
		if self.settings.isAutostart(0):
			self.autostart_active[0].set(True)
			self.autostart1 = True
		if self.settings.isAutostart(1):
			self.autostart_active[1].set(True)
			#self.autostart2 = True
		if self.settings.isAutostart(2):
			self.autostart_active[2].set(True)
			#self.autostart3 = True
		if self.settings.isAutostart(3):
			self.autostart_active[3].set(True)
			#self.autostart4 = True

		# rtc ds1307
		self.labFrmRTC = ttk.LabelFrame(frmETC, text="rtc")
		self.labFrmRTC.grid(column=0, row=0, sticky="nsew", padx=DRBLAYOUT_CompPadding, pady=DRBLAYOUT_CompPadding)
		self.labDS1307 = ttk.Label(self.labFrmRTC, text="RTC DS1307", padding=10)
		self.labDS1307.grid(column=0, row=0, sticky="nsew", padx=5, pady=5)
		self.tfDS1307 = tk.Text(self.labFrmRTC, height=1, width=30)
		self.tfDS1307.grid(column=1, row=0, sticky="ew", padx=5, pady=5)
		self.butStartRTC = ttk.Button(self.labFrmRTC, text='start', width=10, command=self.startRTC)
		self.butStartRTC.grid(column=2, row=0, sticky="ew", padx=5, pady=5)

		self.labPCTime = ttk.Label(self.labFrmRTC, text="PC time", padding=10)
		self.labPCTime.grid(column=0, row=1, sticky="ew", padx=5, pady=5)
		self.tfPCTime = tk.Text(self.labFrmRTC, height=1, width=30)
		self.tfPCTime.grid(column=1, row=1, sticky="ew", padx=5, pady=5)
		self.butSetPCTime = ttk.Button(self.labFrmRTC, text='set', width=10, command=self.setPCTime)
		self.butSetPCTime.grid(column=2, row=1, sticky="ew", padx=5, pady=5)

		self.labManualTime = ttk.Label(self.labFrmRTC, text="manual time", padding=10)
		self.labManualTime.grid(column=0, row=2, sticky="ew", padx=5, pady=5)
		self.tfManualTime = tk.Text(self.labFrmRTC, height=1, width=30)
		self.tfManualTime.grid(column=1, row=2, sticky="ew", padx=5, pady=5)
		self.butSetManualTime = ttk.Button(self.labFrmRTC, text='set', width=10, command=self.setManualTime)
		self.butSetManualTime.grid(column=2, row=2, sticky="ew", padx=5, pady=5)

		# autostart
		self.labFrmAstart = ttk.LabelFrame(frmETC, text="Autostart", padding=10)
		self.labFrmAstart.grid(column=0, row=1, sticky="nsew", padx=5, pady=5)
		self.labAstartTask1 = ttk.Label(self.labFrmAstart, text="task1", padding=10)
		self.labAstartTask1.grid(column=0, row=0, sticky="ew", padx=5, pady=5)
		self.tfAstartTask1 = tk.Text(self.labFrmAstart, height=1, width=50)
		self.tfAstartTask1.grid(column=1, row=0, sticky="ew", padx=5, pady=5)
		self.butAstartTask1 = ttk.Button(self.labFrmAstart, text='set', width=10, command=self.setAutostartTask1)
		self.butAstartTask1.grid(column=2, row=0, sticky="ew", padx=5, pady=5)
		self.checkAstartTask1 = ttk.Checkbutton(self.labFrmAstart, padding=10, text='active', variable=self.autostart_active[0])
		self.checkAstartTask1.grid(column=3, row=0, sticky="nsew", padx=5, pady=5)
		self.labAstartTask2 = ttk.Label(self.labFrmAstart, text="task2", padding=10)
		self.labAstartTask2.grid(column=0, row=1, sticky="ew", padx=5, pady=5)
		self.tfAstartTask2 = tk.Text(self.labFrmAstart, height=1, width=50)
		self.tfAstartTask2.grid(column=1, row=1, sticky="ew", padx=5, pady=5)
		self.butAstartTask2 = ttk.Button(self.labFrmAstart, text='set', width=10, command=self.setAutostartTask2)
		self.butAstartTask2.grid(column=2, row=1, sticky="ew", padx=5, pady=5)
		self.checkAstartTask2 = ttk.Checkbutton(self.labFrmAstart, padding=10, text='active', variable=self.autostart_active[1])
		self.checkAstartTask2.grid(column=3, row=1, sticky="nsew", padx=5, pady=5)
		self.labAstartTask3 = ttk.Label(self.labFrmAstart, text="task3", padding=10)
		self.labAstartTask3.grid(column=0, row=2, sticky="ew", padx=5, pady=5)
		self.tfAstartTask3 = tk.Text(self.labFrmAstart, height=1, width=50)
		self.tfAstartTask3.grid(column=1, row=2, sticky="ew", padx=5, pady=5)
		self.butAstartTask3 = ttk.Button(self.labFrmAstart, text='set', width=10, command=self.setAutostartTask3)
		self.butAstartTask3.grid(column=2, row=2, sticky="ew", padx=5, pady=5)
		self.checkAstartTask2 = ttk.Checkbutton(self.labFrmAstart, padding=10, text='active', variable=self.autostart_active[2])
		self.checkAstartTask2.grid(column=3, row=2, sticky="nsew", padx=5, pady=5)
		self.labAstartTask4 = ttk.Label(self.labFrmAstart, text="task4", padding=10)
		self.labAstartTask4.grid(column=0, row=3, sticky="ew", padx=5, pady=5)
		self.tfAstartTask4 = tk.Text(self.labFrmAstart, height=1, width=50)
		self.tfAstartTask4.grid(column=1, row=3, sticky="ew", padx=5, pady=5)
		self.butAstartTask4 = ttk.Button(self.labFrmAstart, text='set', width=10, command=self.setAutostartTask4)
		self.butAstartTask4.grid(column=2, row=3, sticky="ew", padx=5, pady=5)
		self.checkAstartTask4 = ttk.Checkbutton(self.labFrmAstart, padding=10, text='active', variable=self.autostart_active[3])
		self.checkAstartTask4.grid(column=3, row=3, sticky="nsew", padx=5, pady=5)
		ascfg = self.settings.getAutostartConfig()
		if ascfg['task1'] != '':
			self.tfAstartTask1.insert("1.0", ascfg['task1'])
		if ascfg['task2'] != '':
			self.tfAstartTask2.insert("1.0", ascfg['task2'])
		if ascfg['task3'] != '':
			self.tfAstartTask3.insert("1.0", ascfg['task3'])
		if ascfg['task4'] != '':
			self.tfAstartTask4.insert("1.0", ascfg['task4'])

		# miscellaneous
		self.labFrmMisc = ttk.LabelFrame(frmETC, text="misc")
		self.labFrmMisc.grid(column=0, row=2, sticky="nsew", padx=DRBLAYOUT_CompPadding, pady=DRBLAYOUT_CompPadding)
		self.entryCPUTemp = ttk.Entry(self.labFrmMisc, width=10)
		self.entryCPUTemp.grid(column=0, row=0, sticky="ew", padx=5, pady=5)
		self.checkLogToUI = ttk.Checkbutton(self.labFrmMisc, text='log to UI', padding=10, variable=self.logToUI, command=self.cmdSetLog)
		self.checkLogToUI.grid(column=0, row=1, sticky="ew", padx=5, pady=5)
		self.labGUIupdateInterval = ttk.Label(self.labFrmMisc, text="GUI update interval [ms]", padding=10)
		self.labGUIupdateInterval.grid(column=0, row=2, sticky="ew", padx=5, pady=5)
		self.entryGUIupdateInterval = ttk.Entry(self.labFrmMisc, width=10)
		self.entryGUIupdateInterval.grid(column=1, row=2, sticky="ew", padx=3, pady=10)
		self.butSetGUIupdateInterval = ttk.Button(self.labFrmMisc, text='set', width=10, command=self.setGUIupdateInterval)
		self.butSetGUIupdateInterval.grid(column=2, row=2, sticky="ew", padx=5, pady=5)

		self.tfManualTime.insert("1.0", "2000-01-01 00:00:00")
		self.entryGUIupdateInterval.insert(0, str(self.displayUpdateInterval))

		self.tFile = open('/sys/class/thermal/thermal_zone0/temp')

	#
	def close(self):
		self.tFile.close()
	
	# rtclock
	def startRTC(self):
		self.rtclock.start()

	#
	def setPCTime(self):
		now = datetime.now()
		self.rtclock.setDateTime(now.year, now.month, now.day, now.hour, now.minute, now.second)

	#
	def setManualTime(self):
		time = self.tfManualTime.get("1.0", "end")
		values = re.split("[\- :]", time)
		if len(values) == 6:
			self.rtclock.setDateTime(int(values[0]), int(values[1]), int(values[2]), int(values[3]), int(values[4]), int(values[5]))
			
	# autostart
	def setAutostartTask1(self):
		fileTask = tkFileDialog.askopenfile(initialdir="./tasks", defaultextension=".py")
		if(fileTask == None):
			return
		self.tfAstartTask1.delete("1.0", tk.END)
		self.tfAstartTask1.insert("1.0", fileTask.name)
		self.updateSettings()

	#
	def setAutostartTask2(self):
		fileTask = tkFileDialog.askopenfile(initialdir="./tasks", defaultextension=".py")
		if(fileTask == None):
			return
		self.tfAstartTask2.delete("1.0", tk.END)
		self.tfAstartTask2.insert("1.0", fileTask.name)
		self.updateSettings()

	#
	def setAutostartTask3(self):
		fileTask = tkFileDialog.askopenfile(initialdir="./tasks", defaultextension=".py")
		if(fileTask == None):
			return
		self.tfAstartTask3.delete("1.0", tk.END)
		self.tfAstartTask3.insert("1.0", fileTask.name)
		self.updateSettings()

	#
	def setAutostartTask4(self):
		fileTask = tkFileDialog.askopenfile(initialdir="./tasks", defaultextension=".py")
		if(fileTask == None):
			return
		self.tfAstartTask4.delete("1.0", tk.END)
		self.tfAstartTask4.insert("1.0", fileTask.name)
		self.updateSettings()

	#
	def updateSettings(self):
		f1 = self.tfAstartTask1.get("1.0", "end - 1c")
		f2 = self.tfAstartTask2.get("1.0", "end - 1c")
		f3 = self.tfAstartTask3.get("1.0", "end - 1c")
		f4 = self.tfAstartTask4.get("1.0", "end - 1c")
		self.settings.writeAutostartConfig(f1, self.autostart_active[0].get(), f2, self.autostart_active[1].get(),
			f3, self.autostart_active[2].get(), f4, self.autostart_active[3].get() )
			
	# log
	def cmdSetLog(self):
		if self.logToUI.get():
			sys.stdout = StdoutRedirector(self.tfMessages)
			sys.stderr = StderrRedirector(self.tfMessages)
		else:
			sys.stdout = sys.__stdout__
			sys.stderr = sys.__stderr__

	#
	def setGUIupdateInterval(self):
		self.displayUpdateInterval = int(self.entryGUIupdateInterval.get())

	#
	def getGUIupdateInterval(self):
		return self.displayUpdateInterval

	#
	def update(self):
		sdttm = self.rtclock.getSDateTime()    
		self.tfDS1307.delete("1.0", tk.END)
		self.tfDS1307.insert(tk.END, sdttm)

		datetime.now()
		self.tfPCTime.delete("1.0", tk.END)
		self.tfPCTime.insert(tk.END, datetime.utcnow())

		self.tFile.seek(0)
		temp = float(self.tFile.read())
		self.entryCPUTemp.delete(0, tk.END)
		self.entryCPUTemp.insert(0, "CPU temp:" + str(temp / 1000.0) + " degC")

		return sdttm

