#!/usr/bin/env python3

# -*- coding: utf-8 -*-
import time  #Sleep-Funktion und Zeitberechungsfunktionen
import logging # Log-Datei schreiben

#import codecs #
import sys # Betriebsystem
import math # Mathematische Funktionen für Locatorberechnung

#Socketserverfunktionen
import socket

#Klasse fueGUI und Thread
import tkinter	#GUI-Elemente
import threading #Threading von Prozessen
import queue #Warteschlange



class GuiPart:
	def __init__(self, master, queue, cmdEnde):
		self.queue = queue
		self.createWidgets(master, cmdEnde)
		self.createBindings()
		self.aktuell = 0
		self.status_alt = "R"
	def createWidgets(self, master,cmdEnde):
		# Set up the GUI

		#Breite und Hoehe des Bildschirms ermitteln
		#w, h = master.winfo_screenwidth(), master.winfo_screenheight()
		#master.geometry("%dx%d+0+0" % (w/4,h/4))
		master.title("Rotorsteuerung")

		#root-Fenster auf Vollbildschirm erweitern
		#master.overrideredirect(1)
		#master.attributes("-fullscreen", True)

		#ON-TOP einschalten
		#master.attributes("-topmost",True)
		#Focus auf das Fenster setzen
		master.focus_set()



		#Gesamtbildschirm
		frmScreen = tkinter.Frame(master, name="frmscreen")
		frmScreen.pack(side="left")

		#Frame Buttons
		self.frmButtons = tkinter.LabelFrame(frmScreen, name="frmbuttons",text = "Schnellzugriffstasten",relief="raise")
		self.frmButtons.pack(side="bottom")

		frmButton1 = tkinter.LabelFrame(self.frmButtons, name="frmbutton1")
		frmButton1.pack(side="top")
		frmButton2 = tkinter.LabelFrame(self.frmButtons, name="frmbutton2")
		frmButton2.pack(side="top")
		frmButton3 = tkinter.LabelFrame(self.frmButtons, name="frmbutton3")
		frmButton3.pack(side="top")
		frmButton4 = tkinter.LabelFrame(self.frmButtons, name="frmbutton4")
		frmButton4.pack(side="bottom")

		#Frame Anzeige
		frmanzeige = tkinter.LabelFrame(frmScreen, name="frmanzeige", text = "Rotoranzeige",relief="raise")
		frmanzeige.pack(side="top")

		#Anzeige und zwei Buttons für Plus und Minus Feineinstellung
		#Geometrie der Buttons (Einheit = Anzahl der Zeichen)
		w=1
		h=1
		
		#Button für Minus
		self.btnMinus = tkinter.Button(frmanzeige, name = "btn_minus", text='-', width=w, height = h, command=self.cmdRichtungMinus)
		self.btnMinus.pack(side="left")
		
		#Button für Minus10
		self.btnMinus10 = tkinter.Button(frmanzeige, name = "btn_minus10", text='-10', width=w, height = h, command=self.cmdRichtungMinus10)
		self.btnMinus10.pack(side="left")

		#Gradanzeige
		self.anzeige = tkinter.Label(frmanzeige, text = "???", name = "label_anz", width=3, height=h, font = "Helvetica 16 bold", relief="solid")
		self.anzeige.pack(side="left")
		
		#Button für Plus10
		self.btnPlus10 = tkinter.Button(frmanzeige, name = "btn_plus10", text='+10', width=w, height = h, command=self.cmdRichtungPlus10)
		self.btnPlus10.pack(side="left")
		
		#Button für Plus 
		self.btnPlus = tkinter.Button(frmanzeige, name = "btn_plus", text='+', width=w, height = h, command=self.cmdRichtungPlus)
		self.btnPlus.pack(side="left")
		
		#Buttons für die Himmelsrichtungen
		
		self.btnNW = tkinter.Button(frmButton1, name='nw', text='NW', width=w, height = h, command=self.cmdRichtungNW)
		self.btnNW.pack(side="left")
		self.btnN = tkinter.Button(frmButton1, name='n', text='N', width=w, height = h, command=self.cmdRichtungN)
		self.btnN.pack(side="left")
		self.btnNO = tkinter.Button(frmButton1, name='no', text='NO', width=w, height = h, command=self.cmdRichtungNO)
		self.btnNO.pack(side="left")

		self.btnW = tkinter.Button(frmButton2, name='w', text='W', width=w, height = h, command=self.cmdRichtungW)
		self.btnW.pack(side="left")
		self.btnPark = tkinter.Button(frmButton2, name='park', text=args.park, width=w, height = h, command=self.cmdRichtungP)
		self.btnPark.pack(side="left")
		self.btnO = tkinter.Button(frmButton2, name='o', text='O', width=w, height = h, command=self.cmdRichtungO)
		self.btnO.pack(side="left")

		self.btnSW = tkinter.Button(frmButton3, name='sw', text='SW', width=w, height = h, command=self.cmdRichtungSW)
		self.btnSW.pack(side="left")
		self.btnS = tkinter.Button(frmButton3, name='s', text='S', width=w, height = h, command=self.cmdRichtungS)
		self.btnS.pack(side="left")
		self.btnSO = tkinter.Button(frmButton3, name='so', text='SO', width=w, height = h, command=self.cmdRichtungSO)
		self.btnSO.pack(side="left")
		
		
		#Button zum Beenden
		console = tkinter.Button(frmButton4, name="ende", width = 20, text='Ende', command=cmdEnde)
		console.pack(side="bottom")


		#Button zur Locatorrichtung-Berechnung
		self.berechne = tkinter.Button(frmButton4)
		self.berechne["text"]="berechne Richtung und Entfernung aus " + args.loc + " zum Locator"
		self.berechne["command"]  = self.read_formular
		self.berechne.pack(side="bottom")

		#Label Locatoreingabe
		self.lblLocator = tkinter.Label(frmButton4, padx=10, text = "Ziel-Locator", font = "Helvetica 12")
		self.lblLocator.pack(side="left")
		
		#Eingabefeld Locator
		self.locentry = tkinter.Entry(frmButton4,  width=6,font = "Helvetica 12", relief="solid")
		self.locentry.pack(side="left")

		self.locator = tkinter.StringVar()
		self.locator.set("JO50TI")
		self.locentry["textvariable"] = self.locator
		
		#Checkbox ob auch zum Locator gedreht werden soll
		self.chkDrehen = tkinter.Checkbutton(frmButton4, onvalue=True, offvalue=False)
		self.chkDrehen["text"]= " zum Locator drehen"
		self.valDrehen = tkinter.BooleanVar()
		self.valDrehen.set(False)
		self.chkDrehen["variable"]= self.valDrehen
		self.chkDrehen.pack(side="left")

		#Ergebnisanzeige Locatorberechnung
		self.anzeige_entfernung = tkinter.Label(frmButton4, padx=10, text="noch nichts berechnet", width=20, height=h, font = "Helvetica 12", relief="flat")
		self.anzeige_entfernung.pack(side="left")
		
		
	def berechne_locator_to_grad(self,locator):
		#print("locator=", locator)
		
		
		if len(locator) < 2:
			self.ll = "X"
			self.bb = "X"
			return
			
		if len(locator) >= 2:
			#Zeichen1 an Position 1 kann A bis R sein
			#Buchstabe für Länge -180 bis + 160 Grad A=-180, B=-160
			zeichen1 = ord(locator[0:1])

			#Zeichen2 an Position 1 kann A bis R sein
			#Buchstabe für Breite - 90 bis + 80 Grad A=-90, B=-80
			zeichen2 = ord(locator[1:2])

		else:
			#Keine Eingabe, deshalb auf Mitte setzen
			zeichen1 = ord("I")
			zeichen2 = ord("I")

		#print("zeichen1:",zeichen1,chr(zeichen1))
		zeichen1 = zeichen1 - 65
		#print(zeichen1)
		
		#print("zeichen2:",zeichen2,chr(zeichen2))
		zeichen2 = zeichen2 - 65
		#print(zeichen2)
		
		if len(locator) >= 4:
			#Zeichen1 an Position 2 kann 0 bis 9 sein
			#Zahl für Länge 20 Grad auf 10 Ziffern verteilt 0=0, 1=2
			zeichen3 = ord(locator[2:3])

			#Zeichen2 an Position 2 kann 0 bis 9 sein
			#Zahl für Breite 10 Grad auf 10 Ziffern verteilt 0=0, 1=1
			zeichen4 = ord(locator[3:4])
		else:
			zeichen3 = ord("0")
			zeichen4 = ord("0")
		
		#print("zeichen3:",zeichen3,chr(zeichen3))
		zeichen3 = zeichen3 - 48
		#print(zeichen3)

		#print("zeichen4:",zeichen4,chr(zeichen4))
		zeichen4 = zeichen4 - 48
		#print(zeichen4)
		
		if len(locator) == 6:
			#Zeichen1 an Position 3 kann A bis X sein
			#Zahl für Länge 2 Grad auf 24 Buchstaben verteilt A=0. n= 2/24
			zeichen5 = ord(locator[4:5])

			#Zeichen2 an Position 3 kann A bis X sein
			#Zahl für Breite 1 Grad auf 24 Buchstaben verteilt A=0, B=1/24
			zeichen6 = ord(locator[5:6])
		else:
			zeichen5 = ord("A")
			zeichen6 = ord("A")

		#print("zeichen5:",zeichen5,chr(zeichen5))
		zeichen5 = zeichen5 - 65
		#print(zeichen5)
		
		#print("zeichen6:",zeichen6,chr(zeichen6))
		zeichen6 = zeichen6 - 65
		#print(zeichen6)
			
		
		#Position ganz links westlicher Länge
		ll= -180
		ll = ll + (zeichen1*20)
		ll = ll + (zeichen3*2)
		ll = ll + (zeichen5*2/24)
		#In die Mitte des Locators setzen
		ll = ll + (.5*2/24)
		
		#Position ganz unten südlicher Breite
		bb = -90
		bb = bb + (zeichen2*10)
		bb = bb + (zeichen4*1)
		bb = bb + (zeichen6*1/24)
		#In die Mitte des Locators setzen
		bb = bb + (.5*1/24)
		
		#print("ll=",ll)
		#print("bb=",bb)
		self.ll = ll
		self.bb = bb

	def berechne_entfernung(self,b1, l1, b2, l2):
		"""
		b1, l1 = Breite und Länge Start
		b2, l2 = Breite und Länge Ziel
		jeweils in Dezimal-Grand
		Entferung = R * arccos(sin B1 * sin B2 + cos B1 * cos B2 * cos(L1-L2))
		wobei R = Erdradius mit 6.371 km
		
		Rückgabe in self.richtung und self.entfernung
		"""

		if b1 == b2 and l1 == l2:
			self.richtung=0
			self.entfernung=0
			return
			
			
		ER = 6371
		
		#Umrechung in Bogenmaß
		b1 = math.pi*b1/180
		l1 = math.pi*l1/180
		b2 = math.pi*b2/180
		l2 = math.pi*l2/180
		
		A = math.sin(b1) * math.sin(b2)
		B = math.cos(b1) * math.cos(b2)
		C = math.cos(l1-l2)
		
		D = B * C
		
		#Entferungswinkel
		EW = math.acos(A+D)
		#Entfernung in Kilometern
		E = ER *  EW
		
		#Richtung berechnen
		n1 = math.sin(b2)
		n2 = math.sin(b1)
		n3 = math.cos(EW)
		n4 = math.cos(b1)
		n5 = math.sin(EW)
		r = (n1-(n2*n3))/(n4*n5)
		if r < -1:
			r = -1
		if r > 1:
			r = 1
		r = math.acos(r)
		r = 180*(r/math.pi)
		if l2 - l1 < 0:
			r = 360 - r
		r = round(r,0)
		self.entfernung = round(E)
		self.richtung = r

	def read_formular(self):
		#eigene Position
		locator = args.loc.upper()
		self.berechne_locator_to_grad(locator)
		b1 = self.bb
		l1 = self.ll
		#print ("locator = ",locator," Position = ",b1,l1)
		
		#Zielposition
		locator = self.locator.get().upper()
		self.berechne_locator_to_grad(locator)
		b2 = self.bb
		l2 = self.ll
		#print ("locator = ",locator," Position = ",b2,l2)
		
		#Entferung und Richtung
		if b2=="X" or l2=="X":
			self.anzeige_entfernung["text"]="ERROR - kein Locator"
			return
			
		self.berechne_entfernung(b1, l1, b2, l2)
		
		#print("Richtung",self.richtung)
		#print("Entfernung",self.entfernung)
		self.anzeige_entfernung["text"] = str(int(self.entfernung)) + " km  " + str(int(self.richtung)) +" Grad"
		if self.valDrehen.get()== True:
			self.cmdRichtung(str(int(self.richtung)))



	def evtRichtung(self, event):
		#print("121:",event.char)
		if event.char=="n":
			self.cmdRichtung(0)
		elif event.char=="o":
			self.cmdRichtung(90)
		elif event.char=="s":
			self.cmdRichtung(180)
		elif event.char=="w":
			self.cmdRichtung(270)
		elif event.char=="p":
			self.cmdRichtungPlus10()
		elif event.char=="m":
			self.cmdRichtungMinus10()
		elif event.char=="0":
			self.cmdRichtung(args.park)
		
	def createBindings(self):
		self.btnN.bind_all('<Alt-n>', self.evtRichtung)
		self.btnN.bind_all('<Alt-o>', self.evtRichtung)
		self.btnN.bind_all('<Alt-s>', self.evtRichtung)
		self.btnN.bind_all('<Alt-w>', self.evtRichtung)
		self.btnN.bind_all('<Alt-p>', self.evtRichtung)
		self.btnN.bind_all('<Alt-m>', self.evtRichtung)
		self.btnN.bind_all('<Alt-0>', self.evtRichtung)
		self.btnN.bind_all('<Alt-e>', self.evtRichtung)
		
	def cmdRichtungNW(self):
		self.cmdRichtung(315)
		
	def cmdRichtungN(self):
		self.cmdRichtung(0)

	def cmdRichtungNO(self):
		self.cmdRichtung(45)

	def cmdRichtungW(self):
		self.cmdRichtung(270)
		
	def cmdRichtungP(self):
		self.cmdRichtung(args.park)

	def cmdRichtungO(self):
		self.cmdRichtung(90)

	def cmdRichtungSW(self):
		self.cmdRichtung(225)
		
	def cmdRichtungS(self):
		self.cmdRichtung(180)

	def cmdRichtungSO(self):
		self.cmdRichtung(135)

	def cmdRichtungPlus(self):
		grad = self.aktuell + 1
		if grad > 359:
			grad = grad-359
		self.cmdRichtung(grad)

	def cmdRichtungMinus(self):
		grad = self.aktuell - 1
		if grad < 0 :
			grad = grad + 360
		if grad == 360:
			grad = 0
		self.cmdRichtung(grad)
		
	def cmdRichtungPlus10(self):
		grad = self.aktuell + 10
		if grad > 360:
			grad = grad-360
		if grad == 360:
			grad = 0
		self.cmdRichtung(grad)

	def cmdRichtungMinus10(self):
		grad = self.aktuell - 10
		if grad < 0 :
			grad = grad + 359
		self.cmdRichtung(grad)

	def cmdRichtung(self,grad):
		grad = int(grad)
		daten = str(grad).encode('utf-8')
		farb_button_markierung="#FF0000"
		if grad == 0:
			self.btnN['bg'] = farb_button_markierung
		if grad == 45:
			self.btnNO['bg'] = farb_button_markierung
		if grad == 90:
			self.btnO['bg'] = farb_button_markierung
		if grad == 135:
			self.btnSO['bg'] = farb_button_markierung
		if grad == 180:
			self.btnS['bg'] = farb_button_markierung
		if grad == 225:
			self.btnSW['bg'] = farb_button_markierung
		if grad == 270:
			self.btnW['bg'] = farb_button_markierung
		if grad == 315:
			self.btnNW['bg'] = farb_button_markierung
		if grad == args.park:
			self.btnPark['bg'] = farb_button_markierung

		# Soft-Stop einschalten
		befehl = bytes([2]) + b'AG977' + bytes([13])
		ThreadedClient.tcp_send(befehl)

		# CPM-Modus ausschalten S einschalten = M
		befehl = bytes([2]) + b'AM' + bytes([13])
		ThreadedClient.tcp_send(befehl)

		# an Zielposition drehen
		befehl = bytes([2]) + b'AG' + daten + bytes([13])
		ThreadedClient.tcp_send(befehl)



	def processIncoming(self,gui):
		"""Handle all messages currently in the queue, if any."""
		while self.queue.qsize(  ):
			try:
				msg = self.queue.get(0)
				#GUI aktualisieren
				#print("197:msg=", msg)
				#print ("198:",gui.winfo_children())

				#Aufteilung der Nachricht vom Rotor
				hilf = msg.split(",")
				#print("175:hilf=",hilf)
				txtid = hilf[1]
				if txtid == "?":
					txtgrad = hilf[2]
					self.status =  hilf[3][0:1]
					#print("445 status=",self.status)
					self.anzeige["text"] = str(txtgrad)
					self.aktuell = int(txtgrad)
					if self.status=="B":
						self.anzeige['bg'] = '#FF0000'
					else:
						self.anzeige['bg'] = '#FFFFFF'
				else:
					self.anzeige["text"]="???"

				#Buttons einfärben

				#während der Drehbewegung
				if self.status=="B":
					farb_button_markierung="#FFFF00"
					if self.aktuell == 0:
						self.btnN['bg'] = farb_button_markierung
					if self.aktuell == 45:
						self.btnNO['bg'] = farb_button_markierung
					if self.aktuell == 90:
						self.btnO['bg'] = farb_button_markierung
					if self.aktuell == 135:
						self.btnSO['bg'] = farb_button_markierung
					if self.aktuell == 180:
						self.btnS['bg'] = farb_button_markierung
					if self.aktuell == 225:
						self.btnSW['bg'] = farb_button_markierung
					if self.aktuell == 270:
						self.btnW['bg'] = farb_button_markierung
					if self.aktuell == 315:
						self.btnNW['bg'] = farb_button_markierung
					if self.aktuell == args.park:
						self.btnPark['bg'] = farb_button_markierung
				
				else:
					
					#Am Ende der Bewegung nur noch den übereinstimmend Button grün färben
					
					if self.status_alt != self.status:
						#erst alle auf Bildschirmhintergrund zurücksetzen
						self.btnN['bg'] = self.frmButtons['bg']
						self.btnNO['bg'] = self.frmButtons['bg']
						self.btnO['bg'] = self.frmButtons['bg']
						self.btnSO['bg'] = self.frmButtons['bg']
						self.btnS['bg'] = self.frmButtons['bg']
						self.btnSW['bg'] = self.frmButtons['bg']
						self.btnW['bg'] = self.frmButtons['bg']
						self.btnNW['bg'] = self.frmButtons['bg']
						self.btnPark['bg'] = self.frmButtons['bg']
					
					#aktuellen Button grün färben
					farb_button_markierung="#00FF00"
					if self.aktuell == 0:
						self.btnN['bg'] = farb_button_markierung
					if self.aktuell == 45:
						self.btnNO['bg'] = farb_button_markierung
					if self.aktuell == 90:
						self.btnO['bg'] = farb_button_markierung
					if self.aktuell == 135:
						self.btnSO['bg'] = farb_button_markierung
					if self.aktuell == 180:
						self.btnS['bg'] = farb_button_markierung
					if self.aktuell == 225:
						self.btnSW['bg'] = farb_button_markierung
					if self.aktuell == 270:
						self.btnW['bg'] = farb_button_markierung
					if self.aktuell == 315:
						self.btnNW['bg'] = farb_button_markierung
					if self.aktuell == args.park:
						self.btnPark['bg'] = farb_button_markierung
											
				self.status_alt = self.status
				
			except queue.Empty:
				# just on general principles, although we don't
				# expect this branch to be taken in this case
				pass

