wsdashdemo/main.go

90 lines
1.6 KiB
Go

package main
import (
"encoding/csv"
"github.com/gorilla/websocket"
"io"
"log"
"net/http"
"os"
"strconv"
"time"
)
type dashData struct {
RPM int `json:"rpm"`
Speed int `json:"speed"`
PSI float64 `json:"psi"`
}
// Process the data log at startup
func load_data(filename string) []dashData {
var d []dashData
f, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
r := csv.NewReader(f)
for {
row, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
var e dashData
e.RPM, _ = strconv.Atoi(row[0])
e.Speed, _ = strconv.Atoi(row[2])
e.PSI, _ = strconv.ParseFloat(row[1], 64)
d = append(d, e)
}
return d
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func main() {
http.HandleFunc("/ws/", subscribe)
http.HandleFunc("/", serveIndex)
log.Fatal(http.ListenAndServe("0.0.0.0:9888", nil))
}
func serveIndex(w http.ResponseWriter, r *http.Request) {
f, err := os.Open("index.html")
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
io.Copy(w, f)
}
func subscribe(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
// Load data set
d := load_data("fin.csv")
iterator := 0
for {
if iterator == len(d) {
iterator = 0
}
err := c.WriteJSON(d[iterator])
if err != nil {
// Conection dropped or otherwise
log.Printf("Connection failed.")
return
}
time.Sleep(100 * time.Millisecond)
iterator++
}
}