diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/dolmetschctld/dolmetschctld.go | 15 | ||||
-rw-r--r-- | cmd/dolmetschctld/statemachine.go | 83 |
2 files changed, 90 insertions, 8 deletions
diff --git a/cmd/dolmetschctld/dolmetschctld.go b/cmd/dolmetschctld/dolmetschctld.go index 6cd74bb..783358d 100644 --- a/cmd/dolmetschctld/dolmetschctld.go +++ b/cmd/dolmetschctld/dolmetschctld.go @@ -25,7 +25,6 @@ package main import ( "log" "os" - "time" "spreadspace.org/dolmetschctl/pkg/mixer" ) @@ -48,15 +47,15 @@ func main() { log.Println("Error initializeing the mixer: %v", err) os.Exit(1) } - log.Printf("mixer successfully initialized!") - // TODO: implement state machine - m.UnMute(0x24) - m.SetLevel(0x24, 42) - time.Sleep(2 * time.Second) - m.Mute(0x24) - m.SetLevel(0x24, mixer.FaderLevel0db) + var sm *StateMachine + if sm, err = NewStateMachine(m); err != nil { + log.Printf("state machone successfully initialized!") + } + + sm.Start() + defer sm.Shutdown() log.Printf("exiting.") } diff --git a/cmd/dolmetschctld/statemachine.go b/cmd/dolmetschctld/statemachine.go new file mode 100644 index 0000000..c388d24 --- /dev/null +++ b/cmd/dolmetschctld/statemachine.go @@ -0,0 +1,83 @@ +// +// dolmetschctl +// +// +// Copyright (C) 2019 Christian Pointner <equinox@spreadspace.org> +// +// This file is part of dolmetschctl. +// +// dolmetschctl is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// dolmetschctl is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with dolmetschctl. If not, see <http://www.gnu.org/licenses/>. +// + +package main + +import ( + "time" + + "spreadspace.org/dolmetschctl/pkg/mixer" +) + +type Language string + +type StateMachine struct { + mixer *mixer.Mixer + selectLangCh chan Language + quitCh chan bool + exitedCh chan struct{} +} + +func NewStateMachine(m *mixer.Mixer) (*StateMachine, error) { + sm := &StateMachine{mixer: m} + sm.selectLangCh = make(chan Language, 10) + sm.quitCh = make(chan bool, 1) + sm.exitedCh = make(chan struct{}) + return sm, nil +} + +func (sm *StateMachine) selectLang(l Language) { + sm.mixer.UnMute(0x24) + sm.mixer.SetLevel(0x24, 42) + time.Sleep(2 * time.Second) + sm.mixer.Mute(0x24) + sm.mixer.SetLevel(0x24, mixer.FaderLevel0db) +} + +func (sm *StateMachine) run() { + defer close(sm.exitedCh) + + for { + select { + case l := <-sm.selectLangCh: + sm.selectLang(l) + case <-sm.quitCh: + return + } + } +} + +func (sm *StateMachine) Start() { + go sm.run() +} + +func (sm *StateMachine) SelectLanguage(l Language) { + sm.selectLangCh <- l +} + +func (sm *StateMachine) Shutdown() { + select { + case sm.quitCh <- true: + default: + } + <-sm.exitedCh +} |