recator: use timer signals instead of shared.Message.TimeLeft
- remove shared.Message.TimeLeft - modify Timer struct - add TimeLeft signal - add End and Abort signals - add syncronised ticker - update RunPomodoro to use goroutines for timer starts - add waitForTimer function
This commit is contained in:
parent
aa5c24f06d
commit
3eae584d6d
2 changed files with 44 additions and 22 deletions
|
@ -9,6 +9,19 @@ import (
|
|||
var mu sync.Mutex // to synchronize access to shared state
|
||||
var timer Timer
|
||||
|
||||
func waitForTimer(t Timer) bool {
|
||||
for {
|
||||
select {
|
||||
case <-t.End:
|
||||
return true
|
||||
case <-t.Abort:
|
||||
return false
|
||||
case shared.Message.TimeLeft = <-t.TimeLeft:
|
||||
// do nothing, just let the timer update the message
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RunPomodoro iterates the Pomodoro work/break sessions.
|
||||
func RunPomodoro() {
|
||||
mu.Lock()
|
||||
|
@ -24,18 +37,21 @@ func RunPomodoro() {
|
|||
shared.Message.Session = session
|
||||
|
||||
shared.Message.Mode = "Work"
|
||||
if !timer.Start(pomodoroConfig.Work) {
|
||||
go timer.Start(pomodoroConfig.Work)
|
||||
if !waitForTimer(timer) {
|
||||
break
|
||||
}
|
||||
|
||||
if session > pomodoroConfig.Sessions {
|
||||
if session < pomodoroConfig.Sessions {
|
||||
shared.Message.Mode = "ShortBreak"
|
||||
if !timer.Start(pomodoroConfig.ShortBreak) {
|
||||
go timer.Start(pomodoroConfig.ShortBreak)
|
||||
if !waitForTimer(timer) {
|
||||
break
|
||||
}
|
||||
} else { // last phase, prepare for finish
|
||||
shared.Message.Mode = "LongBreak"
|
||||
if !timer.Start(pomodoroConfig.LongBreak) {
|
||||
go timer.Start(pomodoroConfig.LongBreak)
|
||||
if !waitForTimer(timer) {
|
||||
break
|
||||
}
|
||||
shared.Message.Mode = "End"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue