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