From 30f9d842f7f673454e50d9ac09296f608ecfa506 Mon Sep 17 00:00:00 2001 From: Askill Date: Fri, 27 May 2022 16:12:27 +0200 Subject: [PATCH] added Image and Pixel Obejcts --- go/server.go | 19 ++++++++-------- go/util.go | 56 ++++++++++++++++++++++++++++++++++++++++++----- python/clients.py | 8 +++---- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/go/server.go b/go/server.go index a3e17ed..452320a 100644 --- a/go/server.go +++ b/go/server.go @@ -11,17 +11,15 @@ import ( "flag" "log" "net/http" - "time" "github.com/gorilla/websocket" ) -var addr = flag.String("addr", "localhost:8080", "http service address") - var upgrader = websocket.Upgrader{ ReadBufferSize: 2048, WriteBufferSize: 2048, } +var img = GetImage(10, 10) func serve(w http.ResponseWriter, r *http.Request) { c, err := upgrader.Upgrade(w, r, nil) @@ -31,16 +29,17 @@ func serve(w http.ResponseWriter, r *http.Request) { } defer c.Close() for { - mt, message, err := c.ReadMessage() + mt, msg, err := c.ReadMessage() if err != nil { - //log.Println("read:", err) + log.Println("read:", err) break } - pixel := JsonToStruct(message) - tm := time.Unix(pixel.Timestamp, 0) - log.Println(tm) - err = c.WriteMessage(mt, message) + message := Message{} + message.JsonToStruct(msg) + img.SetPixel(message) + + err = c.WriteMessage(mt, msg) if err != nil { //log.Println("write:", err) break @@ -49,6 +48,8 @@ func serve(w http.ResponseWriter, r *http.Request) { } func main() { + var addr = flag.String("addr", "localhost:8080", "http service address") + flag.Parse() log.SetFlags(0) http.HandleFunc("/", serve) diff --git a/go/util.go b/go/util.go index 4662bf4..7cce13d 100644 --- a/go/util.go +++ b/go/util.go @@ -2,9 +2,11 @@ package main import ( "encoding/json" + "fmt" + "sync" ) -type Pixel struct { +type Message struct { X uint16 `json:"x"` Y uint16 `json:"y"` Color uint8 `json:"color"` @@ -12,8 +14,52 @@ type Pixel struct { UserID uint64 `json:"userid"` } -func JsonToStruct(input []byte) Pixel { - pixel := Pixel{} - json.Unmarshal(input, &pixel) - return pixel +func (message *Message) JsonToStruct(input []byte) *Message { + json.Unmarshal(input, message) + return message +} + +type pixel struct { + Color uint8 `json:"color"` + Timestamp int64 `json:"timestamp"` + UserID uint64 `json:"userid"` + Mutex sync.Mutex +} + +type image struct { + width uint16 + height uint16 + pixels []pixel +} + +func GetImage(w uint16, h uint16) image { + pixels := make([]pixel, w*h) + for i := 0; i < int(w*h); i++ { + pixels[i] = pixel{Color: 0, Timestamp: 0, UserID: 0, Mutex: sync.Mutex{}} + } + return image{width: w, height: h, pixels: pixels} +} + +func (p *pixel) setColor(color uint8, timestamp int64, userid uint64) { + p.Mutex.Lock() + defer p.Mutex.Unlock() + if timestamp > p.Timestamp { + p.Color = color + p.Timestamp = timestamp + p.UserID = userid + } +} + +func (img *image) SetPixel(message Message) *image { + if message.X >= img.width || message.Y >= img.height || message.X < 0 || message.Y < 0 { + fmt.Printf("User %d tried accessing out of bounds \n", message.UserID) + return img + } + if message.Color >= 16 || message.Color < 0 { + fmt.Printf("User %d tried setting non existent color \n", message.UserID) + return img + } + pos := uint32(message.X)*uint32(img.width) + uint32(message.Y) + img.pixels[pos].setColor(message.Color, message.Timestamp, message.UserID) + return img } diff --git a/python/clients.py b/python/clients.py index c063ca4..acfe096 100644 --- a/python/clients.py +++ b/python/clients.py @@ -21,11 +21,11 @@ class pixel: async def main(): message = pixel( - x=0, - y=1, - color=0, + x=11, + y=0, + color=15, timestamp=int(time.time()), - userid=0, + userid=1, ) async with websockets.connect("ws://localhost:8080") as websocket: print(message)