#include "MultiGraph.au3"


; Function								Parameter
; ----------------------------------------------------------------------
; _MG_Graph_erstellen 					($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe)
; _MG_Graph_optionen_allgemein 			($iGraph, $iAufloesung, $iY_min, $iY_max, $vHintergrundfarbe, $iRendermodus)
; _MG_Graph_optionen_Rahmen 			($iGraph, $bAnzeigen, $vRahmenfarbe, $iRahmenbreite)
; _MG_Graph_optionen_Hauptgitterlinien 	($iGraph, $bHauptgitter_aktiviert, $iHauptgitter_abstand_X, $iHauptgitter_abstand_Y, $iHauptgitter_breite, $vHauptgitter_farbe, $iHauptgitter_Transparenz)
; _MG_Graph_optionen_Hilfsgitterlinien 	($iGraph, $bHilfsgitter_aktiviert, $iHilfsgitter_abstand_X, $iHilfsgitter_abstand_Y, $iHilfsgitter_breite, $vHilfsgitter_farbe, $iHilfsgitter_Transparenz)
; _MG_Graph_optionen_Plottmodus 		($iGraph, $iPlottmodus, $iPlottfrequenz, $iClearmodus, $bInterpolation)
; _MG_Kanal_optionen 					($iGraph, $iKanal, $bKanal_aktivieren, $iLinien_Breite, $vLinien_Farbe, $iLinien_Transparenz)
; _MG_Graph_initialisieren 				($iGraph)
; _MG_Wert_setzen 						($iGraph, $iKanal, $fWert)
; _MG_Graph_updaten 					($iGraph)
; _MG_Graph_clear 						($iGraph)
; _MG_Graph_Achse_links 				($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall)
; _MG_Graph_Achse_rechts 				($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall)
; _MG_Graph_Achse_unten 				($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall)
; _MG_Graph_Achse_unten_update 			($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit)
; _MG_Graph_Achse_links_update 			($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit)
; _MG_Graph_Achse_rechts_update 		($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit)
; _MG_Graph_plotten 					($iGraph)
; _MG_Graph_entfernen					($iGraph)
;
;
; genauere Details und Parameterinfos findet ihr in der UDF ;)
;



; GUI aufbauen
$hGUI = GUICreate("", 800, 600,-1,-1, $WS_SIZEBOX)

$Label_Aufloesung = GUICtrlCreateLabel("", 20, 470, 350 ,20)
$Slider_Aufloesung = GUICtrlCreateSlider(20,500,300,30)
GUICtrlSetLimit	($Slider_Aufloesung, 2000,1)
GUICtrlSetData	($Slider_Aufloesung, 500)
$Label_FPS = GUICtrlCreateLabel ("",20,550,600,20)



Global $Interpolieren 	= GUICtrlCreateCheckbox("Interpolieren",400, 405,200,20)
GUICtrlSetState($Interpolieren, $GUI_CHECKED)
Global $Render 			= GUICtrlCreateCheckbox("Kantenglättung (2-Fach)",400, 425,200,20)
Global $Plottmodus 		= GUICtrlCreateCheckbox("Plottmodus (scrolling Graph)",400, 445,200,20)


Global $Label_Plottfreq = GUICtrlCreateLabel ("Plottfrequenz:",416,490,70,20)
Global $Label_Plottfreq_Wert = GUICtrlCreateLabel ("0",656,490,50,20)
Global $Plottfreq 		= GUICtrlCreateSlider (490,486,150,26)
GUICtrlSetLimit	($Plottfreq, 200,0)
GUICtrlSetData	($Plottfreq, 0)


Global $Label_Clear = GUICtrlCreateLabel ("Löschmodus:",416,520,70,20)
Global $Label_Clear_Wert = GUICtrlCreateLabel ("0",656,520,50,20)
Global $Clearmodus 		= GUICtrlCreateSlider (490,516,150,26)
GUICtrlSetLimit	($Clearmodus, 2,0)
GUICtrlSetData	($Clearmodus, 2)