class ThreadedClient:
	"""
	Launch the main part of the GUI and the worker thread. periodicCall and
	endApplication could reside in the GUI part, but putting them here
	means that you have all the thread controls in a single place.
	"""
	def __init__(self, master, max_clients):
		"""
		Start the GUI and the asynchronous threads. We are in the main
		(original) thread of the application, which will later be used by
		the GUI as well. We spawn a new thread for the worker (I/O).
		"""
		self.master = master

		# Create the queue
		self.queue = queue.Queue()

		# Set up the GUI part
		#self.gui = GuiPart(master, self.queue, self.endApplication, max_clients)
		self.gui = GuiPart(master, self.queue, self.endApplication)

		# Set up the thread to do asynchronous I/O
		# More threads can also be created and used, if necessary
		self.running = 1
		self.thread1 = threading.Thread(target=self.workerThread1)
		self.thread1.start(  )


		# Start the periodic call in the GUI to check if the queue contains
		# anything
		self.periodicCall(  )

	def periodicCall(self):
		"""
		Check every 200 ms if there is something new in the queue.
		"""
		self.gui.processIncoming(self.master)
		if not self.running:
			# This is the brutal stop of the system. You may want to do
			# some cleanup before actually shutting it down.
			import sys
			sys.exit(1)
		self.master.after(200, self.periodicCall)

	def workerThread1(self):
		"""
		This is where we handle the asynchronous I/O. For example, it may be
		a 'select(  )'. One important thing to remember is that the thread has
		to yield control pretty regularly, by select or otherwise.
		"""

		nachricht = ""

		while self.running:

			#Daten vom UDP-Port lesen
			msg = self.tcp_read()
			#print("295:msg=",msg)


			#leerer Eintrag sonst Nachricht auswerten
			if msg is None:
				#print("300 pass")
				pass
			else:

				for inhalt in msg:
					#print("305:inhalt=",inhalt)

					if inhalt is None:
						#print("307 pass")
						pass
					else:
						#print("311 Verarbeitung")
						txtinhalt=""
						#UTF-8-Zeichenketten sind bytes - erst in string umwandeln (wegen upper)
						if type(inhalt) == bytes:
							txtinhalt = inhalt.decode('utf-8')

						if type(inhalt) == str:
							txtinhalt = inhalt

						for zeichen in txtinhalt:
							#print("321:zeichen=",zeichen)
							
							if zeichen == chr(2):
								pass
							else:
								if zeichen == chr(13):
									#Nachricht an Warteschlange haengen
									if nachricht != "":
										self.queue.put(nachricht)
										#print("330:nachricht",nachricht)

									#Neue Nachricht beginnt
									nachricht = ""
									txtinhalt=""
								else:
									nachricht = nachricht + zeichen




	def endApplication(self):
		self.running = 0

	""" Warten, bis Informationen per UDP ankommen und dann entsprechende
	Aktion ausfuehren und ggf. Anzeige aktualisieren
	"""
	def tcp_read(self):
		try:
			# Lesen der Daten am Socket
			data = s.recvfrom(1024)

			#Rueckgabe der per UDP erhaltenen Daten
			return(data)

		# Probleme aufgetreten  - dient nur dazu die Anzeige auch dann zu aktualisieren, wenn alle Clients aus sind
		except socket.error as e:
			#print ('Error Code : ' + str(e[0]) + ' Message ' + e[1])
			#sys.exit()
			msg = "Socket-Fehler:",e.args
			logging.debug(msg)

			#Netzwerkmeldung ausloesen damit ggf. neue Verbindung startet
			# Position abfragen
			msg  = bytes([2]) + b'A?' + bytes([13])
			logging.debug (msg)
			s.sendto(msg, (args.server,args.port))


	""" Befehl an Rotor übers Netzwerk senden
	"""
	def tcp_send(nachricht):
		try:
			# Senden der Daten an Socket
			s.send(nachricht)
			#print("375 nachricht=",nachricht)

		# Probleme aufgetreten  - dient nur dazu die Anzeige auch dann zu aktualisieren, wenn alle Clients aus sind
		except socket.error as e:
			#print ('Error Code : ' + str(e[0]) + ' Message ' + e[1])
			#sys.exit()
			msg = "Socket-Fehler:",e.args
			logging.debug(msg)

			#Netzwerkmeldung ausloesen damit ggf. neue Verbindung startet
			# Position abfragen
			msg  = bytes([2]) + b'A?' + bytes([13])
			logging.debug (msg)
			s.sendto(msg, (args.server,args.port))

