#AutoIt3Wrapper_Res_Language=1031                       ;Resource Language code . default 2057=English (United Kingdom)
#AutoIt3Wrapper_Res_Comment=Bin2Dez
#AutoIt3Wrapper_Res_Description=Damit kann man einen 24 Bit Binaercode nach Dezimal umwandeln.
#AutoIt3Wrapper_Res_Fileversion=1.3.0.0                 ;File Version
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n         ;(y/n/p)AutoIncrement FileVersion After Aut2EXE is finished. y=Yes/n=No/P=Prompt   default=n
#AutoIt3Wrapper_Res_LegalCopyright=Thomas Stephan
#AutoIt3Wrapper_Res_Field=Email|oscar@elektronik-kurs.de
#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
#AutoIt3Wrapper_Res_Field=created on:|%longdate% %time%

#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)

If Not FileExists("schalter_an.ico") Then
	MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_an.ico" & @CRLF & "Das Programm wird beendet!")
	Exit
EndIf

If Not FileExists("schalter_aus.ico") Then
	MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_aus.ico" & @CRLF & "Das Programm wird beendet!")
	Exit
EndIf

$gMaxBits = 23; Maximale Bitzahl -1 (hier: 24 Bit = 0...23)

Dim $gaSBit[$gMaxBits+1]
Dim $gaDBit[$gMaxBits+1]
Dim $gaWert[$gMaxBits+1]
Dim $gaButton[6]

Global $gStop, $gStart, $gPause, $gTmp1, $gTmp2, $gx, $gZaehler
Global $gBgColor = 0x909090; Hintergrundfarbe
Global $gUsColor = 0xeeeeee; Vordergrundfarbe der Überschrift
Global $gBsColor = 0x000000; Vordergrundfarbe der Bitbeschriftung
Global $gBwVColor = 0xcccccc; Vordergrundfarbe der Bitwerte
Global $gBwHColor = 0xffff00; Hintergrundfarbe der Bitwerte
Global $gGeschw = 50; Startwert für die Zählergeschwindigkeit
Global $gZaehlRichtung = 1; 1= vorwärts, -1= rückwärts

$gMain = GUICreate("Bin2Dez", 940, 330, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "f_Beenden")
GUISetBkColor($gBgColor, $gMain)

GUICtrlCreateLabel("24 Bit Binär / Dezimal",270,5,600,60)
GUICtrlSetFont(-1,32,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)

GUICtrlCreateLabel("Bit: ",8,58,40,20)
GUICtrlSetFont(-1,12,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)

GUICtrlCreateLabel("Wert:",8,171,40,20)
GUICtrlSetFont(-1,10,800, "Tahoma")
GUICtrlSetColor(-1,0xffff00)

