diff options
| author | xengineering <mail2xengineering@protonmail.com> | 2021-06-15 16:44:15 +0200 | 
|---|---|---|
| committer | xengineering <mail2xengineering@protonmail.com> | 2021-06-15 16:44:15 +0200 | 
| commit | 591097e5a3741432e2acd9c41fadd4eb10678674 (patch) | |
| tree | e33b58eede51d6fd2dd644b08a0ca35527f5581c /src | |
| parent | f77251f132f2c61bc2f6fb6472e31a95badfa210 (diff) | |
| download | birdscan-591097e5a3741432e2acd9c41fadd4eb10678674.tar birdscan-591097e5a3741432e2acd9c41fadd4eb10678674.tar.zst birdscan-591097e5a3741432e2acd9c41fadd4eb10678674.zip  | |
Refactoring: Make Statemachine reusable
Diffstat (limited to 'src')
| -rw-r--r-- | src/camera.go | 16 | ||||
| -rw-r--r-- | src/state.go | 33 | 
2 files changed, 28 insertions, 21 deletions
diff --git a/src/camera.go b/src/camera.go index 12a9d54..197aa21 100644 --- a/src/camera.go +++ b/src/camera.go @@ -2,6 +2,10 @@  package main +import ( +	"time" +) +  type Camera struct {  	statemachine Machine  } @@ -29,10 +33,22 @@ func NewCamera() Camera {  			},  			api: make(chan string),  			state_listeners: make([]*(chan string), 0), +			hook: runCameraHooks,  		},  	}  } +func runCameraHooks(last string, next string) { + +	if last == "idle" && next == "single_picture" { +		// TODO implement launch of python subprocess here +		go func() { +			time.Sleep(1 * time.Second) +			camera.statemachine.SendEvent("single_picture_taken") +		}() +	} +} +  func (cam *Camera) run() {  	cam.statemachine.Run()  } diff --git a/src/state.go b/src/state.go index 5970ba8..10c35ef 100644 --- a/src/state.go +++ b/src/state.go @@ -4,7 +4,6 @@ package main  import (  	"log" -	"time"  )  // This struct represents the statemachine. @@ -15,6 +14,7 @@ type Machine struct {  	states StateMap  	api chan string  	state_listeners []*(chan string) +	hook HookFunction  }  type StateMap map[string]MachineState @@ -29,6 +29,8 @@ type MachineTransition struct {  	to string  } +type HookFunction func(string, string) +  // This will run the statemachine (blocking).  func (m *Machine) Run() {  	var event string @@ -100,28 +102,17 @@ func (m *Machine) deregisterListener(listener *(chan string)) {  func (m *Machine) processEvent(event string) string {  	current := m.GetState()  	next := m.states[current].on[event].to -	if next != "" { +	if next != "" {  // check if transition is possible  		log.Printf("State machine '%s' changes from '%s' to '%s'\n", m.name, current, next) -		m.current = next -		m.runHooks(current, next) -		return next -	} -	return current -} -// In this function one can implement callback functions -// which will be triggered on certain transitions. -func (m *Machine) runHooks(last string, next string) { - -	for _,listener := range(m.state_listeners) { -		*listener <- next -	} +		// inform all state listeners +		for _,listener := range(m.state_listeners) { +			*listener <- next +		} -	if last == "idle" && next == "single_picture" { -		// TODO implement launch of python subprocess here -		go func() { -			time.Sleep(1 * time.Second) -			m.SendEvent("single_picture_taken") -		}() +		m.hook(current, next)  // execute registered callback function +		m.current = next  // set new state +		return next  	} +	return current  }  | 
