From d212e13396ab0b663bcf1575ede5870802c77af5 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 5 Jan 2025 17:15:43 +0100 Subject: [PATCH 1/7] Func modifications --- packet-sender/PacketGenerator.go | 52 ++++++++++---------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 53693aaf2..125d9057f 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,9 +10,7 @@ import ( "strings" "time" - excelAdapter "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/internals" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/models" + "github.com/HyperloopUPV-H8/software/backend/internal/adj" ) type PacketGenerator struct { @@ -20,49 +18,31 @@ type PacketGenerator struct { } func New() PacketGenerator { - excelAdapter := excelAdapter.New(excelAdapter.ExcelAdapterConfig{ - Download: internals.DownloadConfig{ - Id: "1NyNaAOw_6iWtnCpEg73AtSSFx1fMdhPRmmdOhjgjCZI", - Path: ".", - Name: "ade.xlsx", - }, - Parse: internals.ParseConfig{ - GlobalSheetPrefix: "GLOBAL ", - BoardSheetPrefix: "BOARD ", - TablePrefix: "[TABLE] ", - Global: internals.GlobalParseConfig{ - AddressTable: "addresses", - BackendKey: "Backend", - BLCUAddressKey: "BLCU", - UnitsTable: "units", - PortsTable: "ports", - BoardIdsTable: "board_ids", - MessageIdsTable: "message_ids", - }, - }, - }) + adj, err := adj.NewADJ() + if err != nil { + log.Fatalf("Failed to load ADJ: %v\n", err) + } - boards := excelAdapter.GetBoards() packets := make([]Packet, 0) - for _, board := range boards { + for _, board := range adj.Boards { for _, packet := range board.Packets { - if packet.Description.Type != "data" { + if packet.Type != "data" { continue } - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) + 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.Description.Name, + Name: packet.Name, HexValue: "", Count: 0, CycleTime: 0, - Measurements: getMeasurements(packet.Values), + Measurements: getMeasurements(packet.Variables), }) } } @@ -212,19 +192,19 @@ func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { } } -func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { - if packet.Description.Type != "data" { +func (pg *PacketGenerator) AddPacket(boardName string, packet adj.Packet) { + if packet.Type != "data" { return } - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) + 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.Description.Name, + Name: packet.Name, HexValue: "", Count: 0, CycleTime: 0, @@ -233,7 +213,7 @@ func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { } -func getMeasurements(values []models.Value) []Measurement { +func getMeasurements(values []adj.Measurement) []Measurement { measurements := make([]Measurement, 0, len(values)) for _, value := range values { measurements = append(measurements, @@ -252,7 +232,7 @@ func getMeasurements(values []models.Value) []Measurement { return measurements } -func parseRange(literal string) []float64 { +func parseRange(literal string) []float64 { // adaptar con rangos del ADJ?? if literal == "" { return make([]float64, 0) } From a8930cb0f4aa61807c67872388da0bfaa298a4f9 Mon Sep 17 00:00:00 2001 From: Jesus Date: Mon, 6 Jan 2025 19:43:48 +0100 Subject: [PATCH 2/7] Module import change --- packet-sender/PacketGenerator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 125d9057f..04f9a3ed2 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/HyperloopUPV-H8/software/backend/internal/adj" + "github.com/HyperloopUPV-H8/h9-backend/internal/adj" ) type PacketGenerator struct { From bac1c3ebb53806ec827c4afad3ffdd5a04e18e11 Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 29 Jan 2025 18:54:30 +0100 Subject: [PATCH 3/7] Correct import + copy adj in pkg --- backend/pkg/adj/adj.go | 258 +++++++++++++++++++++++++++++++ backend/pkg/adj/models.go | 63 ++++++++ packet-sender/PacketGenerator.go | 2 +- 3 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 backend/pkg/adj/adj.go create mode 100644 backend/pkg/adj/models.go 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 index 04f9a3ed2..72b54d920 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/HyperloopUPV-H8/h9-backend/internal/adj" + "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" ) type PacketGenerator struct { From b2d63d0d4d389fdcc4f55925579203b925d5e770 Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 6 Feb 2025 18:03:21 +0100 Subject: [PATCH 4/7] update --- packet-sender/PacketGenerator.go | 40 ++++++++---------------------- packet-sender/main.go | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 72b54d920..4144a379e 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -208,17 +208,17 @@ func (pg *PacketGenerator) AddPacket(boardName string, packet adj.Packet) { HexValue: "", Count: 0, CycleTime: 0, - Measurements: getMeasurements(packet.Values), + Measurements: getMeasurements(packet.Variables), }) } -func getMeasurements(values []adj.Measurement) []Measurement { - measurements := make([]Measurement, 0, len(values)) - for _, value := range values { +func getMeasurements(variables []adj.Measurement) []Measurement { + measurements := make([]Measurement, 0, len(variables)) + for _, value := range variables { measurements = append(measurements, Measurement{ - ID: value.ID, + ID: value.Id, Name: value.Name, Type: value.Type, //TODO: make sure added property (Value) doesn't break stuff @@ -232,37 +232,17 @@ func getMeasurements(values []adj.Measurement) []Measurement { return measurements } -func parseRange(literal string) []float64 { // adaptar con rangos del ADJ?? - if literal == "" { +func parseRange(literal []*float64) []float64 { + if len(literal) == 0 { return make([]float64, 0) } - strRange := strings.Split(strings.TrimSuffix(strings.TrimPrefix(strings.Replace(literal, " ", "", -1), "["), "]"), ",") - - if len(strRange) != 2 { - log.Fatalf("pod data: parseRange: invalid range %s\n", literal) - } - numRange := make([]float64, 0) - if strRange[0] != "" { - lowerBound, errLowerBound := strconv.ParseFloat(strRange[0], 64) - - if errLowerBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, lowerBound) - } - - if strRange[1] != "" { - upperBound, errUpperBound := strconv.ParseFloat(strRange[1], 64) - - if errUpperBound != nil { - log.Fatal("error parsing lower bound") + for _, val := range literal { + if val != nil { + numRange = append(numRange, *val) } - - numRange = append(numRange, upperBound) } return numRange diff --git a/packet-sender/main.go b/packet-sender/main.go index 4c5abcc19..dc920449d 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -18,6 +18,48 @@ const ( rport uint16 = 50400 ) +/* 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() { err := godotenv.Load(".env") From b3d09a4233ed5739d231a937099ed2b724831fb1 Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 6 Feb 2025 18:07:32 +0100 Subject: [PATCH 5/7] Port solution for windows --- packet-sender/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index dc920449d..b7383c77e 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -13,9 +13,9 @@ import ( const ( lip string = "127.0.0.3" - lport uint16 = 50400 + lport uint16 = 3000 rip string = "127.0.0.4" - rport uint16 = 50400 + rport uint16 = 3000 ) /* package main From c1f026cc5feca58cb3204b568151b42e02a94fb4 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 8 Feb 2025 00:25:34 +0100 Subject: [PATCH 6/7] Change port (front) --- packet-sender/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index b7383c77e..9e367c0b0 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -13,9 +13,9 @@ import ( const ( lip string = "127.0.0.3" - lport uint16 = 3000 + lport uint16 = 8000 rip string = "127.0.0.4" - rport uint16 = 3000 + rport uint16 = 8000 ) /* package main From a519084cb358e60813df4afc9964ee33a35de5ad Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 8 Feb 2025 00:58:35 +0100 Subject: [PATCH 7/7] Remove.env from main --- packet-sender/main.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index 9e367c0b0..cd308029f 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -7,8 +7,6 @@ import ( "os" "os/signal" "time" - - "github.com/joho/godotenv" ) const ( @@ -61,12 +59,6 @@ func generatePackets(adjInstance adj.ADJ) []adj.Packet { }*/ func main() { - err := godotenv.Load(".env") - - if err != nil { - log.Fatal("Error loading .env", err) - } - _ = createListener(lip, lport, rip, rport) conn := getConn(lip, lport, rip, rport) defer conn.Close()