diff --git a/src/internal/apiservice/state/state.go b/src/internal/apiservice/state/state.go index 9a44c4c..8fc2519 100644 --- a/src/internal/apiservice/state/state.go +++ b/src/internal/apiservice/state/state.go @@ -9,6 +9,7 @@ import ( "sync" "time" apiservice_devices "waterservice/internal/apiservice/devices" + "waterservice/internal/app/storage" ) type state string @@ -22,8 +23,9 @@ type State struct { } const ( - StateOn state = "on" - StateOff state = "off" + storage_path = "/var/lib/waterservice/state/state.json" + StateOn state = "on" + StateOff state = "off" ) var ( @@ -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,13 +50,23 @@ func AddHandler() { func Start() { state_mutex.Lock() - for _, device := range apiservice_devices.GetDevices().Devices { - tmp := State{ - Name: device.Name, - State: StateOff, - Runtime: 0, + 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, + 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() @@ -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)