Jump to content

How to find the added time


Mucho
 Share

Recommended Posts

I got this countdown timer script and I am trying to improve on it by adding the minutes and seconds entries to show the expected time when the countdown reaches 0.

#include <GUIConstants.au3>
#include <Date.au3>

Global $Secs, $Mins, $Hour, $Time, $InitialT, $TargetT
GUICreate("Timer", 200, 150)
$MinIn = GUICtrlCreateInput("000", 70, 10, 30, 20, $ES_NUMBER)
$label = GUICtrlCreateLabel(":", 101, 12)
$SecIn = GUICtrlCreateInput("00", 105, 10, 30, 20, $ES_NUMBER)
$start = GUICtrlCreateButton("Start", 75, 50, 50, 30)
$timeLabel = GUICtrlCreateLabel("00:00:00", 80, 20)
$EndTime = GUICtrlCreateLabel("End Time :", 35, 100, 70, 30)
GUICtrlSetState($timeLabel, $GUI_HIDE)
GUISetState(@SW_SHOW)
$started = 0

While 1
  ;After every loop check if the user clicked something in the GUI window
   $msg = GUIGetMsg()

   Select

     ;Check if user clicked on the close button
      Case $msg = $GUI_EVENT_CLOSE
        ;Destroy the GUI including the controls
         GUIDelete()
         ExitLoop

      Case $msg = $start
        If GUICtrlRead($start) == "Start" Then
            StartTimer()
        Else
            StopTimer()
        EndIf

   EndSelect

WEnd
Exit

Func StartTimer()
    GUICtrlSetData($start, "Stop")
    GUICtrlSetState($MinIn, $GUI_HIDE)
    GUICtrlSetState($label, $GUI_HIDE)
    GUICtrlSetState($SecIn, $GUI_HIDE)
    GUICtrlSetState($timeLabel, $GUI_SHOW)
    $InitialT = TimerInit()
    $TargetT = (GUICtrlRead($MinIn) * 60 + GUICtrlRead($SecIn)) *1000
    AdlibRegister("Timer")
EndFunc  ;==>StartTimer

Func StopTimer()
    GUICtrlSetData($start, "Start")
    GUICtrlSetState($MinIn, $GUI_SHOW)
    GUICtrlSetState($label, $GUI_SHOW)
    GUICtrlSetState($SecIn, $GUI_SHOW)
    GUICtrlSetState($timeLabel, $GUI_HIDE)
    AdlibUnregister()
EndFunc  ;==>StartTimer

Func Timer()
    $TimeLeft = $TargetT - TimerDiff($InitialT)
    If $TimeLeft > 0 Then
        _TicksToTime(Int($TimeLeft), $Hour, $Mins, $Secs)
        ; save current time to be able to test and avoid flicker..
        Local $sTime = $Time
        $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
        If $sTime <> $Time Then GUICtrlSetData($timeLabel, $Time)
    Else
        ; Do something here

        StopTimer()
    EndIf
EndFunc  ;==>Timer

I am not code savvy, but I need this function to work for me after I could not find any app on Googleplay that could fulfil my need. So I appreciate any help.

Link to comment
Share on other sites

You should look at the date functions.  This can start you on your way ... shows projected date and time for the finish.

#include <GUIConstants.au3>
#include <Date.au3>

Global $Secs, $Mins, $Hour, $Time, $InitialT, $TargetT
GUICreate("Timer", 200, 150)
$MinIn = GUICtrlCreateInput("000", 70, 10, 30, 20, $ES_NUMBER)
$label = GUICtrlCreateLabel(":", 101, 12)
$SecIn = GUICtrlCreateInput("00", 105, 10, 30, 20, $ES_NUMBER)
$start = GUICtrlCreateButton("Start", 75, 50, 50, 30)
$timeLabel = GUICtrlCreateLabel("00:00:00", 80, 20)
$EndTime = GUICtrlCreateLabel("End Time :", 35, 100, 125, 30)
GUICtrlSetState($timeLabel, $GUI_HIDE)
GUISetState(@SW_SHOW)
$started = 0

