Hörtest mit AutoIt

  • Hallo,
    in den letzten Wochen versuche ich, etwas mit AutoIt warm zu werden (Danke übrigens für die deutsche Hilfe-Datei).
    Jetzt möchte ich mal mein erstes größeres Script vorstellen, welches auch etwas Sinn macht.


    Ultra-Mega-Giga Hörtest

    - Dieser Hörtest ersetzt keinen Arztbesuch! Es ist aber möglich zu prüfen, wer aus dem Bekanntenkreis besser hören kann.
    - Um vergleichbare Ergebnisse zu erzielen, sollte immer die selbe Lautstärke und der gleiche Computer verwendet werden.
    - Für den Test sind Kopfhörer, mit einer möglichst leisen Soundeinstellung, empfohlen.

    - Mit dem Knopf "Test starten" beginnt der Hörtest und es dauert ca. 15 Minuten.
    - Nacheinander werden langsam ansteigende Töne abgespielt. Drücke die "Leertaste", sobald du einen Ton wahrnimmst.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $GUI = GUICreate("Ultra-Mega-Giga Hörtest", 800, 250)
    $LabTitel = GUICtrlCreateLabel("Ultra-Mega-Giga Hörtest", 220, 5, 790, 40)
    GUICtrlSetFont($LabTitel, 25)
    GUICtrlCreatePic(@ScriptDir & "\Data\UltraMegaGigaHoertestLogo.jpg", 32, 45, 100, 100)
    $LabTon = GUICtrlCreateLabel('Frequenz: 0 von 34', 35, 150, 100, 20)
    $LabBeschreibung1 = GUICtrlCreateLabel('- Dieser Hörtest ersetzt keinen Arztbesuch! Es ist aber möglich zu prüfen, wer aus dem Bekanntenkreis besser hören kann.', 170, 60, 790, 20)
    $LabBeschreibung2 = GUICtrlCreateLabel('- Um vergleichbare Ergebnisse zu erzielen, sollte immer die selbe Lautstärke und der gleiche Computer verwendet werden.', 170, 75, 790, 20)
    $LabBeschreibung3 = GUICtrlCreateLabel('- Für den Test sind Kopfhörer, mit einer möglichst leisen Soundeinstellung, empfohlen.', 170, 90, 790, 20)
    $LabBeschreibung4 = GUICtrlCreateLabel('- Mit dem Knopf "Test starten" beginnt der Hörtest und es dauert ca. 15 Minuten.', 170, 110, 790, 20)
    $LabBeschreibung5 = GUICtrlCreateLabel('- Nacheinander werden langsam ansteigende Töne abgespielt. Drücke die "Leertaste", sobald du einen Ton wahrnimmst.', 170, 125, 790, 20)
    $LabBeschreibung6 = GUICtrlCreateLabel('- Gib vor dem Start deinen Namen ein, damit die Hörwerte für einen späteren Vergleich gespeichert werden können.', 170, 140, 790, 20)
    $LabName = GUICtrlCreateLabel('Name:', 280, 170, 35, 20)
    $InpName = GUICtrlCreateInput("", 320, 167, 200)
    $ButStart = GUICtrlCreateButton("Test starten", 10, 200, 780, 40)
    GUICtrlSetState($InpName, $GUI_FOCUS)
    GUICtrlSetOnEvent($ButStart, "START")
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE",$GUI)

    [/autoit] [autoit][/autoit] [autoit]

    $GUI2 = GUICreate("Name's Hörwerte:", 400, 505, -1, -1, -1, -1, $GUI)
    $GUI2List = GUICtrlCreateListView("Frequenz (Hz):|Zeit (Sekunden):", 0, 0, 240, 505, -1, BitOr($LVS_EX_FULLROWSELECT,$LVS_EX_GRIDLINES))
    $LabStatistik = GUICtrlCreateLabel("Statistik:", 250, 5, 150)
    GUICtrlSetFont($LabStatistik, 10, 600)
    GUICtrlCreateLabel("Linkes Ohr:", 250, 30, 150)
    $LabStatistikLinks = GUICtrlCreateLabel("0", 250, 45, 150)
    GUICtrlCreateLabel("Rechtes Ohr:", 250, 65, 150)
    $LabStatistikRechts = GUICtrlCreateLabel("0", 250, 80, 150)
    GUICtrlCreateLabel("Gesammt:", 250, 100, 150)
    $LabStatistikGesammt = GUICtrlCreateLabel("0", 250, 115, 150)
    GUICtrlCreateLabel("Auswertung:", 250, 140, 150)
    $LabStatistikProz = GUICtrlCreateLabel("Dein linkes Ohr ist 00% schlechter als dein Rechtes", 250, 155, 150, 100)

    [/autoit] [autoit][/autoit] [autoit]

    GUISwitch($GUI)
    GUISetState(@SW_SHOW, $GUI)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Timer, $Timeout, $Timeout2, $Date, $Started, $Fortsetzen, $Random, $ZufallsFrequenz, $BenutzteFrequenzen, $Name, $StatistikLinks, $StatistikRechts, $StatistikGesammt, $Date, $TXTName, $SchummelTimer = 1, $FrequenzCounter, $FrequenzenZeiten[34], $GUI2ListItems[34]
    Global $Frequenzen[34] = ["50L","50R","100L","100R","150L","150R","300L","300R","500L","500R","700L","700R","1000L","1000R","2000L","2000R","3000L","3000R","5000L","5000R","7000L","7000R","9000L","9000R","10000L","10000R","11000L","11000R","12000L","12000R","13000L","13000R","14000L","14000R"]

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func START()

    [/autoit] [autoit][/autoit] [autoit]

    $Started = 1

    [/autoit] [autoit][/autoit] [autoit]

    $Name = GUICtrlRead($InpName)
    If $Name = "" Then
    MsgBox(48,"Fehler!","Bitte einen Namen eintragen.")
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $Date = @YEAR & "-" & @MON & "-" & @MDAY & " # " & @HOUR & "-" & @MIN
    $TXTName = @ScriptDir & "/" & $Name & " # " & $Date & ".txt"

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($InpName, $GUI_DISABLE)
    GUICtrlSetState($ButStart, $GUI_DISABLE)
    GUICtrlSetData($ButStart, "Hörtest wurde gestartet...")

    [/autoit] [autoit][/autoit] [autoit]

    HOERTEST()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func HOERTEST()

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit]

    $Fortsetzen = 0
    $SchummelTimer = TimerInit() ;~ prüft ob jemand schummelt und absichtlich zu früh drückt

    [/autoit] [autoit][/autoit] [autoit]

    $Random = Random(0, 33, 1) ;~ wählt eine zufällige frequenz
    $ZufallsFrequenz = $Frequenzen[$Random]

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr($BenutzteFrequenzen, '"' & $ZufallsFrequenz & '"') = 0 Then ;~ prüft ob die frequenz schon abgespielt wurde.
    $BenutzteFrequenzen &= '"' & $ZufallsFrequenz & '",'
    $FrequenzCounter += 1
    ElseIf StringInStr($BenutzteFrequenzen, '"' & $ZufallsFrequenz & '"') > 0 Then
    ContinueLoop
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($LabTon, "Frequenz: " & $FrequenzCounter & " von 34")

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{SPACE}", "TONERKANNT")
    Sleep(Random(5000,20000)) ;~ zufällige wartezeit für den schummeltimer

    [/autoit] [autoit][/autoit] [autoit]

    $SchummelTimer = 0
    $Timer = TimerInit()
    $Timeout = TimerInit()
    SoundPlay(@ScriptDir & "\Data\" & $ZufallsFrequenz & ".mp3")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If $Started = 0 Then ;~ beendet die offene funktion
    Return
    ElseIf $Fortsetzen = 1 Then ;~ führt die schleife fort
    HotKeySet("{SPACE}")
    SoundPlay("")
    $Fortsetzen = 0
    ContinueLoop 2
    ElseIf TimerDiff($Timeout) > 180000 Then ;~ frequenz wurde seit 3 minuten nicht erkannt
    $Timeout2 = 1
    TONERKANNT()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(10)
    WEnd
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func TONERKANNT()

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{SPACE}")
    SoundPlay("")
    $Fortsetzen = 1

    [/autoit] [autoit][/autoit] [autoit]

    If $SchummelTimer <> 0 Then ;~ es wurde vor der frequenz gedrückt.. evtl. absichtlich geschummelt ;)
    GUICtrlSetData($LabTon, "Bitte warten...")
    $FrequenzenZeiten[$Random] = "vorzeitig gedrückt (+180)"
    ElseIf $Timeout2 = 1 Then ;~ frequenz wurde seit 3 minuten nicht erkannt
    $Timeout2 = 0
    $FrequenzenZeiten[$Random] = "Zeit abgelaufen (+180)"
    Else
    $GemesseneZeit = Round((TimerDiff($Timer) / 1000), 3)
    $FrequenzenZeiten[$Random] = $GemesseneZeit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $FrequenzCounter = 34 Then ;~ alle 34 frequenzen wurden abgespielt

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($LabTon, "Frequenz: " & $FrequenzCounter & " von 34")

    [/autoit] [autoit][/autoit] [autoit]

    $Started = 0
    $FrequenzCounter = 0
    $BenutzteFrequenzen = 0
    $StatistikLinks = 0
    $StatistikRechts = 0
    $StatistikGesammt = 0

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($InpName, $GUI_ENABLE)
    GUICtrlSetState($ButStart, $GUI_ENABLE)
    GUICtrlSetData($ButStart, "Test starten")
    HotKeySet("{SPACE}")

    [/autoit] [autoit][/autoit] [autoit]

    $TXTFile = FileOpen($TXTName, 1) ;~ speichert die hörwerte für einen späteren vergleich
    If $TXTFile = -1 Then
    MsgBox(48, "Fehler!", "Die Hörtwerte können nicht gespeichert werden.")
    Else
    For $i = 0 To 33
    FileWrite($TXTFile, $Frequenzen[$i] & " Hz: " & $FrequenzenZeiten[$i] & " Sekunden" & @CRLF)
    Next
    FileClose($TXTFile)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 33 Step 2 ;~ addiert die zeiten
    If $FrequenzenZeiten[$i] = "Zeit abgelaufen (+180)" Or $FrequenzenZeiten[$i] = "vorzeitig gedrückt (+180)" Then
    $StatistikLinks += 180
    Else
    $StatistikLinks += $FrequenzenZeiten[$i]
    EndIf
    Next
    For $i = 1 To 33 Step 2
    If $FrequenzenZeiten[$i] = "Zeit abgelaufen (+180)" Or $FrequenzenZeiten[$i] = "vorzeitig gedrückt (+180)" Then
    $StatistikRechts += 180
    Else
    $StatistikRechts += $FrequenzenZeiten[$i]
    EndIf
    Next
    $StatistikGesammt = $StatistikLinks + $StatistikRechts

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($LabStatistikLinks, $StatistikLinks & " Sekunden")
    GUICtrlSetData($LabStatistikRechts, $StatistikRechts & " Sekunden")
    GUICtrlSetData($LabStatistikGesammt, $StatistikGesammt & " Sekunden")

    [/autoit] [autoit][/autoit] [autoit]

    If $StatistikLinks > $StatistikRechts Then ;~ berechnet prozent und das schlechtere ohr
    $StatistikLinksProz = $StatistikRechts / ($StatistikLinks / 100) ;~ rechtes ohr schlechter als linkes
    ;~ $StatistikRechtsProz = $StatistikLinks / ($StatistikRechts / 100) ;~ linkes ohr besser als rechtes
    GUICtrlSetData($LabStatistikProz, "Dein linkes Ohr ist " & Round($StatistikLinksProz, 2) & "% schlechter als dein Rechtes.")
    ElseIf $StatistikRechts > $StatistikLinks Then
    $StatistikRechtsProz = $StatistikLinks / ($StatistikRechts / 100) ;~ linkes ohr schlechter als rechtes
    ;~ $StatistikLinksProz = $StatistikRechts / ($StatistikLinks / 100) ;~ rechtes ohr besser als linkes
    GUICtrlSetData($LabStatistikProz, "Dein rechtes Ohr ist " & Round($StatistikRechtsProz, 2) & "% schlechter als dein Linkes.")
    Else ;~ $StatistikLinks = $StatistikRechts
    GUICtrlSetData($LabStatistikProz, 'Dein beiden Ohren sind gleich gut oder "gleich schlecht" ;-)')
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 33 ;~ erneuert die listview-tabelle
    GUICtrlDelete($GUI2ListItems[$i])
    $GUI2ListItems[$i] = GUICtrlCreateListViewItem($Frequenzen[$i] & "|" & $FrequenzenZeiten[$i], $GUI2List)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISwitch($GUI2)
    WinSetTitle($GUI2, "", $Name & "'s Hörwerte:")
    GUISetState(@SW_SHOW, $GUI2)

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 0)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $GUI2)
    GUISwitch($GUI)
    Opt('GUIOnEventMode', 1)
    Return
    EndSwitch
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func CLOSE()
    Exit
    EndFunc

    [/autoit]

    Hier ist noch der komplette Download, mit den MP3-Files:
    Download: UltraMegaGigaHoertest.zip (250 MB)