dexcontrol 0.2.7__py3-none-any.whl → 0.2.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. dexcontrol/__init__.py +1 -0
  2. dexcontrol/config/core/arm.py +6 -0
  3. dexcontrol/config/core/hand.py +5 -16
  4. dexcontrol/config/core/head.py +7 -8
  5. dexcontrol/config/core/misc.py +14 -1
  6. dexcontrol/config/core/torso.py +8 -4
  7. dexcontrol/config/sensors/cameras/__init__.py +2 -1
  8. dexcontrol/config/sensors/cameras/luxonis_camera.py +51 -0
  9. dexcontrol/config/sensors/cameras/rgb_camera.py +1 -1
  10. dexcontrol/config/sensors/cameras/zed_camera.py +2 -2
  11. dexcontrol/config/sensors/vega_sensors.py +9 -1
  12. dexcontrol/config/vega.py +30 -2
  13. dexcontrol/core/arm.py +95 -43
  14. dexcontrol/core/component.py +92 -6
  15. dexcontrol/core/hand.py +81 -13
  16. dexcontrol/core/head.py +55 -26
  17. dexcontrol/core/misc.py +94 -13
  18. dexcontrol/core/torso.py +44 -11
  19. dexcontrol/proto/dexcontrol_msg_pb2.py +38 -36
  20. dexcontrol/proto/dexcontrol_msg_pb2.pyi +48 -20
  21. dexcontrol/proto/dexcontrol_query_pb2.py +7 -3
  22. dexcontrol/proto/dexcontrol_query_pb2.pyi +24 -0
  23. dexcontrol/robot.py +319 -75
  24. dexcontrol/sensors/__init__.py +2 -1
  25. dexcontrol/sensors/camera/__init__.py +2 -0
  26. dexcontrol/sensors/camera/luxonis_camera.py +169 -0
  27. dexcontrol/sensors/camera/rgb_camera.py +36 -0
  28. dexcontrol/sensors/camera/zed_camera.py +48 -8
  29. dexcontrol/sensors/imu/chassis_imu.py +5 -1
  30. dexcontrol/sensors/imu/zed_imu.py +3 -2
  31. dexcontrol/sensors/lidar/rplidar.py +1 -0
  32. dexcontrol/sensors/manager.py +3 -0
  33. dexcontrol/utils/constants.py +3 -0
  34. dexcontrol/utils/error_code.py +236 -0
  35. dexcontrol/utils/subscribers/lidar.py +1 -0
  36. dexcontrol/utils/trajectory_utils.py +17 -5
  37. dexcontrol/utils/viz_utils.py +86 -11
  38. dexcontrol/utils/zenoh_utils.py +39 -0
  39. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/METADATA +6 -4
  40. dexcontrol-0.2.12.dist-info/RECORD +75 -0
  41. dexcontrol-0.2.7.dist-info/RECORD +0 -72
  42. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/WHEEL +0 -0
  43. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/licenses/LICENSE +0 -0
dexcontrol/core/misc.py CHANGED
@@ -95,6 +95,14 @@ class Battery(RobotComponent):
95
95
  - power: Power consumption in Watts
96
96
  """
97
97
  state = self._get_state()
98
+ if state is None:
99
+ return {
100
+ "percentage": 0.0,
101
+ "temperature": 0.0,
102
+ "current": 0.0,
103
+ "voltage": 0.0,
104
+ "power": 0.0,
105
+ }
98
106
  return {
99
107
  "percentage": float(state.percentage),
100
108
  "temperature": float(state.temperature),
@@ -111,6 +119,11 @@ class Battery(RobotComponent):
111
119
  table.add_column("Parameter", style="cyan")
112
120
  table.add_column("Value")
113
121
 
122
+ if state is None:
123
+ table.add_row("Status", "[red]No battery data available[/]")
124
+ self._console.print(table)
125
+ return
126
+
114
127
  battery_style = self._get_battery_level_style(state.percentage)
115
128
  table.add_row("Battery Level", f"[{battery_style}]{state.percentage:.1f}%[/]")
116
129
 
@@ -213,10 +226,14 @@ class EStop(RobotComponent):
213
226
  configs: EStop configuration containing subscription topics.
214
227
  zenoh_session: Active Zenoh session for communication.
215
228
  """
229
+ self._enabled = configs.enabled
216
230
  super().__init__(
217
231
  configs.state_sub_topic, zenoh_session, dexcontrol_msg_pb2.EStopState
218
232
  )
219
233
  self._estop_query_name = configs.estop_query_name
234
+ if not self._enabled:
235
+ logger.warning("EStop monitoring is DISABLED via configuration")
236
+ return
220
237
  self._shutdown_event = threading.Event()
221
238
  self._monitor_thread = threading.Thread(target=self._estop_monitor, daemon=True)
222
239
  self._monitor_thread.start()
@@ -264,6 +281,11 @@ class EStop(RobotComponent):
264
281
  - software_estop_enabled: Software EStop enabled
265
282
  """
266
283
  state = self._get_state()
284
+ if state is None:
285
+ return {
286
+ "button_pressed": False,
287
+ "software_estop_enabled": False,
288
+ }
267
289
  return {
268
290
  "button_pressed": state.button_pressed,
269
291
  "software_estop_enabled": state.software_estop_enabled,
@@ -271,11 +293,13 @@ class EStop(RobotComponent):
271
293
 
272
294
  def is_button_pressed(self) -> bool:
273
295
  """Checks if the EStop button is pressed."""
274
- return self._get_state().button_pressed
296
+ state = self._get_state()
297
+ return state.button_pressed if state is not None else False
275
298
 
276
299
  def is_software_estop_enabled(self) -> bool:
277
300
  """Checks if the software EStop is enabled."""
278
- return self._get_state().software_estop_enabled
301
+ state = self._get_state()
302
+ return state.software_estop_enabled if state is not None else False
279
303
 
280
304
  def activate(self) -> None:
281
305
  """Activates the software emergency stop (E-Stop)."""
@@ -291,11 +315,12 @@ class EStop(RobotComponent):
291
315
 
292
316
  def shutdown(self) -> None:
293
317
  """Shuts down the EStop component and stops monitoring thread."""
294
- self._shutdown_event.set()
295
- if self._monitor_thread and self._monitor_thread.is_alive():
296
- self._monitor_thread.join(timeout=2.0) # Extended timeout
297
- if self._monitor_thread.is_alive():
298
- logger.warning("EStop monitor thread did not terminate cleanly")
318
+ if self._enabled:
319
+ self._shutdown_event.set()
320
+ if self._monitor_thread and self._monitor_thread.is_alive():
321
+ self._monitor_thread.join(timeout=2.0) # Extended timeout
322
+ if self._monitor_thread.is_alive():
323
+ logger.warning("EStop monitor thread did not terminate cleanly")
299
324
  super().shutdown()
300
325
 
301
326
  def show(self) -> None:
@@ -306,6 +331,12 @@ class EStop(RobotComponent):
306
331
  table.add_column("Parameter", style="cyan")
307
332
  table.add_column("Value")
308
333
 
334
+ if state is None:
335
+ table.add_row("Status", "[red]No E-Stop data available[/]")
336
+ console = Console()
337
+ console.print(table)
338
+ return
339
+
309
340
  button_style = "bold red" if state.button_pressed else "bold dark_green"
310
341
  table.add_row("Button Pressed", f"[{button_style}]{state.button_pressed}[/]")
311
342
 
@@ -387,9 +418,12 @@ class Heartbeat:
387
418
  Returns:
388
419
  Decoded heartbeat timestamp value in seconds.
389
420
  """
