Skip to content

Commit dbadf8d

Browse files
authored
Merge branch 'develop' into backend/submodule-adj
2 parents bdc9a5e + 703b098 commit dbadf8d

6 files changed

Lines changed: 926 additions & 0 deletions

File tree

backend/pkg/adj/adj.go

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
package adj
2+
3+
import (
4+
"encoding/json"
5+
"os"
6+
"path"
7+
8+
"github.com/HyperloopUPV-H8/h9-backend/internal/utils"
9+
"github.com/go-git/go-git/v5"
10+
)
11+
12+
const (
13+
RepoUrl = "https://github.com/HyperloopUPV-H8/JSON_ADE.git" // URL of the ADJ repository
14+
RepoPath = "./JSON_ADE/" // Path where the ADJ repository is cloned
15+
)
16+
17+
func NewADJ() (ADJ, error) {
18+
infoRaw, boardsRaw, err := downloadADJ()
19+
if err != nil {
20+
return ADJ{}, err
21+
}
22+
23+
var infoJSON InfoJSON
24+
if err := json.Unmarshal(infoRaw, &infoJSON); err != nil {
25+
println("Info JSON unmarshal error")
26+
return ADJ{}, err
27+
}
28+
29+
var info Info = Info{
30+
Ports: infoJSON.Ports,
31+
MessageIds: infoJSON.MessageIds,
32+
Units: make(map[string]utils.Operations),
33+
}
34+
for key, value := range infoJSON.Units {
35+
info.Units[key], err = utils.NewOperations(value)
36+
if err != nil {
37+
return ADJ{}, err
38+
}
39+
}
40+
41+
type BoardList struct {
42+
Boards map[string]string `json:"boards"`
43+
}
44+
45+
var boardsList BoardList
46+
if err := json.Unmarshal(boardsRaw, &boardsList); err != nil {
47+
return ADJ{}, err
48+
}
49+
50+
boards, err := getBoards(boardsList.Boards)
51+
if err != nil {
52+
return ADJ{}, err
53+
}
54+
55+
info.BoardIds, err = getBoardIds(boardsList.Boards)
56+
if err != nil {
57+
return ADJ{}, err
58+
}
59+
60+
info.Addresses, err = getAddresses(boards)
61+
if err != nil {
62+
return ADJ{}, err
63+
}
64+
for target, address := range infoJSON.Addresses {
65+
info.Addresses[target] = address
66+
}
67+
68+
adj := ADJ{
69+
Info: info,
70+
Boards: boards,
71+
}
72+
73+
return adj, nil
74+
}
75+
76+
func downloadADJ() (json.RawMessage, json.RawMessage, error) {
77+
if !checkRepo() {
78+
_, err := git.PlainClone(RepoPath, false, &git.CloneOptions{
79+
URL: RepoUrl,
80+
})
81+
if err != nil {
82+
return nil, nil, err
83+
}
84+
}
85+
86+
// The BoardIds are applied in the NewADJ function by the getBoardIds function
87+
info, err := os.ReadFile(RepoPath + "general_info.json")
88+
if err != nil {
89+
return nil, nil, err
90+
}
91+
92+
boardsList, err := os.ReadFile(RepoPath + "boards.json")
93+
if err != nil {
94+
return nil, nil, err
95+
}
96+
97+
return info, boardsList, nil
98+
}
99+
100+
func checkRepo() bool {
101+
if _, err := os.Stat(RepoPath); os.IsNotExist(err) {
102+
return false
103+
}
104+
105+
return true
106+
}
107+
108+
func getBoards(boardsList map[string]string) (map[string]Board, error) {
109+
boards := make(map[string]Board, len(boardsList))
110+
for boardName, boardPath := range boardsList {
111+
fullPath := path.Join(RepoPath, boardPath)
112+
boardRaw, err := os.ReadFile(fullPath)
113+
if err != nil {
114+
return nil, err
115+
}
116+
117+
var boardJSON BoardJSON
118+
if err = json.Unmarshal(boardRaw, &boardJSON); err != nil {
119+
return nil, err
120+
}
121+
122+
measPathsFr := make([]string, 0)
123+
for _, measPath := range boardJSON.MeasurementsPaths {
124+
measPathsFr = append(measPathsFr, path.Join(RepoPath, "boards", boardName, measPath))
125+
}
126+
boardJSON.MeasurementsPaths = measPathsFr
127+
128+
packetPathsFr := make([]string, 0)
129+
for _, packetPath := range boardJSON.PacketsPaths {
130+
packetPathsFr = append(packetPathsFr, path.Join(RepoPath, "boards", boardName, packetPath))
131+
}
132+
boardJSON.PacketsPaths = packetPathsFr
133+
134+
board := Board{
135+
Name: boardName,
136+
IP: boardJSON.IP,
137+
}
138+
board.Packets, err = getBoardPackets(boardJSON.PacketsPaths)
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
board.Measurements, err = getBoardMeasurements(boardJSON.MeasurementsPaths)
144+
if err != nil {
145+
return nil, err
146+
}
147+
board.LookUpMeasurements = make(map[string]Measurement, len(board.Measurements))
148+
149+
for _, measurement := range board.Measurements {
150+
board.LookUpMeasurements[measurement.Id] = measurement
151+
}
152+
board.Structures = getBoardStructures(board)
153+
154+
boards[boardName] = board
155+
}
156+
157+
return boards, nil
158+
}
159+
160+
func getBoardPackets(packetsPaths []string) ([]Packet, error) {
161+
packets := make([]Packet, 0)
162+
for _, packetPath := range packetsPaths {
163+
if _, err := os.Stat(packetPath); os.IsNotExist(err) {
164+
continue
165+
}
166+
167+
packetRaw, err := os.ReadFile(packetPath)
168+
if err != nil {
169+
return nil, err
170+
}
171+
172+
// Magic happens here
173+
type PacketJSON struct {
174+
Packet []Packet `json:"packets"`
175+
}
176+
177+
packetsJSON := PacketJSON{}
178+
if err = json.Unmarshal(packetRaw, &packetsJSON); err != nil {
179+
return nil, err
180+
}
181+
for _, packetTMP := range packetsJSON.Packet {
182+
packets = append(packets, packetTMP)
183+
}
184+
}
185+
186+
return packets, nil
187+
}
188+
189+
func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) {
190+
measurements := make([]Measurement, 0)
191+
192+
for _, measurementPath := range measurementsPaths {
193+
if _, err := os.Stat(measurementPath); os.IsNotExist(err) {
194+
continue
195+
}
196+
197+
measurementRaw, err := os.ReadFile(measurementPath)
198+
if err != nil {
199+
return nil, err
200+
}
201+
202+
// Absolutely doing tricks on it AGAIN - @msanlli
203+
type MeasurementJSON struct {
204+
Measurements []Measurement `json:"measurements"`
205+
}
206+
207+
measurementsJSON := MeasurementJSON{}
208+
if err = json.Unmarshal(measurementRaw, &measurementsJSON); err != nil {
209+
return nil, err
210+
}
211+
for _, measurementTMP := range measurementsJSON.Measurements {
212+
measurements = append(measurements, measurementTMP)
213+
}
214+
}
215+
216+
return measurements, nil
217+
}
218+
219+
func getBoardIds(boards map[string]string) (map[string]uint16, error) {
220+
boardIds := make(map[string]uint16, len(boards))
221+
for boardName, boardPath := range boards {
222+
fullPath := path.Join(RepoPath, boardPath)
223+
boardRaw, err := os.ReadFile(fullPath)
224+
if err != nil {
225+
return nil, err
226+
}
227+
228+
var boardJSON BoardJSON
229+
if err = json.Unmarshal(boardRaw, &boardJSON); err != nil {
230+
return nil, err
231+
}
232+
233+
boardIds[boardName] = boardJSON.ID
234+
}
235+
236+
return boardIds, nil
237+
}
238+
239+
func getBoardStructures(board Board) []Structure {
240+
structures := make([]Structure, len(board.Packets))
241+
for i, packet := range board.Packets {
242+
structures[i] = Structure{
243+
Packet: packet,
244+
Measurements: board.Measurements,
245+
}
246+
}
247+
248+
return structures
249+
}
250+
251+
func getAddresses(boards map[string]Board) (map[string]string, error) {
252+
addresses := make(map[string]string, len(boards))
253+
for boardName, board := range boards {
254+
addresses[boardName] = board.IP
255+
}
256+
257+
return addresses, nil
258+
}

