diff --git a/backend/pkg/adj/adj.go b/backend/pkg/adj/adj.go new file mode 100644 index 000000000..52c02d2e1 --- /dev/null +++ b/backend/pkg/adj/adj.go @@ -0,0 +1,258 @@ +package adj + +import ( + "encoding/json" + "os" + "path" + + "github.com/HyperloopUPV-H8/h9-backend/internal/utils" + "github.com/go-git/go-git/v5" +) + +const ( + RepoUrl = "https://github.com/HyperloopUPV-H8/JSON_ADE.git" // URL of the ADJ repository + RepoPath = "./JSON_ADE/" // Path where the ADJ repository is cloned +) + +func NewADJ() (ADJ, error) { + infoRaw, boardsRaw, err := downloadADJ() + if err != nil { + return ADJ{}, err + } + + var infoJSON InfoJSON + if err := json.Unmarshal(infoRaw, &infoJSON); err != nil { + println("Info JSON unmarshal error") + return ADJ{}, err + } + + var info Info = Info{ + Ports: infoJSON.Ports, + MessageIds: infoJSON.MessageIds, + Units: make(map[string]utils.Operations), + } + for key, value := range infoJSON.Units { + info.Units[key], err = utils.NewOperations(value) + if err != nil { + return ADJ{}, err + } + } + + type BoardList struct { + Boards map[string]string `json:"boards"` + } + + var boardsList BoardList + if err := json.Unmarshal(boardsRaw, &boardsList); err != nil { + return ADJ{}, err + } + + boards, err := getBoards(boardsList.Boards) + if err != nil { + return ADJ{}, err + } + + info.BoardIds, err = getBoardIds(boardsList.Boards) + if err != nil { + return ADJ{}, err + } + + info.Addresses, err = getAddresses(boards) + if err != nil { + return ADJ{}, err + } + for target, address := range infoJSON.Addresses { + info.Addresses[target] = address + } + + adj := ADJ{ + Info: info, + Boards: boards, + } + + return adj, nil +} + +func downloadADJ() (json.RawMessage, json.RawMessage, error) { + if !checkRepo() { + _, err := git.PlainClone(RepoPath, false, &git.CloneOptions{ + URL: RepoUrl, + }) + if err != nil { + return nil, nil, err + } + } + + // The BoardIds are applied in the NewADJ function by the getBoardIds function + info, err := os.ReadFile(RepoPath + "general_info.json") + if err != nil { + return nil, nil, err + } + + boardsList, err := os.ReadFile(RepoPath + "boards.json") + if err != nil { + return nil, nil, err + } + + return info, boardsList, nil +} + +func checkRepo() bool { + if _, err := os.Stat(RepoPath); os.IsNotExist(err) { + return false + } + + return true +} + +func getBoards(boardsList map[string]string) (map[string]Board, error) { + boards := make(map[string]Board, len(boardsList)) + for boardName, boardPath := range boardsList { + fullPath := path.Join(RepoPath, boardPath) + boardRaw, err := os.ReadFile(fullPath) + if err != nil { + return nil, err + } + + var boardJSON BoardJSON + if err = json.Unmarshal(boardRaw, &boardJSON); err != nil { + return nil, err + } + + measPathsFr := make([]string, 0) + for _, measPath := range boardJSON.MeasurementsPaths { + measPathsFr = append(measPathsFr, path.Join(RepoPath, "boards", boardName, measPath)) + } + boardJSON.MeasurementsPaths = measPathsFr + + packetPathsFr := make([]string, 0) + for _, packetPath := range boardJSON.PacketsPaths { + packetPathsFr = append(packetPathsFr, path.Join(RepoPath, "boards", boardName, packetPath)) + } + boardJSON.PacketsPaths = packetPathsFr + + board := Board{ + Name: boardName, + IP: boardJSON.IP, + } + board.Packets, err = getBoardPackets(boardJSON.PacketsPaths) + if err != nil { + return nil, err + } + + board.Measurements, err = getBoardMeasurements(boardJSON.MeasurementsPaths) + if err != nil { + return nil, err + } + board.LookUpMeasurements = make(map[string]Measurement, len(board.Measurements)) + + for _, measurement := range board.Measurements { + board.LookUpMeasurements[measurement.Id] = measurement + } + board.Structures = getBoardStructures(board) + + boards[boardName] = board + } + + return boards, nil +} + +func getBoardPackets(packetsPaths []string) ([]Packet, error) { + packets := make([]Packet, 0) + for _, packetPath := range packetsPaths { + if _, err := os.Stat(packetPath); os.IsNotExist(err) { + continue + } + + packetRaw, err := os.ReadFile(packetPath) + if err != nil { + return nil, err + } + + // Magic happens here + type PacketJSON struct { + Packet []Packet `json:"packets"` + } + + packetsJSON := PacketJSON{} + if err = json.Unmarshal(packetRaw, &packetsJSON); err != nil { + return nil, err + } + for _, packetTMP := range packetsJSON.Packet { + packets = append(packets, packetTMP) + } + } + + return packets, nil +} + +func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { + measurements := make([]Measurement, 0) + + for _, measurementPath := range measurementsPaths { + if _, err := os.Stat(measurementPath); os.IsNotExist(err) { + continue + } + + measurementRaw, err := os.ReadFile(measurementPath) + if err != nil { + return nil, err + } + + // Absolutely doing tricks on it AGAIN - @msanlli + type MeasurementJSON struct { + Measurements []Measurement `json:"measurements"` + } + + measurementsJSON := MeasurementJSON{} + if err = json.Unmarshal(measurementRaw, &measurementsJSON); err != nil { + return nil, err + } + for _, measurementTMP := range measurementsJSON.Measurements { + measurements = append(measurements, measurementTMP) + } + } + + return measurements, nil +} + +func getBoardIds(boards map[string]string) (map[string]uint16, error) { + boardIds := make(map[string]uint16, len(boards)) + for boardName, boardPath := range boards { + fullPath := path.Join(RepoPath, boardPath) + boardRaw, err := os.ReadFile(fullPath) + if err != nil { + return nil, err + } + + var boardJSON BoardJSON + if err = json.Unmarshal(boardRaw, &boardJSON); err != nil { + return nil, err + } + + boardIds[boardName] = boardJSON.ID + } + + return boardIds, nil +} + +func getBoardStructures(board Board) []Structure { + structures := make([]Structure, len(board.Packets)) + for i, packet := range board.Packets { + structures[i] = Structure{ + Packet: packet, + Measurements: board.Measurements, + } + } + + return structures +} + +func getAddresses(boards map[string]Board) (map[string]string, error) { + addresses := make(map[string]string, len(boards)) + for boardName, board := range boards { + addresses[boardName] = board.IP + } + + return addresses, nil +} diff --git a/backend/pkg/adj/models.go b/backend/pkg/adj/models.go new file mode 100644 index 000000000..f0ad09738 --- /dev/null +++ b/backend/pkg/adj/models.go @@ -0,0 +1,63 @@ +package adj + +import "github.com/HyperloopUPV-H8/h9-backend/internal/utils" + +type ADJ struct { + Info Info + Boards map[string]Board +} + +type InfoJSON struct { + Ports map[string]uint16 `json:"ports"` + Addresses map[string]string + Units map[string]string `json:"units"` + MessageIds map[string]uint16 `json:"message_ids"` + BoardIds map[string]uint16 +} + +type Info struct { + Ports map[string]uint16 + Addresses map[string]string + Units map[string]utils.Operations + MessageIds map[string]uint16 + BoardIds map[string]uint16 +} + +type BoardJSON struct { + ID uint16 `json:"board_id"` + IP string `json:"board_ip"` + MeasurementsPaths []string `json:"measurements"` + PacketsPaths []string `json:"packets"` +} + +type Board struct { + Name string + IP string + Packets []Packet + Measurements []Measurement + Structures []Structure + LookUpMeasurements map[string]Measurement +} + +type Packet struct { + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Variables []Measurement `json:"variables"` +} + +type Measurement struct { + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + PodUnits string `json:"podUnits"` + DisplayUnits string `json:"displayUnits"` + SafeRange []*float64 `json:"safeRange"` + WarningRange []*float64 `json:"warningRange"` + EnumValues []string `json:"enumValues"` +} + +type Structure struct { + Packet Packet + Measurements []Measurement +} diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go new file mode 100644 index 000000000..4144a379e --- /dev/null +++ b/packet-sender/PacketGenerator.go @@ -0,0 +1,279 @@ +package main + +import ( + "bytes" + "encoding/binary" + "log" + "math" + "math/rand" + "strconv" + "strings" + "time" + + "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" +) + +type PacketGenerator struct { + packets []Packet +} + +func New() PacketGenerator { + adj, err := adj.NewADJ() + if err != nil { + log.Fatalf("Failed to load ADJ: %v\n", err) + } + + packets := make([]Packet, 0) + + for _, board := range adj.Boards { + for _, packet := range board.Packets { + if packet.Type != "data" { + continue + } + + id, err := strconv.ParseUint(packet.Id, 10, 16) + if err != nil { + log.Fatalf("data transfer: AddPacket: %s\n", err) + } + + packets = append(packets, Packet{ + ID: uint16(id), + Name: packet.Name, + HexValue: "", + Count: 0, + CycleTime: 0, + Measurements: getMeasurements(packet.Variables), + }) + } + } + + pg := PacketGenerator{ + packets: packets, + } + + return pg +} + +func (pg *PacketGenerator) CreateRandomPacket() []byte { + randomIndex := rand.Int63n(int64(len(pg.packets))) + randomPacket := pg.packets[randomIndex] + + buff := bytes.NewBuffer(make([]byte, 0)) + + binary.Write(buff, binary.LittleEndian, randomPacket.ID) + + for _, measurement := range randomPacket.Measurements { + if strings.Contains(measurement.Type, "enum") { + binary.Write(buff, binary.LittleEndian, uint8(rand.Int63n(int64(len(strings.Split(strings.ReplaceAll(strings.TrimSuffix(strings.TrimPrefix(measurement.Type, "enum("), ")"), " ", ""), ",")))))) + } else if measurement.Type == "bool" { + binary.Write(buff, binary.LittleEndian, rand.Int31n(2) == 1) + } else if measurement.Type != "string" { + var number float64 + if len(measurement.WarningRange) == 0 { + number = mapNumberToRange(rand.Float64(), measurement.WarningRange, measurement.Type) + } else { + number = mapNumberToRange(rand.Float64(), []float64{measurement.WarningRange[0] * 0.8, measurement.WarningRange[1] * 1.2}, measurement.Type) + } + writeNumberAsBytes(number, measurement.Type, buff) + } else { + return nil + } + + } + + return buff.Bytes() +} + +func (pg *PacketGenerator) CreateSinePacket() []byte { + randomIndex := rand.Int63n(int64(len(pg.packets))) + randomPacket := pg.packets[randomIndex] + + buff := bytes.NewBuffer(make([]byte, 0)) + + binary.Write(buff, binary.LittleEndian, randomPacket.ID) + + for _, measurement := range randomPacket.Measurements { + if strings.Contains(measurement.Type, "enum") { + binary.Write(buff, binary.LittleEndian, uint8(1)) + } else if measurement.Type != "string" { + sineValue := generateSinusoidalValue() + number := mapNumberToRange(sineValue, measurement.SafeRange, measurement.Type) + writeNumberAsBytes(number, measurement.Type, buff) + } else { + return nil + } + } + + return buff.Bytes() +} + +func generateSinusoidalValue() float64 { + amplitude := 1.0 + frequency := 0.01 + phase := 0.0 + + value := amplitude * math.Sin(2*math.Pi*frequency*float64(time.Now().Unix())+phase) + return value +} + +func mapNumberToRange(number float64, numberRange []float64, numberType string) float64 { + if len(numberRange) == 0 { + return number * getTypeMaxValue(numberType) + } else { + return (number * (numberRange[1] - numberRange[0])) + numberRange[0] + } +} + +func getTypeMaxValue(numberType string) float64 { + switch numberType { + case "uint8": + return math.MaxUint8 + case "uint16": + return math.MaxUint16 + case "uint32": + return math.MaxUint32 + case "uint64": + return math.MaxUint64 + case "int8": + return math.MaxInt8 + case "int16": + return math.MaxInt16 + case "int32": + return math.MaxInt32 + case "int64": + return math.MaxInt64 + case "float32": + return math.MaxFloat32 + case "float64": + return math.MaxFloat64 + case "bool": + return math.MaxUint8 + default: + return math.MaxUint8 + } +} + +func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { + switch numberType { + case "uint8": + binary.Write(buff, binary.LittleEndian, uint8(number)) + case "uint16": + binary.Write(buff, binary.LittleEndian, uint16(number)) + + case "uint32": + binary.Write(buff, binary.LittleEndian, uint32(number)) + + case "uint64": + binary.Write(buff, binary.LittleEndian, uint64(number)) + + case "int8": + binary.Write(buff, binary.LittleEndian, int8(number)) + + case "int16": + binary.Write(buff, binary.LittleEndian, int16(number)) + + case "int32": + binary.Write(buff, binary.LittleEndian, int32(number)) + + case "int64": + binary.Write(buff, binary.LittleEndian, int64(number)) + + case "float32": + binary.Write(buff, binary.LittleEndian, float32(number)) + + case "float64": + binary.Write(buff, binary.LittleEndian, number) + + case "bool": + binary.Write(buff, binary.LittleEndian, uint8(number)) + + default: + binary.Write(buff, binary.LittleEndian, uint8(number)) + } +} + +func (pg *PacketGenerator) AddPacket(boardName string, packet adj.Packet) { + if packet.Type != "data" { + return + } + + id, err := strconv.ParseUint(packet.Id, 10, 16) + if err != nil { + log.Fatalf("data transfer: AddPacket: %s\n", err) + } + + pg.packets = append(pg.packets, Packet{ + ID: uint16(id), + Name: packet.Name, + HexValue: "", + Count: 0, + CycleTime: 0, + Measurements: getMeasurements(packet.Variables), + }) + +} + +func getMeasurements(variables []adj.Measurement) []Measurement { + measurements := make([]Measurement, 0, len(variables)) + for _, value := range variables { + measurements = append(measurements, + Measurement{ + ID: value.Id, + Name: value.Name, + Type: value.Type, + //TODO: make sure added property (Value) doesn't break stuff + Value: getDefaultValue(value.Type), + Units: value.DisplayUnits, + SafeRange: parseRange(value.SafeRange), + WarningRange: parseRange(value.WarningRange), + }, + ) + } + return measurements +} + +func parseRange(literal []*float64) []float64 { + if len(literal) == 0 { + return make([]float64, 0) + } + + numRange := make([]float64, 0) + + for _, val := range literal { + if val != nil { + numRange = append(numRange, *val) + } + } + + return numRange +} + +func getDefaultValue(valueType string) any { + switch valueType { + case "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64", "float32", "float64": + return 0 + case "bool": + return false + default: + return "Default" + } +} + +type Packet struct { + ID uint16 `json:"id"` + Name string `json:"name"` + HexValue string `json:"hexValue"` + Count uint16 `json:"count"` + CycleTime int64 `json:"cycleTime"` + Measurements []Measurement `json:"measurements"` +} + +type Measurement struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Value any `json:"value"` + Units string `json:"units"` + SafeRange []float64 `json:"safeRange"` + WarningRange []float64 `json:"warningRange"` +} diff --git a/packet-sender/go.mod b/packet-sender/go.mod new file mode 100644 index 000000000..086ae203e --- /dev/null +++ b/packet-sender/go.mod @@ -0,0 +1,37 @@ +module packet_sender + +go 1.21.3 + +toolchain go1.23.1 + +require ( + github.com/HyperloopUPV-H8/h9-backend v0.0.0-00010101000000-000000000000 + github.com/joho/godotenv v1.4.0 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.12.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/tools v0.13.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect +) + +replace github.com/HyperloopUPV-H8/h9-backend => ../backend diff --git a/packet-sender/go.sum b/packet-sender/go.sum new file mode 100644 index 000000000..b558401bf --- /dev/null +++ b/packet-sender/go.sum @@ -0,0 +1,147 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/packet-sender/main.go b/packet-sender/main.go new file mode 100644 index 000000000..cd308029f --- /dev/null +++ b/packet-sender/main.go @@ -0,0 +1,142 @@ +package main + +import ( + "fmt" + "log" + "net" + "os" + "os/signal" + "time" +) + +const ( + lip string = "127.0.0.3" + lport uint16 = 8000 + rip string = "127.0.0.4" + rport uint16 = 8000 +) + +/* package main + +import ( + "encoding/json" + "fmt" + "log" + + "github.com/HyperloopUPV-H8/h9-backend/internal/adj" +) + +func main() { + + adjInstance, err := adj.NewADJ() + if err != nil { + log.Fatalf("Error initializing ADJ: %v", err) + } + + + packets := generatePackets(adjInstance) + + + output, err := json.MarshalIndent(packets, "", " ") + if err != nil { + log.Fatalf("Error marshalling packets: %v", err) + } + + fmt.Println(string(output)) +} + + +func generatePackets(adjInstance adj.ADJ) []adj.Packet { + var allPackets []adj.Packet + + for _, board := range adjInstance.Boards { + for _, packet := range board.Packets { + allPackets = append(allPackets, packet) + } + } + + return allPackets +}*/ + +func main() { + _ = createListener(lip, lport, rip, rport) + conn := getConn(lip, lport, rip, rport) + defer conn.Close() + + packetGenerator := New() + fmt.Println("Sending packets") + + count := make(chan struct{}, 10000) + start := time.Now() + prev := time.Now() + go func() { + for { + packet := packetGenerator.CreateRandomPacket() + fmt.Println(time.Since(prev)) + prev = time.Now() + + if packet == nil { + continue + } + _, err := conn.Write(packet) + + if err != nil { + continue + } + + count <- struct{}{} + } + + }() + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + c := 0 + for { + select { + case <-count: + c++ + case <-interrupt: + fmt.Printf("%d, %v\n", c, time.Since(start)) + return + } + } + +} + +func getConn(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { + laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) + if err != nil { + log.Fatalf("resolve address: %s\n", err) + } + raddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) + if err != nil { + log.Fatalf("resolve address: %s\n", err) + } + conn, err := net.DialUDP("udp", laddr, raddr) + + if err != nil { + log.Fatal("Error creating udp connection", err) + } + + return conn +} + +func createListener(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { + _, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) + if err != nil { + log.Fatalf("resolve address: %s\n", err) + } + laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) + if err != nil { + log.Fatalf("resolve address: %s\n", err) + } + listener, err := net.ListenUDP("udp", laddr) + + if err != nil { + log.Fatal("Error creating udp connection", err) + } + + return listener +}