void UavcanNode::fill_node_info() { /* software version */ uavcan::protocol::SoftwareVersion swver; // Extracting the first 8 hex digits of the git hash and converting them to int char fw_git_short[9] = {}; std::memmove(fw_git_short, px4_firmware_version_string(), 8); char *end = nullptr; swver.vcs_commit = std::strtol(fw_git_short, &end, 16); swver.optional_field_flags |= swver.OPTIONAL_FIELD_FLAG_VCS_COMMIT; swver.major = AppDescriptor.major_version; swver.minor = AppDescriptor.minor_version; swver.image_crc = AppDescriptor.image_crc; warnx("SW version vcs_commit: 0x%08x", unsigned(swver.vcs_commit)); _node.setSoftwareVersion(swver); /* hardware version */ uavcan::protocol::HardwareVersion hwver; hwver.major = HW_VERSION_MAJOR; hwver.minor = HW_VERSION_MINOR; mfguid_t mfgid = {}; board_get_mfguid(mfgid); uavcan::copy(mfgid, mfgid + sizeof(mfgid), hwver.unique_id.begin()); _node.setHardwareVersion(hwver); }
int board_get_mfguid_formated(char *format_buffer, int size) { mfguid_t mfguid; board_get_mfguid(mfguid); int offset = 0; for (unsigned int i = 0; i < PX4_CPU_MFGUID_BYTE_LENGTH; i++) { offset += snprintf(&format_buffer[offset], size - offset, "%02x", mfguid[i]); } return offset; }
int UavcanNode::getHardwareVersion(uavcan::protocol::HardwareVersion &hwver) { int rv = -1; if (UavcanNode::instance()) { if (!std::strncmp(px4_board_name(), "PX4FMU_V1", 9)) { hwver.major = 1; } else if (!std::strncmp(px4_board_name(), "PX4FMU_V2", 9)) { hwver.major = 2; } else { ; // All other values of px4_board_name() resolve to zero } mfguid_t mfgid = {}; board_get_mfguid(mfgid); uavcan::copy(mfgid, mfgid + sizeof(mfgid), hwver.unique_id.begin()); rv = 0; } return rv; }