Skip to content

Commit 02d4674

Browse files
committed
order/send topic implementation
1 parent 9375242 commit 02d4674

7 files changed

Lines changed: 133 additions & 33 deletions

File tree

backend/cmd/main.go

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@ import (
1717

1818
blcuPackage "github.com/HyperloopUPV-H8/h9-backend/internal/blcu"
1919
"github.com/HyperloopUPV-H8/h9-backend/internal/common"
20-
"github.com/HyperloopUPV-H8/h9-backend/internal/connection_transfer"
2120
"github.com/HyperloopUPV-H8/h9-backend/internal/data_transfer"
2221
"github.com/HyperloopUPV-H8/h9-backend/internal/excel"
2322
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/ade"
2423
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/utils"
2524
"github.com/HyperloopUPV-H8/h9-backend/internal/info"
2625
"github.com/HyperloopUPV-H8/h9-backend/internal/message_transfer"
27-
"github.com/HyperloopUPV-H8/h9-backend/internal/order_transfer"
2826
"github.com/HyperloopUPV-H8/h9-backend/internal/pod_data"
2927
"github.com/HyperloopUPV-H8/h9-backend/internal/server"
3028
"github.com/HyperloopUPV-H8/h9-backend/internal/update_factory"
@@ -34,6 +32,7 @@ import (
3432
"github.com/HyperloopUPV-H8/h9-backend/pkg/broker"
3533
connection_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/connection"
3634
data_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/data"
35+
order_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/order"
3736
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport"
3837
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer"
3938
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp"
@@ -111,8 +110,6 @@ func main() {
111110
}
112111
config.Vehicle.Network.Interface = dev.Name
113112

114-
connectionTransfer := connection_transfer.New(config.Connections)
115-
116113
vehicleOrders, err := vehicle_models.NewVehicleOrders(podData.Boards, config.Excel.Parse.Global.BLCUAddressKey)
117114
if err != nil {
118115
trace.Fatal().Err(err).Msg("creating vehicleOrders")
@@ -146,24 +143,22 @@ func main() {
146143
idToBoard[packet.Id] = board.Name
147144
}
148145
}
149-
orderTransfer, orderChannel := order_transfer.New(idToBoard)
150146

151147
// <--- blcu --->
152148
var blcu blcuPackage.BLCU
153149
blcuAddr, useBlcu := info.Addresses.Boards["BLCU"]
154150

155151
// <--- broker --->
156152
broker := broker.New()
157-
broker.SetAPI(&brokerAPI{
158-
OnUserPush: func(push abstraction.BrokerPush) {},
159-
})
160153

161154
dataTopic := data_topic.NewUpdateTopic(time.Second / 10)
162155
defer dataTopic.Stop()
163156
connectionTopic := connection_topic.NewUpdateTopic()
157+
orderTopic := order_topic.NewSendTopic()
164158

165159
broker.AddTopic(data_topic.UpdateName, dataTopic)
166160
broker.AddTopic(connection_topic.UpdateName, connectionTopic)
161+
broker.AddTopic(order_topic.SendName, orderTopic)
167162

168163
connections := make(chan *websocket.Client)
169164
upgrader := websocket.NewUpgrader(connections)
@@ -244,10 +239,9 @@ func main() {
244239
}
245240

246241
case *order.Add:
247-
orderTransfer.AddStateOrders(*p)
248-
242+
trace.Debug().Msg("adding order")
249243
case *order.Remove:
250-
orderTransfer.RemoveStateOrders(*p)
244+
trace.Debug().Msg("removing order")
251245
}
252246
},
253247

@@ -256,6 +250,42 @@ func main() {
256250
},
257251
})
258252

253+
// this is here because we need to use transport to send messages
254+
broker.SetAPI(&brokerAPI{
255+
OnUserPush: func(push abstraction.BrokerPush) {
256+
switch push.Topic() {
257+
case order_topic.SendName:
258+
order, ok := push.(*order_topic.Order)
259+
if !ok {
260+
trace.Error().Any("push", push).Msg("error casting push to order")
261+
return
262+
}
263+
264+
packet, err := order.ToPacket()
265+
if err != nil {
266+
trace.Error().Any("order", order).Err(err).Msg("error converting order to packet")
267+
return
268+
}
269+
270+
err = transp.SendMessage(transport.NewPacketMessage(packet))
271+
if err != nil {
272+
trace.Error().Any("order", order).Err(err).Msg("error sending order")
273+
return
274+
}
275+
276+
err = loggerHandler.PushRecord(&order_logger.Record{
277+
Packet: packet,
278+
})
279+
280+
if err != nil {
281+
fmt.Println("Error pushing record to logger: ", err)
282+
}
283+
default:
284+
fmt.Printf("unknow topic %s\n", push.Topic())
285+
}
286+
},
287+
})
288+
259289
// Load and set packet decoder and encoder
260290
decoder, encoder := getTransportDecEnc(info, podData)
261291
transp.WithDecoder(decoder).WithEncoder(encoder)
@@ -299,24 +329,6 @@ func main() {
299329
}
300330
go transp.HandleSniffer(sniffer.New(source, &layers.LayerTypeEthernet))
301331

