# 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 RS232 functionality

import ttk
import Tkinter as tk
from textExt import *

#
class FrameRS232():

	#
	def __init__(self, frmRS232, hwmng):
		self.rs232 = hwmng.getRS232()
		
		self.labRS232_Baud = ttk.Label(frmRS232, text="Baudrate", padding=5)
		self.labRS232_Baud.grid(column=0, row=0, sticky="nsew", padx=3, pady=10)
		self.entryRS232_Baud = ttk.Entry(frmRS232, width=10)
		self.entryRS232_Baud.grid(column=1, row=0, sticky="nsew", padx=3, pady=10)
		self.butInitRS232 = ttk.Button(frmRS232, text='init', width=10, command=self.initRS232)
		self.butInitRS232.grid(column=2, row=0, sticky="nsew", padx=3, pady=10)

		self.tfSendRS232_1 = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_1.grid(column=0, row=1, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.tfSendRS232_1_KeyUp = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_1_KeyUp.grid(column=0, row=2, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.butSendRS232_1 = ttk.Button(frmRS232, text='send', width=10, command=self.sendRS232_1)
		self.butSendRS232_1.bind('<ButtonRelease-1>', self.sendRS232_1_KeyUp)
		self.butSendRS232_1.grid(column=4, row=1, sticky="nsew", padx=3, pady=10)

		self.tfSendRS232_2 = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_2.grid(column=0, row=3, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.tfSendRS232_2_KeyUp = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_2_KeyUp.grid(column=0, row=4, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.butSendRS232_2 = ttk.Button(frmRS232, text='send', width=10, command=self.sendRS232_2)
		self.butSendRS232_2.bind('<ButtonRelease-1>', self.sendRS232_2_KeyUp)
		self.butSendRS232_2.grid(column=4, row=3, sticky="nsew", padx=3, pady=10)

		self.tfSendRS232_3 = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_3.grid(column=0, row=5, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.tfSendRS232_3_KeyUp = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_3_KeyUp.grid(column=0, row=6, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.butSendRS232_3 = ttk.Button(frmRS232, text='send', width=10, command=self.sendRS232_3)
		self.butSendRS232_3.bind('<ButtonRelease-1>', self.sendRS232_3_KeyUp)
		self.butSendRS232_3.grid(column=4, row=5, sticky="nsew", padx=3, pady=10)

		self.tfSendRS232_4 = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_4.grid(column=0, row=7, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.tfSendRS232_4_KeyUp = tk.Text(frmRS232, height=2, width=40)
		self.tfSendRS232_4_KeyUp.grid(column=0, row=8, columnspan=3, sticky="nsew", padx=3, pady=5)
		self.butSendRS232_4 = ttk.Button(frmRS232, text='send', width=10, command=self.sendRS232_4)
		self.butSendRS232_4.bind('<ButtonRelease-1>', self.sendRS232_4_KeyUp)
		self.butSendRS232_4.grid(column=4, row=7, sticky="nsew", padx=3, pady=10)

		self.tfReceiveRS232 = tk.Text(frmRS232, height=10, width=40)
		self.tfReceiveRS232.grid(column=0, row=9, columnspan=6, sticky="nsew", padx=3, pady=5)
		
		self.scrbarRecRS232 = tk.Scrollbar(frmRS232, command=self.tfReceiveRS232.yview)
		self.scrbarRecRS232.grid(column=6, row=9, sticky='nsw')
		self.tfReceiveRS232.config(yscrollcommand=self.scrbarRecRS232.set)

		self.entryRS232_Baud.insert(0, "38400")
		
	#
	def initRS232(self):
		baud = self.entryRS232_Baud.get()
		self.rs232.changeBaudrate(int(baud))
		
	#
	def sendRS232_1(self):
		msg = self.tfSendRS232_1.get("1.0", "end-1c")
		self.rs232.write(msg)

	#
	def sendRS232_1_KeyUp(self, event):
		msg = self.tfSendRS232_1_KeyUp.get("1.0", "end-1c")
		self.rs232.write(msg)

	#
	def sendRS232_2(self):
		msg = self.tfSendRS232_2.get("1.0", "end-1c")
		self.rs232.write(msg)

	#
	def sendRS232_2_KeyUp(self, event):
		msg = self.tfSendRS232_2_KeyUp.get("1.0", "end-1c")
		self.rs232.write(msg)
		
	#
	def sendRS232_3():
		msg = tfSendRS232_3.get("1.0", "end-1c")
		self.rs232.write(msg)
		
	#
	def sendRS232_3_KeyUp(event):
		msg = self.tfSendRS232_3_KeyUp.get("1.0", "end-1c")
		self.rs232.write(msg)
		
	#
	def sendRS232_4(self):
		msg = self.tfSendRS232_4.get("1.0", "end-1c")
		self.rs232.write(msg)
		
	#
	def sendRS232_4_KeyUp(self, event):
		msg = self.tfSendRS232_4_KeyUp.get("1.0", "end-1c")
		self.rs232.write(msg)

	#
	def update(self):
		msg = self.rs232.read(1000)
		if msg != "":
			self.tfReceiveRS232.insert("end", msg)
			#self.tfReceiveRS232.insert("end", "len:" + str(len(msg)))
			#for character in msg:
			#	tfReceiveRS232.insert("end", hex(ord(character)))

