From ec727efc1373112f7603bd516bba0717c2602842 Mon Sep 17 00:00:00 2001 From: Thomas Klaehn Date: Thu, 11 Sep 2025 08:42:57 +0200 Subject: [PATCH] Add camera control Signed-off-by: Thomas Klaehn --- src/internal/apiservice/camera/camera.go | 98 ++++++++++++++++++++++ src/internal/apiservice/printer/printer.go | 54 ++++++------ src/main.go | 4 +- webui/index.html | 24 ++++-- 4 files changed, 142 insertions(+), 38 deletions(-) create mode 100644 src/internal/apiservice/camera/camera.go diff --git a/src/internal/apiservice/camera/camera.go b/src/internal/apiservice/camera/camera.go new file mode 100644 index 0000000..fa8245d --- /dev/null +++ b/src/internal/apiservice/camera/camera.go @@ -0,0 +1,98 @@ +package apiservice_camera + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + apiservice_relay "powerswitch/internal/apiservice/relay" +) + +type state string + +type State struct { + State state `json:"state"` +} + +const ( + StateOn state = "on" + StateOff state = "off" + id int = 2 +) + +var ( + logger log.Logger = *log.Default() +) + +func init() { + logger.SetFlags(log.Llongfile | log.Ltime) +} + +func AddHandler() { + http.HandleFunc("GET /camera/state", handle_get_powerstate) + http.HandleFunc("PATCH /camera/state", handle_patch_powerstate) +} + +func GetState() (bool, error) { + res, err := apiservice_relay.GetRelay(id) + return !res, err +} + +func SetState(state bool) error { + return apiservice_relay.SetRelay(id, !state) +} + +func handle_get_powerstate(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-type", "application/json; charset=utf-8;") + state, err := apiservice_relay.GetRelay(id) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } + var res State + if state { + res.State = StateOff + } else { + res.State = StateOn + } + tmp, err := json.Marshal(res) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } + w.WriteHeader(http.StatusOK) + w.Write(tmp) +} + +func handle_patch_powerstate(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-type", "application/json; charset=utf-8;") + + tmp, err := io.ReadAll(r.Body) + if err != nil { + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + w.WriteHeader(http.StatusInternalServerError) + return + } + var state State + err = json.Unmarshal(tmp, &state) + if err != nil { + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + w.WriteHeader(http.StatusInternalServerError) + return + } + + set_state := true + if state.State == StateOn { + set_state = false + } + err = apiservice_relay.SetRelay(id, set_state) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } + w.WriteHeader(http.StatusOK) +} diff --git a/src/internal/apiservice/printer/printer.go b/src/internal/apiservice/printer/printer.go index 859a16e..483aea6 100644 --- a/src/internal/apiservice/printer/printer.go +++ b/src/internal/apiservice/printer/printer.go @@ -6,6 +6,7 @@ import ( "io" "log" "net/http" + apiservice_camera "powerswitch/internal/apiservice/camera" apiservice_data "powerswitch/internal/apiservice/data" apiservice_power "powerswitch/internal/apiservice/power" "powerswitch/internal/app/process/octoprint" @@ -85,21 +86,32 @@ func handle_patch_printerstate(w http.ResponseWriter, r *http.Request) { return } + new_state := false + if state.State == StateOn { + new_state = true + } + err = apiservice_data.SetState(new_state) + if err != nil { + logger.Print(err) + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } + err = apiservice_power.SetState(new_state) + if err != nil { + logger.Print(err) + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } + err = apiservice_camera.SetState(new_state) + if err != nil { + logger.Print(err) + w.WriteHeader(http.StatusInternalServerError) + w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) + return + } if state.State == StateOn { - err := apiservice_data.SetState(true) - if err != nil { - logger.Print(err) - w.WriteHeader(http.StatusInternalServerError) - w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) - return - } - err = apiservice_power.SetState(true) - if err != nil { - logger.Print(err) - w.WriteHeader(http.StatusInternalServerError) - w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) - return - } err = octoprint.ReStart() if err != nil { logger.Print(err) @@ -115,20 +127,6 @@ func handle_patch_printerstate(w http.ResponseWriter, r *http.Request) { w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) return } - err = apiservice_power.SetState(false) - if err != nil { - logger.Print(err) - w.WriteHeader(http.StatusInternalServerError) - w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) - return - } - err = apiservice_data.SetState(false) - if err != nil { - logger.Print(err) - w.WriteHeader(http.StatusInternalServerError) - w.Write(json.RawMessage(fmt.Sprintf(`{"error": "%s"}`, err.Error()))) - return - } } w.WriteHeader(http.StatusOK) } diff --git a/src/main.go b/src/main.go index 2994cc5..2dd1b15 100644 --- a/src/main.go +++ b/src/main.go @@ -5,6 +5,7 @@ import ( "log" "net/http" + apiservice_camera "powerswitch/internal/apiservice/camera" apiservice_data "powerswitch/internal/apiservice/data" apiservice_power "powerswitch/internal/apiservice/power" apiservice_printer "powerswitch/internal/apiservice/printer" @@ -29,12 +30,13 @@ func main() { host.Init() + apiservice_camera.AddHandler() apiservice_data.AddHandler() apiservice_power.AddHandler() apiservice_printer.AddHandler() apiservice_relay.AddHandler() - port := ":80" + port := ":8083" http.Handle("/", http.FileServer(http.Dir(webui_path))) logger.Fatal(http.ListenAndServe(port, nil)) } diff --git a/webui/index.html b/webui/index.html index 0d5a19a..e034634 100644 --- a/webui/index.html +++ b/webui/index.html @@ -7,17 +7,20 @@ @@ -124,6 +121,15 @@ + + Kamera: + + + +