Func StartTimer()
    GUICtrlSetData($start, "Stop")
    GUICtrlSetState($MinIn, $GUI_HIDE)
    GUICtrlSetState($label, $GUI_HIDE)
    GUICtrlSetState($SecIn, $GUI_HIDE)
    GUICtrlSetState($timeLabel, $GUI_SHOW)
    $InitialT = TimerInit()
    $TargetT = (GUICtrlRead($MinIn) * 60 + GUICtrlRead($SecIn)) *1000
    AdlibRegister("Timer")
;THIS IS THE PART THAT SHOWS THE PROJECTED FINISH
    $projectedFinish= round((($TargetT + TimerDiff($InitialT)))/1000,0)
    GUICtrlSetData($EndTime,"End Time : "& _DateAdd ( 's', $projectedFinish,_NowCalc()))
EndFunc  ;==>StartTimer

Func StopTimer()
    GUICtrlSetData($start, "Start")
    GUICtrlSetState($MinIn, $GUI_SHOW)
    GUICtrlSetState($label, $GUI_SHOW)
    GUICtrlSetState($SecIn, $GUI_SHOW)
    GUICtrlSetState($timeLabel, $GUI_HIDE)
    AdlibUnregister()
EndFunc  ;==>StartTimer


Func Timer()
    $TimeLeft = $TargetT - TimerDiff($InitialT)
    If $TimeLeft > 0 Then
        _TicksToTime(Int($TimeLeft), $Hour, $Mins, $Secs)
        ; save current time to be able to test and avoid flicker..
        Local $sTime = $Time
        $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
        If $sTime <> $Time Then GUICtrlSetData($timeLabel, $Time)
    Else
        ; Do something here

        StopTimer()
    EndIf
EndFunc  ;==>Timer



While 1
  ;After every loop check if the user clicked something in the GUI window
   $msg = GUIGetMsg()

   Select

     ;Check if user clicked on the close button
      Case $msg = $GUI_EVENT_CLOSE
        ;Destroy the GUI including the controls
         GUIDelete()
         ExitLoop

      Case $msg = $start
        If GUICtrlRead($start) == "Start" Then
            StartTimer()
        Else
            StopTimer()
        EndIf

   EndSelect
WEnd

 

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Link to comment
Share on other sites

@Jfish,

 

I found that the following countdown timer code is more suitable for me as it allows for the input of hours, unlike the previous one.

#NoTrayIcon
#include <TrayConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <Sound.au3>

Opt("MustDeclareVars", 1) ; removes the chance for misspelled variables causing bugs.
Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.
Opt("GUIOnEventMode", 1) ; OnEvent functions notifications

Global $seconds = 0, $g_sec, $g_min, $g_hr, $EndTime, $projectedFinish, $seconds, $T, $InitialT, $started = False, $sec = 99, $aTimeHold[3], $g_IsAlarm = 0, $iAppTitle, $sAppTitle = timerTitle()
$iAppTitle = @extended


