Skip to content

Commit 17339b0

Browse files
authored
Merge pull request #100 from HyperloopUPV-H8/backend/reset-counter
[ethernet-view] reset packet information when board reconnects
2 parents f500d69 + 1a944d2 commit 17339b0

9 files changed

Lines changed: 139 additions & 15 deletions

File tree

backend/cmd/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,15 @@ func main() {
112112
}
113113

114114
// <--- update factory --->
115-
updateFactory := update_factory.NewFactory()
115+
boardToPackets := make(map[abstraction.TransportTarget][]uint16)
116+
for _, board := range podData.Boards {
117+
packetIds := make([]uint16, len(board.Packets))
118+
for i, packet := range board.Packets {
119+
packetIds[i] = packet.Id
120+
}
121+
boardToPackets[abstraction.TransportTarget(board.Name)] = packetIds
122+
}
123+
updateFactory := update_factory.NewFactory(boardToPackets)
116124

117125
// <--- logger --->
118126
var boardMap map[abstraction.BoardId]string

backend/internal/update_factory/update_factory.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"github.com/HyperloopUPV-H8/h9-backend/internal/common"
9+
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
910
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/data"
1011

1112
"github.com/HyperloopUPV-H8/h9-backend/internal/update_factory/models"
@@ -30,9 +31,10 @@ type UpdateFactory struct {
3031
packetCount map[uint16]uint
3132
lastPacketCount map[uint16]float64
3233
trace zerolog.Logger
34+
boardToPackets map[abstraction.TransportTarget][]uint16
3335
}
3436

