uint32_t px4_os_version(void) { #if defined(__PX4_DARWIN) return 0; //TODO: implement version for Darwin #elif defined(__PX4_LINUX) struct utsname name; if (uname(&name) == 0) { char *c = name.release; // cut the part after the first '-' while (*c && *c != '-') { ++c; } *c = 0; return version_tag_to_number(name.release); } else { return 0; } #elif defined(__PX4_QURT) return 0; //TODO: implement version for QuRT #elif defined(__PX4_NUTTX) return version_tag_to_number(NUTTX_GIT_TAG_STR); #else # error "px4_os_version not implemented for current OS" #endif }
int ver_main(int argc, char *argv[]) { /* defaults to an error */ int ret = 1; /* first check if there are at least 2 params */ if (argc >= 2) { if (argv[1] != NULL) { if (!strncmp(argv[1], sz_ver_hwcmp_str, sizeof(sz_ver_hwcmp_str))) { if (argc >= 3 && argv[2] != NULL) { /* compare 3rd parameter with HW_ARCH string, in case of match, return 0 */ ret = strncmp(HW_ARCH, argv[2], strlen(HW_ARCH)); if (ret == 0) { PX4_INFO("match: %s", HW_ARCH); } return ret; } else { warn("Not enough arguments, try 'ver hwcmp PX4FMU_V2'"); return 1; } } /* check if we want to show all */ bool show_all = !strncmp(argv[1], sz_ver_all_str, sizeof(sz_ver_all_str)); if (show_all || !strncmp(argv[1], sz_ver_hw_str, sizeof(sz_ver_hw_str))) { printf("HW arch: %s\n", HW_ARCH); ret = 0; } if (show_all || !strncmp(argv[1], sz_ver_git_str, sizeof(sz_ver_git_str))) { printf("FW git-hash: %s\n", px4_git_version); unsigned fwver = version_tag_to_number(px4_git_tag); unsigned major = (fwver >> (8 * 3)) & 0xFF; unsigned minor = (fwver >> (8 * 2)) & 0xFF; unsigned patch = (fwver >> (8 * 1)) & 0xFF; unsigned type = (fwver >> (8 * 0)) & 0xFF; printf("FW version: %s (%u.%u.%u %u), %u\n", px4_git_tag, major, minor, patch, type, fwver); /* middleware is currently the same thing as firmware, so not printing yet */ printf("OS version: %s (%u)\n", os_git_tag, version_tag_to_number(os_git_tag)); ret = 0; } if (show_all || !strncmp(argv[1], sz_ver_bdate_str, sizeof(sz_ver_bdate_str))) { printf("Build datetime: %s %s\n", __DATE__, __TIME__); ret = 0; } if (show_all || !strncmp(argv[1], sz_ver_gcc_str, sizeof(sz_ver_gcc_str))) { printf("Toolchain: %s\n", __VERSION__); ret = 0; } if (show_all || !strncmp(argv[1], mcu_ver_str, sizeof(mcu_ver_str))) { char rev; char *revstr; int chip_version = mcu_version(&rev, &revstr); if (chip_version < 0) { printf("UNKNOWN MCU\n"); } else { printf("MCU: %s, rev. %c\n", revstr, rev); if (chip_version < MCU_REV_STM32F4_REV_3) { printf("\nWARNING WARNING WARNING!\n" "Revision %c has a silicon errata\n" "This device can only utilize a maximum of 1MB flash safely!\n" "https://pixhawk.org/help/errata\n\n", rev); } } ret = 0; } if (show_all || !strncmp(argv[1], mcu_uid_str, sizeof(mcu_uid_str))) { uint32_t uid[3]; mcu_unique_id(uid); printf("UID: %X:%X:%X \n", uid[0], uid[1], uid[2]); ret = 0; } if (ret == 1) { warn("unknown command.\n"); return 1; } } else {
uint32_t px4_firmware_version(void) { return version_tag_to_number(PX4_GIT_TAG_STR); }