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++ } }