From 70ef7880ef8233f0670dea7c05b92ec4d7b80f08 Mon Sep 17 00:00:00 2001 From: Andres de la Torre Mora Date: Sun, 16 Feb 2025 12:35:20 +0100 Subject: [PATCH 01/20] solved bug with uint32 orders --- .../Orders/BoardOrders/OrderForm/Fields/Field/validation.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/Fields/Field/validation.ts b/ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/Fields/Field/validation.ts index aea50a06b..975d7e568 100644 --- a/ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/Fields/Field/validation.ts +++ b/ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/Fields/Field/validation.ts @@ -72,11 +72,13 @@ function stringIsNumber(valueStr: string, numberType: NumericType): boolean { } function checkUnsignedIntegerOverflow(value: number, bits: number): boolean { - return value >= 0 && value < 1 << bits; //FIXME: aƱadir unos + return value >= 0 && value <= Math.pow(2, bits) - 1; } function checkSignedIntegerOverflow(value: number, bits: number): boolean { - return value >= -1 << (bits - 1) && value < 1 << (bits - 1); + const min = -Math.pow(2, bits - 1); + const max = Math.pow(2, bits - 1) - 1; + return value >= min && value <= max; } function checkFloatOverflow(value: number): boolean { From faa93386c9afa43f2110abfac22769c4c165e451 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 16 Feb 2025 16:06:16 +0100 Subject: [PATCH 02/20] adj repo name change --- .gitmodules | 6 +++--- backend/cmd/{JSON_ADE => adj} | 0 backend/internal/adj/adj.go | 4 ++-- backend/pkg/adj/adj.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename backend/cmd/{JSON_ADE => adj} (100%) diff --git a/.gitmodules b/.gitmodules index d1a8618fc..a127c694b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ -[submodule "backend/cmd/JSON_ADE"] - path = backend/cmd/JSON_ADE - url = https://github.com/HyperloopUPV-H8/JSON_ADE.git +[submodule "backend/cmd/adj"] + path = backend/cmd/adj + url = https://github.com/HyperloopUPV-H8/adj.git branch = main diff --git a/backend/cmd/JSON_ADE b/backend/cmd/adj similarity index 100% rename from backend/cmd/JSON_ADE rename to backend/cmd/adj diff --git a/backend/internal/adj/adj.go b/backend/internal/adj/adj.go index 7a6ba9ea3..cab3bac89 100644 --- a/backend/internal/adj/adj.go +++ b/backend/internal/adj/adj.go @@ -11,8 +11,8 @@ import ( ) 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 + RepoUrl = "https://github.com/HyperloopUPV-H8/adj.git" // URL of the ADJ repository + RepoPath = "./adj/" // Path where the ADJ repository is cloned ) func NewADJ(AdjBranch string) (ADJ, error) { diff --git a/backend/pkg/adj/adj.go b/backend/pkg/adj/adj.go index 52c02d2e1..9e57ecd3c 100644 --- a/backend/pkg/adj/adj.go +++ b/backend/pkg/adj/adj.go @@ -10,8 +10,8 @@ import ( ) 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 + RepoUrl = "https://github.com/HyperloopUPV-H8/adj.git" // URL of the ADJ repository + RepoPath = "./adj/" // Path where the ADJ repository is cloned ) func NewADJ() (ADJ, error) { From 41cb07ded65a20f8d46696925f396a3f43fa8001 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 16 Feb 2025 16:08:14 +0100 Subject: [PATCH 03/20] adj repo name change --- backend/cmd/testadj.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/cmd/testadj.py b/backend/cmd/testadj.py index 72ba3c160..82802cd34 100644 --- a/backend/cmd/testadj.py +++ b/backend/cmd/testadj.py @@ -115,7 +115,7 @@ def validate_json_folder(folder_path): print(f"Error al procesar el archivo {full_path}: {e}") -if os.path.exists('./JSON_ADE/') == False: - print("La carpeta JSON_ADE no existe") +if os.path.exists('./adj/') == False: + print("La carpeta ./adj/ no existe") if __name__ == "__main__": - validate_json_folder("./JSON_ADE/") + validate_json_folder("./adj/") From bb370e48b588903cb426e118910071f69493e58d Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 16 Feb 2025 19:01:57 +0100 Subject: [PATCH 04/20] remove adj test prints --- backend/internal/adj/adj.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/backend/internal/adj/adj.go b/backend/internal/adj/adj.go index cab3bac89..3a61c371f 100644 --- a/backend/internal/adj/adj.go +++ b/backend/internal/adj/adj.go @@ -132,15 +132,11 @@ func updateRepo(AdjBranch string) error { branch := head.Name().Short() - println("actual branch is: ", branch) - worktree, err := repo.Worktree() if err != nil { return err } - println(head.Name().Short(), AdjBranch) - if branch != AdjBranch { localBranchRef := plumbing.NewBranchReferenceName(AdjBranch) _, err = repo.Reference(localBranchRef, false) @@ -155,7 +151,7 @@ func updateRepo(AdjBranch string) error { Branch: localBranchRef, Create: true, Force: true, - Hash: remoteRef.Hash(), + Hash: remoteRef.Hash(), }) if err != nil { println(err.Error()) @@ -164,7 +160,7 @@ func updateRepo(AdjBranch string) error { } else { err = worktree.Checkout(&git.CheckoutOptions{ Branch: localBranchRef, - Force: true, + Force: true, }) } } From edb1c0b82d2621a01573a1021a7f19cf357518e5 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 20 Feb 2025 17:46:11 +0100 Subject: [PATCH 05/20] add python files to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8c6e03892..769d96cab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ build profiles backend/cmd/cmd +.ropeproject # MacOS Files .DS_Store From bef6519028bcf9e3c9cc5a01c7527b525714e4f6 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 20 Feb 2025 18:00:43 +0100 Subject: [PATCH 06/20] modulise adj git handling --- backend/internal/adj/git.go | 98 +++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 backend/internal/adj/git.go diff --git a/backend/internal/adj/git.go b/backend/internal/adj/git.go new file mode 100644 index 000000000..490955117 --- /dev/null +++ b/backend/internal/adj/git.go @@ -0,0 +1,98 @@ +package adj + +import ( + "os" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" +) + +// WARNING: Doing tricks on it +func updateRepo(AdjBranch string) error { + var repo *git.Repository + var err error + + if AdjBranch == "" { + // Makes use of submodule + return nil + } else { + if _, err = os.Stat(RepoPath); os.IsNotExist(err) { + repo, err = git.PlainClone(RepoPath, false, &git.CloneOptions{ + URL: RepoUrl, + ReferenceName: plumbing.NewBranchReferenceName(AdjBranch), + SingleBranch: true, + Depth: 1, + }) + if err != nil { + return err + } + } else { + repo, err = git.PlainOpen(RepoPath) + if err != nil { + return err + } + } + + err = repo.Fetch(&git.FetchOptions{ + RemoteName: "origin", + Force: true, + }) + if err != nil && err != git.NoErrAlreadyUpToDate { + return err + } + + head, err := repo.Head() + if err != nil { + return err + } + + branch := head.Name().Short() + + worktree, err := repo.Worktree() + if err != nil { + return err + } + + if branch != AdjBranch { + localBranchRef := plumbing.NewBranchReferenceName(AdjBranch) + _, err = repo.Reference(localBranchRef, false) + if err != nil { + remoteBranchRef := plumbing.NewRemoteReferenceName("origin", AdjBranch) + remoteRef, err2 := repo.Reference(remoteBranchRef, true) + if err2 != nil { + return err2 + } + + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: localBranchRef, + Create: true, + Force: true, + Hash: remoteRef.Hash(), + }) + if err != nil { + println(err.Error()) + return err + } + } else { + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: localBranchRef, + Force: true, + }) + } + } + + err = worktree.Pull(&git.PullOptions{ + RemoteName: "origin", + SingleBranch: true, + }) + if err != nil { + if err == git.NoErrAlreadyUpToDate { + return nil + } else { + return err + } + } + } + + return nil +} From bd783a03a6291be823705f8808eaf5ea2f1a4185 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 20 Feb 2025 18:01:21 +0100 Subject: [PATCH 07/20] new adj models --- backend/internal/adj/models.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/internal/adj/models.go b/backend/internal/adj/models.go index f0ad09738..f7c2edab1 100644 --- a/backend/internal/adj/models.go +++ b/backend/internal/adj/models.go @@ -57,6 +57,22 @@ type Measurement struct { EnumValues []string `json:"enumValues"` } +type MeasurementJSON struct { + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + PodUnits string `json:"podUnits"` + DisplayUnits string `json:"displayUnits"` + Below *float64 `json:"below"` + Above *float64 `json:"above"` + EnumValues []string `json:"enumValues"` +} + +type Range struct { + Warning *float64 `json:"warning"` + Safe *float64 `json:"safe"` +} + type Structure struct { Packet Packet Measurements []Measurement From 146116cfbfb69ea466fb44de99ac0ea0539a1776 Mon Sep 17 00:00:00 2001 From: msanlli Date: Fri, 21 Feb 2025 14:59:21 +0100 Subject: [PATCH 08/20] adj boards module --- backend/internal/adj/boards.go | 168 +++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 backend/internal/adj/boards.go diff --git a/backend/internal/adj/boards.go b/backend/internal/adj/boards.go new file mode 100644 index 000000000..0132c2ddb --- /dev/null +++ b/backend/internal/adj/boards.go @@ -0,0 +1,168 @@ +package adj + +import ( + "encoding/json" + "os" + "path" +) + +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) { + measurementsTMP := make([]MeasurementJSON, 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 MeasurementsJSON struct { + Measurements []MeasurementJSON `json:"measurements"` + } + + measurementsJSON := MeasurementsJSON{} + if err = json.Unmarshal(measurementRaw, &measurementsJSON); err != nil { + return nil, err + } + for _, measurementTMP := range measurementsJSON.Measurements { + measurementsTMP = append(measurementsTMP, measurementTMP) + } + } + + measurements, err := getRanges(measurementsTMP) + if err != nil { + return nil, err + } + + return measurements, nil +} + +func getRanges(measurementsTMP []MeasurementJSON) ([]Measurement, error) { + return nil, 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 +} From 34bf1f0bbb6920b5291e47a1239dde691feade2c Mon Sep 17 00:00:00 2001 From: msanlli Date: Fri, 21 Feb 2025 16:26:07 +0100 Subject: [PATCH 09/20] adj out_of_range model --- backend/internal/adj/models.go | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/backend/internal/adj/models.go b/backend/internal/adj/models.go index f7c2edab1..b027e5e60 100644 --- a/backend/internal/adj/models.go +++ b/backend/internal/adj/models.go @@ -58,14 +58,25 @@ type Measurement struct { } type MeasurementJSON struct { - Id string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - PodUnits string `json:"podUnits"` - DisplayUnits string `json:"displayUnits"` - Below *float64 `json:"below"` - Above *float64 `json:"above"` - EnumValues []string `json:"enumValues"` + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + PodUnits string `json:"podUnits"` + DisplayUnits string `json:"displayUnits"` + Below BelowOrAbove `json:"below"` + Above BelowOrAbove `json:"above"` + OutOfRange OutOfRange `json:"out_of_range"` + EnumValues []string `json:"enumValues"` +} + +type BelowOrAbove struct { + Safe *float64 `json:"safe"` + Warning *float64 `json:"warning"` +} + +type OutOfRange struct { + Safe []*float64 `json:"safe"` + Warning []*float64 `json:"warning"` } type Range struct { From e853d3c6a7f3ccc6bdedaf2ca2a3b10825256698 Mon Sep 17 00:00:00 2001 From: msanlli Date: Fri, 21 Feb 2025 18:38:35 +0100 Subject: [PATCH 10/20] adj module logic for new adj --- backend/internal/adj/adj.go | 245 --------------------------------- backend/internal/adj/boards.go | 44 +++++- backend/internal/adj/models.go | 4 +- 3 files changed, 43 insertions(+), 250 deletions(-) diff --git a/backend/internal/adj/adj.go b/backend/internal/adj/adj.go index 3a61c371f..7708aaa35 100644 --- a/backend/internal/adj/adj.go +++ b/backend/internal/adj/adj.go @@ -3,11 +3,8 @@ package adj import ( "encoding/json" "os" - "path" "github.com/HyperloopUPV-H8/h9-backend/internal/utils" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" ) const ( @@ -90,245 +87,3 @@ func downloadADJ(AdjBranch string) (json.RawMessage, json.RawMessage, error) { return info, boardsList, nil } - -// WARNING: Doing tricks on it -func updateRepo(AdjBranch string) error { - var repo *git.Repository - var err error - - if AdjBranch == "" { - // Makes use of submodule - return nil - } else { - if _, err = os.Stat(RepoPath); os.IsNotExist(err) { - repo, err = git.PlainClone(RepoPath, false, &git.CloneOptions{ - URL: RepoUrl, - ReferenceName: plumbing.NewBranchReferenceName(AdjBranch), - SingleBranch: true, - Depth: 1, - }) - if err != nil { - return err - } - } else { - repo, err = git.PlainOpen(RepoPath) - if err != nil { - return err - } - } - - err = repo.Fetch(&git.FetchOptions{ - RemoteName: "origin", - Force: true, - }) - if err != nil && err != git.NoErrAlreadyUpToDate { - return err - } - - head, err := repo.Head() - if err != nil { - return err - } - - branch := head.Name().Short() - - worktree, err := repo.Worktree() - if err != nil { - return err - } - - if branch != AdjBranch { - localBranchRef := plumbing.NewBranchReferenceName(AdjBranch) - _, err = repo.Reference(localBranchRef, false) - if err != nil { - remoteBranchRef := plumbing.NewRemoteReferenceName("origin", AdjBranch) - remoteRef, err2 := repo.Reference(remoteBranchRef, true) - if err2 != nil { - return err2 - } - - err = worktree.Checkout(&git.CheckoutOptions{ - Branch: localBranchRef, - Create: true, - Force: true, - Hash: remoteRef.Hash(), - }) - if err != nil { - println(err.Error()) - return err - } - } else { - err = worktree.Checkout(&git.CheckoutOptions{ - Branch: localBranchRef, - Force: true, - }) - } - } - - err = worktree.Pull(&git.PullOptions{ - RemoteName: "origin", - SingleBranch: true, - }) - if err != nil { - if err == git.NoErrAlreadyUpToDate { - return nil - } else { - return err - } - } - } - - return nil -} - -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/internal/adj/boards.go b/backend/internal/adj/boards.go index 0132c2ddb..fb7d5b598 100644 --- a/backend/internal/adj/boards.go +++ b/backend/internal/adj/boards.go @@ -114,7 +114,7 @@ func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { } } - measurements, err := getRanges(measurementsTMP) + measurements, err := measTranslate(measurementsTMP) if err != nil { return nil, err } @@ -122,8 +122,46 @@ func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { return measurements, nil } -func getRanges(measurementsTMP []MeasurementJSON) ([]Measurement, error) { - return nil, nil +func measTranslate(measurementsTMP []MeasurementJSON) ([]Measurement, error) { + measurements := make([]Measurement, 0) + + for _, measJSON := range measurementsTMP { + safeRange, warningRange, err := getRanges(measJSON) + if err != nil { + return nil, err + } + + measurements = append(measurements, Measurement{ + Id: measJSON.Id, + Name: measJSON.Name, + Type: measJSON.Type, + PodUnits: measJSON.PodUnits, + DisplayUnits: measJSON.DisplayUnits, + EnumValues: measJSON.EnumValues, + SafeRange: safeRange, + WarningRange: warningRange, + }) + } + + return measurements, nil +} + +func getRanges(measTMP MeasurementJSON) ([]*float64, []*float64, error) { + safeRange := make([]*float64, 0) + warningRange := make([]*float64, 0) + + if measTMP.OutOfRange.Safe == nil && measTMP.OutOfRange.Warning == nil { + safeRange = append(safeRange, measTMP.Below.Safe) + safeRange = append(safeRange, measTMP.Above.Safe) + + warningRange = append(warningRange, measTMP.Below.Warning) + warningRange = append(warningRange, measTMP.Above.Warning) + } else { + safeRange = measTMP.OutOfRange.Safe + warningRange = measTMP.OutOfRange.Warning + } + + return safeRange, warningRange, nil } func getBoardIds(boards map[string]string) (map[string]uint16, error) { diff --git a/backend/internal/adj/models.go b/backend/internal/adj/models.go index b027e5e60..72be00cf9 100644 --- a/backend/internal/adj/models.go +++ b/backend/internal/adj/models.go @@ -52,9 +52,9 @@ type Measurement struct { Type string `json:"type"` PodUnits string `json:"podUnits"` DisplayUnits string `json:"displayUnits"` + EnumValues []string `json:"enumValues"` SafeRange []*float64 `json:"safeRange"` WarningRange []*float64 `json:"warningRange"` - EnumValues []string `json:"enumValues"` } type MeasurementJSON struct { @@ -63,10 +63,10 @@ type MeasurementJSON struct { Type string `json:"type"` PodUnits string `json:"podUnits"` DisplayUnits string `json:"displayUnits"` + EnumValues []string `json:"enumValues"` Below BelowOrAbove `json:"below"` Above BelowOrAbove `json:"above"` OutOfRange OutOfRange `json:"out_of_range"` - EnumValues []string `json:"enumValues"` } type BelowOrAbove struct { From 0112f6cf349962c7ace8848d30480208b98ae211 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 14:35:40 +0100 Subject: [PATCH 11/20] new adj boards logic --- backend/internal/adj/boards.go | 114 +++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 42 deletions(-) diff --git a/backend/internal/adj/boards.go b/backend/internal/adj/boards.go index fb7d5b598..dc602e65e 100644 --- a/backend/internal/adj/boards.go +++ b/backend/internal/adj/boards.go @@ -36,7 +36,8 @@ func getBoards(boardsList map[string]string) (map[string]Board, error) { Name: boardName, IP: boardJSON.IP, } - board.Packets, err = getBoardPackets(boardJSON.PacketsPaths) + + boardPackets, err := getBoardPackets(boardJSON.PacketsPaths) if err != nil { return nil, err } @@ -45,11 +46,14 @@ func getBoards(boardsList map[string]string) (map[string]Board, error) { if err != nil { return nil, err } - board.LookUpMeasurements = make(map[string]Measurement, len(board.Measurements)) + board.LookUpMeasurements = make(map[string]Measurement, len(board.Measurements)) for _, measurement := range board.Measurements { board.LookUpMeasurements[measurement.Id] = measurement } + + board.Packets = lookUpMeas(boardPackets, board.LookUpMeasurements) + board.Structures = getBoardStructures(board) boards[boardName] = board @@ -58,8 +62,25 @@ func getBoards(boardsList map[string]string) (map[string]Board, error) { return boards, nil } +func lookUpMeas(packetsTMP []Packet, lookUpMeas map[string]Measurement) []Packet { + packetsFNL := make([]Packet, 0) + for _, packetTMP := range packetsTMP { + measFNL := make([]Measurement, 0) + for _, measId := range packetTMP.VariablesIds { + meas := lookUpMeas[measId] + measFNL = append(measFNL, meas) + } + + packetTMP.Variables = measFNL + packetsFNL = append(packetsFNL, packetTMP) + } + + return packetsFNL +} + func getBoardPackets(packetsPaths []string) ([]Packet, error) { packets := make([]Packet, 0) + for _, packetPath := range packetsPaths { if _, err := os.Stat(packetPath); os.IsNotExist(err) { continue @@ -70,51 +91,43 @@ func getBoardPackets(packetsPaths []string) ([]Packet, error) { return nil, err } - // Magic happens here - type PacketJSON struct { - Packet []Packet `json:"packets"` - } + packet := make([]Packet, 0) - packetsJSON := PacketJSON{} - if err = json.Unmarshal(packetRaw, &packetsJSON); err != nil { + if err = json.Unmarshal(packetRaw, &packet); err != nil { return nil, err } - for _, packetTMP := range packetsJSON.Packet { - packets = append(packets, packetTMP) - } + + packets = append(packets, packet...) } return packets, nil } +// Absolutely doing tricks on it AGAIN, AGAIN - @msanlli func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { - measurementsTMP := make([]MeasurementJSON, 0) + measurementsJSON := make([]Measurement, 0) for _, measurementPath := range measurementsPaths { if _, err := os.Stat(measurementPath); os.IsNotExist(err) { + println("ADJ Error: Measurement file path not found") continue } + measTMP := make([]Measurement, 0) + measurementRaw, err := os.ReadFile(measurementPath) if err != nil { return nil, err } - // Absolutely doing tricks on it AGAIN - @msanlli - type MeasurementsJSON struct { - Measurements []MeasurementJSON `json:"measurements"` - } - - measurementsJSON := MeasurementsJSON{} - if err = json.Unmarshal(measurementRaw, &measurementsJSON); err != nil { + if err = json.Unmarshal(measurementRaw, &measTMP); err != nil { return nil, err } - for _, measurementTMP := range measurementsJSON.Measurements { - measurementsTMP = append(measurementsTMP, measurementTMP) - } + + measurementsJSON = append(measurementsJSON, measTMP...) } - measurements, err := measTranslate(measurementsTMP) + measurements, err := measTranslate(measurementsJSON) if err != nil { return nil, err } @@ -122,43 +135,60 @@ func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { return measurements, nil } -func measTranslate(measurementsTMP []MeasurementJSON) ([]Measurement, error) { +func measTranslate(measurementsTMP []Measurement) ([]Measurement, error) { measurements := make([]Measurement, 0) for _, measJSON := range measurementsTMP { - safeRange, warningRange, err := getRanges(measJSON) + var err error + + measJSON.SafeRange, measJSON.WarningRange, err = getRanges(measJSON) if err != nil { return nil, err } - measurements = append(measurements, Measurement{ - Id: measJSON.Id, - Name: measJSON.Name, - Type: measJSON.Type, - PodUnits: measJSON.PodUnits, - DisplayUnits: measJSON.DisplayUnits, - EnumValues: measJSON.EnumValues, - SafeRange: safeRange, - WarningRange: warningRange, - }) + measurements = append(measurements, measJSON) } return measurements, nil } -func getRanges(measTMP MeasurementJSON) ([]*float64, []*float64, error) { +func getRanges(measTMP Measurement) ([]*float64, []*float64, error) { safeRange := make([]*float64, 0) warningRange := make([]*float64, 0) if measTMP.OutOfRange.Safe == nil && measTMP.OutOfRange.Warning == nil { - safeRange = append(safeRange, measTMP.Below.Safe) - safeRange = append(safeRange, measTMP.Above.Safe) + if measTMP.Below.Safe == nil { + safeRange = nil + } else { + safeRange = append(safeRange, measTMP.Below.Safe) + } + + if measTMP.Above.Safe == nil { + safeRange = nil + } else { + safeRange = append(safeRange, measTMP.Above.Safe) + } - warningRange = append(warningRange, measTMP.Below.Warning) - warningRange = append(warningRange, measTMP.Above.Warning) + if measTMP.Below.Warning == nil { + warningRange = nil + } else { + warningRange = append(warningRange, measTMP.Below.Warning) + } + + if measTMP.Above.Warning == nil { + warningRange = nil + } else { + warningRange = append(warningRange, measTMP.Above.Warning) + } + } else if measTMP.OutOfRange.Safe == nil { + safeRange = nil + warningRange = append(warningRange, measTMP.OutOfRange.Warning...) + } else if measTMP.OutOfRange.Warning == nil { + safeRange = append(safeRange, measTMP.OutOfRange.Safe...) + warningRange = nil } else { - safeRange = measTMP.OutOfRange.Safe - warningRange = measTMP.OutOfRange.Warning + safeRange = append(safeRange, measTMP.OutOfRange.Safe...) + warningRange = append(warningRange, measTMP.OutOfRange.Warning...) } return safeRange, warningRange, nil From 90e772d4184ad78288ff5dce5a92f7e935fe3915 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 14:36:14 +0100 Subject: [PATCH 12/20] optimize adj models --- backend/internal/adj/models.go | 39 ++++++++++++---------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/backend/internal/adj/models.go b/backend/internal/adj/models.go index 72be00cf9..5619833bf 100644 --- a/backend/internal/adj/models.go +++ b/backend/internal/adj/models.go @@ -40,30 +40,22 @@ type Board struct { } type Packet struct { - Id string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Variables []Measurement `json:"variables"` + Id uint16 `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Variables []Measurement + VariablesIds []string `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"` - EnumValues []string `json:"enumValues"` - SafeRange []*float64 `json:"safeRange"` - WarningRange []*float64 `json:"warningRange"` -} - -type MeasurementJSON struct { - Id string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - PodUnits string `json:"podUnits"` - DisplayUnits string `json:"displayUnits"` - EnumValues []string `json:"enumValues"` + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + PodUnits string `json:"podUnits"` + DisplayUnits string `json:"displayUnits"` + EnumValues []string `json:"enumValues"` + SafeRange []*float64 + WarningRange []*float64 Below BelowOrAbove `json:"below"` Above BelowOrAbove `json:"above"` OutOfRange OutOfRange `json:"out_of_range"` @@ -79,11 +71,6 @@ type OutOfRange struct { Warning []*float64 `json:"warning"` } -type Range struct { - Warning *float64 `json:"warning"` - Safe *float64 `json:"safe"` -} - type Structure struct { Packet Packet Measurements []Measurement From 96847c7fa69a3ed3e491084cdfa44ca11f13bea3 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 14:36:54 +0100 Subject: [PATCH 13/20] fix pod_data measurements logic --- backend/internal/pod_data/measurement.go | 60 ++++++++++++------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/backend/internal/pod_data/measurement.go b/backend/internal/pod_data/measurement.go index b75247146..781aaa3fb 100644 --- a/backend/internal/pod_data/measurement.go +++ b/backend/internal/pod_data/measurement.go @@ -11,11 +11,11 @@ import ( const EnumType = "enum" -func getMeasurements(packet adj.Packet, globalUnits map[string]utils.Operations) ([]Measurement, error) { +func getMeasurements(measurementsADJ []adj.Measurement, globalUnits map[string]utils.Operations) ([]Measurement, error) { measurements := make([]Measurement, 0) mErrors := common.NewErrorList() - for _, adjMeas := range packet.Variables { + for _, adjMeas := range measurementsADJ { meas, err := getMeasurement(adjMeas, globalUnits) if err != nil { mErrors.Add(err) @@ -32,34 +32,34 @@ func getMeasurements(packet adj.Packet, globalUnits map[string]utils.Operations) return measurements, nil } -func getMeasurement(adeMeas adj.Measurement, globalUnits map[string]utils.Operations) (Measurement, error) { +func getMeasurement(adjMeas adj.Measurement, globalUnits map[string]utils.Operations) (Measurement, error) { var tmp Measurement var err error - if isNumeric(adeMeas.Type) { - tmp, err = getNumericMeasurement(adeMeas, globalUnits) - } else if adeMeas.Type == "bool" { - tmp = getBooleanMeasurement(adeMeas) - } else if strings.HasPrefix(adeMeas.Type, "enum") { - tmp = getEnumMeasurement(adeMeas) + + // DEBUG + println("Meas type: ", adjMeas.Type) + + if isNumeric(adjMeas.Type) { + tmp, err = getNumericMeasurement(adjMeas, globalUnits) + } else if adjMeas.Type == "bool" { + tmp = getBooleanMeasurement(adjMeas) + } else if strings.HasPrefix(adjMeas.Type, "enum") { + tmp = getEnumMeasurement(adjMeas) } else { - return nil, fmt.Errorf("type %s not recognized", adeMeas.Type) + return nil, fmt.Errorf("type %s not recognized", adjMeas.Type) } return tmp, err } -func getNumericMeasurement(adeMeas adj.Measurement, globalUnits map[string]utils.Operations) (NumericMeasurement, error) { +func getNumericMeasurement(adjMeas adj.Measurement, globalUnits map[string]utils.Operations) (NumericMeasurement, error) { measErrs := common.NewErrorList() - safeRange := adeMeas.SafeRange - - warningRange := adeMeas.WarningRange - - displayUnits, err := utils.ParseUnits(adeMeas.DisplayUnits, globalUnits) + displayUnits, err := utils.ParseUnits(adjMeas.DisplayUnits, globalUnits) if err != nil { measErrs.Add(err) } - podUnits, err := utils.ParseUnits(adeMeas.PodUnits, globalUnits) + podUnits, err := utils.ParseUnits(adjMeas.PodUnits, globalUnits) if err != nil { measErrs.Add(err) } @@ -69,31 +69,31 @@ func getNumericMeasurement(adeMeas adj.Measurement, globalUnits map[string]utils } return NumericMeasurement{ - Id: adeMeas.Id, - Name: adeMeas.Name, - Type: adeMeas.Type, + Id: adjMeas.Id, + Name: adjMeas.Name, + Type: adjMeas.Type, Units: displayUnits.Name, DisplayUnits: displayUnits, PodUnits: podUnits, - SafeRange: safeRange, - WarningRange: warningRange, + SafeRange: adjMeas.SafeRange, + WarningRange: adjMeas.WarningRange, }, nil } -func getEnumMeasurement(adeMeas adj.Measurement) EnumMeasurement { +func getEnumMeasurement(adjMeas adj.Measurement) EnumMeasurement { return EnumMeasurement{ - Id: adeMeas.Id, - Name: adeMeas.Name, + Id: adjMeas.Id, + Name: adjMeas.Name, Type: EnumType, - Options: adeMeas.EnumValues, + Options: adjMeas.EnumValues, } } -func getBooleanMeasurement(adeMeas adj.Measurement) BooleanMeasurement { +func getBooleanMeasurement(adjMeas adj.Measurement) BooleanMeasurement { return BooleanMeasurement{ - Id: adeMeas.Id, - Name: adeMeas.Name, - Type: adeMeas.Type, + Id: adjMeas.Id, + Name: adjMeas.Name, + Type: adjMeas.Type, } } From 2c3e0c6de33a038099772777757f40c2e200ce89 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 14:37:32 +0100 Subject: [PATCH 14/20] fix pod_data logic --- backend/internal/pod_data/pod_data.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/backend/internal/pod_data/pod_data.go b/backend/internal/pod_data/pod_data.go index 156bc42b8..7cafa1411 100644 --- a/backend/internal/pod_data/pod_data.go +++ b/backend/internal/pod_data/pod_data.go @@ -1,8 +1,6 @@ package pod_data import ( - "strconv" - "github.com/HyperloopUPV-H8/h9-backend/internal/utils" "github.com/HyperloopUPV-H8/h9-backend/internal/adj" @@ -39,14 +37,17 @@ func getBoard(adjBoard adj.Board, globalUnits map[string]utils.Operations) (Boar packets := make([]Packet, 0) for _, adjPacket := range adjBoard.Packets { - packet, err := getPacket(adjPacket) // Black magic fuck + packet, err := getPacket(adjPacket) if err != nil { return Board{}, err } - for idx, packetVariable := range adjPacket.Variables { - adjPacket.Variables[idx] = adjBoard.LookUpMeasurements[packetVariable.Name] + + variablesADJ := make([]adj.Measurement, 0) + for _, packetVariable := range adjPacket.Variables { + packetVariable = adjBoard.LookUpMeasurements[packetVariable.Id] + variablesADJ = append(variablesADJ, packetVariable) } - packet.Measurements, err = getMeasurements(adjPacket, globalUnits) // TODO: Check if this is correct + packet.Measurements, err = getMeasurements(variablesADJ, globalUnits) packets = append(packets, packet) } @@ -56,13 +57,8 @@ func getBoard(adjBoard adj.Board, globalUnits map[string]utils.Operations) (Boar } func getPacket(packet adj.Packet) (Packet, error) { - id, err := strconv.ParseUint(packet.Id, 10, 16) - if err != nil { - return Packet{}, err - } - return Packet{ - Id: uint16(id), + Id: packet.Id, Name: packet.Name, Type: packet.Type, HexValue: "000000", From 8a04c32ae8f04be6c44cc4bc1461e05d9e6896dd Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 14:39:04 +0100 Subject: [PATCH 15/20] remove debug prints --- backend/internal/pod_data/measurement.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/backend/internal/pod_data/measurement.go b/backend/internal/pod_data/measurement.go index 781aaa3fb..446b88611 100644 --- a/backend/internal/pod_data/measurement.go +++ b/backend/internal/pod_data/measurement.go @@ -36,9 +36,6 @@ func getMeasurement(adjMeas adj.Measurement, globalUnits map[string]utils.Operat var tmp Measurement var err error - // DEBUG - println("Meas type: ", adjMeas.Type) - if isNumeric(adjMeas.Type) { tmp, err = getNumericMeasurement(adjMeas, globalUnits) } else if adjMeas.Type == "bool" { From 67cc95a62b3926e04696e47d9527563441435a35 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 15:13:29 +0100 Subject: [PATCH 16/20] new config.toml --- backend/cmd/config.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/cmd/config.toml b/backend/cmd/config.toml index 8a9f54fa1..044fd758f 100644 --- a/backend/cmd/config.toml +++ b/backend/cmd/config.toml @@ -10,8 +10,5 @@ programable_boards = "/uploadableBoards" connections = "/backend" files = "/" -[vehicle] -boardsList = ["VCU"] - [adj] -branch = "main" # Leave blank when using ADJ as a submodule +branch = "" # Leave blank when using ADJ as a submodule From 28e1a594b40ba2094ac02e3bcde9e64a13e1718e Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 15:14:02 +0100 Subject: [PATCH 17/20] new config.toml --- backend/cmd/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cmd/config.toml b/backend/cmd/config.toml index 044fd758f..1bff72f3f 100644 --- a/backend/cmd/config.toml +++ b/backend/cmd/config.toml @@ -11,4 +11,4 @@ connections = "/backend" files = "/" [adj] -branch = "" # Leave blank when using ADJ as a submodule +branch = "" # Leave blank when using ADJ as a submodule (like this: "") From 0db6d9ca1d625546d5f8b469ac5123d09b7e9dee Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 15:18:54 +0100 Subject: [PATCH 18/20] add adj to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8c6e03892..f68173155 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ build profiles backend/cmd/cmd +backend/cmd/adj # MacOS Files .DS_Store From cd859b4a5476c11559bc636b8104df38c24b3363 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 16:09:53 +0100 Subject: [PATCH 19/20] fix adj folder in .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f68173155..2160db6bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ build profiles backend/cmd/cmd -backend/cmd/adj +backend/cmd/adj/ # MacOS Files .DS_Store From 32e8d476780e34999b2b98bb896757706392b8d6 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sun, 23 Feb 2025 16:14:24 +0100 Subject: [PATCH 20/20] fix ranges logic --- backend/internal/adj/boards.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/internal/adj/boards.go b/backend/internal/adj/boards.go index dc602e65e..2ea61038e 100644 --- a/backend/internal/adj/boards.go +++ b/backend/internal/adj/boards.go @@ -56,6 +56,12 @@ func getBoards(boardsList map[string]string) (map[string]Board, error) { board.Structures = getBoardStructures(board) + // DEBUG + for _, meas := range board.Measurements { + println(meas.SafeRange[0], ", ", meas.SafeRange[1]) + println(meas.WarningRange[0], ", ", meas.WarningRange[1]) + } + boards[boardName] = board } @@ -157,35 +163,38 @@ func getRanges(measTMP Measurement) ([]*float64, []*float64, error) { warningRange := make([]*float64, 0) if measTMP.OutOfRange.Safe == nil && measTMP.OutOfRange.Warning == nil { - if measTMP.Below.Safe == nil { - safeRange = nil + if measTMP.Below.Safe == nil && measTMP.Below.Warning == nil && measTMP.Above.Safe == nil && measTMP.Above.Warning == nil { + safeRange = append(safeRange, []*float64{nil, nil}...) + warningRange = append(warningRange, []*float64{nil, nil}...) + } else if measTMP.Below.Safe == nil { + safeRange = append(safeRange, []*float64{nil}...) } else { safeRange = append(safeRange, measTMP.Below.Safe) } if measTMP.Above.Safe == nil { - safeRange = nil + safeRange = append(safeRange, []*float64{nil}...) } else { safeRange = append(safeRange, measTMP.Above.Safe) } if measTMP.Below.Warning == nil { - warningRange = nil + warningRange = append(warningRange, []*float64{nil}...) } else { warningRange = append(warningRange, measTMP.Below.Warning) } if measTMP.Above.Warning == nil { - warningRange = nil + warningRange = append(warningRange, []*float64{nil}...) } else { warningRange = append(warningRange, measTMP.Above.Warning) } } else if measTMP.OutOfRange.Safe == nil { - safeRange = nil + safeRange = append(safeRange, []*float64{nil, nil}...) warningRange = append(warningRange, measTMP.OutOfRange.Warning...) } else if measTMP.OutOfRange.Warning == nil { safeRange = append(safeRange, measTMP.OutOfRange.Safe...) - warningRange = nil + warningRange = append(warningRange, []*float64{nil, nil}...) } else { safeRange = append(safeRange, measTMP.OutOfRange.Safe...) warningRange = append(warningRange, measTMP.OutOfRange.Warning...)