#cs ----------------------------------------------------------------------------

 AutoIt Version: 	3.3.8.1
 Autor:				Christian Lehner
 Skriptfunktion:	Trainings-Zeitnahme für Clubsport-Kartslalom

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

$version = "1.0.3"
$stand = "26.05.2016"

#Region
#AutoIt3Wrapper_Icon=Iconsmind-Outline-Stopwatch-2.ico
#AutoIt3Wrapper_Res_Fileversion=$version
#AutoIt3Wrapper_Res_Language=1031
#EndRegion

Opt("GUIOnEventMode",1)

; Variablen setzen
$FormName = "Zeitnahme -- MSC Javel 77 -- von Christian Lehner -- Version: v." & $version & " (" & $stand & ")"	;Name der GUI
$Config = @ScriptDir & "\config.ini"																			;Datei mit Informationen über Fahrer, Kart, Wetter, etc.
$DB = @ScriptDir & "\" & @YEAR & "_" & @MON & "_" & @MDAY & "_zeitnahme_ergebnisse.txt"							;Textdatei mit Ergebnissen (im Weiteren als "Datenbank" bezeichnet)
$AktuelleRunde = "0"																							;Setzt den Wert "aktuellen Runde" auf "0"
$TrainingsID = _DateDiff( 's',"1970/01/01 00:00:00",_NowCalc())													;TrainingsID = Unix-Zeitstempel wird beim Start der Software gesetzt und ist für alle Runden eines Trainings identisch
$startstopp = "start"																							;Setzt den Wert "start" für die Doppelbelegung des Buttons "Start / Stopp" der Stoppuhr
$status = "Bereit"																								;Wert für die Statusbar

Global $ahTime[4], $aOld[4], $iTimer, $fPause = False

; Farbwerte setzen
$Gruen = "0x66FF00"
$Rot = "0xff0000"
$Grau = "0xD1D8DE"