#Region ### START Koda GUI section ### Form=\\WDMYCLOUDEX4100\Public\[FMIS]\au3_Shared_projects\timerThing.kxf
Global $Form1 = GUICreate($sAppTitle, 245, 120, @DesktopWidth - 275 - (40 * $iAppTitle), 20 + (40 * $iAppTitle), -1, BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
Global $idHour = GUICtrlCreateInput("00", 5, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idMin = GUICtrlCreateInput("00", 58, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idSec = GUICtrlCreateInput("00", 110, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idStart = GUICtrlCreateButton("Start Timer", 163, 6, 75, 61, $BS_MULTILINE)
Global $idTitle = GUICtrlCreateInput("", 4, 40, 129, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_WANTRETURN))
Global $idAlarm = GUICtrlCreateCheckbox("", 137, 53, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON))
Global $idInsist = GUICtrlCreateCheckbox("", 137, 37, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON))
Global $idEndTime = GUICtrlCreateLabel("End Time :", 5, 90, 125, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUICtrlSetFont($idHour, 14, 800)
GUICtrlSetFont($idMin, 14, 800)
GUICtrlSetFont($idSec, 14, 800)
GUICtrlSetFont($idStart, 12, 800)
GUICtrlSetFont($idTitle, 12, 800)

GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUICtrlSetOnEvent($idStart, "idStartClick")
GUICtrlSetOnEvent($idTitle, "idTitleChange")
GUICtrlSetOnEvent($idAlarm, "idAlarmEvent")

TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "OnTray_PRIMARYDOUBLE")

GUICtrlSetTip($idStart, 'press ENTER or click' & @CR & @CR & 'once started, on close,' & @CR & 'will move to the tray area.')
GUICtrlSetTip($idHour, 'Hours' & @CR & @CR & 'enter the hours' & @CR & 'and press ENTER')
GUICtrlSetTip($idMin, 'Minutes' & @CR & @CR & 'enter the minutes' & @CR & 'and press ENTER')
GUICtrlSetTip($idSec, 'Seconds' & @CR & @CR & 'enter the seconds' & @CR & 'and press ENTER')
GUICtrlSetTip($idTitle, 'Type a title for this' & @CR & 'timer and press ENTER')
GUICtrlSetTip($idAlarm, 'Swap between' & @CR & 'Timer and Alarm' & @CR & 'functionality')
GUICtrlSetTip($idInsist, 'Replay the alert' & @CR & 'every 10 sec.' & @CR & 'for 10 min.')

;~ If Not FileGetSize("timerThing.wav") Then FileInstall("timerThing.wav", "timerThing.wav") ; if you wanna include your WAV file

Global $hForm1 = WinGetHandle($Form1)
Global $idDummy = GUICtrlCreateDummy()
Global $aAccelKeys[1][2] = [["{Enter}", $idDummy]]
GUISetAccelerators($aAccelKeys)
GUICtrlSetOnEvent($idDummy, "On_idDummy")

While 1
    Sleep(50)
    If Not $started Then ContinueLoop
    If $sec = @SEC Then ContinueLoop
    $sec = @SEC
    Countdown()
WEnd

Func Form1Close()
    If $started Then
        TraySetState(1)
        WinSetState($hForm1, "", @SW_HIDE)
    Else
        GUIDelete()
        Exit
    EndIf
EndFunc   ;==>Form1Close

Func Countdown() ; mod. from https://www.autoitscript.com/forum/topic/135227-simple-counter/?do=findComment&comment=950305
    If $g_IsAlarm Then
        If Int(GUICtrlRead($idHour)) = Int(@HOUR) And Int(GUICtrlRead($idMin)) = Int(@MIN) And Int(GUICtrlRead($idSec)) = Int(@SEC) Then
            $seconds = -1
        Else
            Return
        EndIf
    EndIf
    $g_sec = Mod($seconds, 60)
    $g_min = Mod($seconds / 60, 60)
    $g_hr = Floor($seconds / 60 ^ 2)
    If $seconds < -3 Then Return
    TrayToolTip()
    $seconds -= 1
    If $seconds = -2 Then
        GUICtrlSetState($idInsist, $GUI_DISABLE)
        If GUICtrlRead($idInsist) = 1 Then
            $seconds = -5
            InsistPlayTheWAV()
            AdlibRegister("InsistPlayTheWAV", 10000)
        Else
            playTheWAV()
        EndIf
        Return
    EndIf
    If $seconds < -1 Then Return
    GUICtrlSetData($idHour, StringFormat("%02i", $g_hr))
    GUICtrlSetData($idMin, StringFormat("%02i", $g_min))
    GUICtrlSetData($idSec, StringFormat("%02i", $g_sec))

EndFunc   ;==>Countdown

Func playTheWAV()
    OnTray_PRIMARYDOUBLE()
    WinActivate($hForm1)
    If Not FileGetSize(@ScriptDir & "\timerThing.wav") Then
        SoundSetWaveVolume(25)
        SoundPlay(@WindowsDir & "\media\tada.wav")
    Else
        SoundSetWaveVolume(5)
        SoundPlay(@ScriptDir & "\timerThing.wav")
    EndIf
EndFunc   ;==>playTheWAV

Func InsistPlayTheWAV()
    Local Static $t = 0
    If $t = 0 Then $t = TimerInit()
    playTheWAV()
    If TimerDiff($t) > 600000 Then
        AdlibUnRegister("InsistPlayTheWAV")
        $t = 0
    EndIf
EndFunc   ;==>InsistPlayTheWAV

Func TrayToolTip()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    TraySetToolTip('' & _
            $title & @CR & _
            GUICtrlRead($idHour) & ":" & GUICtrlRead($idMin) & ":" & GUICtrlRead($idSec) & @CR & @CR & _
            'Double' & @CR & _
            'Click to' & @CR & _
            'restore' & @CR & @CR & ' ')
EndFunc   ;==>TrayToolTip

Func idStartClick()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    WinSetTitle($hForm1, "", $title)
    $sec = 99
    $started = Not $started
    Switch $started
        Case True
            GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Start", "STOP"))
            $seconds = (Int(GUICtrlRead($idHour)) * 60 * 60) + (Int(GUICtrlRead($idMin)) * 60) + Int(GUICtrlRead($idSec))
            $aTimeHold[0] = StringFormat("%02i", GUICtrlRead($idHour))
            $aTimeHold[1] = StringFormat("%02i", GUICtrlRead($idMin))
            $aTimeHold[2] = StringFormat("%02i", GUICtrlRead($idSec))

   ;
            $InitialT = TimerInit()
            AdlibRegister("Timer")
            ;THIS IS THE PART THAT SHOWS THE PROJECTED FINISH
            $projectedFinish= round(($seconds + TimerDiff($InitialT)),0)
            GUICtrlSetData($idEndTime,"End Time : "& _DateAdd ( 's', $projectedFinish,_NowCalc()))

            GUICtrlSetState($idStart, $GUI_FOCUS)
            GUICtrlSetState($idHour, $GUI_DISABLE)
            GUICtrlSetState($idMin, $GUI_DISABLE)
            GUICtrlSetState($idSec, $GUI_DISABLE)
            GUICtrlSetState($idAlarm, $GUI_DISABLE)
        Case Else
            GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "STOP", "Start"))
            GUICtrlSetData($idHour, $aTimeHold[0])
            GUICtrlSetData($idMin, $aTimeHold[1])
            GUICtrlSetData($idSec, $aTimeHold[2])
            GUICtrlSetState($idHour, $GUI_ENABLE)
            GUICtrlSetState($idMin, $GUI_ENABLE)
            GUICtrlSetState($idSec, $GUI_ENABLE)
            GUICtrlSetState($idAlarm, $GUI_ENABLE)
            GUICtrlSetState($idInsist, $GUI_ENABLE)
            GUICtrlSetState($idStart, $GUI_FOCUS)
            GUICtrlSetData($idEndTime, $GUI_ENABLE)


         EndSwitch
         AdlibUnRegister("Timer")
