Skip to content

Commit bd3317f

Browse files
authored
Remove all remaining usages of MessageToDict (UBC-Thunderbots#3472)
1 parent 473badd commit bd3317f

2 files changed

Lines changed: 39 additions & 117 deletions

File tree

src/software/thunderscope/gl/layers/gl_referee_info_layer.py

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
from typing import Optional
2-
31
from PyQt6 import QtGui
4-
from google.protobuf.json_format import MessageToDict
52
from pyqtgraph.opengl.items.GLTextItem import GLTextItem
63

74
from proto.import_all_protos import *
@@ -14,7 +11,6 @@
1411
)
1512
from software.thunderscope.gl.graphics.gl_circle import GLCircle
1613
from software.thunderscope.gl.graphics.gl_label import GLLabel
17-
from software.thunderscope.gl.helpers.observable_list import ObservableList
1814
from software.thunderscope.gl.layers.gl_layer import GLLayer
1915
from software.thunderscope.thread_safe_buffer import ThreadSafeBuffer
2016

@@ -54,8 +50,6 @@ def __init__(self, name: str, buffer_size: int = 1) -> None:
5450
self.cached_world = None
5551
self.cached_referee_info = None
5652

57-
self.referee_text_graphics = ObservableList(self._graphics_changed)
58-
5953
self.placement_tolerance_graphic = GLCircle(
6054
parent_item=self,
6155
radius=BALL_PLACEMENT_TOLERANCE_RADIUS_METERS,
@@ -74,11 +68,14 @@ def __init__(self, name: str, buffer_size: int = 1) -> None:
7468
outline_color=self.BALL_PLACEMENT_ROBOT_AVOID_AREA_VISUALIZATION_COLOR,
7569
)
7670

77-
# initialize the two text items to display
78-
self.gamestate_type_text: Optional[GLLabel] = None
79-
self.command_type_text: Optional[GLLabel] = None
71+
self.gamestate_type_text = GLLabel(parent_item=self, offset=(-10, 50))
72+
self.command_type_text = GLLabel(parent_item=self, offset=(-10, 70))
8073

81-
self.ball_placement_countdown_graphic: Optional[GLTextItem] = None
74+
self.ball_placement_countdown_graphic = GLTextItem(
75+
parentItem=self,
76+
font=QtGui.QFont(THUNDERSCOPE_UI_FONT_NAME, 7, weight=700),
77+
color=self.COUNT_DOWN_TEXT_COLOR,
78+
)
8279

8380
self.ball_placement_point = None
8481
self.ball_placement_in_progress = False
@@ -91,13 +88,6 @@ def __update_ball_placement(self) -> None:
9188
block=False, return_cached=False
9289
)
9390

94-
if not self.ball_placement_countdown_graphic:
95-
self.ball_placement_countdown_graphic = GLTextItem(
96-
parentItem=self,
97-
font=QtGui.QFont(THUNDERSCOPE_UI_FONT_NAME, 7, weight=700),
98-
color=self.COUNT_DOWN_TEXT_COLOR,
99-
)
100-
10191
# if ball placement is in progress, update all the visuals
10292
if self.ball_placement_in_progress:
10393
self.__update_ball_placement_status(self.cached_world.ball.current_state)
@@ -124,34 +114,17 @@ def __update_referee_info(self):
124114
if not referee_proto:
125115
return
126116

127-
referee_msg_dict = MessageToDict(referee_proto)
128-
if not referee_msg_dict:
129-
return
130-
self.cached_referee_info = referee_msg_dict
117+
self.cached_referee_info = referee_proto
131118