302-
// <--- order transfer --->
303-
go func() {
304-
for order := range orderChannel {
305-
err := transp.SendMessage(transport.NewPacketMessage(&order))
306-
if err != nil {
307-
trace.Error().Any("order", order).Err(err).Msg("error sending order")
308-
}
309-
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-
}
317-
}
318-
}()
319-
320332
// <--- blcu --->
321333
if useBlcu {
322334
blcu = blcuPackage.NewBLCU(net.TCPAddr{
@@ -337,11 +349,8 @@ func main() {
337349
websocketBroker.RegisterHandle(&blcu, config.BLCU.Topics.Upload, config.BLCU.Topics.Download)
338350
}
339351

340-
websocketBroker.RegisterHandle(&connectionTransfer, config.Connections.UpdateTopic, "connection/update")
341-
websocketBroker.RegisterHandle(&dataTransfer, "podData/update")
342352
websocketBroker.RegisterHandle(loggerHandler, config.LoggerHandler.Topics.Enable)
343353
websocketBroker.RegisterHandle(&messageTransfer, "message/update")
344-
websocketBroker.RegisterHandle(&orderTransfer, config.Orders.SendTopic, "order/stateOrders")
345354

346355
uploadableBords := common.Filter(common.Keys(info.Addresses.Boards), func(item string) bool {
347356
return item != config.Excel.Parse.Global.BLCUAddressKey

backend/internal/vehicle/models/order_data.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ func getField(m pod_data.Measurement) (any, error) {
121121
Kind: BooleanKind,
122122
Name: typedMeas.Name,
123123
},
124+
VarType: "bool",
124125
}, nil
125126
case pod_data.EnumMeasurement:
126127
return EnumDescription{
@@ -130,6 +131,7 @@ func getField(m pod_data.Measurement) (any, error) {
130131
Name: typedMeas.Name,
131132
},
132133
Options: typedMeas.Options,
134+
VarType: "enum",
133135
}, nil
134136
default:
135137
return struct{}{}, errors.New("unrecognized measurement type")
@@ -157,9 +159,11 @@ type NumericDescription struct {
157159

158160
type BooleanDescription struct {
159161
fieldDescription
162+
VarType string `json:"type"`
160163
}
161164

162165
type EnumDescription struct {
163166
fieldDescription
164167
Options []string `json:"options"`
168+
VarType string `json:"type"`
165169
}

backend/pkg/broker/topics/order/send.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package order
22

33
import (
4+
"encoding/json"
5+
"fmt"
6+
47
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
8+
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/data"
59
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
610
)
711

@@ -12,6 +16,10 @@ type Send struct {
1216
api abstraction.BrokerAPI
1317
}
1418

19+
func NewSendTopic() *Send {
20+
return &Send{}
21+
}
22+
1523
func (send *Send) Topic() abstraction.BrokerTopic {
1624
return SendName
1725
}
@@ -24,10 +32,84 @@ func (send *Send) Pull(request abstraction.BrokerRequest) (abstraction.BrokerRes
2432
return nil, nil
2533
}
2634

35+
func (send *Send) ClientMessage(id websocket.ClientId, message *websocket.Message) {
36+
switch message.Topic {
37+
case SendName:
38+
err := send.handleOrder(id, message)
39+
if err != nil {
40+
fmt.Printf("error handling order: %v\n", err)
41+
}
42+
}
43+
}
44+
45+
func (send *Send) handleOrder(id websocket.ClientId, message *websocket.Message) error {
46+
var order Order
47+
err := json.Unmarshal(message.Payload, &order)
48+
if err != nil {
49+
return err
50+
}
51+
52+
send.api.UserPush(&order)
53+
return nil
54+
}
55+
2756
func (send *Send) SetPool(pool *websocket.Pool) {
2857
send.pool = pool
2958
}
3059

3160
func (send *Send) SetAPI(api abstraction.BrokerAPI) {
3261
send.api = api
3362
}
63+
64+
type Order struct {
65+
Id uint16 `json:"id"`
66+
Fields map[string]Field `json:"fields"`
67+
}
68+
69+
func (order *Order) Topic() abstraction.BrokerTopic {
70+
return SendName
71+
}
72+
73+
func (order *Order) ToPacket() (*data.Packet, error) {
74+
values := make(map[data.ValueName]data.Value)
75+
enabled := make(map[data.ValueName]bool)
76+
for name, field := range order.Fields {
77+
enabled[data.ValueName(name)] = field.IsEnabled
78+
switch field.Type {
79+
case "uint8":
80+
values[data.ValueName(name)] = data.NewNumericValue[uint8]((uint8)(field.Value.(float64)))
81+
case "uint16":
82+
values[data.ValueName(name)] = data.NewNumericValue[uint16]((uint16)(field.Value.(float64)))
83+
case "uint32":
84+
values[data.ValueName(name)] = data.NewNumericValue[uint32]((uint32)(field.Value.(float64)))
85+
case "uint64":
86+
values[data.ValueName(name)] = data.NewNumericValue[uint64]((uint64)(field.Value.(float64)))
87+
case "int8":
88+
values[data.ValueName(name)] = data.NewNumericValue[int8]((int8)(field.Value.(float64)))
89+
case "int16":
90+
values[data.ValueName(name)] = data.NewNumericValue[int16]((int16)(field.Value.(float64)))
91+
case "int32":
92+
values[data.ValueName(name)] = data.NewNumericValue[int32]((int32)(field.Value.(float64)))
93+
case "int64":
94+
values[data.ValueName(name)] = data.NewNumericValue[int64]((int64)(field.Value.(float64)))
95+
case "float32":
96+
values[data.ValueName(name)] = data.NewNumericValue[float32]((float32)(field.Value.(float64)))
97+
case "float64":
98+
values[data.ValueName(name)] = data.NewNumericValue[float64](field.Value.(float64))
99+
case "bool":
100+
values[data.ValueName(name)] = data.NewBooleanValue(field.Value.(bool))
101+
case "enum":
102+
values[data.ValueName(name)] = data.NewEnumValue(data.EnumVariant(field.Value.(string)))
103+
default:
104+
return nil, fmt.Errorf("unknown field type %s", field.Type)
105+
}
106+
}
107+
108+
return data.NewPacketWithValues(abstraction.PacketId(order.Id), values, enabled), nil
109+
}
110+
111+
type Field struct {
112+
Value any `json:"value"`
113+
IsEnabled bool `json:"isEnabled"`
114+
Type string `json:"type"`
115+
}

common-front/lib/adapters/Order.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ export type NumericDescription = AbstractFieldDescription & {
2727

2828
export type BooleanDescription = AbstractFieldDescription & {
2929
readonly kind: "boolean";
30+
readonly type: "bool";
3031
};
3132

3233
export type EnumDescription = AbstractFieldDescription & {
3334
readonly kind: "enum";
3435
readonly options: string[];
36+
readonly type: "enum";
3537
};
3638

3739
// export type ArrayDescription = AbstractFieldDescription & {

common-front/lib/models/Order.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type Order = {
88
export type OrderField = {
99
value: string | number | boolean;
1010
isEnabled: boolean;
11+
type: string;
1112
};
1213

1314
export type VehicleOrders = {

ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/OrderForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function createOrder(id: number, fields: FormField[]): Order {
2121
fields.map((field) => {
2222
return [
2323
field.id,
24-
{ value: field.value, isEnabled: field.isEnabled },
24+
{ value: field.value, isEnabled: field.isEnabled, type: field.type },
2525
];
2626
})
2727
),

ethernet-view/src/components/OrdersContainer/Orders/BoardOrders/OrderForm/form.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ function getBooleanFormField(desc: BooleanDescription): BooleanField {
8282
id: desc.id,
8383
name: desc.name,
8484
kind: desc.kind,
85+
type: desc.type,
8586
value: false,
8687
isValid: true,
8788
isEnabled: true,
@@ -92,6 +93,7 @@ function getEnumFormField(desc: EnumDescription): EnumField {
9293
id: desc.id,
9394
name: desc.name,
9495
kind: desc.kind,
96+
type: desc.type,
9597
options: desc.options,
9698
value: desc.options[0],
9799
isValid: true,

0 commit comments

Comments
 (0)