Add camera control
Signed-off-by: Thomas Klaehn <thomas.klaehn@perinet.io>
This commit is contained in:
98
src/internal/apiservice/camera/camera.go
Normal file
98
src/internal/apiservice/camera/camera.go
Normal 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)
|
||||
}
|
@@ -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)
|
||||
}
|
||||
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user