time_count

#!/usr/bin/wish

#Script Tcl/Tk affichant un compteur.
#Affiche le temps passé depuis son lancement mais aussi
#un cumul (avec possibilité de le remettre à 0).
#Je m'en servais pour compter mon temps de
#connexion Internet par mois.

set TIME_FILE /usr/bin/internet/total_time
set chour 0
set cmin 0
set csec 0
set thour 0
set tmin 0
set tsec 0
set file [open $TIME_FILE r]
gets $file phour
gets $file pmin
gets $file psec
close $file

set start_time [exec date +%s]

proc quit_timer {} {
    save_time
    exit 0
}

proc save_time {} {
     upvar thour thour
     upvar tmin tmin
     upvar tsec tsec
     upvar chour chour
     upvar cmin cmin
     upvar csec csec
     upvar TIME_FILE TIME_FILE

     set file [open $TIME_FILE w]
     puts $file $thour
     puts $file $tmin
     puts $file $tsec
     puts $file $chour
     puts $file $cmin
     puts $file $csec

     close $file
     puts "saved"

     exit 0
}

proc mk_time {hour min sec} {
     set zh ""
     set zm ""
     set zs ""
     if {$hour<10} {
       set zh "0"
     }
     if {$min<10} {
       set zm "0"
     }
     if {$sec<10} {
       set zs "0"
     }
     return "$zh$hour:$zm$min:$zs$sec"
}

proc update_timer {} {
     upvar phour phour
     upvar pmin pmin
     upvar psec psec
     upvar chour chour
     upvar cmin cmin
     upvar csec csec
     upvar thour thour
     upvar tmin tmin
     upvar tsec tsec
     upvar start_time start_time

     set curtime [exec date +%s]
     set elapsed_time [expr $curtime - $start_time]

     set chour [expr $elapsed_time / 3600]
     set elapsed_time [expr $elapsed_time - [expr $chour * 3600]]
     set cmin [expr $elapsed_time / 60]
     set csec [expr $elapsed_time % 60]
     
     set thour [expr $phour + $chour]
     set tmin [expr $pmin + $cmin]
     set tsec [expr $psec + $csec]

     set retenu [expr $tsec / 60]
     if {$retenu != 0} {
       set tmin [expr $tmin + $retenu]
       set tsec [expr $tsec % 60]
     }
     set retenu [expr $tmin / 60]
     if {$retenu != 0} {
       set thour [expr $thour + $retenu]
       set tmin [expr $tmin % 60]
     }

     .lvTotal config -text [mk_time $thour $tmin $tsec]
     .lvCurrent config -text [mk_time $chour $cmin $csec]
     after 1000 update_timer
}

proc reset {} {
     upvar phour phour
     upvar pmin pmin
     upvar psec psec
     upvar chour chour
     upvar cmin cmin
     upvar csec csec
     upvar thour thour
     upvar tmin tmin
     upvar tsec tsec
     upvar start_time start_time

     set phour 0
     set pmin 0
     set psec 0
     set thour 0
     set tmin 0
     set tsec 0
     set chour 0
     set cmin 0
     set csec 0
     set start_time [exec date +%s]
     .lvTotal config -text [mk_time $thour $tmin $tsec]
     .lvCurrent config -text [mk_time $chour $cmin $csec]
}

. config -bg steelblue
label .liTotal -text "Temps total: " -justify right -bg steelblue
label .lvTotal -text [mk_time $phour $pmin $psec] -justify left -bg steelblue
label .liCurrent -text "Temps courant: " -justify right -bg steelblue
label .lvCurrent -text "0" -justify left -bg steelblue
button .bReset -text "RAZ" -justify center -command {reset}

grid .liTotal -row 0 -column 0 -sticky "e"
grid .lvTotal -row 0 -column 1 -sticky "w"
grid .liCurrent -row 1 -column 0 -sticky "e"
grid .lvCurrent -row 1 -column 1 -sticky "w"
grid .bReset -row 2 -column 0 -columnspan 2 -sticky "new"
bind .lvTotal <Destroy> {save_time}
update_timer