bool preflightCheck(orb_advert_t *mavlink_log_pub, bool checkMag, bool checkAcc, bool checkGyro, bool checkBaro, bool checkAirspeed, bool checkRC, bool checkGNSS, bool checkDynamic, bool reportFailures) { #ifdef __PX4_QURT // WARNING: Preflight checks are important and should be added back when // all the sensors are supported PX4_WARN("Preflight checks always pass on Snapdragon."); return true; #endif bool failed = false; /* ---- MAG ---- */ if (checkMag) { bool prime_found = false; int32_t prime_id = 0; param_get(param_find("CAL_MAG_PRIME"), &prime_id); /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_mag_count; i++) { bool required = (i < max_mandatory_mag_count); int device_id = -1; if (!magnometerCheck(mavlink_log_pub, i, !required, device_id, reportFailures) && required) { failed = true; } if (device_id == prime_id) { prime_found = true; } } /* check if the primary device is present */ if (!prime_found && prime_id != 0) { if (reportFailures) { mavlink_and_console_log_critical(mavlink_log_pub, "Warning: Primary compass not found"); } failed = true; } } /* ---- ACCEL ---- */ if (checkAcc) { bool prime_found = false; int32_t prime_id = 0; param_get(param_find("CAL_ACC_PRIME"), &prime_id); /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_accel_count; i++) { bool required = (i < max_mandatory_accel_count); int device_id = -1; if (!accelerometerCheck(mavlink_log_pub, i, !required, checkDynamic, device_id, reportFailures) && required) { failed = true; } if (device_id == prime_id) { prime_found = true; } } /* check if the primary device is present */ if (!prime_found && prime_id != 0) { if (reportFailures) { mavlink_and_console_log_critical(mavlink_log_pub, "Warning: Primary accelerometer not found"); } failed = true; } } /* ---- GYRO ---- */ if (checkGyro) { bool prime_found = false; int32_t prime_id = 0; param_get(param_find("CAL_GYRO_PRIME"), &prime_id); /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_gyro_count; i++) { bool required = (i < max_mandatory_gyro_count); int device_id = -1; if (!gyroCheck(mavlink_log_pub, i, !required, device_id, reportFailures) && required) { failed = true; } if (device_id == prime_id) { prime_found = true; } } /* check if the primary device is present */ if (!prime_found && prime_id != 0) { if (reportFailures) { mavlink_and_console_log_critical(mavlink_log_pub, "Warning: Primary gyro not found"); } failed = true; } } /* ---- BARO ---- */ if (checkBaro) { bool prime_found = false; int32_t prime_id = 0; param_get(param_find("CAL_BARO_PRIME"), &prime_id); /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_baro_count; i++) { bool required = (i < max_mandatory_baro_count); int device_id = -1; if (!baroCheck(mavlink_log_pub, i, !required, device_id, reportFailures) && required) { failed = true; } if (device_id == prime_id) { prime_found = true; } } // TODO there is no logic in place to calibrate the primary baro yet // // check if the primary device is present if (!prime_found && prime_id != 0) { if (reportFailures) { mavlink_and_console_log_critical(mavlink_log_pub, "warning: primary barometer not operational"); } failed = true; } } /* ---- AIRSPEED ---- */ if (checkAirspeed) { if (!airspeedCheck(mavlink_log_pub, true, reportFailures)) { failed = true; } } /* ---- RC CALIBRATION ---- */ if (checkRC) { if (rc_calibration_check(mavlink_log_pub, reportFailures) != OK) { if (reportFailures) { mavlink_and_console_log_critical(mavlink_log_pub, "RC calibration check failed"); } failed = true; } } /* ---- Global Navigation Satellite System receiver ---- */ if (checkGNSS) { if (!gnssCheck(mavlink_log_pub, reportFailures)) { failed = true; } } /* Report status */ return !failed; }
bool preflightCheck(int mavlink_fd, bool checkMag, bool checkAcc, bool checkGyro, bool checkBaro, bool checkAirspeed, bool checkRC, bool checkGNSS, bool checkDynamic) { bool failed = false; /* ---- MAG ---- */ if (checkMag) { /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_mag_count; i++) { bool required = (i < max_mandatory_mag_count); if (!magnometerCheck(mavlink_fd, i, !required) && required) { failed = true; } } } /* ---- ACCEL ---- */ if (checkAcc) { /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_accel_count; i++) { bool required = (i < max_mandatory_accel_count); if (!accelerometerCheck(mavlink_fd, i, !required, checkDynamic) && required) { failed = true; } } } /* ---- GYRO ---- */ if (checkGyro) { /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_gyro_count; i++) { bool required = (i < max_mandatory_gyro_count); if (!gyroCheck(mavlink_fd, i, !required) && required) { failed = true; } } } /* ---- BARO ---- */ if (checkBaro) { /* check all sensors, but fail only for mandatory ones */ for (unsigned i = 0; i < max_optional_baro_count; i++) { bool required = (i < max_mandatory_baro_count); if (!baroCheck(mavlink_fd, i, !required) && required) { failed = true; } } } /* ---- AIRSPEED ---- */ if (checkAirspeed) { if (!airspeedCheck(mavlink_fd, true)) { failed = true; } } /* ---- RC CALIBRATION ---- */ if (checkRC) { if (rc_calibration_check(mavlink_fd) != OK) { failed = true; } } /* ---- Global Navigation Satellite System receiver ---- */ if(checkGNSS) { if(!gnssCheck(mavlink_fd)) { failed = true; } } /* Report status */ return !failed; }