; Config.ini prüfen und ggf. neu erstellen
If Not FileExists ($Config) Then 																				;Wenn keine config.ini vorhanden ist, dann eine neue erstellen
   IniWrite ($Config, "Kart", "; ==> Angezeigter Name ", " Name für Protokoll ohne Leerzeichen! ") 				;Kommentar in der Config.ini
   IniWrite ($Config, "Kart", "200ccm Vereinskart", "200")	 													;Default-Kart (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Kart", "270ccm Vereinskart", "270") 														;Default-Kart (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Kart", "390ccm Vereinskart", "390")	 													;Default-Kart (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Kart", "390ccm Christian", "390L") 														;Default-Kart (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Fahrer", "; ==> Fortlaufende Nummer ", " Fahrername für Protokoll ohne Leerzeichen!") 	;Kommentar in der Config.ini
   IniWrite ($Config, "Fahrer", "1", "Kai") 																	;Default-Fahrer (#1 - Name: Kai)
   IniWrite ($Config, "Fahrer", "2", "Manfred") 																;Default-Fahrer (#2 - Name: Manfred)
   IniWrite ($Config, "Fahrer", "3", "Helmut") 																	;Default-Fahrer (#3 - Name: Helmut)
   IniWrite ($Config, "Fahrer", "4", "Christian") 																;Default-Fahrer (#4 - Name: Christian)
   IniWrite ($Config, "Wetter", "; ==> Angezeigter Name ", " Name für Protokoll ohne Leerzeichen!") 			;Kommentar in der Config.ini
   IniWrite ($Config, "Wetter", "trockene Strecke", "T") 														;Default-Wetter (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Wetter", "nasse Strecke, konstanter Regen", "R") 										;Default-Wetter (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Wetter", "nasse Strecke, nach Regenfall", "N") 											;Default-Wetter (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "Wetter", "abtrockende Strecke, teilweise nass", "A") 									;Default-Wetter (Angezeigter Name - Kürzel für Protokoll)
   IniWrite ($Config, "config", "Totmann", "3") 																;Wartezeit für die Totmann-Schaltung in Sekunden
   IniWrite ($Config, "config", "Default-Runden", "5") 															;Default Rundenanzahl "Soll"
   $status = "Config.ini wurde neu angelegt ... Bereit"
EndIf

; Datenbank öffnen
FileOpen ($DB, 1) 																								; Mode 1 = Schreibmodus (anhängend an das Dateiende)

If $DB = -1 Then 																								;Prüfen ob die Datenbank im Schreibmodus geöffnet ist. Bei einem Fehler wird "-1" zurück gegeben.
   MsgBox(16, "Datenbank-Fehler", "Die Datei konnte nicht geöffnet werden!" & @CRLF & $DB)
   Exit
EndIf

; GUI
#Region ### START Koda GUI section ### Form=c:\users\elehchr\desktop\zeitnahme\form_zeitnahme_v100.kxf
$Form_Zeitnahme = GUICreate($FormName, 606, 441, 730, 339, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_TABSTOP), BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
$grp_zeitmessung = GUICtrlCreateGroup("Zeitmessung ", 16, 16, 177, 89)
$lbl_zeitmessung = GUICtrlCreateLabel("00:00:00", 24, 40, 156, 52, $SS_CENTER)
GUICtrlSetFont(-1, 30, 800, 0, "MS Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grp_runden = GUICtrlCreateGroup("Runden ", 208, 16, 153, 89)
$lbl_runden_soll = GUICtrlCreateLabel("Runden soll:", 224, 40, 63, 17, $SS_RIGHT)
$input_runden_soll = GUICtrlCreateInput( IniRead($config, "config", "Default-Runden", "5") , 296, 40, 49, 21)
$lbl_runden_ist = GUICtrlCreateLabel("Runden ist:", 224, 72, 58, 17, $SS_RIGHT)
$input_runden_ist = GUICtrlCreateInput($AktuelleRunde, 296, 72, 49, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grp_manuelle_zeiteingabe = GUICtrlCreateGroup("Manuelle Zeiteingabe ", 376, 16, 209, 89)
$checkbox_manuelle_zeiteingabe = GUICtrlCreateCheckbox("Manuelle Zeiteingabe aktivieren", 392, 40, 177, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$input_manuelle_zeitmessung = GUICtrlCreateInput("00:00:00", 392, 64, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
GUICtrlSetState(-1, $GUI_DISABLE)
$lbl_einheit_manuelle_zeiteingabe = GUICtrlCreateLabel("Min:Sek:1/100", 488, 64, 75, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grp_fahrer = GUICtrlCreateGroup("Fahrer ", 16, 120, 569, 129)
$lbl_kart = GUICtrlCreateLabel("Kart:", 144, 176, 26, 17, $SS_RIGHT)
$combo_kart = GUICtrlCreateCombo("", 184, 176, 201, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$lbl_fahrer = GUICtrlCreateLabel("Fahrer:", 136, 144, 37, 17, $SS_RIGHT)
$combo_fahrer = GUICtrlCreateCombo("", 184, 144, 201, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$lbl_wetterbedingungen = GUICtrlCreateLabel("Wetterbedingungen:", 72, 208, 101, 17, $SS_RIGHT)
$combo_wetterbedingungen = GUICtrlCreateCombo("", 184, 208, 377, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grp_zeitstrafen = GUICtrlCreateGroup("Zeitstrafen ", 336, 264, 249, 97)
$lbl_pylonenfehler = GUICtrlCreateLabel("Pylonen:", 344, 288, 45, 17, $SS_RIGHT)
$input_pylonenfehler = GUICtrlCreateInput("0", 392, 288, 49, 21)
$lbl_torfehler = GUICtrlCreateLabel("Tore:", 360, 320, 29, 17, $SS_RIGHT)
$input_torfehler = GUICtrlCreateInput("0", 392, 320, 49, 21)
$cmd_plus_pylone = GUICtrlCreateButton("+1 Pyl.", 448, 288, 59, 25)
$cmd_minus_pylone = GUICtrlCreateButton("-1 Pyl.", 512, 288, 59, 25)
$cmd_plus_tor = GUICtrlCreateButton("+1 Tor", 448, 320, 59, 25)
$cmd_minus_tor = GUICtrlCreateButton("-1 Tor", 512, 320, 59, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$cmd_startstopp = GUICtrlCreateButton("START", 16, 264, 179, 57)
$cmd_speichern = GUICtrlCreateButton("speichern", 16, 328, 179, 33)
GUICtrlSetState(-1, $GUI_DISABLE)
$cmd_reset = GUICtrlCreateButton("reset", 16, 368, 179, 33)
$lbl_statusanzeige = GUICtrlCreateLabel($status, 16, 416, 572, 17, $SS_SUNKEN)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

_ConfigEinlesen()																								;Config.ini einlesen und somit die Combo-Boxen mit Inhalt füllen

GUICtrlSetOnEvent($cmd_startstopp, "_StartStopp") 																;Funktion Start/Stopp-Button
GUICtrlSetOnEvent($cmd_plus_pylone, "_Plus_Pylonenfehler") 														;Funktion +1 Pylonenfehler
GUICtrlSetOnEvent($cmd_minus_pylone, "_Minus_Pylonenfehler") 													;Funktion -1 Pylonenfehler
GUICtrlSetOnEvent($cmd_plus_tor, "_Plus_Torfehler") 															;Funktion +1 Torfehler
GUICtrlSetOnEvent($cmd_minus_tor, "_Minus_Torfehler") 															;Funktion -1 Torfehler
GUICtrlSetOnEvent($cmd_speichern, "_Speichern") 																;Funktion Speichern
GUICtrlSetOnEvent($cmd_reset, "_Reset") 																		;Funktion Reset
GUISetOnEvent(-3, "_Ende") 																						;Funktion Ende

While 1
WEnd

Func _ConfigEinlesen()
   Local $aArray = IniReadSection($Config, "Kart") 																;Config.ini für Combo-Box "Kart" einlesen
   For $i = 1 to $aArray[0][0]
      GUICtrlSetData ($combo_kart, $aArray[$i][0])
   Next

   Local $aArray = IniReadSection($Config, "Fahrer") 															;Config.ini für Combo-Box "Fahrer" einlesen
   For $i = 1 to $aArray[0][0]
      GUICtrlSetData ($combo_fahrer, $aArray[$i][1])
   Next

   Local $aArray = IniReadSection($Config, "Wetter") 															;Config.ini für Combo-Box "Wetter" einlesen
   For $i = 1 to $aArray[0][0]
      GUICtrlSetData ($combo_wetterbedingungen, $aArray[$i][0])
   Next
EndFunc ;==> _ConfigEinlesen

Func _StartStopp()
   If $startstopp = "start" Then
	  $totmann = IniRead($Config, "config", "Totmann", "3") 													;Totmann-Wert setzen
	  ;Timer starten
	  $iTimer = TimerInit()																						;Timer wird gestartet
	  AdlibRegister('_ShowTime', 1)																				;Funktion wird alle 1ms ausgeführt
	  ;GUI-Formatierung
	  GUICtrlSetData ($cmd_startstopp, "STOPP") 																;Start-Stopp-Button Text ändern
	  GUICtrlSetState ($cmd_speichern, $GUI_DISABLE) 															;Speicher-Button deaktivieren
	  GUICtrlSetState ($cmd_reset, $GUI_DISABLE) 																;Reset-Button deaktivieren
	  For $i = $totmann to 1 Step -1																			;Den Wert "Totmann" bis auf 1 runter zählen
		 GUICtrlSetState ($cmd_startstopp, $GUI_DISABLE) 														;Button Start/Stopp deaktivieren
		 GUICtrlSetBkColor($cmd_startstopp, $Grau) 																;Button Start/Stopp Farbe ändern
		 $status = "Zeitmessung läuft ... Totmann-Sperre aktiv!"												;Status neu setzen
		 GUICtrlSetData ($lbl_statusanzeige, $status)															;Status auf der GUI aktualisieren
		 Sleep(1000)																							;Wartezeit 1sek.
	  Next
	  GUICtrlSetState ($cmd_startstopp, $GUI_ENABLE) 															;Button Start/Stopp aktivieren
	  GUICtrlSetBkColor($cmd_startstopp, $Gruen) 																;Button Start/Stopp Farbe ändern
	  $status = "Zeitmessung läuft ..."																			;Status neu setzen
	  GUICtrlSetData ($lbl_statusanzeige, $status)																;Status auf der GUI aktualisieren
	  $startstopp = "stopp"																						;Variable auf "stopp" setzen
   ElseIf $startstopp = "stopp" Then
	  ;Timmer stoppen
	  AdlibUnRegister('_ShowTime')																				;Timer stoppen
	  _ShowTime()																								;Zeit auf der GUI aktualisieren
	  ;GUI-Formatierung
	  GUICtrlSetState ($cmd_startstopp, $GUI_DISABLE) 															;Button Start/Stopp deaktivieren
	  GUICtrlSetData ($cmd_startstopp, "START") 																;Start-Stopp-Button Text ändern
	  GUICtrlSetBkColor($cmd_startstopp, $Grau) 																;Button Start/Stopp Farbe ändern
	  GUICtrlSetState ($cmd_speichern, $GUI_ENABLE) 															;Speicher-Button aktivieren
	  GUICtrlSetState ($cmd_reset, $GUI_ENABLE) 																;Reset-Button aktivieren
	  $status = "Zeitmessung gestoppt. Bitte speichern oder reset."												;Status neu setzen
	  GUICtrlSetData ($lbl_statusanzeige, $status)																;Status auf der GUI aktualisieren
	  $startstopp = "start"																						;Variable auf "start" setzen
   Else
	  MsgBox (16, "Fehler", "Start-Stopp-Status nicht erkannt!")												;Fehlermeldung
   EndIf

EndFunc

Func _ShowTime()
   Global $aTime[4], $iTicks = TimerDiff($iTimer)
   $aTime[2] = Int($iTicks / 1000)				;Sekunden
   $aTime[3] = Int($iTicks / 10) 	 			;Hundertstel
   $aTime[0] = Int($aTime[2] / 3600) 			;Stunden
   $aTime[2] = Mod($aTime[2], 3600) 			;?
   $aTime[1] = Int($aTime[2] / 60) 				;Minuten
   $aTime[2] = Mod($aTime[2], 60) 				;?
   GUICtrlSetData ($lbl_zeitmessung, StringRight('00' & $aTime[1], 2) & ":" & StringRight('00' & $aTime[2], 2) & ":" & StringRight('00' & $aTime[3], 2))
EndFunc   ;==>_ShowTime

Func _Plus_Pylonenfehler() 																						;Pylonenfehler +1
   $iPyl = GUICtrlRead ($input_pylonenfehler)
   GUICtrlSetData ($input_pylonenfehler, $iPyl +1)
EndFunc

Func _Minus_Pylonenfehler() 																					;Pylonenfehler -1
   $iPyl = GUICtrlRead ($input_pylonenfehler)
   if $iPyl > 0 Then																							;Sperre für negativen Wert
	  GUICtrlSetData ($input_pylonenfehler, $iPyl -1)
   EndIf
EndFunc

Func _Plus_Torfehler() 																							;Torfehler +1
   $iTor = GUICtrlRead ($input_torfehler)
   GUICtrlSetData ($input_torfehler, $iTor +1)
EndFunc

Func _Minus_Torfehler() 																						;Torfehler -1
   $iTor = GUICtrlRead ($input_torfehler)
   if $iTor > 0 Then																							;Sperre für negativen Wert
	  GUICtrlSetData ($input_torfehler, $iTor -1)
   EndIf
EndFunc

Func _Speichern()																								;Speicherfunktion => Alle wichtigen Daten in eine Textdatei speichern
   If GUICtrlRead($combo_fahrer) = "" Then 																		;Warnung wenn kein Fahrer ausgewählt wurde
      MsgBox(16 + 262144, "Eingabe fehlt", "Bitte ein Fahrer auswählen!")										;Meldung
   ElseIf GUICtrlRead($combo_kart) = "" Then 																	;Warnung wenn kein Kart ausgewählt wurde
      MsgBox(16 + 262144, "Eingabe fehlt", "Bitte ein Kart auswählen!")											;Meldung
   ElseIf GUICtrlRead($combo_wetterbedingungen) = "" Then 														;Warnung wenn kein Wetter ausgewählt wurde
      MsgBox(16 + 262144, "Eingabe fehlt", "Bitte das Wetter auswählen!")										;Meldung
   Else
	  Local $KonvertKart = IniRead($Config, "Kart", GUICtrlRead($combo_kart), "error") 							;Auswahl "Kart" per .ini-Datei in ein Kürzel umwandeln
      Local $Fahrer = GUICtrlRead($combo_fahrer) 																;Fahrername aus der Combobox auslesen
      Local $KonvertWetter = IniRead($Config, "Wetter", GUICtrlRead($combo_wetterbedingungen), "error") 		;Auswahl "Wetter" per .ini-Datei in ein Kürzel umwandeln
      Local $UnixTimestamp = _DateDiff( 's',"1970/01/01 00:00:00",_NowCalc())									;Unix-Zeitstempel
      Local $KonvertHundertstel = $aTime[3]																		;Umrechnung der gestoppten Zeit nach Hundertstel-Sekunden für das Protokoll

	  $status = "speichern ..."																					;Status neu setzen
	  GUICtrlSetData ($lbl_statusanzeige, $status)																;Status auf der GUI aktualisieren

	  ;Wunschformatierung von Kai: => FileWriteLine ($DB, "ZeitenID" & "=" & "TrainingsID" & "="& "Fahrername" & "=" & "Kartname" & "=" & "Bedingungen" & "=" & "Zeit" & "=" & "Pylonen" & "=" & "Tore" & "=" & "Gesamtzeit")
      FileWriteLine ($DB, $UnixTimestamp & "=" & $TrainingsID & "="& $Fahrer & "=" & $KonvertKart & "=" & $KonvertWetter & "=" & $KonvertHundertstel & "=" & GUICtrlRead($input_pylonenfehler) & "=" & GUICtrlRead($input_torfehler) & "=" & $KonvertHundertstel + (GUICtrlRead($input_pylonenfehler) * 200) + (GUICtrlRead($input_torfehler) * 1000))

	  $AktuelleRunde = GUICtrlRead($input_runden_ist) +1 														;Aktuelle Runde +1
      GUICtrlSetData($input_runden_ist, $AktuelleRunde) 														;Aktuelle Runde auf GUI aktualisieren

	  ;GUI
	  GUICtrlSetData($lbl_zeitmessung, "00:00:00")																;Stoppuhr zurücksetzen
	  GUICtrlSetData($input_pylonenfehler, "0") 																;Pylonenfehler zurücksetzen
	  GUICtrlSetData($input_torfehler, "0") 																	;Torfehler zurücksetzen
	  GUICtrlSetState($cmd_speichern, $GUI_DISABLE) 															;Speicherbutton deaktivieren

      ;Start-Button formatieren
      If GUICtrlRead($input_runden_ist) >= GUICtrlRead($input_runden_soll) Then 								;Prüfen ob die gefahrenen Runden der Vorgabe "Runden Soll" entsprechen.
         GUICtrlSetBkColor($cmd_startstopp, $Rot) 																;Start-Button Farbe ändern
         GUICtrlSetData ($cmd_startstopp, "!Rundenanzahl erreicht!") 											;Start-Stopp-Button Text ändern
		 $status = "Bitte reset drücken."																		;Status neu setzen
		 GUICtrlSetData ($lbl_statusanzeige, $status)															;Status auf der GUI aktualisieren
      Else
         GUICtrlSetState ($cmd_startstopp, $GUI_ENABLE) 														;Button Start/Stopp aktivieren
         GUICtrlSetBkColor($cmd_startstopp, $Gruen) 															;Start-Button Farbe ändern
         GUICtrlSetData ($cmd_startstopp, "START") 																;Start-Button Text ändern
      EndIf

	  $status = "Daten wurden gespeichert... Bereit"															;Status neu setzen
	  GUICtrlSetData ($lbl_statusanzeige, $status)																;Status auf der GUI aktualisieren

   EndIf
EndFunc

Func _Reset() 																									;Reset-Funktion
   GUICtrlSetData($lbl_zeitmessung, "00:00:00")																	;Stoppuhr zurücksetzen
   GUICtrlSetData($input_manuelle_zeitmessung, "00:00:00")														;Manuelle Eingaben zurücksetzen
   GUICtrlSetData($input_pylonenfehler, "0") 																	;Pylonenfehler zurücksetzen
   GUICtrlSetData($input_torfehler, "0") 																		;Torfehler zurücksetzen
   GUICtrlSetState ($cmd_startstopp, $GUI_ENABLE) 																;Button Start/Stopp aktivieren
   GUICtrlSetBkColor($cmd_startstopp, $gruen) 																	;Button Start/Stopp Farbe ändern
   GUICtrlSetData ($cmd_startstopp, "START") 																	;Start-Button Text ändern
   GUICtrlSetState ($cmd_speichern, $GUI_DISABLE) 																;Speicher-Button deaktivieren
   $AktuelleRunde = "0" 																						;Aktuell gefahrene Runde: Wert auf 0 setzen
   GUICtrlSetData($input_runden_ist, $AktuelleRunde) 															;Aktuell gefahrene Runden GUI zurück auf 0 setzen
   $status = "Reset durchgeführt ... Bereit"																	;Status neu setzen
   GUICtrlSetData ($lbl_statusanzeige, $status)																	;Status auf der GUI aktualisieren
EndFunc ;==> _Reset


Func _Ende()																									;Funktion Programm beenden
   FileClose ($DB) 																								;Ergebnis.txt schließen
   Exit
EndFunc ;==> _Ende
