From eb1785f668db4e4cd34b16cc9fe7902862c8b3c6 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 19 Dec 2024 18:30:35 -0600 Subject: [PATCH] recreate examples from psn-js and vyv --- cmd/decode/main.go | 31 -------------- examples/decode/main.go | 33 ++++++++++++++ examples/encode/main.go | 45 ++++++++++++++++++++ examples/psn_client/main.go | 83 ++++++++++++++++++++++++++++++++++++ examples/psn_server/main.go | 85 +++++++++++++++++++++++++++++++++++++ 5 files changed, 246 insertions(+), 31 deletions(-) delete mode 100644 cmd/decode/main.go create mode 100644 examples/decode/main.go create mode 100644 examples/encode/main.go create mode 100644 examples/psn_client/main.go create mode 100644 examples/psn_server/main.go diff --git a/cmd/decode/main.go b/cmd/decode/main.go deleted file mode 100644 index c8b6a17..0000000 --- a/cmd/decode/main.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "fmt" - "log/slog" - - "github.com/jwetzell/psn-go/internal/decoders" -) - -func main() { - infoDecoded, error := decoders.DecodePacketChunk([]byte{0x56, 0x67, 0x34, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, - 0x01, 0x01, 0x00, 0x0b, 0x00, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x11, - 0x80, 0x01, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x09, 0x00, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x31}) - - if error != nil { - slog.Error("problem decoding packet", "error", error) - } else { - fmt.Printf("decoded: %+v\n", infoDecoded) - } - - dataDecoded, error := decoders.DecodePacketChunk([]byte{0x55, 0x67, 0x28, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, - 0x01, 0x01, 0x00, 0x14, 0x80, 0x01, 0x00, 0x10, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, - 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f}) - - if error != nil { - slog.Error("problem decoding packet", "error", error) - } else { - fmt.Printf("decoded: %+v\n", dataDecoded) - - } -} diff --git a/examples/decode/main.go b/examples/decode/main.go new file mode 100644 index 0000000..694c06f --- /dev/null +++ b/examples/decode/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/jwetzell/psn-go" +) + +func main() { + decoder := psn.NewDecoder() + + infoPacketBytes := []byte{0x56, 0x67, 0x34, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x0b, 0x00, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x11, + 0x80, 0x01, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x09, 0x00, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x31} + + dataPacketBytes := []byte{0x55, 0x67, 0x28, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x14, 0x80, 0x01, 0x00, 0x10, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, + 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f} + + decoder.Decode(infoPacketBytes) + decoder.Decode(dataPacketBytes) + + fmt.Printf("decoded: %+v\n", decoder.SystemName) + + trackers, err := json.MarshalIndent(decoder.Trackers, "", " ") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(string(trackers)) +} diff --git a/examples/encode/main.go b/examples/encode/main.go new file mode 100644 index 0000000..ac346fc --- /dev/null +++ b/examples/encode/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + + "github.com/jwetzell/psn-go" +) + +func main() { + + encoder := psn.Encoder{ + SystemName: "Server Name", + VersionHigh: 2, + VersionLow: 3, + } + + tracker := psn.Tracker{ + Id: 1, + Name: "Tracker 1", + } + + tracker.SetPos(1.0, 1.0, 1.0) + + trackers := []psn.Tracker{ + tracker, + } + + timestamp := 1 + + dataPackets := encoder.GetDataPackets(uint64(timestamp), trackers) + infoPackets := encoder.GetInfoPackets(uint64(timestamp), trackers) + + for _, dataPacket := range dataPackets { + println("send packet somehow") + fmt.Printf("%v\n", dataPacket) + + } + + for _, infoPacket := range infoPackets { + println("send packet somehow") + fmt.Printf("%v\n", infoPacket) + + } + +} diff --git a/examples/psn_client/main.go b/examples/psn_client/main.go new file mode 100644 index 0000000..a4f1819 --- /dev/null +++ b/examples/psn_client/main.go @@ -0,0 +1,83 @@ +package main + +import ( + "fmt" + "net" + "time" + + "github.com/jwetzell/psn-go" +) + +func main() { + addr, err := net.ResolveUDPAddr("udp", "236.10.10.10:56565") + if err != nil { + fmt.Printf("Error %v\n", err) + return + } + + client, err := net.ListenMulticastUDP("udp", nil, addr) + + if err != nil { + fmt.Printf("Error %v\n", err) + return + } + defer client.Close() + + decoder := psn.NewDecoder() + + lastPrintMillis := time.Now().UnixMilli() + + for { + buffer := make([]byte, 2048) + + length, _, err := client.ReadFromUDP(buffer) + + if err != nil { + fmt.Printf("Error %v", err) + } + + if length > 0 { + decoder.Decode(buffer) + } + + if time.Now().UnixMilli()-lastPrintMillis > 1000 { + if decoder.SystemName != "" { + fmt.Printf("System Name: %s\n", decoder.SystemName) + } + + fmt.Printf("Tracker Count: %d\n", len(decoder.Trackers)) + + for id, tracker := range decoder.Trackers { + fmt.Printf("Tracker - id: %d | name: %s\n", id, tracker.Name) + if tracker.Pos != nil { + fmt.Printf("\tpos: %f,%f,%f\n", tracker.Pos.X, tracker.Pos.Y, tracker.Pos.Z) + } + + if tracker.Speed != nil { + fmt.Printf("\tspeed: %f,%f,%f\n", tracker.Speed.X, tracker.Speed.Y, tracker.Speed.Z) + } + + if tracker.Ori != nil { + fmt.Printf("\tori: %f,%f,%f\n", tracker.Ori.X, tracker.Ori.Y, tracker.Ori.Z) + } + + if tracker.Validity != nil { + fmt.Printf("\tstatus: %f\n", *tracker.Validity) + } + + if tracker.Accel != nil { + fmt.Printf("\taccel: %f,%f,%f\n", tracker.Accel.X, tracker.Accel.Y, tracker.Accel.Z) + } + + if tracker.TrgtPos != nil { + fmt.Printf("\ttrgtpos: %f,%f,%f\n", tracker.TrgtPos.X, tracker.TrgtPos.Y, tracker.TrgtPos.Z) + } + + if tracker.Timestamp != nil { + fmt.Printf("\ttimestamp: %d\n", *tracker.Timestamp) + } + } + lastPrintMillis = time.Now().UnixMilli() + } + } +} diff --git a/examples/psn_server/main.go b/examples/psn_server/main.go new file mode 100644 index 0000000..d0b532b --- /dev/null +++ b/examples/psn_server/main.go @@ -0,0 +1,85 @@ +package main + +import ( + "fmt" + "math" + "net" + "time" + + "github.com/jwetzell/psn-go" +) + +func main() { + client, err := net.Dial("udp", "236.10.10.10:56565") + + if err != nil { + fmt.Printf("Error %v\n", err) + return + } + + encoder := psn.Encoder{ + SystemName: "Test PSN Server", + VersionHigh: 2, + VersionLow: 0, + } + + trackers := []psn.Tracker{} + + trackers = append(trackers, psn.Tracker{Id: 0, Name: "Sun"}) + trackers = append(trackers, psn.Tracker{Id: 1, Name: "Mercury"}) + trackers = append(trackers, psn.Tracker{Id: 2, Name: "Venus"}) + trackers = append(trackers, psn.Tracker{Id: 3, Name: "Earth"}) + trackers = append(trackers, psn.Tracker{Id: 4, Name: "Mars"}) + trackers = append(trackers, psn.Tracker{Id: 5, Name: "Jupiter"}) + trackers = append(trackers, psn.Tracker{Id: 6, Name: "Saturn"}) + trackers = append(trackers, psn.Tracker{Id: 7, Name: "Uranus"}) + trackers = append(trackers, psn.Tracker{Id: 8, Name: "Neptune"}) + trackers = append(trackers, psn.Tracker{Id: 9, Name: "Pluto"}) + + orbits := []float32{1.0, 88.0, 224.7, 365.2, 687, 4332, 10760, 30700, 60200, 90600} + distFromSun := []float32{0, 0.58, 1.08, 1.5, 2.28, 7.78, 14.29, 28.71, 45.04, 59.13} + + timestamp := 0 + + lastInfoMillis := time.Now().UnixMilli() + lastDataMillis := time.Now().UnixMilli() + + for { + if (time.Now().UnixMilli() - lastInfoMillis) > 500 { + fmt.Println("Sending Info Packets") + infoPackets := encoder.GetInfoPackets(uint64(timestamp), trackers) + for _, infoPacket := range infoPackets { + client.Write(infoPacket) + } + lastInfoMillis = time.Now().UnixMilli() + } + + if (time.Now().UnixMilli() - lastDataMillis) > 5 { + for index, orbit := range orbits { + a := 1.0 / orbit + b := distFromSun[index] + x := timestamp + cb := math.Cos(float64(a*float32(x))) * float64(b) + sb := math.Sin(float64(a*float32(x))) * float64(b) + + trackers[index].SetPos(float32(sb), 0, float32(cb)) + trackers[index].SetSpeed(a*float32(cb), 0, -a*float32(sb)) + trackers[index].SetOri(0, float32(x)/1000.0, 0) + trackers[index].SetAccel(-a*a*float32(sb), 0, -a*a*float32(cb)) + trackers[index].SetTrgtPos(3, 14, 16) + trackers[index].SetStatus(float32(index) / 10.0) + trackers[index].SetTimestamp(uint64(timestamp)) + } + + fmt.Println("Sending Data Packets") + dataPackets := encoder.GetDataPackets(uint64(timestamp), trackers) + for _, DataPacket := range dataPackets { + client.Write(DataPacket) + } + lastDataMillis = time.Now().UnixMilli() + timestamp += 1 + } + + } + +}