Skip to content

Commit c68a3fe

Browse files
committed
Merge branch 'develop' into backend/client-broker
2 parents dc723ef + 843dc1c commit c68a3fe

24 files changed

Lines changed: 897 additions & 267 deletions

File tree

.github/workflows/build-backend.yaml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
SECRET:
77
required: true
88
workflow_dispatch:
9+
pull_request:
10+
paths:
11+
- backend/**
912

1013
env:
1114
SECRET: ${{ secrets.SECRET }}
@@ -26,7 +29,9 @@ jobs:
2629
- name: "Install packages"
2730
run: apk update && apk add --no-cache libpcap-dev musl-dev gcc go
2831

29-
- uses: actions/checkout@v3
32+
- uses: actions/checkout@v4
33+
with:
34+
sparse-checkout: backend
3035

3136
- name: "Create output path"
3237
working-directory: "${{env.BACKEND_DIR}}"
@@ -47,10 +52,12 @@ jobs:
4752
go build -ldflags '-linkmode external -extldflags "-static"' -o ../output/backend-linux-64
4853
4954
- name: "Upload build"
50-
uses: actions/upload-artifact@v3
55+
uses: actions/upload-artifact@v4
5156
with:
5257
name: backend-linux
5358
path: "${{env.BACKEND_DIR}}/output/*"
59+
retention-days: 3
60+
compression-level: 9
5461

5562
build-backend-windows:
5663
name: "Build backend for windows"
@@ -90,10 +97,12 @@ jobs:
9097
go build -o ..\output\backend-windows-64.exe
9198
9299
- name: "Upload build"
93-
uses: actions/upload-artifact@v3
100+
uses: actions/upload-artifact@v4
94101
with:
95102
name: backend-windows
96103
path: "${{env.BACKEND_DIR}}\\output\\*"
104+
retention-days: 3
105+
compression-level: 9
97106

98107
build-backend-mac:
99108
name: "Build backend for macOS"
@@ -142,7 +151,9 @@ jobs:
142151
go build -o ../output/backend-macos-m1-64
143152
144153
- name: "Upload build"
145-
uses: actions/upload-artifact@v3
154+
uses: actions/upload-artifact@v4
146155
with:
147156
name: backend-macos
148157
path: "${{env.BACKEND_DIR}}/output/*"
158+
retention-days: 3
159+
compression-level: 9

.github/workflows/build-ethernet-view.yaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ name: Build ethernet view
33
on:
44
workflow_call:
55
workflow_dispatch:
6+
pull_request:
7+
paths:
8+
- ethernet-view/**
9+
- common-front/**
610

711
jobs:
812
build-ethernet-view:
@@ -14,7 +18,11 @@ jobs:
1418
COMMON_DIR: ./common-front
1519

1620
steps:
17-
- uses: actions/checkout@v3
21+
- uses: actions/checkout@v4
22+
with:
23+
sparse-checkout: |
24+
ethernet-view
25+
common-front
1826
1927
- name: "Install common front dependencies"
2028
working-directory: "${{env.COMMON_DIR}}"
@@ -36,7 +44,9 @@ jobs:
3644

3745

3846
- name: "Upload build"
39-
uses: actions/upload-artifact@v3
47+
uses: actions/upload-artifact@v4
4048
with:
4149
name: ethernet-view
4250
path: "${{env.FRONTEND_DIR}}/static/*"
51+
retention-days: 3
52+
compression-level: 9
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Test backend
2+
3+
on:
4+
push:
5+
paths:
6+
- backend/**
7+
pull_request:
8+
paths:
9+
- backend/**
10+
workflow_dispatch:
11+
12+
env:
13+
SECRET: ${{ secrets.SECRET }}
14+
15+
jobs:
16+
test-backend:
17+
name: "Test backend"
18+
runs-on: ubuntu-latest
19+
20+
env:
21+
BACKEND_DIR: ./backend
22+
23+
steps:
24+
- name: Checkout
25+
uses: actions/checkout@v4
26+
27+
- name: Setup Go
28+
uses: actions/setup-go@v4
29+
with:
30+
go-version: 1.21
31+
cache: false
32+
33+
34+
- name: Install Dependencies
35+
run: |
36+
sudo apt-get update && sudo apt-get install -y libpcap-dev
37+
38+
- name: "Load secret"
39+
working-directory: "${{env.BACKEND_DIR}}"
40+
run: |
41+
./load-secret.sh "$SECRET"
42+
43+
- name: Test with Go
44+
working-directory: "${{env.BACKEND_DIR}}"
45+
run: go test -v -timeout 30s ./...

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
build
2+
.vscode
23

34
# GOOGLE API KEY
45
secret.json

backend/cmd/config.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ udp_tag = "UDP"
2121
mtu = 1500
2222
interface = "lo"
2323
# blcu_ack_id = "blcu_ack"
24-
keep_alive_interval = "1s"
25-
keep_alive_probes = 3
2624
timeout = "1s"
2725

2826
[vehicle.messages]

backend/cmd/main.go

Lines changed: 85 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,18 @@ import (
2222
"github.com/HyperloopUPV-H8/h9-backend/internal/excel"
2323
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/ade"
2424
"github.com/HyperloopUPV-H8/h9-backend/internal/info"
25-
"github.com/HyperloopUPV-H8/h9-backend/internal/logger_handler"
26-
protection_logger "github.com/HyperloopUPV-H8/h9-backend/internal/message_logger"
2725
"github.com/HyperloopUPV-H8/h9-backend/internal/message_transfer"
28-
"github.com/HyperloopUPV-H8/h9-backend/internal/order_logger"
2926
"github.com/HyperloopUPV-H8/h9-backend/internal/order_transfer"
30-
"github.com/HyperloopUPV-H8/h9-backend/internal/packet_logger"
3127
"github.com/HyperloopUPV-H8/h9-backend/internal/pod_data"
3228
"github.com/HyperloopUPV-H8/h9-backend/internal/server"
33-
"github.com/HyperloopUPV-H8/h9-backend/internal/state_space_logger"
3429
"github.com/HyperloopUPV-H8/h9-backend/internal/update_factory"
35-
"github.com/HyperloopUPV-H8/h9-backend/internal/value_logger"
3630
vehicle_models "github.com/HyperloopUPV-H8/h9-backend/internal/vehicle/models"
3731
"github.com/HyperloopUPV-H8/h9-backend/internal/ws_handle"
3832
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
3933
"github.com/HyperloopUPV-H8/h9-backend/pkg/broker"
4034
connection_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/connection"
4135
data_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/data"
36+
"github.com/HyperloopUPV-H8/h9-backend/pkg/excel/utils"
4237
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport"
4338
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer"
4439
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp"
@@ -55,6 +50,12 @@ import (
5550
"github.com/google/gopacket/pcap"
5651
"github.com/pelletier/go-toml/v2"
5752
trace "github.com/rs/zerolog/log"
53+
54+
"github.com/HyperloopUPV-H8/h9-backend/pkg/logger"
55+
data_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/data"
56+
messages_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/messages"
57+
order_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/order"
58+
state_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/state"
5859
)
5960

6061
var traceLevel = flag.String("trace", "info", "set the trace level (\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\")")
@@ -128,20 +129,15 @@ func main() {
128129
updateFactory := update_factory.NewFactory()
129130

130131
// <--- logger --->
131-
packetLogger := packet_logger.NewPacketLogger(podData.Boards, config.PacketLogger)
132-
valueLogger := value_logger.NewValueLogger(podData.Boards, config.ValueLogger)
133-
orderLogger := order_logger.NewOrderLogger(podData.Boards, config.OrderLogger)
134-
protectionLogger := protection_logger.NewMessageLogger(config.Vehicle.Messages.InfoIdKey, config.Vehicle.Messages.FaultIdKey, config.Vehicle.Messages.WarningIdKey, config.ProtectionLogger)
135-
stateSpaceLogger := state_space_logger.NewStateSpaceLogger(info.MessageIds.StateSpace)
136-
137-
loggers := map[string]logger_handler.Logger{
138-
"packets": &packetLogger,
139-
"values": &valueLogger,
140-
"orders": &orderLogger,
141-
"protections": &protectionLogger,
142-
"stateSpace": &stateSpaceLogger,
132+
var boardMap map[abstraction.BoardId]string
133+
var subloggers = map[abstraction.LoggerName]abstraction.Logger{
134+
data_logger.Name: data_logger.NewLogger(),
135+
messages_logger.Name: messages_logger.NewLogger(boardMap),
136+
order_logger.Name: order_logger.NewLogger(),
137+
state_logger.Name: state_logger.NewLogger(),
143138
}
144-
loggerHandler := logger_handler.NewLoggerHandler(loggers, config.LoggerHandler)
139+
140+
loggerHandler := logger.NewLogger(subloggers)
145141

146142
// <--- order transfer --->
147143
idToBoard := make(map[uint16]string)
@@ -189,40 +185,67 @@ func main() {
189185
transp.SetAPI(&transportAPI{
190186
OnNotification: func(notification abstraction.TransportNotification) {
191187
packet := notification.(transport.PacketNotification)
188+
192189
switch p := packet.Packet.(type) {
193190
case *data.Packet:
194-
if _, ok := orders[p.Id()]; ok {
195-
loggerHandler.Log(order_logger.LoggableOrder(*p))
196-
return
197-
}
198-
199191
update := updateFactory.NewUpdate(p)
200192
err := broker.Push(data_topic.NewPush(&update))
201193
if err != nil {
202194
fmt.Println(err)
203195
}
204196

205-
loggerHandler.Log(packet_logger.ToLoggablePacket(p))
197+
err = loggerHandler.PushRecord(&data_logger.Record{
198+
Packet: p,
199+
})
206200

207-
for id, value := range p.GetValues() {
208-
loggerHandler.Log(value_logger.ToLoggableValue(string(id), value, p.Timestamp()))
201+
if err != nil {
202+
fmt.Println("Error pushing record to logger: ", err)
209203
}
204+
210205
case *info_packet.Packet:
211206
messageTransfer.SendMessage(p)
212-
loggerHandler.Log(protection_logger.LoggableInfo(*p))
207+
208+
err = loggerHandler.PushRecord(&messages_logger.Record{
209+
Packet: p,
210+
})
211+
212+
if err != nil {
213+
fmt.Println("Error pushing record to logger: ", err)
214+
}
215+
213216
case *protection.Packet:
214217
messageTransfer.SendMessage(p)
215-
loggerHandler.Log(protection_logger.LoggableProtection(*p))
218+
219+
packet := info_packet.NewPacket(p.Id())
220+
packet.BoardId = p.BoardId
221+
packet.Timestamp = p.Timestamp
222+
packet.Msg = info_packet.InfoData(fmt.Sprint(p))
223+
224+
err = loggerHandler.PushRecord(&messages_logger.Record{
225+
Packet: packet,
226+
})
227+
228+
if err != nil {
229+
fmt.Println("Error pushing record to logger: ", err)
230+
}
231+
216232
case *blcu_packet.Ack:
217233
if useBlcu {
218234
blcu.NotifyAck()
219235
}
236+
220237
case *state.Space:
221-
for _, row := range p.State() {
222-
loggerHandler.Log(state_space_logger.LoggableStateSpaceRow(row))
238+
err = loggerHandler.PushRecord(&state_logger.Record{
239+
Packet: p,
240+
})
241+
242+
if err != nil {
243+
fmt.Println("Error pushing record to logger: ", err)
223244
}
245+
224246
case *order.Add:
225247
orderTransfer.AddStateOrders(*p)
248+
226249
case *order.Remove:
227250
orderTransfer.RemoveStateOrders(*p)
228251
}
@@ -284,7 +307,13 @@ func main() {
284307
trace.Error().Any("order", order).Err(err).Msg("error sending order")
285308
}
286309

287-
loggerHandler.Log(order_logger.LoggableOrder(order))
310+
err = loggerHandler.PushRecord(&order_logger.Record{
311+
Packet: &order,
312+
})
313+
314+
if err != nil {
315+
fmt.Println("Error pushing record to logger: ", err)
316+
}
288317
}
289318
}()
290319

@@ -310,7 +339,7 @@ func main() {
310339

311340
websocketBroker.RegisterHandle(&connectionTransfer, config.Connections.UpdateTopic, "connection/update")
312341
websocketBroker.RegisterHandle(&dataTransfer, "podData/update")
313-
websocketBroker.RegisterHandle(&loggerHandler, config.LoggerHandler.Topics.Enable)
342+
websocketBroker.RegisterHandle(loggerHandler, config.LoggerHandler.Topics.Enable)
314343
websocketBroker.RegisterHandle(&messageTransfer, "message/update")
315344
websocketBroker.RegisterHandle(&orderTransfer, config.Orders.SendTopic, "order/stateOrders")
316345

@@ -462,27 +491,29 @@ func getTransportDecEnc(info info.Info, podData pod_data.PodData) (*presentation
462491
for i, measurement := range packet.Measurements {
463492
switch meas := measurement.(type) {
464493
case pod_data.NumericMeasurement:
494+
podOps := getOps(meas.PodUnits)
495+
displayOps := getOps(meas.DisplayUnits)
465496
switch meas.Type {
466497
case "uint8":
467-
descriptor[i] = data.NewNumericDescriptor[uint8](data.ValueName(meas.Id))
498+
descriptor[i] = data.NewNumericDescriptor[uint8](data.ValueName(meas.Id), podOps, displayOps)
468499
case "uint16":
469-
descriptor[i] = data.NewNumericDescriptor[uint16](data.ValueName(meas.Id))
500+
descriptor[i] = data.NewNumericDescriptor[uint16](data.ValueName(meas.Id), podOps, displayOps)
470501
case "uint32":
471-
descriptor[i] = data.NewNumericDescriptor[uint32](data.ValueName(meas.Id))
502+
descriptor[i] = data.NewNumericDescriptor[uint32](data.ValueName(meas.Id), podOps, displayOps)
472503
case "uint64":
473-
descriptor[i] = data.NewNumericDescriptor[uint64](data.ValueName(meas.Id))
504+
descriptor[i] = data.NewNumericDescriptor[uint64](data.ValueName(meas.Id), podOps, displayOps)
474505
case "int8":
475-
descriptor[i] = data.NewNumericDescriptor[int8](data.ValueName(meas.Id))
506+
descriptor[i] = data.NewNumericDescriptor[int8](data.ValueName(meas.Id), podOps, displayOps)
476507
case "int16":
477-
descriptor[i] = data.NewNumericDescriptor[int16](data.ValueName(meas.Id))
508+
descriptor[i] = data.NewNumericDescriptor[int16](data.ValueName(meas.Id), podOps, displayOps)
478509
case "int32":
479-
descriptor[i] = data.NewNumericDescriptor[int32](data.ValueName(meas.Id))
510+
descriptor[i] = data.NewNumericDescriptor[int32](data.ValueName(meas.Id), podOps, displayOps)
480511
case "int64":
481-
descriptor[i] = data.NewNumericDescriptor[int64](data.ValueName(meas.Id))
512+
descriptor[i] = data.NewNumericDescriptor[int64](data.ValueName(meas.Id), podOps, displayOps)
482513
case "float32":
483-
descriptor[i] = data.NewNumericDescriptor[float32](data.ValueName(meas.Id))
514+
descriptor[i] = data.NewNumericDescriptor[float32](data.ValueName(meas.Id), podOps, displayOps)
484515
case "float64":
485-
descriptor[i] = data.NewNumericDescriptor[float64](data.ValueName(meas.Id))
516+
descriptor[i] = data.NewNumericDescriptor[float64](data.ValueName(meas.Id), podOps, displayOps)
486517
default:
487518
panic(fmt.Sprintf("unexpected numeric type for %s: %s", meas.Id, meas.Type))
488519
}
@@ -526,6 +557,17 @@ func getTransportDecEnc(info info.Info, podData pod_data.PodData) (*presentation
526557
return decoder, encoder
527558
}
528559

560+
func getOps(units utils.Units) data.ConversionDescriptor {
561+
output := make(data.ConversionDescriptor, len(units.Operations))
562+
for i, operation := range units.Operations {
563+
output[i] = data.Operation{
564+
Operator: operation.Operator,
565+
Operand: operation.Operand,
566+
}
567+
}
568+
return output
569+
}
570+
529571
type transportAPI struct {
530572
OnNotification func(abstraction.TransportNotification)
531573
OnConnectionUpdate func(abstraction.TransportTarget, bool)

backend/pkg/abstraction/logger.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type LoggerRequest interface {
1616
// Logger is the module in charge of storing and retrieving information from the
1717
// hard drive, making it persistent.
1818
type Logger interface {
19-
Start(startKeys []LoggerName) error
20-
Stop(stopKeys []LoggerName) error
19+
Start() error
20+
Stop() error
2121
// PushRecord will store a record to disk
2222
PushRecord(LoggerRecord) error
2323
// PullRecord will retrieve a record from disk

0 commit comments

Comments
 (0)