+ void update_motor_err() {
+ uint8_t err;
+ const int ret = i2c_read_reg(0x50, 0xa1, 1, &err);
+ if (ret != 1) {
+ RCLCPP_ERROR(this->get_logger(), "Failed to read motor status err=%d", ret);
+ return;
+ }
+
+ auto msg = diagnostic_msgs::msg::DiagnosticArray();
+ msg.header.stamp = this->get_clock()->now();
+ auto stat = diagnostic_msgs::msg::DiagnosticStatus();
+ stat.name = "Motor: Error Status";
+ stat.level = err ? diagnostic_msgs::msg::DiagnosticStatus::ERROR : diagnostic_msgs::msg::DiagnosticStatus::OK;
+ stat.message = std::format("0x{:02x}", err);
+
+ // Diag
+ auto kvAftLeft = diagnostic_msgs::msg::KeyValue();
+ kvAftLeft.key = "aft right diag";
+ kvAftLeft.value = std::format("{}", err & (1 << 0));
+ stat.values.push_back(kvAftLeft);
+ auto kvFrontLeft = diagnostic_msgs::msg::KeyValue();
+ kvFrontLeft.key = "front right diag";
+ kvFrontLeft.value = std::format("{}", err & (1 << 1));
+ stat.values.push_back(kvFrontLeft);
+ auto kvAftRight = diagnostic_msgs::msg::KeyValue();
+ kvAftRight.key = "aft left diag";
+ kvAftRight.value = std::format("{}", err & (1 << 2));
+ stat.values.push_back(kvAftRight);
+ auto kvFrontRight = diagnostic_msgs::msg::KeyValue();
+ kvFrontRight.key = "front left diag";
+ kvFrontRight.value = std::format("{}", err & (1 << 3));
+ stat.values.push_back(kvFrontRight);
+ // Stall
+ auto kvAftLeft2 = diagnostic_msgs::msg::KeyValue();
+ auto kvFrontLeft2 = diagnostic_msgs::msg::KeyValue();
+ auto kvAftRight2 = diagnostic_msgs::msg::KeyValue();
+ auto kvFrontRight2 = diagnostic_msgs::msg::KeyValue();
+ kvAftLeft2.key = "aft right stall";
+ kvAftLeft2.value = std::format("{}", err & (1 << 4));
+ stat.values.push_back(kvAftLeft2);
+ kvFrontLeft2.key = "front right stall";
+ kvFrontLeft2.value = std::format("{}", err & (1 << 5));
+ stat.values.push_back(kvFrontLeft2);
+ kvAftRight2.key = "aft left stall";
+ kvAftRight2.value = std::format("{}", err & (1 << 6));
+ stat.values.push_back(kvAftRight2);
+ kvFrontRight2.key = "front left stall";
+ kvFrontRight2.value = std::format("{}", err & (1 << 7));
+ stat.values.push_back(kvFrontRight2);
+
+ msg.status.push_back(stat);
+ pub_diag->publish(msg);
+ }
+