From 34831bbc59b0cb62ec837e1791457cf3bd4574ce Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 4 Nov 2024 10:34:37 -0500 Subject: server: humidity record for each room --- server/Makefile | 10 +++++++ server/record.go | 60 ++++++++++++++++++++++++++++++++++++++++++ server/server.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 server/Makefile create mode 100644 server/record.go create mode 100644 server/server.go (limited to 'server') diff --git a/server/Makefile b/server/Makefile new file mode 100644 index 0000000..8954492 --- /dev/null +++ b/server/Makefile @@ -0,0 +1,10 @@ +SRC = server.go record.go + +server: ${SRC} + go build $^ + +fmt: + gofmt -l -s -w ${SRC} + +clean: + rm -f server diff --git a/server/record.go b/server/record.go new file mode 100644 index 0000000..9051146 --- /dev/null +++ b/server/record.go @@ -0,0 +1,60 @@ +package main + +import ( + "time" +) + +type Record[T any] struct { + put chan<- T + get chan<- chan T + getRecent chan<- chan T +} + +type entry[T any] struct { + t time.Time + v T +} + +func newRecord[T any]() Record[T] { + put := make(chan T) + get := make(chan chan T) + getRecent := make(chan chan T) + + go func() { + var entries []entry[T] + + for { + select { + case v, ok := <-put: + if !ok { + return + } + entries = append(entries, entry[T]{time.Now(), v}) + case c, ok := <-get: + if !ok { + return + } + for _, e := range entries { + c <- e.v + } + close(c) + case c, ok := <-getRecent: + if !ok { + return + } + if len(entries) > 0 { + c <- entries[len(entries)-1].v + } + close(c) + } + } + }() + + return Record[T]{put, get, getRecent} +} + +func (l Record[T]) Close() { + close(l.put) + close(l.get) + close(l.getRecent) +} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..2795890 --- /dev/null +++ b/server/server.go @@ -0,0 +1,80 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "strconv" +) + +const addr = ":9090" +var rooms = []RoomID { + ",4AL[+V*:*k*n{7vL{}/d=K#Mo*y*^.@", + "Jq!+