import argparse

parser = argparse.ArgumentParser(
	description='Netzwerk-Client zur Steuerung des Rotors über die lokale serielle Schnittstelle',
	epilog="""Tastensteuerung:Die 4 Haupthimmelsrichtungen:Alt-n, Alt-o, Alt-w, Alt-s ,
Plus 10 = Alt-p, und Minus 10 = Alt-m und die Parkposition = Alt-0
""")

parser.add_argument(
	'-s','--server',
	nargs='?',
	help="Name des Servers, default: %(default)s",
	default='raspiz')

parser.add_argument(
	'-p', '--port',
	nargs='?',
	type=int,
	help='Port zur Verbindung mit dem Server, default: %(default)s',
	default=7775)

parser.add_argument(
	'-a','--park',
	nargs='?',
	type=int,
	help='Parkposition in Grad, default: %(default)s',
	default=325)

parser.add_argument(
	'-l','--loc',
	nargs='?',
	help='eigener Locator, default: %(default)s',
	default="JO50VI")

args = parser.parse_args()


try:
	#TCP-Client einrichten
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.settimeout(10)
	srvname = (args.server,args.port)
	s.connect (srvname)

	ownadress = s.getsockname()
	msg = sys.argv[0]
	msg = msg + "#START ROTOR-Client#" + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
	msg = msg + "#" + str(ownadress[0]) + ";" + str(ownadress[1])
	logging.info(msg)

	# Router abfragen
	befehl = bytes([2]) + b'A?' + bytes([13])
	ThreadedClient.tcp_send(befehl)


	#GUI anzeigen
	root = tkinter.Tk()
	client = ThreadedClient(root, 1)
	root.mainloop()

except socket.error:
	print(socket.error)
	msg = ('Failed to create socket')
	logging.info (msg)
	print(msg)
	sys.stderr.write('\n--- exit ---\n')
	sys.exit()

