Big Gotool Refactoring
- Added Event Bus - Reworked Package Parsing - Rewokred Frame Parsing
This commit is contained in:
+71
-40
@@ -1,71 +1,102 @@
|
||||
package frontend
|
||||
|
||||
import (
|
||||
"context"
|
||||
"embed"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"alox.tool/api"
|
||||
"alox.tool/eventbus"
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
//go:embed www
|
||||
var staticFiles embed.FS
|
||||
|
||||
func home(w http.ResponseWriter, r *http.Request) {
|
||||
content, err := staticFiles.ReadFile("www/index.html")
|
||||
if err != nil {
|
||||
log.Printf("Could not Read file %v", err)
|
||||
}
|
||||
fmt.Fprintf(w, string(content))
|
||||
var upgrader = websocket.Upgrader{}
|
||||
|
||||
type FServer struct {
|
||||
bus eventbus.EventBus
|
||||
mux *http.ServeMux
|
||||
}
|
||||
|
||||
var upgrader = websocket.Upgrader{} // use default options
|
||||
|
||||
type ValueChangeResp struct {
|
||||
Cmd string `json:"cmd"`
|
||||
Name string `json:"name"`
|
||||
Value string `json:"value"`
|
||||
func New(bus eventbus.EventBus) *FServer {
|
||||
fsrv := &FServer{
|
||||
bus: bus,
|
||||
mux: http.NewServeMux(),
|
||||
}
|
||||
fsrv.routes()
|
||||
return fsrv
|
||||
}
|
||||
|
||||
func echo(w http.ResponseWriter, r *http.Request) {
|
||||
func (fsrv *FServer) routes() {
|
||||
// Statische Dateien aus dem Embed-FS
|
||||
// "www" Präfix entfernen, damit index.html unter / verfügbar ist
|
||||
root, _ := fs.Sub(staticFiles, "www")
|
||||
fsrv.mux.Handle("/", http.FileServer(http.FS(root)))
|
||||
|
||||
type resp struct {
|
||||
Cmd string `json:"cmd"`
|
||||
Arg string `json:"arg"`
|
||||
}
|
||||
// WebSocket Endpunkt
|
||||
fsrv.mux.HandleFunc("/ws", fsrv.handleWS)
|
||||
}
|
||||
|
||||
c, err := upgrader.Upgrade(w, r, nil)
|
||||
func (fsrv *FServer) handleWS(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
log.Print("upgrade:", err)
|
||||
log.Printf("Upgrade error: %v", err)
|
||||
return
|
||||
}
|
||||
defer c.Close()
|
||||
defer conn.Close()
|
||||
|
||||
// Kanäle für die Hardware-Events abonnieren
|
||||
rxChan := fsrv.bus.Subscribe(api.TopicUARTRx)
|
||||
txChan := fsrv.bus.Subscribe(api.TopicUARTTx)
|
||||
|
||||
// Context nutzen, um Goroutinen zu stoppen, wenn die Verbindung abreißt
|
||||
ctx, cancel := context.WithCancel(r.Context())
|
||||
defer cancel()
|
||||
|
||||
// WRITER: Send Events to Browser
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case f := <-rxChan:
|
||||
if err := conn.WriteJSON(map[string]any{"type": "rx", "frame": f}); err != nil {
|
||||
return
|
||||
}
|
||||
case f := <-txChan:
|
||||
if err := conn.WriteJSON(map[string]any{"type": "tx", "frame": f}); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// READER: Commands from Browser
|
||||
for {
|
||||
_, message, err := c.ReadMessage()
|
||||
if err != nil {
|
||||
log.Println("read:", err)
|
||||
var cmd api.FrontendCmd
|
||||
if err := conn.ReadJSON(&cmd); err != nil {
|
||||
log.Printf("WS Read Error: %v", err)
|
||||
break
|
||||
}
|
||||
log.Printf("recv: %s", message)
|
||||
|
||||
jsonResp := resp{
|
||||
Cmd: "echo",
|
||||
Arg: string(message),
|
||||
}
|
||||
|
||||
err = c.WriteJSON(jsonResp)
|
||||
if err != nil {
|
||||
log.Println("write:", err)
|
||||
break
|
||||
}
|
||||
fsrv.bus.Publish(api.TopicFrontendCmd, cmd)
|
||||
log.Printf("Browser Action: %s auf ID 0x%02X", cmd.Action, cmd.ID)
|
||||
}
|
||||
}
|
||||
|
||||
func StartServer() {
|
||||
http.Handle("/www/", http.FileServer(http.FS(staticFiles)))
|
||||
http.HandleFunc("/", home)
|
||||
http.HandleFunc("/echo", echo)
|
||||
func (fsrv *FServer) Start(addr string) error {
|
||||
server := &http.Server{
|
||||
Addr: addr,
|
||||
Handler: fsrv.mux,
|
||||
ReadTimeout: 5 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
}
|
||||
|
||||
http.ListenAndServe("0.0.0.0:8000", nil)
|
||||
log.Printf("Frontend Server gestartet auf %s", addr)
|
||||
return server.ListenAndServe()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user