-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathroverd.go
145 lines (113 loc) · 2.93 KB
/
roverd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package main
import (
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net/http"
"strconv"
"github.com/knei-knurow/roverd/handlers/move"
"github.com/knei-knurow/roverd/modules/motors"
"github.com/knei-knurow/roverd/modules/servos"
"github.com/knei-knurow/roverd/ports"
"github.com/tarm/serial"
)
var (
// Host on which the roverd will listen for requests. Usually empty or "localhost".
host string
// Port on which the roverd will listen for requests.
port string
// Whether to log extensive output.
verbose bool
)
var (
// Port with the device controlling motors.
movePort ports.Serial
// Port with the device controlling rangefinder.
// rangefinderPort sercom.Serial
)
func init() {
log.SetFlags(0)
log.SetPrefix("roverd: ")
flag.BoolVar(&verbose, "verbose", false, "print verbose output")
flag.Parse()
if verbose {
motors.Verbose = true
servos.Verbose = true
}
env := Env{}
env.Load()
log.Printf("loaded env vars: %v\n", env)
host = env.listenHost
port = env.listenPort
movePortName := env.movePort
movePortBaud, err := strconv.Atoi(env.movePortBaud)
if err != nil {
log.Fatalf("cannot read baud rate: %v\n", err)
}
config := &serial.Config{
Name: movePortName,
Baud: movePortBaud,
}
p, err := serial.OpenPort(config)
if err != nil {
log.Fatalf("cannot open port %s: %v\n", movePortName, err)
}
movePort = ports.SerialPort{ReadWriteCloser: p}
motors.Port = movePort
servos.Port = movePort
}
func main() {
addr := host + ":" + port
log.Println("listening on", addr)
serveHTTP(addr)
}
func serveHTTP(addr string) {
http.HandleFunc("/", handleIndex)
http.HandleFunc("/move", handleMove)
http.ListenAndServe(addr, nil)
}
func handleIndex(w http.ResponseWriter, req *http.Request) {
log.Printf("request from %s: %s %q", req.RemoteAddr, req.Method, req.URL)
fmt.Fprintln(w, "hello from roverd!")
}
func handleMove(w http.ResponseWriter, req *http.Request) {
log.Println("new move request")
b, err := io.ReadAll(req.Body)
if err != nil {
log.Fatalln("failed to read request body:", err)
}
log.Printf("request body: %s\n", b)
m := make(map[string]interface{})
err = json.Unmarshal(b, &m)
if err != nil {
log.Fatalln("failed to unmarshal HTTP request body into map[string]interface{}:", err)
}
err = move.HandleMove(m)
if err != nil {
log.Println("failed to handle move:", err)
w.WriteHeader(http.StatusInternalServerError)
body := make(map[string]interface{})
body["message"] = err.Error()
b, err := json.Marshal(body)
if err != nil {
log.Fatalln("failed to marshal json error response:", err)
}
_, err = w.Write(b)
if err != nil {
log.Fatalln("failed to write json error response body:", err)
}
return
}
body := make(map[string]interface{})
body["message"] = "success"
b, err = json.Marshal(body)
if err != nil {
log.Fatalln("failed to marshal json response:", err)
}
_, err = w.Write(b)
if err != nil {
log.Fatalln("failed to write json response body:", err)
}
}