feat: enhance firmware update process with reupdate handling and status tracking

This commit is contained in:
ob-yalian
2025-12-15 15:06:46 +08:00
parent db77882d35
commit c4dee75e96
2 changed files with 44 additions and 3 deletions
@@ -137,6 +137,8 @@ class OBCameraNodeDriver : public rclcpp::Node {
static backward::SignalHandling sh; // for stack trace
std::string upgrade_firmware_;
std::atomic<bool> firmware_update_success_{false};
std::atomic<bool> need_reupdate_{false};
std::atomic<bool> is_reupdating_{false}; // Flag to track if we're in reupdate process
rclcpp::TimerBase::SharedPtr device_status_timer_ = nullptr;
int device_status_interval_hz = 2; // 2Hz
rclcpp::Publisher<orbbec_camera_msgs::msg::DeviceStatus>::SharedPtr device_status_pub_ = nullptr;
+42 -3
View File
@@ -1039,7 +1039,18 @@ void OBCameraNodeDriver::initializeDevice(const std::shared_ptr<ob::Device> &dev
RCLCPP_INFO_STREAM(logger_, "Start device cost " << time_cost.count() << " ms");
if (!upgrade_firmware_.empty()) {
// Check if this is a second update (reupdate scenario)
bool is_second_update = is_reupdating_.load();
if (is_second_update) {
RCLCPP_INFO(logger_, "Device reconnected, starting the second firmware update...");
} else {
RCLCPP_INFO(logger_, "Starting firmware update from file: %s", upgrade_firmware_.c_str());
}
firmware_update_success_ = false;
need_reupdate_ = false;
if (ob_camera_node_) {
TRY_EXECUTE_BLOCK({
ob_camera_node_->withDeviceLock([&]() {
@@ -1057,7 +1068,26 @@ void OBCameraNodeDriver::initializeDevice(const std::shared_ptr<ob::Device> &dev
std::placeholders::_2, std::placeholders::_3),
false);
}
if (need_reupdate_) {
// Some devices require a second update after reboot
RCLCPP_INFO(logger_, "Firmware update completed but not finalized.");
RCLCPP_INFO(logger_, "The device will reboot and perform a second update automatically.");
RCLCPP_INFO(logger_, "Please wait for the device to reconnect...");
// Set flag to indicate we're waiting for device to reboot for second update
is_reupdating_ = true;
// Keep upgrade_firmware_ path and wait for device to reconnect
// The second update will be triggered automatically when device reconnects
return;
}
if (firmware_update_success_) {
if (is_second_update) {
RCLCPP_INFO(logger_, "Second firmware update completed successfully!");
is_reupdating_ = false;
} else {
RCLCPP_INFO(logger_, "Firmware update completed successfully!");
}
return;
}
}
@@ -1416,6 +1446,10 @@ void OBCameraNodeDriver::firmwareUpdateCallback(OBFwUpdateState state, const cha
case STAT_DONE:
std::cout << "Update completed" << std::endl;
break;
case STAT_DONE_REBOOT_AND_REUPDATE:
need_reupdate_ = true;
std::cout << "Update completed" << std::endl;
break;
case STAT_IN_PROGRESS:
std::cout << "Upgrade in progress" << std::endl;
break;
@@ -1432,7 +1466,7 @@ void OBCameraNodeDriver::firmwareUpdateCallback(OBFwUpdateState state, const cha
std::cout << "\033[K";
std::cout << "Message : " << message << std::endl << std::flush;
if (state == STAT_DONE) {
if (state == STAT_DONE || state == STAT_DONE_REBOOT_AND_REUPDATE) {
RCLCPP_INFO(logger_, "Reboot device");
if (ob_camera_node_) {
@@ -1451,9 +1485,14 @@ void OBCameraNodeDriver::firmwareUpdateCallback(OBFwUpdateState state, const cha
ob_lidar_node_.reset();
}
device_connected_ = false;
upgrade_firmware_ = "";
firmware_update_success_ = true;
if (state == STAT_DONE_REBOOT_AND_REUPDATE) {
// Keep upgrade_firmware_ path for second update
RCLCPP_INFO(logger_, "Firmware update requires a second update after reboot");
} else {
upgrade_firmware_ = "";
firmware_update_success_ = true;
}
}
}