132-
if not self.gamestate_type_text:
133-
self.gamestate_type_text = GLLabel(
134-
parent_item=self,
135-
offset=(-10, 50),
136-
text=GLRefereeInfoLayer.GAMESTATE_PREFIX + referee_msg_dict["stage"],
137-
)
138-
self.referee_text_graphics.append(self.gamestate_type_text)
139-
else:
140-
self.gamestate_type_text.set_text(
141-
GLRefereeInfoLayer.GAMESTATE_PREFIX + referee_msg_dict["stage"]
142-
)
119+
self.gamestate_type_text.set_text(
120+
GLRefereeInfoLayer.GAMESTATE_PREFIX
121+
+ Referee.Stage.Name(referee_proto.stage)
122+
)
143123

144-
if not self.command_type_text:
145-
self.command_type_text = GLLabel(
146-
parent_item=self,
147-
offset=(-10, 70),
148-
text=GLRefereeInfoLayer.GAMESTATE_PREFIX + referee_msg_dict["command"],
149-
)
150-
self.referee_text_graphics.append(self.command_type_text)
151-
else:
152-
self.command_type_text.set_text(
153-
GLRefereeInfoLayer.REFEREE_COMMAND_PREFIX + referee_msg_dict["command"]
154-
)
124+
self.command_type_text.set_text(
125+
GLRefereeInfoLayer.REFEREE_COMMAND_PREFIX
126+
+ Referee.Command.Name(referee_proto.command)
127+
)
155128

156129
def refresh_graphics(self) -> None:
157130
"""Refresh all visuals for both ball placement and referee info"""
@@ -196,8 +169,7 @@ def __update_target_visual(self) -> None:
196169
# update the count-down graphics
197170
if self.cached_referee_info:
198171
time_left = max(
199-
int(self.cached_referee_info["currentActionTimeRemaining"]) // 1000000,
200-
0,
172+
self.cached_referee_info.current_action_time_remaining // 1000000, 0
201173
)
202174
self.ball_placement_countdown_graphic.setData(text=f"{time_left}s")
203175

Lines changed: 22 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
from collections import defaultdict
12
from pyqtgraph.Qt.QtWidgets import *
23
from proto.import_all_protos import *
34
from software.py_constants import SECONDS_PER_MICROSECOND, SECONDS_PER_MINUTE
45
from software.thunderscope.common.common_widgets import set_table_data
56
from software.thunderscope.thread_safe_buffer import ThreadSafeBuffer
6-
from google.protobuf.json_format import MessageToDict
77

88

99
class RefereeInfoWidget(QWidget):
@@ -34,6 +34,9 @@ def __init__(self, buffer_size: int = 1) -> None:
3434
self.vertical_layout.addWidget(self.referee_info)
3535
self.setLayout(self.vertical_layout)
3636

37+
# Team info table data, indexed by [field_name]["blue" | "yellow"]
38+
self.team_info = defaultdict(dict)
39+
3740
def refresh(self) -> None:
3841
"""Update the referee info widget with new referee information"""
3942
referee = self.referee_buffer.get(block=False, return_cached=False)
@@ -42,68 +45,27 @@ def refresh(self) -> None:
4245
if referee is None:
4346
return
4447