EndFunc   ;==>idStartClick

Func On_idDummy()
    Local $i, $s = ControlGetFocus($hForm1)
    $i = Int(StringRight($s, 1))
    If $s = "Button1" Then Return ControlClick($hForm1, "", "Button1")
    If StringInStr($s, "Edit") Then
        Switch $i
            Case 1, 2, 3
                Send("{Tab}")
        EndSwitch
    EndIf
EndFunc   ;==>On_idDummy

Func idTitleChange()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    WinSetTitle($hForm1, "", $title)
EndFunc   ;==>idTitleChange

Func timerTitle()
    Local $n, $i = 0
    For $n = 1 To 1000
        If Not WinExists(" Timer  thing [" & $n & "]") Then
            AutoItWinSetTitle(" Timer  thing [" & $n & "]")
            $i = $n - 1
            If 40 * $n > @DesktopHeight - 150 Then $i = 1
            Return SetError(0, $i, " Timer " & $n)
        EndIf
    Next
    Return SetError(1, $i, " Timer ???")
EndFunc   ;==>timerTitle

Func OnTray_PRIMARYDOUBLE()
    TraySetState(2)
    WinSetState($hForm1, "", @SW_SHOW)
EndFunc   ;==>OnTray_PRIMARYDOUBLE

Func idAlarmEvent()
    ConsoleWrite('+ Func idAlarmEvent() : ' & GUICtrlRead($idAlarm) & @CRLF)
    If GUICtrlRead($idAlarm) = 1 Then
        $g_IsAlarm = 1
        GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Timer", "Alarm"))
        $sAppTitle = StringReplace($sAppTitle, "Timer", "Alarm")
    Else
        $g_IsAlarm = 0
        GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Alarm", "Timer"))
        $sAppTitle = StringReplace($sAppTitle, "Alarm", "Timer")
    EndIf
    idTitleChange()
EndFunc   ;==>idAlarmEvent

 

However, if I clicked on 'Stop Timer', the 'End Time' is strangely replaced with '64'.

How to correct the error?

Edited by Mucho
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...