backend/pkg/adj/models.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package adj
2+
3+
import "github.com/HyperloopUPV-H8/h9-backend/internal/utils"
4+
5+
type ADJ struct {
6+
Info Info
7+
Boards map[string]Board
8+
}
9+
10+
type InfoJSON struct {
11+
Ports map[string]uint16 `json:"ports"`
12+
Addresses map[string]string
13+
Units map[string]string `json:"units"`
14+
MessageIds map[string]uint16 `json:"message_ids"`
15+
BoardIds map[string]uint16
16+
}
17+
18+
type Info struct {
19+
Ports map[string]uint16
20+
Addresses map[string]string
21+
Units map[string]utils.Operations
22+
MessageIds map[string]uint16
23+
BoardIds map[string]uint16
24+
}
25+
26+
type BoardJSON struct {
27+
ID uint16 `json:"board_id"`
28+
IP string `json:"board_ip"`
29+
MeasurementsPaths []string `json:"measurements"`
30+
PacketsPaths []string `json:"packets"`
31+
}
32+
33+
type Board struct {
34+
Name string
35+
IP string
36+
Packets []Packet
37+
Measurements []Measurement
38+
Structures []Structure
39+
LookUpMeasurements map[string]Measurement
40+
}
41+
42+
type Packet struct {
43+
Id string `json:"id"`
44+
Name string `json:"name"`
45+
Type string `json:"type"`
46+
Variables []Measurement `json:"variables"`
47+
}
48+
49+
type Measurement struct {
50+
Id string `json:"id"`
51+
Name string `json:"name"`
52+
Type string `json:"type"`
53+
PodUnits string `json:"podUnits"`
54+
DisplayUnits string `json:"displayUnits"`
55+
SafeRange []*float64 `json:"safeRange"`
56+
WarningRange []*float64 `json:"warningRange"`
57+
EnumValues []string `json:"enumValues"`
58+
}
59+
60+
type Structure struct {
61+
Packet Packet
62+
Measurements []Measurement
63+
}

0 commit comments

Comments
 (0)