From 3dd9525833d2a07f3b5462a76abfa5b9ef43a1c8 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Apr 2026 15:38:41 -0500 Subject: [PATCH] feat(anchor): add MCU Versioning feedback --- src/anchor_pkg/anchor_pkg/anchor_node.py | 30 ++++++++++++++++++++++-- src/astra_msgs | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/anchor_pkg/anchor_pkg/anchor_node.py b/src/anchor_pkg/anchor_pkg/anchor_node.py index 7c475a6..4ff8216 100644 --- a/src/anchor_pkg/anchor_pkg/anchor_node.py +++ b/src/anchor_pkg/anchor_pkg/anchor_node.py @@ -1,4 +1,5 @@ from warnings import deprecated +import time import rclpy from rclpy.node import Node from rclpy.executors import ExternalShutdownException @@ -17,8 +18,9 @@ from .connector import ( from .convert import string_to_viccan import threading -from astra_msgs.msg import VicCAN +from builtin_interfaces.msg import Time from std_msgs.msg import String +from astra_msgs.msg import VicCAN, McuVersion class Anchor(Node): @@ -47,6 +49,8 @@ class Anchor(Node): Instead, it converts them to VicCAN messages first. """ + ASTRA_EPOCH = time.struct_time((2022, 1, 1, 0, 0, 0, 0, 0, 0)) # January 1, 2022 + connector: Connector def __init__(self): @@ -158,6 +162,12 @@ class Anchor(Node): "/anchor/to_vic/debug", 20, ) + # MCU Version publisher + self.mcu_version_pub_ = self.create_publisher( + McuVersion, + "/anchor/from_vic/mcu_version", + 20, + ) # Subscribers self.tovic_sub_ = self.create_subscription( @@ -173,7 +183,7 @@ class Anchor(Node): 20, ) self.mock_mcu_sub_ = self.create_subscription( - String, + VicCAN, "/anchor/from_vic/mock_mcu", self.relay_fromvic, 20, @@ -185,6 +195,8 @@ class Anchor(Node): 20, ) + self.mcu_versions: dict[str, McuVersion] = {} + # Close devices on exit atexit.register(self.cleanup) @@ -231,6 +243,20 @@ class Anchor(Node): elif msg.mcu_name == "citadel" or msg.mcu_name == "digit": self.fromvic_bio_pub_.publish(msg) + # MCU Versioning information + if msg.command_id in (46, 47) and msg.mcu_name not in self.mcu_versions: + self.mcu_versions[msg.mcu_name] = McuVersion(mcu_name=msg.mcu_name) + + if msg.command_id == 46: # commit hashes + self.mcu_versions[msg.mcu_name].project_commit_hash = int(msg.data[0]) + self.mcu_versions[msg.mcu_name].astra_lib_commit_hash = int(msg.data[1]) + elif msg.command_id == 47: # build timestamp and version numbers + version_msg = self.mcu_versions[msg.mcu_name] + version_msg.build_time = Time( + sec=int(time.mktime(self.ASTRA_EPOCH) + msg.data[0]) + ) + self.mcu_version_pub_.publish(version_msg) + def main(args=None): try: diff --git a/src/astra_msgs b/src/astra_msgs index 2264a2c..71c90b9 160000 --- a/src/astra_msgs +++ b/src/astra_msgs @@ -1 +1 @@ -Subproject commit 2264a2cb673c88810eecea2ab462b5a7366947a1 +Subproject commit 71c90b9c31414b707361a540b4b73a91cac8024e