Global $Label_SignalStaerke  = GUICtrlCreateLabel ("Signalstärke:",20,410,100,20)
Global $Label_SignalStaerke_Wert = GUICtrlCreateLabel ("0",300,410,50,20)
Global $SignalStaerke 		= GUICtrlCreateSlider (130,406,150,26)
GUICtrlSetLimit	($SignalStaerke, 1000,0)
GUICtrlSetData	($SignalStaerke, 80)


Global $Label_SignalRauschen   = GUICtrlCreateLabel ("Signal-Rauschen:",20,435,100,20)
Global $Label_SignalRauschen_Wert = GUICtrlCreateLabel ("0",300,435,50,20)
Global $SignalRauschen 		= GUICtrlCreateSlider (130,431,150,26)
GUICtrlSetLimit	($SignalRauschen, 400,0)
GUICtrlSetData	($SignalRauschen, 30)


Global $Graph_refresh		= 0

Global $var_Interpolieren 	= 0
Global $var_Render 			= 0
Global $var_Plottmodus 		= 0
Global $var_Aufloesung 		= 0
Global $var_Plottfreq 		= 0
Global $var_Clearmodus	 	= 0
Global $var_SignalStaerke 	= 0
Global $var_SignalRauschen 	= 0


$Time			= 0
$counter		= 0
$counter_FPS 	= 0



Opt("GUIOnEventMode", 1)

AdlibRegister		("_FPS", 1000)	; zum berechnen der FPS
GUISetOnEvent		($GUI_EVENT_CLOSE, "_Exit", $hGUI)
GUIRegisterMsg		($WM_SIZE, "WM_SIZE")	; Graph neu zeichen, wenn die Größe der GUI geändert wird
GUISetState()






While 1


	 ; prüft periodisch die GUI-Einstellungen auf Veränderungen
	_Einstellungen_pruefen ()

	$counter += 0.1
	$counter_FPS +=1


	; Signal erzeugen und den Graphen übergeben
	$Signal = 512 + (sin($counter))*$var_SignalStaerke + Random(-$var_SignalRauschen,$var_SignalRauschen,1)
	_MG_Wert_setzen (1, 1, $Signal)


	; Graphen plotten (d.h. in den Puffer zeichnen. Der Graph wird nur dann in der GUI dargestellt, wenn alle Plottvorgänge vollständig sind)
	$status = _MG_Graph_plotten (1)


	; Graph aktualisieren, wenn die GUI geändert wurde (oder Controls)
	if ($Graph_refresh = 1) Then
		_MG_Graph_updaten (1) ;Graph in die GUI zeichnen
		$Graph_refresh = 0
	EndIf


	; nach jedem Bilddurchlauf des Graphen die X-Achse aktualisieren ($status: ist die aktuelle Plottposition des Graphen)
	If ($status = 0) Then
		$Zeit = TimerDiff($Time)
		_MG_Graph_Achse_unten_update(1,0,$Zeit,2," ms")
		$Time = TimerInit()
	EndIf



WEnd





; prüft periodisch die GUI-Einstellungen auf Veränderungen
Func _Einstellungen_pruefen ()

	If (GUICtrlRead($Interpolieren) 	<> $var_Interpolieren) 	Then $Graph_refresh = 1
	If (GUICtrlRead($Render) 			<> $var_Render) 		Then $Graph_refresh = 1
	If (GUICtrlRead($Plottmodus) 		<> $var_Plottmodus) 	Then $Graph_refresh = 1
	If (GUICtrlRead($Slider_Aufloesung) <> $var_Aufloesung) 	Then $Graph_refresh = 1
	If (GUICtrlRead($Plottfreq) 		<> $var_Plottfreq) 		Then $Graph_refresh = 1
	If (GUICtrlRead($Clearmodus) 		<> $var_Clearmodus)		Then $Graph_refresh = 1
	If (GUICtrlRead($SignalStaerke)		<> $var_SignalStaerke) 	Then $Graph_refresh = 1
	If (GUICtrlRead($SignalRauschen) 	<> $var_SignalRauschen)	Then $Graph_refresh = 1


	If ($Graph_refresh = 1) Then

		$var_Interpolieren 	= GUICtrlRead($Interpolieren)
		$var_Render			= GUICtrlRead($Render)
		$var_Plottmodus		= GUICtrlRead($Plottmodus)
		$var_Aufloesung		= GUICtrlRead($Slider_Aufloesung)
		$var_Plottfreq		= GUICtrlRead($Plottfreq)
		$var_Clearmodus		= GUICtrlRead($Clearmodus)
		$var_SignalStaerke	= GUICtrlRead($SignalStaerke)
		$var_SignalRauschen	= GUICtrlRead($SignalRauschen)


		 WM_SIZE()

	EndIf