390
- timestamp = int.from_bytes(data.to_bytes(), byteorder="little")
391
- # convert it from microseconds to seconds
392
- return timestamp / 1000000.0
421
+ # Decode UTF-8 string and convert to float
422
+ # Publisher sends: str(self.timecount_now).encode() in milliseconds
423
+ timestamp_str = data.to_bytes().decode("utf-8")
424
+ timestamp_ms = float(timestamp_str)
425
+ # Convert from milliseconds to seconds
426
+ return timestamp_ms / 1000.0
393
427
 
394
428
  def _heartbeat_monitor(self) -> None:
395
429
  """Background thread that continuously monitors heartbeat signal."""
@@ -527,6 +561,52 @@ class Heartbeat:
527
561
  return False
528
562
  return self._subscriber.is_active()
529
563
 
564
+ @staticmethod
565
+ def _format_uptime(seconds: float) -> str:
566
+ """Convert seconds to human-readable uptime format with high resolution.
567
+
568
+ Args:
569
+ seconds: Total seconds of uptime.
570
+
571
+ Returns:
572
+ Human-readable string like "1mo 2d 3h 45m 12s 345ms".
573
+ """
574
+ # Calculate months (assuming 30 days per month)
575
+ months = int(seconds // (86400 * 30))
576
+ remaining = seconds % (86400 * 30)
577
+
578
+ # Calculate days
579
+ days = int(remaining // 86400)
580
+ remaining = remaining % 86400
581
+
582
+ # Calculate hours
583
+ hours = int(remaining // 3600)
584
+ remaining = remaining % 3600
585
+
586
+ # Calculate minutes
587
+ minutes = int(remaining // 60)
588
+ remaining = remaining % 60
589
+
590
+ # Calculate seconds and milliseconds
591
+ secs = int(remaining)
592
+ milliseconds = int((remaining - secs) * 1000)
593
+
594
+ parts = []
595
+ if months > 0:
596
+ parts.append(f"{months}mo")
597
+ if days > 0:
598
+ parts.append(f"{days}d")
599
+ if hours > 0:
600
+ parts.append(f"{hours}h")
601
+ if minutes > 0:
602
+ parts.append(f"{minutes}m")
603
+ if secs > 0:
604
+ parts.append(f"{secs}s")
605
+ if milliseconds > 0 or not parts:
606
+ parts.append(f"{milliseconds}ms")
607
+
608
+ return " ".join(parts)
609
+
530
610
  def shutdown(self) -> None:
531
611
  """Shuts down the heartbeat monitor and stops monitoring thread."""
532
612
  if not self._enabled:
@@ -567,12 +647,13 @@ class Heartbeat:
567
647
  active_style = "bold dark_green" if status["is_active"] else "bold red"
568
648
  table.add_row("Signal Active", f"[{active_style}]{status['is_active']}[/]")
569
649
 
570
- # Last heartbeat value
650
+ # Last heartbeat value (robot uptime)
571
651
  last_value = status["last_value"]
572
652
  if last_value is not None:
573
- table.add_row("Last Value", f"[blue]{last_value:.6f}s[/]")
653
+ uptime_str = self._format_uptime(last_value)
654
+ table.add_row("Robot server uptime", f"[blue]{uptime_str}[/]")
574
655
  else:
575
- table.add_row("Last Value", "[red]No data[/]")
656
+ table.add_row("Robot server uptime", "[red]No data[/]")
576
657
 
577
658
  # Time since last heartbeat
578
659
  time_since = status["time_since_last"]
dexcontrol/core/torso.py CHANGED
@@ -14,8 +14,6 @@ This module provides the Torso class for controlling a robot torso through Zenoh
14
14
  communication. It handles joint position and velocity control and state monitoring.
15
15
  """
16
16
 
17
- import time
18
-
19
17
  import numpy as np
20
18
  import zenoh
21
19
  from jaxtyping import Float
@@ -54,10 +52,15 @@ class Torso(RobotJointComponent):
54
52
  state_message_type=dexcontrol_msg_pb2.TorsoState,
55
53
  zenoh_session=zenoh_session,
56
54
  joint_name=configs.joint_name,
55
+ joint_limit=configs.joint_limit
56
+ if hasattr(configs, "joint_limit")
57
+ else None,
58
+ joint_vel_limit=configs.joint_vel_limit
59
+ if hasattr(configs, "joint_vel_limit")
60
+ else None,
57
61
  pose_pool=configs.pose_pool,
58
62
  )
59
- self.default_vel = configs.default_vel
60
- self.max_vel = configs.max_vel
63
+ assert self._joint_vel_limit is not None, "joint_vel_limit is not set"
61
64
 
62
65
  def set_joint_pos_vel(
63
66
  self,
@@ -69,6 +72,8 @@ class Torso(RobotJointComponent):
69
72
  | None = None,
70
73
  relative: bool = False,
71
74
  wait_time: float = 0.0,
75
+ exit_on_reach: bool = False,
76
+ exit_on_reach_kwargs: dict[str, float] | None = None,
72
77
  ) -> None:
73
78
  """Send control commands to the torso.
74
79
 
@@ -86,6 +91,8 @@ class Torso(RobotJointComponent):
86
91
  relative: If True, the joint positions are relative to the current position.
87
92
  wait_time: Time to wait after sending command in seconds. If 0, returns
88
93
  immediately after sending command.
94
+ exit_on_reach: If True, the function will exit when the joint positions are reached.
95
+ exit_on_reach_kwargs: Optional parameters for exit when the joint positions are reached.
89
96
 
90
97
  Raises:
91
98
  ValueError: If wait_time is negative or joint_pos dictionary contains
@@ -102,6 +109,15 @@ class Torso(RobotJointComponent):
102
109
  joint_pos = self._convert_joint_cmd_to_array(joint_pos)
103
110
  joint_vel = self._process_joint_velocities(joint_vel, joint_pos)
104
111
 
112
+ if self._joint_limit is not None:
113
+ joint_pos = np.clip(
114
+ joint_pos, self._joint_limit[:, 0], self._joint_limit[:, 1]
115
+ )
116
+ if self._joint_vel_limit is not None:
117
+ joint_vel = np.clip(
118
+ joint_vel, -self._joint_vel_limit, self._joint_vel_limit
119
+ )
120
+
105
121
  # Create and send control message
106
122
  control_msg = dexcontrol_msg_pb2.TorsoCommand()
107
123
  control_msg.joint_pos.extend(joint_pos.tolist())
@@ -109,8 +125,12 @@ class Torso(RobotJointComponent):
109
125
  self._publish_control(control_msg)
110
126
 
111
127
  # Wait if specified
112
- if wait_time > 0.0:
113
- time.sleep(wait_time)
128
+ self._wait_for_position(
129
+ joint_pos=joint_pos,
130
+ wait_time=wait_time,
131
+ exit_on_reach=exit_on_reach,
132
+ exit_on_reach_kwargs=exit_on_reach_kwargs,
133
+ )
114
134
 
115
135
  def set_joint_pos(
116
136
  self,
@@ -118,6 +138,8 @@ class Torso(RobotJointComponent):
118
138
  relative: bool = False,
119
139
  wait_time: float = 0.0,
120
140
  wait_kwargs: dict[str, float] | None = None,
141
+ exit_on_reach: bool = False,
142
+ exit_on_reach_kwargs: dict[str, float] | None = None,
121
143
  ) -> None:
122
144
  """Send joint position control commands to the torso.
123
145
 
@@ -130,12 +152,19 @@ class Torso(RobotJointComponent):
130
152
  wait_time: Time to wait after sending command in seconds. If 0, returns
131
153
  immediately after sending command.
132
154
  wait_kwargs: Optional parameters for trajectory generation (not used in Torso).
155
+ exit_on_reach: If True, the function will exit when the joint positions are reached.
156
+ exit_on_reach_kwargs: Optional parameters for exit when the joint positions are reached.
133
157
 
134
158
  Raises:
135
159
  ValueError: If joint_pos dictionary contains invalid joint names.
136
160
  """
137
161
  self.set_joint_pos_vel(
138
- joint_pos, joint_vel=None, relative=relative, wait_time=wait_time
162
+ joint_pos,
163
+ joint_vel=None,
164
+ relative=relative,
165
+ wait_time=wait_time,
166
+ exit_on_reach=exit_on_reach,
167
+ exit_on_reach_kwargs=exit_on_reach_kwargs,
139
168
  )
140
169
 
141
170
  def stop(self) -> None:
@@ -192,12 +221,16 @@ class Torso(RobotJointComponent):
192
221
  if motion_norm < 1e-6: # Avoid division by zero
193
222
  return np.zeros(3, dtype=np.float32)
194
223
 
195
- # Scale velocities by default velocity
196
- return (joint_motion / motion_norm) * self.default_vel
224
+ default_vel = (
225
+ 0.6 if self._joint_vel_limit is None else np.min(self._joint_vel_limit)
226
+ )
227
+ return (joint_motion / motion_norm) * default_vel
197
228
 
198
229
  if isinstance(joint_vel, (int, float)):
199
230
  # Single value - apply to all joints
200
231
  return np.full(3, joint_vel, dtype=np.float32)
201
232
 
202
- # Convert to array and clip to max velocity
203
- return self._convert_joint_cmd_to_array(joint_vel, clip_value=self.max_vel)
233
+ # Convert to array and clip to velocity limits
234
+ return self._convert_joint_cmd_to_array(
235
+ joint_vel, clip_value=self._joint_vel_limit
236
+ )
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
25
25
 
26
26
 
27
27
 
28
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x64\x65xcontrol_msg.proto\x12\ndexcontrol\"V\n\x08\x41rmState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x11\n\tjoint_cur\x18\x03 \x03(\x02\x12\x11\n\tjoint_err\x18\x04 \x03(\r\"F\n\tHandState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x13\n\x0bjoint_statu\x18\x03 \x03(\r\"1\n\tHeadState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"2\n\nTorsoState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"a\n\x10SingleWheelState\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_pos\x18\x02 \x01(\x02\x12\x11\n\twheel_vel\x18\x03 \x01(\x02\x12\x11\n\twheel_cur\x18\x04 \x01(\x02\"g\n\x0c\x43hassisState\x12*\n\x04left\x18\x01 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\x12+\n\x05right\x18\x02 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\"j\n\x08\x42MSState\x12\x0f\n\x07voltage\x18\x01 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\x02\x12\x13\n\x0btemperature\x18\x03 \x01(\x02\x12\x12\n\npercentage\x18\x04 \x01(\r\x12\x13\n\x0bis_charging\x18\x05 \x01(\x08\"H\n\x0bWrenchState\x12\x0e\n\x06wrench\x18\x01 \x03(\x02\x12\x13\n\x0b\x62lue_button\x18\x02 \x01(\x08\x12\x14\n\x0cgreen_button\x18\x03 \x01(\x08\"D\n\nEStopState\x12\x16\n\x0e\x62utton_pressed\x18\x01 \x01(\x08\x12\x1e\n\x16software_estop_enabled\x18\x02 \x01(\x08\"a\n\x0fUltrasonicState\x12\x12\n\nfront_left\x18\x01 \x01(\x02\x12\x13\n\x0b\x66ront_right\x18\x02 \x01(\x02\x12\x11\n\tback_left\x18\x03 \x01(\x02\x12\x12\n\nback_right\x18\x04 \x01(\x02\"\xa7\x01\n\x08IMUState\x12\r\n\x05\x61\x63\x63_x\x18\x01 \x01(\x02\x12\r\n\x05\x61\x63\x63_y\x18\x02 \x01(\x02\x12\r\n\x05\x61\x63\x63_z\x18\x03 \x01(\x02\x12\x0e\n\x06gyro_x\x18\x04 \x01(\x02\x12\x0e\n\x06gyro_y\x18\x05 \x01(\x02\x12\x0e\n\x06gyro_z\x18\x06 \x01(\x02\x12\x0e\n\x06quat_w\x18\x07 \x01(\x02\x12\x0e\n\x06quat_x\x18\x08 \x01(\x02\x12\x0e\n\x06quat_y\x18\t \x01(\x02\x12\x0e\n\x06quat_z\x18\n \x01(\x02\"\xa3\x01\n\nArmCommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32\".dexcontrol.ArmCommand.CommandType\x12\x11\n\tjoint_pos\x18\x02 \x03(\x02\x12\x11\n\tjoint_vel\x18\x03 \x03(\x02\"5\n\x0b\x43ommandType\x12\x0c\n\x08POSITION\x10\x00\x12\x18\n\x14VELOCITY_FEEDFORWARD\x10\x01\" \n\x0bHandCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\"3\n\x0bHeadCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"4\n\x0cTorsoCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"=\n\x12SingleWheelCommand\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_vel\x18\x02 \x01(\x02\"m\n\x0e\x43hassisCommand\x12,\n\x04left\x18\x01 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommand\x12-\n\x05right\x18\x02 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommandb\x06proto3')
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x64\x65xcontrol_msg.proto\x12\ndexcontrol\"l\n\x08\x41rmState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x11\n\tjoint_cur\x18\x03 \x03(\x02\x12\x11\n\tjoint_err\x18\x04 \x03(\r\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\\\n\tHandState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x13\n\x0bjoint_statu\x18\x03 \x03(\r\x12\x14\n\x0ctimestamp_ns\x18\x04 \x01(\x04\"G\n\tHeadState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"H\n\nTorsoState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"a\n\x10SingleWheelState\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_pos\x18\x02 \x01(\x02\x12\x11\n\twheel_vel\x18\x03 \x01(\x02\x12\x11\n\twheel_cur\x18\x04 \x01(\x02\"}\n\x0c\x43hassisState\x12*\n\x04left\x18\x01 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\x12+\n\x05right\x18\x02 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\x8f\x01\n\x08\x42MSState\x12\x0f\n\x07voltage\x18\x01 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\x02\x12\x13\n\x0btemperature\x18\x03 \x01(\x02\x12\x12\n\npercentage\x18\x04 \x01(\r\x12\x13\n\x0bis_charging\x18\x05 \x01(\x08\x12\r\n\x05\x65rror\x18\x06 \x01(\r\x12\x14\n\x0ctimestamp_ns\x18\x07 \x01(\x04\"^\n\x0bWrenchState\x12\x0e\n\x06wrench\x18\x01 \x03(\x02\x12\x13\n\x0b\x62lue_button\x18\x02 \x01(\x08\x12\x14\n\x0cgreen_button\x18\x03 \x01(\x08\x12\x14\n\x0ctimestamp_ns\x18\x04 \x01(\x04\"Z\n\nEStopState\x12\x16\n\x0e\x62utton_pressed\x18\x01 \x01(\x08\x12\x1e\n\x16software_estop_enabled\x18\x02 \x01(\x08\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"w\n\x0fUltrasonicState\x12\x12\n\nfront_left\x18\x01 \x01(\x02\x12\x13\n\x0b\x66ront_right\x18\x02 \x01(\x02\x12\x11\n\tback_left\x18\x03 \x01(\x02\x12\x12\n\nback_right\x18\x04 \x01(\x02\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\xbd\x01\n\x08IMUState\x12\r\n\x05\x61\x63\x63_x\x18\x01 \x01(\x02\x12\r\n\x05\x61\x63\x63_y\x18\x02 \x01(\x02\x12\r\n\x05\x61\x63\x63_z\x18\x03 \x01(\x02\x12\x0e\n\x06gyro_x\x18\x04 \x01(\x02\x12\x0e\n\x06gyro_y\x18\x05 \x01(\x02\x12\x0e\n\x06gyro_z\x18\x06 \x01(\x02\x12\x0e\n\x06quat_w\x18\x07 \x01(\x02\x12\x0e\n\x06quat_x\x18\x08 \x01(\x02\x12\x0e\n\x06quat_y\x18\t \x01(\x02\x12\x0e\n\x06quat_z\x18\n \x01(\x02\x12\x14\n\x0ctimestamp_ns\x18\x0b \x01(\x04\"\xa3\x01\n\nArmCommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32\".dexcontrol.ArmCommand.CommandType\x12\x11\n\tjoint_pos\x18\x02 \x03(\x02\x12\x11\n\tjoint_vel\x18\x03 \x03(\x02\"5\n\x0b\x43ommandType\x12\x0c\n\x08POSITION\x10\x00\x12\x18\n\x14VELOCITY_FEEDFORWARD\x10\x01\" \n\x0bHandCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\"3\n\x0bHeadCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"4\n\x0cTorsoCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"=\n\x12SingleWheelCommand\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_vel\x18\x02 \x01(\x02\"m\n\x0e\x43hassisCommand\x12,\n\x04left\x18\x01 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommand\x12-\n\x05right\x18\x02 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommand\"-\n\x1d\x45ndEffectorPassThroughCommand\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x62\x06proto3')
29
29
 
30
30
  _globals = globals()
31
31
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -33,39 +33,41 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dexcontrol_msg_pb2', _globa
33
33
  if not _descriptor._USE_C_DESCRIPTORS:
34
34
  DESCRIPTOR._loaded_options = None
35
35
  _globals['_ARMSTATE']._serialized_start=36
36
- _globals['_ARMSTATE']._serialized_end=122
37
- _globals['_HANDSTATE']._serialized_start=124
38
- _globals['_HANDSTATE']._serialized_end=194
39
- _globals['_HEADSTATE']._serialized_start=196
40
- _globals['_HEADSTATE']._serialized_end=245
41
- _globals['_TORSOSTATE']._serialized_start=247
42
- _globals['_TORSOSTATE']._serialized_end=297
43
- _globals['_SINGLEWHEELSTATE']._serialized_start=299
44
- _globals['_SINGLEWHEELSTATE']._serialized_end=396
45
- _globals['_CHASSISSTATE']._serialized_start=398
46
- _globals['_CHASSISSTATE']._serialized_end=501
47
- _globals['_BMSSTATE']._serialized_start=503
48
- _globals['_BMSSTATE']._serialized_end=609
49
- _globals['_WRENCHSTATE']._serialized_start=611
50
- _globals['_WRENCHSTATE']._serialized_end=683
51
- _globals['_ESTOPSTATE']._serialized_start=685
52
- _globals['_ESTOPSTATE']._serialized_end=753
53
- _globals['_ULTRASONICSTATE']._serialized_start=755
54
- _globals['_ULTRASONICSTATE']._serialized_end=852
55
- _globals['_IMUSTATE']._serialized_start=855
56
- _globals['_IMUSTATE']._serialized_end=1022
57
- _globals['_ARMCOMMAND']._serialized_start=1025
58
- _globals['_ARMCOMMAND']._serialized_end=1188
59
- _globals['_ARMCOMMAND_COMMANDTYPE']._serialized_start=1135
60
- _globals['_ARMCOMMAND_COMMANDTYPE']._serialized_end=1188
61
- _globals['_HANDCOMMAND']._serialized_start=1190
62
- _globals['_HANDCOMMAND']._serialized_end=1222
63
- _globals['_HEADCOMMAND']._serialized_start=1224
64
- _globals['_HEADCOMMAND']._serialized_end=1275
65
- _globals['_TORSOCOMMAND']._serialized_start=1277
66
- _globals['_TORSOCOMMAND']._serialized_end=1329
67
- _globals['_SINGLEWHEELCOMMAND']._serialized_start=1331
68
- _globals['_SINGLEWHEELCOMMAND']._serialized_end=1392
69
- _globals['_CHASSISCOMMAND']._serialized_start=1394
70
- _globals['_CHASSISCOMMAND']._serialized_end=1503
36
+ _globals['_ARMSTATE']._serialized_end=144
37
+ _globals['_HANDSTATE']._serialized_start=146
38
+ _globals['_HANDSTATE']._serialized_end=238
39
+ _globals['_HEADSTATE']._serialized_start=240
40
+ _globals['_HEADSTATE']._serialized_end=311
41
+ _globals['_TORSOSTATE']._serialized_start=313
42
+ _globals['_TORSOSTATE']._serialized_end=385
43
+ _globals['_SINGLEWHEELSTATE']._serialized_start=387
44
+ _globals['_SINGLEWHEELSTATE']._serialized_end=484
45
+ _globals['_CHASSISSTATE']._serialized_start=486
46
+ _globals['_CHASSISSTATE']._serialized_end=611
47
+ _globals['_BMSSTATE']._serialized_start=614
48
+ _globals['_BMSSTATE']._serialized_end=757
49
+ _globals['_WRENCHSTATE']._serialized_start=759
50
+ _globals['_WRENCHSTATE']._serialized_end=853
51
+ _globals['_ESTOPSTATE']._serialized_start=855
52
+ _globals['_ESTOPSTATE']._serialized_end=945
53
+ _globals['_ULTRASONICSTATE']._serialized_start=947
54
+ _globals['_ULTRASONICSTATE']._serialized_end=1066
55
+ _globals['_IMUSTATE']._serialized_start=1069
56
+ _globals['_IMUSTATE']._serialized_end=1258
57
+ _globals['_ARMCOMMAND']._serialized_start=1261
58
+ _globals['_ARMCOMMAND']._serialized_end=1424
59
+ _globals['_ARMCOMMAND_COMMANDTYPE']._serialized_start=1371
60
+ _globals['_ARMCOMMAND_COMMANDTYPE']._serialized_end=1424
61
+ _globals['_HANDCOMMAND']._serialized_start=1426
62
+ _globals['_HANDCOMMAND']._serialized_end=1458
63
+ _globals['_HEADCOMMAND']._serialized_start=1460
64
+ _globals['_HEADCOMMAND']._serialized_end=1511
65
+ _globals['_TORSOCOMMAND']._serialized_start=1513
66
+ _globals['_TORSOCOMMAND']._serialized_end=1565
67
+ _globals['_SINGLEWHEELCOMMAND']._serialized_start=1567
68
+ _globals['_SINGLEWHEELCOMMAND']._serialized_end=1628
69
+ _globals['_CHASSISCOMMAND']._serialized_start=1630
70
+ _globals['_CHASSISCOMMAND']._serialized_end=1739
71
+ _globals['_ENDEFFECTORPASSTHROUGHCOMMAND']._serialized_start=1741
72
+ _globals['_ENDEFFECTORPASSTHROUGHCOMMAND']._serialized_end=1786
71
73
  # @@protoc_insertion_point(module_scope)
@@ -12,42 +12,50 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
12
12
  DESCRIPTOR: _descriptor.FileDescriptor
13
13
 
14
14
  class ArmState(_message.Message):
15
- __slots__ = ("joint_pos", "joint_vel", "joint_cur", "joint_err")
15
+ __slots__ = ("joint_pos", "joint_vel", "joint_cur", "joint_err", "timestamp_ns")
16
16
  JOINT_POS_FIELD_NUMBER: _ClassVar[int]
17
17
  JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
18
18
  JOINT_CUR_FIELD_NUMBER: _ClassVar[int]
19
19
  JOINT_ERR_FIELD_NUMBER: _ClassVar[int]
20
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
20
21
  joint_pos: _containers.RepeatedScalarFieldContainer[float]
21
22
  joint_vel: _containers.RepeatedScalarFieldContainer[float]
22
23
  joint_cur: _containers.RepeatedScalarFieldContainer[float]
23
24
  joint_err: _containers.RepeatedScalarFieldContainer[int]
24
- def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_cur: _Optional[_Iterable[float]] = ..., joint_err: _Optional[_Iterable[int]] = ...) -> None: ...
25
+ timestamp_ns: int
26
+ def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_cur: _Optional[_Iterable[float]] = ..., joint_err: _Optional[_Iterable[int]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
25
27
 
26
28
  class HandState(_message.Message):
27
- __slots__ = ("joint_pos", "joint_vel", "joint_statu")
29
+ __slots__ = ("joint_pos", "joint_vel", "joint_statu", "timestamp_ns")
28
30
  JOINT_POS_FIELD_NUMBER: _ClassVar[int]
29
31
  JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
30
32
  JOINT_STATU_FIELD_NUMBER: _ClassVar[int]
33
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
31
34
  joint_pos: _containers.RepeatedScalarFieldContainer[float]
32
35
  joint_vel: _containers.RepeatedScalarFieldContainer[float]
33
36
  joint_statu: _containers.RepeatedScalarFieldContainer[int]
34
- def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_statu: _Optional[_Iterable[int]] = ...) -> None: ...
37
+ timestamp_ns: int
38
+ def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_statu: _Optional[_Iterable[int]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
35
39
 
36
40
  class HeadState(_message.Message):
37
- __slots__ = ("joint_pos", "joint_vel")
41
+ __slots__ = ("joint_pos", "joint_vel", "timestamp_ns")
38
42
  JOINT_POS_FIELD_NUMBER: _ClassVar[int]
39
43
  JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
44
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
40
45
  joint_pos: _containers.RepeatedScalarFieldContainer[float]
41
46
  joint_vel: _containers.RepeatedScalarFieldContainer[float]
42
- def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ...) -> None: ...
47
+ timestamp_ns: int
48
+ def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
43
49
 
44
50
  class TorsoState(_message.Message):
45
- __slots__ = ("joint_pos", "joint_vel")
51
+ __slots__ = ("joint_pos", "joint_vel", "timestamp_ns")
46
52
  JOINT_POS_FIELD_NUMBER: _ClassVar[int]
47
53
  JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
54
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
48
55
  joint_pos: _containers.RepeatedScalarFieldContainer[float]
49
56
  joint_vel: _containers.RepeatedScalarFieldContainer[float]
50
- def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ...) -> None: ...
57
+ timestamp_ns: int
58
+ def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
51
59
 
52
60
  class SingleWheelState(_message.Message):
53
61
  __slots__ = ("steering_pos", "wheel_pos", "wheel_vel", "wheel_cur")
@@ -62,59 +70,71 @@ class SingleWheelState(_message.Message):
62
70
  def __init__(self, steering_pos: _Optional[float] = ..., wheel_pos: _Optional[float] = ..., wheel_vel: _Optional[float] = ..., wheel_cur: _Optional[float] = ...) -> None: ...
63
71
 
64
72
  class ChassisState(_message.Message):
65
- __slots__ = ("left", "right")
73
+ __slots__ = ("left", "right", "timestamp_ns")
66
74
  LEFT_FIELD_NUMBER: _ClassVar[int]
67
75
  RIGHT_FIELD_NUMBER: _ClassVar[int]
76
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
68
77
  left: SingleWheelState
69
78
  right: SingleWheelState
70
- def __init__(self, left: _Optional[_Union[SingleWheelState, _Mapping]] = ..., right: _Optional[_Union[SingleWheelState, _Mapping]] = ...) -> None: ...
79
+ timestamp_ns: int
80
+ def __init__(self, left: _Optional[_Union[SingleWheelState, _Mapping]] = ..., right: _Optional[_Union[SingleWheelState, _Mapping]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
71
81
 
72
82
  class BMSState(_message.Message):
73
- __slots__ = ("voltage", "current", "temperature", "percentage", "is_charging")
83
+ __slots__ = ("voltage", "current", "temperature", "percentage", "is_charging", "error", "timestamp_ns")
74
84
  VOLTAGE_FIELD_NUMBER: _ClassVar[int]
75
85
  CURRENT_FIELD_NUMBER: _ClassVar[int]
76
86
  TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
77
87
  PERCENTAGE_FIELD_NUMBER: _ClassVar[int]
78
88
  IS_CHARGING_FIELD_NUMBER: _ClassVar[int]
89
+ ERROR_FIELD_NUMBER: _ClassVar[int]
90
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
79
91
  voltage: float
80
92
  current: float
81
93
  temperature: float
82
94
  percentage: int
83
95
  is_charging: bool
84
- def __init__(self, voltage: _Optional[float] = ..., current: _Optional[float] = ..., temperature: _Optional[float] = ..., percentage: _Optional[int] = ..., is_charging: bool = ...) -> None: ...
96
+ error: int
97
+ timestamp_ns: int
98
+ def __init__(self, voltage: _Optional[float] = ..., current: _Optional[float] = ..., temperature: _Optional[float] = ..., percentage: _Optional[int] = ..., is_charging: bool = ..., error: _Optional[int] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
85
99
 
86
100
  class WrenchState(_message.Message):
87
- __slots__ = ("wrench", "blue_button", "green_button")
101
+ __slots__ = ("wrench", "blue_button", "green_button", "timestamp_ns")
88
102
  WRENCH_FIELD_NUMBER: _ClassVar[int]
89
103
  BLUE_BUTTON_FIELD_NUMBER: _ClassVar[int]
90
104
  GREEN_BUTTON_FIELD_NUMBER: _ClassVar[int]
105
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
91
106
  wrench: _containers.RepeatedScalarFieldContainer[float]
92
107
  blue_button: bool
93
108
  green_button: bool
94
- def __init__(self, wrench: _Optional[_Iterable[float]] = ..., blue_button: bool = ..., green_button: bool = ...) -> None: ...
109
+ timestamp_ns: int
110
+ def __init__(self, wrench: _Optional[_Iterable[float]] = ..., blue_button: bool = ..., green_button: bool = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
95
111
 
96
112
  class EStopState(_message.Message):
97
- __slots__ = ("button_pressed", "software_estop_enabled")
113
+ __slots__ = ("button_pressed", "software_estop_enabled", "timestamp_ns")
98
114
  BUTTON_PRESSED_FIELD_NUMBER: _ClassVar[int]
99
115
  SOFTWARE_ESTOP_ENABLED_FIELD_NUMBER: _ClassVar[int]
116
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
100
117
  button_pressed: bool
101
118
  software_estop_enabled: bool
102
- def __init__(self, button_pressed: bool = ..., software_estop_enabled: bool = ...) -> None: ...
119
+ timestamp_ns: int
120
+ def __init__(self, button_pressed: bool = ..., software_estop_enabled: bool = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
103
121
 
104
122
  class UltrasonicState(_message.Message):
105
- __slots__ = ("front_left", "front_right", "back_left", "back_right")
123
+ __slots__ = ("front_left", "front_right", "back_left", "back_right", "timestamp_ns")
106
124
  FRONT_LEFT_FIELD_NUMBER: _ClassVar[int]
107
125
  FRONT_RIGHT_FIELD_NUMBER: _ClassVar[int]
108
126
  BACK_LEFT_FIELD_NUMBER: _ClassVar[int]
109
127
  BACK_RIGHT_FIELD_NUMBER: _ClassVar[int]
128
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
110
129
  front_left: float
111
130
  front_right: float
112
131
  back_left: float
113
132
  back_right: float
114
- def __init__(self, front_left: _Optional[float] = ..., front_right: _Optional[float] = ..., back_left: _Optional[float] = ..., back_right: _Optional[float] = ...) -> None: ...
133
+ timestamp_ns: int
134
+ def __init__(self, front_left: _Optional[float] = ..., front_right: _Optional[float] = ..., back_left: _Optional[float] = ..., back_right: _Optional[float] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
115
135
 
116
136
  class IMUState(_message.Message):
117
- __slots__ = ("acc_x", "acc_y", "acc_z", "gyro_x", "gyro_y", "gyro_z", "quat_w", "quat_x", "quat_y", "quat_z")
137
+ __slots__ = ("acc_x", "acc_y", "acc_z", "gyro_x", "gyro_y", "gyro_z", "quat_w", "quat_x", "quat_y", "quat_z", "timestamp_ns")
118
138
  ACC_X_FIELD_NUMBER: _ClassVar[int]
119
139
  ACC_Y_FIELD_NUMBER: _ClassVar[int]
120
140
  ACC_Z_FIELD_NUMBER: _ClassVar[int]
@@ -125,6 +145,7 @@ class IMUState(_message.Message):
125
145
  QUAT_X_FIELD_NUMBER: _ClassVar[int]
126
146
  QUAT_Y_FIELD_NUMBER: _ClassVar[int]
127
147
  QUAT_Z_FIELD_NUMBER: _ClassVar[int]
148
+ TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
128
149
  acc_x: float
129
150
  acc_y: float
130
151
  acc_z: float
@@ -135,7 +156,8 @@ class IMUState(_message.Message):
135
156
  quat_x: float
136
157
  quat_y: float
137
158
  quat_z: float
138
- def __init__(self, acc_x: _Optional[float] = ..., acc_y: _Optional[float] = ..., acc_z: _Optional[float] = ..., gyro_x: _Optional[float] = ..., gyro_y: _Optional[float] = ..., gyro_z: _Optional[float] = ..., quat_w: _Optional[float] = ..., quat_x: _Optional[float] = ..., quat_y: _Optional[float] = ..., quat_z: _Optional[float] = ...) -> None: ...
159
+ timestamp_ns: int
160
+ def __init__(self, acc_x: _Optional[float] = ..., acc_y: _Optional[float] = ..., acc_z: _Optional[float] = ..., gyro_x: _Optional[float] = ..., gyro_y: _Optional[float] = ..., gyro_z: _Optional[float] = ..., quat_w: _Optional[float] = ..., quat_x: _Optional[float] = ..., quat_y: _Optional[float] = ..., quat_z: _Optional[float] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
139
161
 
140
162
  class ArmCommand(_message.Message):
141
163
  __slots__ = ("command_type", "joint_pos", "joint_vel")
@@ -190,3 +212,9 @@ class ChassisCommand(_message.Message):
190
212
  left: SingleWheelCommand
191
213
  right: SingleWheelCommand
192
214
  def __init__(self, left: _Optional[_Union[SingleWheelCommand, _Mapping]] = ..., right: _Optional[_Union[SingleWheelCommand, _Mapping]] = ...) -> None: ...
215
+
216
+ class EndEffectorPassThroughCommand(_message.Message):
217
+ __slots__ = ("data",)
218
+ DATA_FIELD_NUMBER: _ClassVar[int]
219
+ data: bytes
220
+ def __init__(self, data: _Optional[bytes] = ...) -> None: ...
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
25
25
 
26
26
 
27
27
 
28
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x64\x65xcontrol_query.proto\x12\ndexcontrol\"Z\n\nSetArmMode\x12)\n\x04mode\x18\x01 \x01(\x0e\x32\x1b.dexcontrol.SetArmMode.Mode\"!\n\x04Mode\x12\x0c\n\x08POSITION\x10\x00\x12\x0b\n\x07\x44ISABLE\x10\x01\"Z\n\x0bSetHeadMode\x12*\n\x04mode\x18\x01 \x01(\x0e\x32\x1c.dexcontrol.SetHeadMode.Mode\"\x1f\n\x04Mode\x12\n\n\x06\x45NABLE\x10\x00\x12\x0b\n\x07\x44ISABLE\x10\x01\"\x1a\n\x08SetEstop\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\x18\n\x06SetLed\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\x82\x01\n\nClearError\x12\x33\n\tcomponent\x18\x01 \x01(\x0e\x32 .dexcontrol.ClearError.Component\"?\n\tComponent\x12\x0c\n\x08LEFT_ARM\x10\x00\x12\r\n\tRIGHT_ARM\x10\x01\x12\x08\n\x04HEAD\x10\x02\x12\x0b\n\x07\x43HASSIS\x10\x03\"y\n\x0fRebootComponent\x12\x38\n\tcomponent\x18\x01 \x01(\x0e\x32%.dexcontrol.RebootComponent.Component\",\n\tComponent\x12\x07\n\x03\x41RM\x10\x00\x12\t\n\x05TORSO\x10\x01\x12\x0b\n\x07\x43HASSIS\x10\x02\"\x80\x01\n\x0f\x46irmwareVersion\x12\x18\n\x10hardware_version\x18\x01 \x01(\x05\x12\x18\n\x10software_version\x18\x02 \x01(\x05\x12\x14\n\x0c\x63ompile_time\x18\x03 \x01(\x05\x12\x11\n\tmain_hash\x18\x04 \x01(\t\x12\x10\n\x08sub_hash\x18\x05 \x01(\t\"\xb2\x01\n\x0fSoftwareVersion\x12J\n\x10\x66irmware_version\x18\x01 \x03(\x0b\x32\x30.dexcontrol.SoftwareVersion.FirmwareVersionEntry\x1aS\n\x14\x46irmwareVersionEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.dexcontrol.FirmwareVersion:\x02\x38\x01\"\x9d\x01\n\x14SingleComponentState\x12\x11\n\tconnected\x18\x01 \x01(\x08\x12,\n\x07\x65nabled\x18\x02 \x01(\x0e\x32\x1b.dexcontrol.ComponentStatus\x12\x30\n\x0b\x65rror_state\x18\x03 \x01(\x0e\x32\x1b.dexcontrol.ComponentStatus\x12\x12\n\nerror_code\x18\x04 \x01(\t\"\x9b\x01\n\x0f\x43omponentStates\x12\x37\n\x06states\x18\x01 \x03(\x0b\x32\'.dexcontrol.ComponentStates.StatesEntry\x1aO\n\x0bStatesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .dexcontrol.SingleComponentState:\x02\x38\x01*0\n\x0f\x43omponentStatus\x12\n\n\x06NORMAL\x10\x00\x12\x06\n\x02NA\x10\x01\x12\t\n\x05\x45RROR\x10\x02\x62\x06proto3')
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x64\x65xcontrol_query.proto\x12\ndexcontrol\"Z\n\nSetArmMode\x12)\n\x04mode\x18\x01 \x01(\x0e\x32\x1b.dexcontrol.SetArmMode.Mode\"!\n\x04Mode\x12\x0c\n\x08POSITION\x10\x00\x12\x0b\n\x07\x44ISABLE\x10\x01\"Z\n\x0bSetHeadMode\x12*\n\x04mode\x18\x01 \x01(\x0e\x32\x1c.dexcontrol.SetHeadMode.Mode\"\x1f\n\x04Mode\x12\n\n\x06\x45NABLE\x10\x00\x12\x0b\n\x07\x44ISABLE\x10\x01\"\x1a\n\x08SetEstop\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\x18\n\x06SetLed\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\x82\x01\n\nClearError\x12\x33\n\tcomponent\x18\x01 \x01(\x0e\x32 .dexcontrol.ClearError.Component\"?\n\tComponent\x12\x0c\n\x08LEFT_ARM\x10\x00\x12\r\n\tRIGHT_ARM\x10\x01\x12\x08\n\x04HEAD\x10\x02\x12\x0b\n\x07\x43HASSIS\x10\x03\"y\n\x0fRebootComponent\x12\x38\n\tcomponent\x18\x01 \x01(\x0e\x32%.dexcontrol.RebootComponent.Component\",\n\tComponent\x12\x07\n\x03\x41RM\x10\x00\x12\t\n\x05TORSO\x10\x01\x12\x0b\n\x07\x43HASSIS\x10\x02\"\x80\x01\n\x0f\x46irmwareVersion\x12\x18\n\x10hardware_version\x18\x01 \x01(\x05\x12\x18\n\x10software_version\x18\x02 \x01(\x05\x12\x14\n\x0c\x63ompile_time\x18\x03 \x01(\x05\x12\x11\n\tmain_hash\x18\x04 \x01(\t\x12\x10\n\x08sub_hash\x18\x05 \x01(\t\"\xb2\x01\n\x0fSoftwareVersion\x12J\n\x10\x66irmware_version\x18\x01 \x03(\x0b\x32\x30.dexcontrol.SoftwareVersion.FirmwareVersionEntry\x1aS\n\x14\x46irmwareVersionEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.dexcontrol.FirmwareVersion:\x02\x38\x01\"\x9d\x01\n\x14SingleComponentState\x12\x11\n\tconnected\x18\x01 \x01(\x08\x12,\n\x07\x65nabled\x18\x02 \x01(\x0e\x32\x1b.dexcontrol.ComponentStatus\x12\x30\n\x0b\x65rror_state\x18\x03 \x01(\x0e\x32\x1b.dexcontrol.ComponentStatus\x12\x12\n\nerror_code\x18\x04 \x01(\t\"\x9b\x01\n\x0f\x43omponentStates\x12\x37\n\x06states\x18\x01 \x03(\x0b\x32\'.dexcontrol.ComponentStates.StatesEntry\x1aO\n\x0bStatesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .dexcontrol.SingleComponentState:\x02\x38\x01\"U\n\nNTPRequest\x12\x1b\n\x13\x63lient_send_time_ns\x18\x01 \x01(\x04\x12\x14\n\x0csample_count\x18\x02 \x01(\r\x12\x14\n\x0csample_index\x18\x03 \x01(\r\"\x94\x01\n\x0bNTPResponse\x12\x1b\n\x13\x63lient_send_time_ns\x18\x01 \x01(\x04\x12\x1e\n\x16server_receive_time_ns\x18\x02 \x01(\x04\x12\x1b\n\x13server_send_time_ns\x18\x03 \x01(\x04\x12\x14\n\x0csample_index\x18\x04 \x01(\r\x12\x15\n\rtotal_samples\x18\x05 \x01(\r*0\n\x0f\x43omponentStatus\x12\n\n\x06NORMAL\x10\x00\x12\x06\n\x02NA\x10\x01\x12\t\n\x05\x45RROR\x10\x02\x62\x06proto3')
29
29
 
30
30
  _globals = globals()
31
31
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -36,8 +36,8 @@ if not _descriptor._USE_C_DESCRIPTORS:
36
36
  _globals['_SOFTWAREVERSION_FIRMWAREVERSIONENTRY']._serialized_options = b'8\001'
37
37
  _globals['_COMPONENTSTATES_STATESENTRY']._loaded_options = None
38
38
  _globals['_COMPONENTSTATES_STATESENTRY']._serialized_options = b'8\001'
39
- _globals['_COMPONENTSTATUS']._serialized_start=1162
40
- _globals['_COMPONENTSTATUS']._serialized_end=1210
39
+ _globals['_COMPONENTSTATUS']._serialized_start=1400
40
+ _globals['_COMPONENTSTATUS']._serialized_end=1448
41
41
  _globals['_SETARMMODE']._serialized_start=38
42
42
  _globals['_SETARMMODE']._serialized_end=128
43
43
  _globals['_SETARMMODE_MODE']._serialized_start=95
@@ -70,4 +70,8 @@ if not _descriptor._USE_C_DESCRIPTORS:
70
70
  _globals['_COMPONENTSTATES']._serialized_end=1160
71
71
  _globals['_COMPONENTSTATES_STATESENTRY']._serialized_start=1081
72
72
  _globals['_COMPONENTSTATES_STATESENTRY']._serialized_end=1160
73
+ _globals['_NTPREQUEST']._serialized_start=1162
74
+ _globals['_NTPREQUEST']._serialized_end=1247
75
+ _globals['_NTPRESPONSE']._serialized_start=1250
76
+ _globals['_NTPRESPONSE']._serialized_end=1398
73
77
  # @@protoc_insertion_point(module_scope)
@@ -136,3 +136,27 @@ class ComponentStates(_message.Message):
136
136
  STATES_FIELD_NUMBER: _ClassVar[int]
137
137
  states: _containers.MessageMap[str, SingleComponentState]
138
138
  def __init__(self, states: _Optional[_Mapping[str, SingleComponentState]] = ...) -> None: ...
139
+
140
+ class NTPRequest(_message.Message):
141
+ __slots__ = ("client_send_time_ns", "sample_count", "sample_index")
142
+ CLIENT_SEND_TIME_NS_FIELD_NUMBER: _ClassVar[int]
143
+ SAMPLE_COUNT_FIELD_NUMBER: _ClassVar[int]
144
+ SAMPLE_INDEX_FIELD_NUMBER: _ClassVar[int]
145
+ client_send_time_ns: int
146
+ sample_count: int
147
+ sample_index: int
148
+ def __init__(self, client_send_time_ns: _Optional[int] = ..., sample_count: _Optional[int] = ..., sample_index: _Optional[int] = ...) -> None: ...
149
+
150
+ class NTPResponse(_message.Message):
151
+ __slots__ = ("client_send_time_ns", "server_receive_time_ns", "server_send_time_ns", "sample_index", "total_samples")
152
+ CLIENT_SEND_TIME_NS_FIELD_NUMBER: _ClassVar[int]
153
+ SERVER_RECEIVE_TIME_NS_FIELD_NUMBER: _ClassVar[int]
154
+ SERVER_SEND_TIME_NS_FIELD_NUMBER: _ClassVar[int]
155
+ SAMPLE_INDEX_FIELD_NUMBER: _ClassVar[int]
156
+ TOTAL_SAMPLES_FIELD_NUMBER: _ClassVar[int]
157
+ client_send_time_ns: int
158
+ server_receive_time_ns: int
159
+ server_send_time_ns: int
160
+ sample_index: int
161
+ total_samples: int
162
+ def __init__(self, client_send_time_ns: _Optional[int] = ..., server_receive_time_ns: _Optional[int] = ..., server_send_time_ns: _Optional[int] = ..., sample_index: _Optional[int] = ..., total_samples: _Optional[int] = ...) -> None: ...