apiservice/state: Enhancement: store state cache
Signed-off-by: Thomas Klaehn <tkl@blackfinn.de>
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
apiservice_devices "waterservice/internal/apiservice/devices"
|
||||
"waterservice/internal/app/storage"
|
||||
)
|
||||
|
||||
type state string
|
||||
@@ -22,6 +23,7 @@ type State struct {
|
||||
}
|
||||
|
||||
const (
|
||||
storage_path = "/var/lib/waterservice/state/state.json"
|
||||
StateOn state = "on"
|
||||
StateOff state = "off"
|
||||
)
|
||||
@@ -31,12 +33,14 @@ var (
|
||||
|
||||
state_cache map[string]State
|
||||
state_mutex sync.Mutex
|
||||
store storage.Storage
|
||||
cb_register_off registerOffSwitch
|
||||
cb_unregister_off registerOffSwitch
|
||||
)
|
||||
|
||||
func init() {
|
||||
logger.SetFlags(log.Llongfile | log.Ltime)
|
||||
store.SetPath(storage_path)
|
||||
state_cache = map[string]State{}
|
||||
}
|
||||
|
||||
@@ -46,6 +50,10 @@ func AddHandler() {
|
||||
|
||||
func Start() {
|
||||
state_mutex.Lock()
|
||||
res, err := store.Read()
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
// build default state_cache
|
||||
for _, device := range apiservice_devices.GetDevices().Devices {
|
||||
tmp := State{
|
||||
Name: device.Name,
|
||||
@@ -54,6 +62,12 @@ func Start() {
|
||||
}
|
||||
state_cache[device.Name] = tmp
|
||||
}
|
||||
} else {
|
||||
err = json.Unmarshal(res, &state_cache)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
}
|
||||
}
|
||||
state_mutex.Unlock()
|
||||
|
||||
go poll_states()
|
||||
@@ -84,6 +98,15 @@ func SetState(st State) error {
|
||||
tmp := state_cache[dev.Name]
|
||||
tmp.State = st.State
|
||||
state_cache[dev.Name] = tmp
|
||||
res, err := json.Marshal(state_cache)
|
||||
if err != nil {
|
||||
logger.Print("unable to store state cache")
|
||||
} else {
|
||||
err = store.Write(res)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
}
|
||||
}
|
||||
state_mutex.Unlock()
|
||||
if cb_register_off != nil && cb_unregister_off != nil {
|
||||
if st.State == StateOn {
|
||||
@@ -104,6 +127,15 @@ func SetRuntime(name string, runtime time.Duration) {
|
||||
tmp := state_cache[name]
|
||||
tmp.Runtime = runtime
|
||||
state_cache[name] = tmp
|
||||
res, err := json.Marshal(state_cache)
|
||||
if err != nil {
|
||||
logger.Print("unable to store state cache")
|
||||
} else {
|
||||
err = store.Write(res)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
}
|
||||
}
|
||||
state_mutex.Unlock()
|
||||
}
|
||||
|
||||
@@ -166,6 +198,15 @@ func handle_patch(r *http.Request) error {
|
||||
tmp := state_cache[dev.Name]
|
||||
tmp.State = st.State
|
||||
state_cache[dev.Name] = tmp
|
||||
res, err := json.Marshal(state_cache)
|
||||
if err != nil {
|
||||
logger.Print("unable to store state cache")
|
||||
} else {
|
||||
err = store.Write(res)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
}
|
||||
}
|
||||
state_mutex.Unlock()
|
||||
if cb_register_off != nil && cb_unregister_off != nil {
|
||||
if st.State == StateOn {
|
||||
@@ -213,6 +254,15 @@ func poll_states() {
|
||||
tmp := state_cache[dev.Name]
|
||||
tmp.State = status
|
||||
state_cache[dev.Name] = tmp
|
||||
res, err := json.Marshal(state_cache)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
} else {
|
||||
err = store.Write(res)
|
||||
if err != nil {
|
||||
logger.Print(err)
|
||||
}
|
||||
}
|
||||
state_mutex.Unlock()
|
||||
}
|
||||
time.Sleep(time.Second * 10)
|
||||
|
Reference in New Issue
Block a user