45-
referee_msg_dict = MessageToDict(referee)
46-
47-
if not referee_msg_dict:
48-
return
49-
50-
stage_time_left_s = (
51-
int(referee_msg_dict["stageTimeLeft"]) * SECONDS_PER_MICROSECOND
52-
)
53-
p = (
54-
f"Packet Timestamp: {round(float(referee_msg_dict['packetTimestamp']) * SECONDS_PER_MICROSECOND, 3)}\n"
48+
stage_time_left_s = referee.stage_time_left * SECONDS_PER_MICROSECOND
49+
self.referee_info.setText(
50+
f"Packet Timestamp: {round(referee.packet_timestamp * SECONDS_PER_MICROSECOND, 3)}\n"
5551
+ f"Stage Time Left: {int(stage_time_left_s / SECONDS_PER_MINUTE):02d}"
5652
+ f":{int(stage_time_left_s % SECONDS_PER_MINUTE):02d}\n"
57-
+ f"Stage: {referee_msg_dict['stage']}\n"
58-
+ "Command: "
59-
+ referee_msg_dict["command"]
60-
+ "\n"
61-
+ f"Blue Team on Positive Half: {referee_msg_dict['blueTeamOnPositiveHalf']}\n"
53+
+ f"Stage: {Referee.Stage.Name(referee.stage)}\n"
54+
+ f"Command: {Referee.Command.Name(referee.command)}\n"
55+
+ f"Blue Team on Positive Half: {referee.blue_team_on_positive_half}\n"
6256
)
63-
self.referee_info.setText(p)
64-
65-
team_info = []
66-
blue = []
67-
yellow = []
68-
69-
for team_info_name in referee_msg_dict["blue"]:
70-
if team_info_name == "timeouts":
71-
team_info.append("remainingTimeouts")
72-
elif team_info_name == "goalkeeper":
73-
team_info.append("goalkeeperID")
74-
else:
75-
team_info.append(team_info_name)
76-
77-
for team_info_name in referee_msg_dict["yellow"]:
78-
if team_info_name in team_info:
79-
continue
80-
81-
if team_info_name == "timeouts":
82-
team_info.append("remainingTimeouts")
83-
elif team_info_name == "goalkeeper":
84-
team_info.append("goalkeeperID")
85-
else:
86-
team_info.append(team_info_name)
87-
88-
for info in team_info:
89-
if info == "yellowCardTimes":
90-
blue.append(self.parse_yellow_card_times(referee_msg_dict["blue"]))
91-
yellow.append(self.parse_yellow_card_times(referee_msg_dict["yellow"]))
92-
elif info == "remainingTimeouts":
93-
blue.append(referee_msg_dict["blue"]["timeouts"])
94-
yellow.append(referee_msg_dict["yellow"]["timeouts"])
95-
elif info == "goalkeeperID":
96-
blue.append(referee_msg_dict["blue"]["goalkeeper"])
97-
yellow.append(referee_msg_dict["yellow"]["goalkeeper"])
98-
else:
99-
blue.append(referee_msg_dict["blue"][info])
100-
yellow.append(referee_msg_dict["yellow"][info])
57+
58+
for field_descriptor, field_val in referee.blue.ListFields():
59+
self.team_info[field_descriptor.name]["blue"] = field_val
60+
61+
for field_descriptor, field_val in referee.yellow.ListFields():
62+
self.team_info[field_descriptor.name]["yellow"] = field_val
10163

10264
set_table_data(
10365
{
104-
"Team Info": team_info,
105-
"Blue": blue,
106-
"Yellow": yellow,
66+
"Team Info": self.team_info.keys(),
67+
"Blue": [val["blue"] for val in self.team_info.values()],
68+
"Yellow": [val["yellow"] for val in self.team_info.values()],
10769
},
10870
self.referee_table,
10971
RefereeInfoWidget.HEADER_SIZE_HINT_WIDTH_EXPANSION,
@@ -118,18 +80,6 @@ def parse_yellow_card_times(self, team_info: TeamInfo) -> str:
11880
11981
:param team_info: TeamInfo protobuf dict to parse
12082
"""
121-
text = ""
122-
if "yellowCardTimes" in team_info:
123-
yellow_card_times = team_info["yellowCardTimes"]
124-
for i in range(0, len(yellow_card_times) - 1):
125-
formatted_time = int(yellow_card_times[i] * SECONDS_PER_MICROSECOND)
126-
text = text + str(formatted_time) + ", "
127-
128-
formatted_time = int(
129-
yellow_card_times[len(yellow_card_times) - 1] * SECONDS_PER_MICROSECOND
130-
)
131-
text = text + str(formatted_time)
132-
else:
133-
text = "0"
134-
135-
return text
83+
return [
84+
time * SECONDS_PER_MICROSECOND for time in team_info.yellow_card_times
85+
].join(", ")

0 commit comments

Comments
 (0)