Skip to content

Commit bc457f5

Browse files
authored
Merge branch 'develop' into features/test-workflow
2 parents 47fa87a + 4032ae0 commit bc457f5

5 files changed

Lines changed: 218 additions & 111 deletions

File tree

backend/cmd/main.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/HyperloopUPV-H8/h9-backend/internal/data_transfer"
2121
"github.com/HyperloopUPV-H8/h9-backend/internal/excel"
2222
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/ade"
23+
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/utils"
2324
"github.com/HyperloopUPV-H8/h9-backend/internal/info"
2425
"github.com/HyperloopUPV-H8/h9-backend/internal/logger_handler"
2526
protection_logger "github.com/HyperloopUPV-H8/h9-backend/internal/message_logger"
@@ -436,27 +437,29 @@ func getTransportDecEnc(info info.Info, podData pod_data.PodData) (*presentation
436437
for i, measurement := range packet.Measurements {
437438
switch meas := measurement.(type) {
438439
case pod_data.NumericMeasurement:
440+
podOps := getOps(meas.PodUnits)
441+
displayOps := getOps(meas.DisplayUnits)
439442
switch meas.Type {
440443
case "uint8":
441-
descriptor[i] = data.NewNumericDescriptor[uint8](data.ValueName(meas.Id))
444+
descriptor[i] = data.NewNumericDescriptor[uint8](data.ValueName(meas.Id), podOps, displayOps)
442445
case "uint16":
443-
descriptor[i] = data.NewNumericDescriptor[uint16](data.ValueName(meas.Id))
446+
descriptor[i] = data.NewNumericDescriptor[uint16](data.ValueName(meas.Id), podOps, displayOps)
444447
case "uint32":
445-
descriptor[i] = data.NewNumericDescriptor[uint32](data.ValueName(meas.Id))
448+
descriptor[i] = data.NewNumericDescriptor[uint32](data.ValueName(meas.Id), podOps, displayOps)
446449
case "uint64":
447-
descriptor[i] = data.NewNumericDescriptor[uint64](data.ValueName(meas.Id))
450+
descriptor[i] = data.NewNumericDescriptor[uint64](data.ValueName(meas.Id), podOps, displayOps)
448451
case "int8":
449-
descriptor[i] = data.NewNumericDescriptor[int8](data.ValueName(meas.Id))
452+
descriptor[i] = data.NewNumericDescriptor[int8](data.ValueName(meas.Id), podOps, displayOps)
450453
case "int16":
451-
descriptor[i] = data.NewNumericDescriptor[int16](data.ValueName(meas.Id))
454+
descriptor[i] = data.NewNumericDescriptor[int16](data.ValueName(meas.Id), podOps, displayOps)
452455
case "int32":
453-
descriptor[i] = data.NewNumericDescriptor[int32](data.ValueName(meas.Id))
456+
descriptor[i] = data.NewNumericDescriptor[int32](data.ValueName(meas.Id), podOps, displayOps)
454457
case "int64":
455-
descriptor[i] = data.NewNumericDescriptor[int64](data.ValueName(meas.Id))
458+
descriptor[i] = data.NewNumericDescriptor[int64](data.ValueName(meas.Id), podOps, displayOps)
456459
case "float32":
457-
descriptor[i] = data.NewNumericDescriptor[float32](data.ValueName(meas.Id))
460+
descriptor[i] = data.NewNumericDescriptor[float32](data.ValueName(meas.Id), podOps, displayOps)
458461
case "float64":
459-
descriptor[i] = data.NewNumericDescriptor[float64](data.ValueName(meas.Id))
462+
descriptor[i] = data.NewNumericDescriptor[float64](data.ValueName(meas.Id), podOps, displayOps)
460463
default:
461464
panic(fmt.Sprintf("unexpected numeric type for %s: %s", meas.Id, meas.Type))
462465
}
@@ -500,6 +503,17 @@ func getTransportDecEnc(info info.Info, podData pod_data.PodData) (*presentation
500503
return decoder, encoder
501504
}
502505

506+
func getOps(units utils.Units) data.ConversionDescriptor {
507+
output := make(data.ConversionDescriptor, len(units.Operations))
508+
for i, operation := range units.Operations {
509+
output[i] = data.Operation{
510+
Operator: operation.Operator,
511+
Operand: operation.Operand,
512+
}
513+
}
514+
return output
515+
}
516+
503517
type TransportAPI struct {
504518
OnNotification func(abstraction.TransportNotification)
505519
OnConnectionUpdate func(abstraction.TransportTarget, bool)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package data
2+
3+
type valueConverter func(Value) Value
4+
type valueReverter func(Value) Value
5+
6+
type ConversionDescriptor []Operation
7+
8+
type Operation struct {
9+
Operator string
10+
Operand float64
11+
}
12+
13+
func newConvertNumeric[N numeric](podConversion, displayConversion ConversionDescriptor) valueConverter {
14+
return func(value Value) Value {
15+
numeric := value.(NumericValue[N])
16+
for _, operation := range append(podConversion, displayConversion...) {
17+
switch operation.Operator {
18+
case "+":
19+
numeric.inner += N(operation.Operand)
20+
case "-":
21+
numeric.inner -= N(operation.Operand)
22+
case "*":
23+
numeric.inner *= N(operation.Operand)
24+
case "/":
25+
numeric.inner /= N(operation.Operand)
26+
}
27+
}
28+
return numeric
29+
}
30+
}
31+
32+
func newRevertNumeric[N numeric](podConversion, displayConversion ConversionDescriptor) valueReverter {
33+
return func(value Value) Value {
34+
numeric := value.(NumericValue[N])
35+
for i := len(displayConversion) - 1; i >= 0; i-- {
36+
operation := displayConversion[i]
37+
switch operation.Operator {
38+
case "+":
39+
numeric.inner -= N(operation.Operand)
40+
case "-":
41+
numeric.inner += N(operation.Operand)
42+
case "*":
43+
numeric.inner /= N(operation.Operand)
44+
case "/":
45+
numeric.inner *= N(operation.Operand)
46+
}
47+
}
48+
49+
for i := len(podConversion) - 1; i >= 0; i-- {
50+
operation := podConversion[i]
51+
switch operation.Operator {
52+
case "+":
53+
numeric.inner -= N(operation.Operand)
54+
case "-":
55+
numeric.inner += N(operation.Operand)
56+
case "*":
57+
numeric.inner /= N(operation.Operand)
58+
case "/":
59+
numeric.inner *= N(operation.Operand)
60+
}
61+
}
62+
63+
return numeric
64+
}
65+
}
66+
67+
func convertBoolean(value Value) Value {
68+
return value
69+
}
70+
71+
func revertBoolean(value Value) Value {
72+
return value
73+
}
74+
75+
func convertEnum(value Value) Value {
76+
return value
77+
}
78+
79+
func revertEnum(value Value) Value {
80+
return value
81+
}

backend/pkg/transport/packet/data/descriptors.go

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,40 @@ type Descriptor []valueDescriptor
1111

1212
// valueDescriptor describes a value of a packet
1313
type valueDescriptor struct {
14-
Name ValueName
15-
Type valueType
16-
decode valueDecoder
17-
encode valueEncoder
14+
Name ValueName
15+
Type valueType
16+
decode valueDecoder
17+
encode valueEncoder
18+
convert valueConverter
19+
revert valueReverter
1820
}
1921

2022
// Decode decodes the next value from the reader using its decoding method
2123
func (descriptor *valueDescriptor) Decode(endianness binary.ByteOrder, reader io.Reader) (Value, error) {
22-
return descriptor.decode(endianness, reader)
24+
value, err := descriptor.decode(endianness, reader)
25+
if err != nil {
26+
return value, err
27+
}
28+
return descriptor.convert(value), nil
2329
}
2430

2531
// Encode encodes the provided value into the writer using its encoding method
2632
func (descriptor *valueDescriptor) Encode(endianness binary.ByteOrder, value Value, writer io.Writer) error {
27-
return descriptor.encode(endianness, value, writer)
33+
return descriptor.encode(endianness, descriptor.revert(value), writer)
2834
}
2935

3036
// NewNumericDescriptor creates a new NumericDescriptor
3137
//
3238
// name is the name for the value
33-
func NewNumericDescriptor[N numeric](name ValueName) valueDescriptor {
39+
func NewNumericDescriptor[N numeric](name ValueName, podUnits, displayUnits ConversionDescriptor) valueDescriptor {
3440
var n N
3541
return valueDescriptor{
36-
Name: name,
37-
Type: valueType(reflect.TypeOf(n).Name()),
38-
decode: decodeNumeric[N],
39-
encode: encodeNumeric[N],
42+
Name: name,
43+
Type: valueType(reflect.TypeOf(n).Name()),
44+
decode: decodeNumeric[N],
45+
encode: encodeNumeric[N],
46+
convert: newConvertNumeric[N](podUnits, displayUnits),
47+
revert: newRevertNumeric[N](podUnits, displayUnits),
4048
}
4149
}
4250

@@ -45,10 +53,12 @@ func NewNumericDescriptor[N numeric](name ValueName) valueDescriptor {
4553
// name is the name for the value
4654
func NewBooleanDescriptor(name ValueName) valueDescriptor {
4755
return valueDescriptor{
48-
Name: name,
49-
Type: BoolType,
50-
decode: decodeBool,
51-
encode: encodeBool,
56+
Name: name,
57+
Type: BoolType,
58+
decode: decodeBool,
59+
encode: encodeBool,
60+
convert: convertBoolean,
61+
revert: revertBoolean,
5262
}
5363
}
5464

@@ -57,9 +67,11 @@ func NewBooleanDescriptor(name ValueName) valueDescriptor {
5767
// name is the name for the value and descriptor is the variants the enum has
5868
func NewEnumDescriptor(name ValueName, descriptor EnumDescriptor) valueDescriptor {
5969
return valueDescriptor{
60-
Name: name,
61-
Type: EnumType,
62-
decode: newDecodeEnum(name, descriptor),
63-
encode: newEncodeEnum(name, descriptor),
70+
Name: name,
71+
Type: EnumType,
72+
decode: newDecodeEnum(name, descriptor),
73+
encode: newEncodeEnum(name, descriptor),
74+
convert: convertEnum,
75+
revert: revertEnum,
6476
}
6577
}

backend/pkg/transport/presentation/decoder_test.go

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,20 +1056,20 @@ func getDecoder(endianness binary.ByteOrder) *presentation.Decoder {
10561056

10571057
dataDecoder := data.NewDecoder(endianness)
10581058
dataDecoder.SetDescriptor(9, data.Descriptor{
1059-
data.NewNumericDescriptor[uint8]("uint8"),
1060-
data.NewNumericDescriptor[uint16]("uint16"),
1061-
data.NewNumericDescriptor[uint32]("uint32"),
1062-
data.NewNumericDescriptor[uint64]("uint64"),
1059+
data.NewNumericDescriptor[uint8]("uint8", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1060+
data.NewNumericDescriptor[uint16]("uint16", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1061+
data.NewNumericDescriptor[uint32]("uint32", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1062+
data.NewNumericDescriptor[uint64]("uint64", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
10631063
})
10641064
dataDecoder.SetDescriptor(10, data.Descriptor{
1065-
data.NewNumericDescriptor[int8]("int8"),
1066-
data.NewNumericDescriptor[int16]("int16"),
1067-
data.NewNumericDescriptor[int32]("int32"),
1068-
data.NewNumericDescriptor[int64]("int64"),
1065+
data.NewNumericDescriptor[int8]("int8", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1066+
data.NewNumericDescriptor[int16]("int16", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1067+
data.NewNumericDescriptor[int32]("int32", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1068+
data.NewNumericDescriptor[int64]("int64", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
10691069
})
10701070
dataDecoder.SetDescriptor(11, data.Descriptor{
1071-
data.NewNumericDescriptor[float32]("float32"),
1072-
data.NewNumericDescriptor[float64]("float64"),
1071+
data.NewNumericDescriptor[float32]("float32", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1072+
data.NewNumericDescriptor[float64]("float64", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
10731073
})
10741074
dataDecoder.SetDescriptor(12, data.Descriptor{
10751075
data.NewBooleanDescriptor("bool"),
@@ -1078,9 +1078,9 @@ func getDecoder(endianness binary.ByteOrder) *presentation.Decoder {
10781078
data.NewEnumDescriptor("enum", data.EnumDescriptor{"a", "b", "c", "d"}),
10791079
})
10801080
dataDecoder.SetDescriptor(14, data.Descriptor{
1081-
data.NewNumericDescriptor[uint8]("uint8_1"),
1082-
data.NewNumericDescriptor[uint8]("uint8_2"),
1083-
data.NewNumericDescriptor[float64]("float64"),
1081+
data.NewNumericDescriptor[uint8]("uint8_1", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1082+
data.NewNumericDescriptor[uint8]("uint8_2", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1083+
data.NewNumericDescriptor[float64]("float64", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
10841084
data.NewBooleanDescriptor("bool"),
10851085
data.NewEnumDescriptor("enum", data.EnumDescriptor{"a", "b", "c"}),
10861086
})
@@ -1097,36 +1097,36 @@ func getDecoder(endianness binary.ByteOrder) *presentation.Decoder {
10971097
data.NewEnumDescriptor("enum_5", data.EnumDescriptor{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}),
10981098
})
10991099
dataDecoder.SetDescriptor(17, data.Descriptor{
1100-
data.NewNumericDescriptor[uint8]("uint8_1"),
1101-
data.NewNumericDescriptor[uint8]("uint8_2"),
1102-
data.NewNumericDescriptor[uint8]("uint8_3"),
1103-
data.NewNumericDescriptor[uint8]("uint8_4"),
1104-
data.NewNumericDescriptor[uint8]("uint8_5"),
1105-
data.NewNumericDescriptor[uint8]("uint8_6"),
1106-
data.NewNumericDescriptor[uint8]("uint8_7"),
1107-
data.NewNumericDescriptor[uint8]("uint8_8"),
1108-
data.NewNumericDescriptor[uint8]("uint8_9"),
1109-
data.NewNumericDescriptor[uint8]("uint8_10"),
1100+
data.NewNumericDescriptor[uint8]("uint8_1", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1101+
data.NewNumericDescriptor[uint8]("uint8_2", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1102+
data.NewNumericDescriptor[uint8]("uint8_3", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1103+
data.NewNumericDescriptor[uint8]("uint8_4", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1104+
data.NewNumericDescriptor[uint8]("uint8_5", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1105+
data.NewNumericDescriptor[uint8]("uint8_6", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1106+
data.NewNumericDescriptor[uint8]("uint8_7", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1107+
data.NewNumericDescriptor[uint8]("uint8_8", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1108+
data.NewNumericDescriptor[uint8]("uint8_9", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1109+
data.NewNumericDescriptor[uint8]("uint8_10", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
11101110
})
11111111
dataDecoder.SetDescriptor(18, data.Descriptor{
1112-
data.NewNumericDescriptor[uint64]("uint64_1"),
1113-
data.NewNumericDescriptor[int64]("int64_1"),
1114-
data.NewNumericDescriptor[float64]("float64_1"),
1115-
data.NewNumericDescriptor[uint64]("uint64_2"),
1116-
data.NewNumericDescriptor[int64]("int64_2"),
1117-
data.NewNumericDescriptor[float64]("float64_2"),
1118-
data.NewNumericDescriptor[uint64]("uint64_3"),
1119-
data.NewNumericDescriptor[int64]("int64_3"),
1120-
data.NewNumericDescriptor[float64]("float64_3"),
1121-
data.NewNumericDescriptor[uint64]("uint64_4"),
1122-
data.NewNumericDescriptor[int64]("int64_4"),
1123-
data.NewNumericDescriptor[float64]("float64_4"),
1124-
data.NewNumericDescriptor[uint64]("uint64_5"),
1125-
data.NewNumericDescriptor[int64]("int64_5"),
1126-
data.NewNumericDescriptor[float64]("float64_5"),
1127-
data.NewNumericDescriptor[uint64]("uint64_6"),
1128-
data.NewNumericDescriptor[int64]("int64_6"),
1129-
data.NewNumericDescriptor[float64]("float64_6"),
1112+
data.NewNumericDescriptor[uint64]("uint64_1", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1113+
data.NewNumericDescriptor[int64]("int64_1", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1114+
data.NewNumericDescriptor[float64]("float64_1", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1115+
data.NewNumericDescriptor[uint64]("uint64_2", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1116+
data.NewNumericDescriptor[int64]("int64_2", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1117+
data.NewNumericDescriptor[float64]("float64_2", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1118+
data.NewNumericDescriptor[uint64]("uint64_3", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1119+
data.NewNumericDescriptor[int64]("int64_3", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1120+
data.NewNumericDescriptor[float64]("float64_3", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1121+
data.NewNumericDescriptor[uint64]("uint64_4", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1122+
data.NewNumericDescriptor[int64]("int64_4", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1123+
data.NewNumericDescriptor[float64]("float64_4", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1124+
data.NewNumericDescriptor[uint64]("uint64_5", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1125+
data.NewNumericDescriptor[int64]("int64_5", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1126+
data.NewNumericDescriptor[float64]("float64_5", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1127+
data.NewNumericDescriptor[uint64]("uint64_6", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1128+
data.NewNumericDescriptor[int64]("int64_6", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
1129+
data.NewNumericDescriptor[float64]("float64_6", make(data.ConversionDescriptor, 0), make(data.ConversionDescriptor, 0)),
11301130
})
11311131
decoder.SetPacketDecoder(9, dataDecoder)
11321132
decoder.SetPacketDecoder(10, dataDecoder)

0 commit comments

Comments
 (0)