GUICtrlCreateGroup ("Zähler", 535, 200, 395, 120)
GUICtrlSetFont(-1,10,400, "Tahoma")
$gaButton[0] = GUICtrlCreateButton("Start",685,235,60,30) 
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
$gaButton[1] = GUICtrlCreateButton("Pause",755,235,60,30) 
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetState(-1,$GUI_DISABLE)
$gaButton[2] = GUICtrlCreateButton("Stop",825,235,60,30) 
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetState(-1,$GUI_DISABLE)
$gSlider = GUICtrlCreateSlider(685, 275, 200, 25)
GUICtrlSetData(-1,$gGeschw)
GUICtrlSetOnEvent(-1, "f_Tempo")
GUICtrlCreateLabel("Geschwindigkeit:     min.",555,280,129,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
GUICtrlCreateLabel("max.",889,280,30,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
GUICtrlCreateLabel("Richtung:",555,237,45,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gaButton[3] = GUICtrlCreateButton("vorwärts",605,235,65,20) 
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateGroup ("",-99,-99,1,1) 

For $gx = $gMaxBits To 0 Step -1
	$gaWert[$gx] = 0
	$gTmp2 = $gMaxBits - $gx
	$gTmp1 = StringFormat("% 4u",($gx))
	GUICtrlCreateLabel($gTmp1,48+$gTmp2*37,60,30,16)
	GUICtrlSetFont(-1,10,400, "Tahoma")
	GUICtrlSetColor(-1,$gBsColor)
	$gaSBit[$gx] = GUICtrlCreateIcon("schalter_aus.ico", -1, 50+$gTmp2*37, 75, 25, 85)
	GUICtrlSetOnEvent(-1, "f_Schalten")
	$gTmp1 = StringFormat("% 7u",(2^$gx))
	$gaDBit[$gx] = GUICtrlCreateLabel($gTmp1,50+$gTmp2*37,175,35,10)
	GUICtrlSetFont(-1,7,400, "Tahoma")
	GUICtrlSetColor(-1,$gBwVColor)
Next	

GUICtrlCreateGroup ("Ergebnis", 8, 200, 520, 120)
GUICtrlSetFont(-1,10,400, "Tahoma")
GUICtrlCreateLabel("Dezimal = ",26,224,200,60)
GUICtrlSetFont(-1,28,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gDez = GUICtrlCreateInput("0",220,220,230,50)
GUICtrlSetFont(-1,28,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
GUICtrlSetOnEvent(-1, "f_Eingabe")
$gaButton[4] = GUICtrlCreateButton("kopieren",455,234,55,20)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateLabel("Binär = ",110,280,200,30)
GUICtrlSetFont(-1,20,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gBin = GUICtrlCreateInput("000000000000000000000000",220,286,230,20, $ES_READONLY)
GUICtrlSetFont(-1,10,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
$gaButton[5] = GUICtrlCreateButton("kopieren",455,286,55,20)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateGroup ("",-99,-99,1,1) 


GUISetState(@SW_SHOW)

;-----------------------------------------------------------------------------
; Hauptschleife
;-----------------------------------------------------------------------------
While 1
	GUICtrlSetState($gDez, $GUI_FOCUS)
	Do
		Sleep(10)
	Until $gStart = 1
	GUICtrlSetState($gaButton[0],$GUI_DISABLE)
	GUICtrlSetState($gaButton[1],$GUI_ENABLE)
	GUICtrlSetState($gaButton[2],$GUI_ENABLE)
	$gStart = 0
	$gZaehler = GUICtrlRead($gDez); Startwert für den Zähler holen
	Do; Hier startet der Zähler
		For $gx = 0 To $gMaxBits; Die entsprechenden Bits von $gZaehler setzen bzw. löschen
			If BitAnd($gZaehler, 2^$gx) Then
				If $gaWert[$gx] = 0 Then; nur setzen, wenn noch nicht gesetzt
					$gaWert[$gx] = 1
					GUICtrlSetImage($gaSBit[$gx],"schalter_an.ico")
					GUICtrlSetColor($gaDBit[$gx],$gBsColor)
					GUICtrlSetBkColor($gaDBit[$gx],$gBwHColor)
				EndIf
			Else
				If $gaWert[$gx] = 1 Then; nur löschen, wenn noch nicht gelöscht
					GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
					GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
					GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
					$gaWert[$gx] = 0
				EndIf
			EndIf
		Next
		If $gPause = 1 Then; Wenn der Benutzer auf [Pause] geklickt hat
			GUICtrlSetState($gaButton[2],$GUI_DISABLE)
			GUICtrlSetData($gaButton[1],"Weiter")
			Do
				Sleep(10)
			Until $gPause = 0; warten bis er die Pause beendet
			$gZaehler = GUICtrlRead($gDez); wenn der Benutzer inzwischen den Wert verändert hat, Zählerwert ändern
			GUICtrlSetData($gaButton[1],"Pause")
			GUICtrlSetState($gaButton[2],$GUI_ENABLE)
		EndIf
		If $gStop = 1 Then; Wenn der Benutzer auf [Stop] geklickt hat
			$gStop = 0; Werte zurücksetzen und für neuen Zählerstart vorbereiten
			$gZaehler = 1
			For $gx = 0 To $gMaxBits
				$gaWert[$gx] = 0
				GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
				GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
				GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
			Next
			f_Berechnen()
			ExitLoop; Zählerschleife verlassen
		EndIf
		f_Berechnen()
		Sleep(10*(100-$gGeschw)); Warteschleife, die mit dem Slider beeinflusst werden kann
		$gZaehler += $gZaehlRichtung
	Until ($gZaehler < 0) or ($gZaehler >= 2^($gMaxBits+1)); 24 Bit überschritten oder kleiner als 0? Ja, dann Zählerschleife verlassen
	GUICtrlSetState($gaButton[1],$GUI_DISABLE); [Pause] sperren
	GUICtrlSetState($gaButton[2],$GUI_DISABLE); [Stop] sperren
	GUICtrlSetState($gaButton[0],$GUI_ENABLE); [Start]-Button wieder freigeben
WEnd
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------

;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer das Programm beenden will
;******************************************************************************************
Func f_Beenden() 
	Exit
EndFunc

;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn einer der grafischen Schalter angeklickt wurde
;******************************************************************************************
Func f_Schalten()
	Local $lAusw = (@GUI_CTRLID - $gaSBit[$gMaxBits]) / 3
	$lAusw = $gMaxBits - $lAusw
	$gaWert[$lAusw] = Not $gaWert[$lAusw]
	Switch $gaWert[$lAusw]
		Case 0
			GUICtrlSetImage($gaSBit[$lAusw],"schalter_aus.ico")
			GUICtrlSetColor($gaDBit[$lAusw],$gBwVColor)
			GUICtrlSetBkColor($gaDBit[$lAusw],$gBgColor)
		Case 1
			GUICtrlSetImage($gaSBit[$lAusw],"schalter_an.ico")
			GUICtrlSetColor($gaDBit[$lAusw],$gBsColor)
			GUICtrlSetBkColor($gaDBit[$lAusw],$gBwHColor)
	EndSwitch
	f_Berechnen()
	GUICtrlSetState($gDez, $GUI_FOCUS)
EndFunc

;******************************************************************************************
; Diese Funktion berechnet die Dezimal- und Binärwerte und zeigt sie an
;******************************************************************************************
Func f_Berechnen()
	Local $lErgDez = 0
	Local $lErgBin = ""
	For $lx = $gMaxBits To 0 Step -1 
		$lErgDez += 2^$lx*$gaWert[$lx]
		Switch $gaWert[$lx]
			Case 0
				$lErgBin &= "0"
			Case 1
				$lErgBin &= "1"
		EndSwitch
	Next
	GUICtrlSetData($gDez, $lErgDez)
	GUICtrlSetData($gBin, $lErgBin)
EndFunc

;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer einen der Buttons angeklickt hat
;******************************************************************************************
Func f_Zaehlertasten()
	Local $lAusw = @GUI_CtrlId
	Switch $lAusw
		Case $gaButton[0]; Start
			$gStart = 1
		Case $gaButton[1]; Pause
			$gPause = Not $gPause
		Case $gaButton[2]; Stop
			$gStop = 1
		Case $gaButton[3]; Zaehlrichtung änder
			$gZaehlRichtung = -$gZaehlRichtung
			Beep(400,50)
			If $gZaehlRichtung = 1 Then
				GUICtrlSetData($gaButton[3],"vorwärts")
			Else
				GUICtrlSetData($gaButton[3],"rückwärts")
			EndIf
		Case $gaButton[4]; Dezimal-Ergebnis in die Zwischenablage kopieren
			ClipPut(GUICtrlRead($gDez))
			Beep(800,50)
		Case $gaButton[5]; Binär-Ergebnis in die Zwischenablage kopieren
			ClipPut(GUICtrlRead($gBin))
			Beep(800,50)
	EndSwitch
	GUICtrlSetState($gDez, $GUI_FOCUS)
EndFunc

;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer den Slider verändert
;******************************************************************************************
Func f_Tempo()
	$gGeschw = GUICtrlRead($gSlider)
EndFunc

;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer etwas in Dezimalfeld eingibt
;******************************************************************************************
Func f_Eingabe()
	Local $lx
	Local $ld = GUICtrlRead($gDez)
	If $ld >= 2^($gMaxBits+1) Then
		MsgBox(48,"Bin2Dez","Die eingegebene Zahl ist zu groß!" & @CRLF & "Sie läßt sich mit " & $gMaxBits+1 & " Bit nicht darstellen.")
		GUICtrlSetData($gDez,0)
		GUICtrlSetState($gDez, $GUI_FOCUS)
		$ld = -1
	EndIf
	If $ld >= 0 Then
		$gZaehler = $ld
		For $lx = 0 To $gMaxBits
			If BitAnd($ld, 2^$lx) Then
				If $gaWert[$lx] = 0 Then
					$gaWert[$lx] = 1
					GUICtrlSetImage($gaSBit[$lx],"schalter_an.ico")
					GUICtrlSetColor($gaDBit[$lx],$gBsColor)
					GUICtrlSetBkColor($gaDBit[$lx],$gBwHColor)
				EndIf
			Else
				If $gaWert[$lx] = 1 Then
					$gaWert[$lx] = 0
					GUICtrlSetImage($gaSBit[$lx],"schalter_aus.ico")
					GUICtrlSetColor($gaDBit[$lx],$gBwVColor)
					GUICtrlSetBkColor($gaDBit[$lx],$gBgColor)
				EndIf
			EndIf
		Next
		f_Berechnen()
		GUICtrlSetState($gDez, $GUI_FOCUS)
	EndIf
EndFunc
