Add camera control

Signed-off-by: Thomas Klaehn <thomas.klaehn@perinet.io>
This commit is contained in:
Thomas Klaehn
2025-09-11 08:42:57 +02:00
parent 355ee97c17
commit 35db2c1f58
4 changed files with 141 additions and 37 deletions

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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,6 +30,7 @@ func main() {
host.Init()
apiservice_camera.AddHandler()
apiservice_data.AddHandler()
apiservice_power.AddHandler()
apiservice_printer.AddHandler()