35-
func NewFactory() *UpdateFactory {
37+
func NewFactory(boardToPackets map[abstraction.TransportTarget][]uint16) *UpdateFactory {
3638
trace.Info().Msg("new update factory")
3739
factory := &UpdateFactory{
3840
count: make(map[uint16]uint64),
@@ -44,13 +46,39 @@ func NewFactory() *UpdateFactory {
4446
packetCount: make(map[uint16]uint),
4547
lastPacketCount: make(map[uint16]float64),
4648
trace: trace.With().Str("component", "updateFactory").Logger(),
49+
boardToPackets: boardToPackets,
4750
}
4851

4952
go factory.adjustOrder()
5053

5154
return factory
5255
}
5356

57+
func (factory *UpdateFactory) ClearPacketsFor(target abstraction.TransportTarget) {
58+
packets, ok := factory.boardToPackets[target]
59+
if !ok {
60+
return
61+
}
62+
63+
factory.averageMx.Lock()
64+
defer factory.averageMx.Unlock()
65+
factory.countMx.Lock()
66+
defer factory.countMx.Unlock()
67+
68+
for _, id := range packets {
69+
factory.clearPacket(id)
70+
}
71+
}
72+
73+
func (factory *UpdateFactory) clearPacket(id uint16) {
74+
delete(factory.count, id)
75+
delete(factory.cycleTimeAvg, id)
76+
delete(factory.timestamp, id)
77+
delete(factory.fieldAvg, id)
78+
delete(factory.packetCount, id)
79+
delete(factory.lastPacketCount, id)
80+
}
81+
5482
func (factory *UpdateFactory) NewUpdate(packet *data.Packet) models.Update {
5583
factory.updateCount(uint16(packet.Id()))
5684

backend/pkg/broker/topics/connection/update.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ func (update *Update) Push(push abstraction.BrokerPush) error {
4949
defer update.connectionMx.Unlock()
5050
update.connections[connection.Name] = *connection
5151

52-
rawPayload, err := json.Marshal(update.connections)
52+
rawPayload, err := json.Marshal(map[string]Connection{
53+
connection.Name: *connection,
54+
})
5355
if err != nil {
5456
return err
5557
}

backend/pkg/vehicle/vehicle.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,7 @@ func (vehicle *Vehicle) SendPush(abstraction.BrokerPush) error {
177177
// ConnectionUpdate is the method invoked by transport to signal a connection state has changed
178178
func (vehicle *Vehicle) ConnectionUpdate(target abstraction.TransportTarget, isConnected bool) {
179179
vehicle.broker.Push(connection_topic.NewConnection(string(target), isConnected))
180+
if isConnected {
181+
vehicle.updateFactory.ClearPacketsFor(target)
182+
}
180183
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
import { Connection } from "../models";
22

3-
export type ConnectionsUpdate = Connection[];
3+
export type ConnectionsUpdate = {[name: string]: Connection};

common-front/lib/components/Connections/useConnections.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
import { useConnectionsStore, useSubscribe } from "../..";
1+
import { useConnectionsStore, useMeasurementsStore, usePodDataStore, useSubscribe } from "../..";
22

33
export function useConnections() {
44

5-
// const setBoardConnections = useStore(state => state.setConnections);
6-
// const connections = useStore(state => state.connections);
7-
8-
const setBoardConnections = useConnectionsStore(state => state.setConnections);
5+
const setBoardConnections = useConnectionsStore(state => state.setConnections)
6+
const clearMeasurements = useMeasurementsStore(state => state.clearMeasurements)
7+
const clearPodData = usePodDataStore(state => state.clearPodData);
98
const connections = useConnectionsStore(state => state.connections)
109

1110
useSubscribe("connection/update", (update) => {
1211
setBoardConnections(update)
12+
for (const connection of Object.values(update)) {
13+
if (connection.isConnected) {
14+
clearMeasurements(connection.name)
15+
clearPodData(connection.name)
16+
}
17+
}
1318
});
1419

1520
return connections;

common-front/lib/store/connectionsStore.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Connection } from "..";
1+
import { Connection, ConnectionsUpdate } from "..";
22
import { StateCreator, StoreApi, create } from "zustand";
33

44
export interface ConnectionsStore {
@@ -7,10 +7,10 @@ export interface ConnectionsStore {
77
boards: Connection[];
88
}
99
setBackendConnection: (isConnected: boolean) => void;
10-
setConnections: (connections: Connection[]) => void;
10+
setConnections: (connections: ConnectionsUpdate) => void;
1111
}
1212

13-
export const useConnectionsStore = create<ConnectionsStore>((set) => ({
13+
export const useConnectionsStore = create<ConnectionsStore>((set, get) => ({
1414
connections: {
1515
backend: { name: "Backend WebSocket", isConnected: false },
1616
boards: [] as Connection[],
@@ -42,12 +42,25 @@ export const useConnectionsStore = create<ConnectionsStore>((set) => ({
4242
* When a board connection state changes, it updates all the connections.
4343
* @param {Connection[]} connections
4444
*/
45-
setConnections: (connections: Connection[]) => {
45+
setConnections: (connections: ConnectionsUpdate) => {
46+
const boardsDraft = get().connections.boards;
47+
48+
for (const board of boardsDraft) {
49+
if (board.name in connections) {
50+
board.isConnected = connections[board.name].isConnected
51+
delete(connections[board.name])
52+
}
53+
}
54+
55+
for (const connection of Object.values(connections)) {
56+
boardsDraft.push(connection)
57+
}
58+
4659
set(state => ({
4760
...state,
4861
connections: {
4962
...state.connections,
50-
boards: connections
63+
boards: boardsDraft
5164
}
5265
}))
5366
}

common-front/lib/store/measurementsStore.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import {
88
PacketUpdate,
99
} from "../adapters";
1010
import { create } from "zustand";
11+
import { isNumericType } from "../BackendTypes";
1112

1213
export type Measurements = Record<string, Measurement>
1314

1415
export interface MeasurementsStore {
1516
measurements: Measurements;
1617
packetIdToBoard: Record<number, string>;
1718
initMeasurements: (podDataAdapter: PodDataAdapter) => void;
18-
updateMeasurements: (measurements: Record<string, PacketUpdate>) => void
19+
updateMeasurements: (measurements: Record<string, PacketUpdate>) => void;
20+
clearMeasurements: (board: string) => void
1921
}
2022

2123
export const useMeasurementsStore = create<MeasurementsStore>((set, get) => ({
@@ -57,6 +59,31 @@ export const useMeasurementsStore = create<MeasurementsStore>((set, get) => ({
5759
measurementsDraft[measurementId].value = mUpdate;
5860
}
5961
}
62+
63+
set(state => ({
64+
...state,
65+
measurements: measurementsDraft
66+
}))
67+
},
68+
69+
clearMeasurements: (board: string) => {
70+
const measurementsDraft = get().measurements;
71+
72+
for (const measurementId in measurementsDraft) {
73+
if (measurementId.includes(board)) {
74+
if (isNumericType(measurementsDraft[measurementId].type)) {
75+
measurementsDraft[measurementId].value = {
76+
average: 0,
77+
last: 0,
78+
}
79+
} else if (measurementsDraft[measurementId].type == "bool") {
80+
measurementsDraft[measurementId].value = false
81+
} else {
82+
measurementsDraft[measurementId].value = "Default"
83+
}
84+
}
85+
}
86+
6087
set(state => ({
6188
...state,
6289
measurements: measurementsDraft

common-front/lib/store/podDataStore.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { isNumericType } from "../BackendTypes";
12
import {
23
createPodDataFromAdapter,
34
PacketUpdate,
@@ -13,6 +14,7 @@ export interface PodDataStore {
1314
podData: PodData
1415
initPodData: (podDataAdapter: PodDataAdapter) => void
1516
updatePodData: (packetUpdates: Record<number, PacketUpdate>) => void
17+
clearPodData: (board: string) => void
1618
}
1719

1820
export const usePodDataStore = create<PodDataStore>((set, get) => ({
@@ -101,6 +103,42 @@ export const usePodDataStore = create<PodDataStore>((set, get) => ({
101103
}
102104
}))
103105
},
106+
107+
clearPodData(boardName: string) {
108+
const boardsDraft = get().podData.boards
109+
110+
for (const board of boardsDraft) {
111+
if (board.name != boardName) {
112+
continue;
113+
}
114+
115+
for (const packet of board.packets) {
116+
packet.count = 0
117+
packet.cycleTime = 0
118+
packet.hexValue = ""
119+
for (const measurement of packet.measurements) {
120+
if (isNumericType(measurement.type)) {
121+
measurement.value = {
122+
average: 0,
123+
last: 0,
124+
}
125+
} else if (measurement.type == "bool") {
126+
measurement.value = false
127+
} else {
128+
measurement.value = "Default"
129+
}
130+
}
131+
}
132+
}
133+
134+
set(state => ({
135+
...state,
136+
podData: {
137+
...state.podData,
138+
boards: boardsDraft,
139+
}
140+
}))
141+
}
104142
}))
105143

106144
export function getPacket(podData: PodData, id: number): Packet | undefined {

0 commit comments

Comments
 (0)