EndFunc






; wird ausgeführt, sobald die GUI-Größe oder die Einstellungen geändert werden
Func WM_SIZE()

	; den Status der Checkboxen bestimmen
	If ($var_Interpolieren = $GUI_CHECKED) Then
		Local $iInterpolieren = 1
	Else
		Local $iInterpolieren = 0
	EndIf


	If ($var_Render = $GUI_CHECKED) Then
		Local $iRender = 2
	Else
		Local $iRender = 0
	EndIf


	If ($var_Plottmodus = $GUI_CHECKED) Then
		Local $iPlottmodus = 1
	Else
		Local $iPlottmodus = 0
	EndIf



	; aktuelle GUI-Größe ermitteln
	Local $size = WinGetClientSize($hGUI)


	; den alten Graphen löschen und anschließend neu zeichnen
	if IsArray($size) Then

		_MG_Graph_entfernen(1)

		_MG_Graph_erstellen 					(1, $hGUI, 80, 20, $size[0]-190, $size[1]-300)

		_MG_Graph_optionen_allgemein			(1,$var_Aufloesung, 0, 1000, 0xFFFFFF, $iRender)
		_MG_Graph_optionen_Rahmen 				(1, True, 0x000000, 1)
		_MG_Graph_optionen_Hauptgitterlinien 	(1, 1, 60, 30, 1,0x000000,  190)
		_MG_Graph_optionen_Hilfsgitterlinien 	(1, 1, 10, 10, 1,0x000000,  220)
		_MG_Graph_optionen_Plottmodus 			(1, $iPlottmodus, $var_Plottfreq, $var_Clearmodus, $iInterpolieren)

		_MG_Kanal_optionen 						(1, 1, 1, 1, 0x0044FF, 0)

		_MG_Graph_Achse_links					(1, True, 0, 1000, 0, "", 0x000000, Default, 9, 70, 1)
		_MG_Graph_Achse_rechts 					(1, True, 0, 5, 1, " V", 0x000000, Default, 9, 70, 1)
		_MG_Graph_Achse_unten 					(1, True, 0, 0, 2, " ms", 0x000000, Default, 9, 70, 2)

		_MG_Graph_initialisieren(1)

	EndIf


	; die Control-Beschriftungen aktualisieren
	Local $Graphbreite 			= $MG_aGraph[1][0][$MG_a_iBreite]
	Local $Skallierungsfaktor 	= Round( $Graphbreite / $var_Aufloesung, 2)

	GUICtrlSetData($Label_Aufloesung, "Auflösung: " & $var_Aufloesung & @TAB & " - horizontale Skallierung (Zoom): " & $Skallierungsfaktor)

	GUICtrlSetData($Label_Plottfreq_Wert, 		$var_Plottfreq)
	GUICtrlSetData($Label_Clear_Wert,			$var_Clearmodus)
	GUICtrlSetData($Label_SignalStaerke_Wert, 	$var_SignalStaerke)
	GUICtrlSetData($Label_SignalRauschen_Wert, 	$var_SignalRauschen)


EndFunc





; jede Sekunde die geplotteten Werte und die FPS ausgeben
Func _FPS()

	$FPS = Round($counter_FPS/GUICtrlRead($Slider_Aufloesung),1)

	GUICtrlSetData($Label_FPS,	$counter_FPS & " Werte/sek   - " & $FPS & " FPS (komplette Bilddurchläufe)")

	$counter_FPS = 0

EndFunc







Func _Exit()
    Exit
EndFunc

