LCOV - code coverage report
Current view: top level - home/pbarker/rc/ardupilot/ArduPlane - control_modes.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 119 127 93.7 %
Date: 2026-09-09 11:02:08 Functions: 7 7 100.0 %

          Line data    Source code
       1             : #include "Plane.h"
       2             : 
       3             : #include "quadplane.h"
       4             : #include "qautotune.h"
       5             : 
       6        2550 : Mode *Plane::mode_from_mode_num(const enum Mode::Number num)
       7             : {
       8        2550 :     Mode *ret = nullptr;
       9        2550 :     switch (num) {
      10        1533 :     case Mode::Number::MANUAL:
      11        1533 :         ret = &mode_manual;
      12        1533 :         break;
      13          11 :     case Mode::Number::CIRCLE:
      14          11 :         ret = &mode_circle;
      15          11 :         break;
      16           3 :     case Mode::Number::STABILIZE:
      17           3 :         ret = &mode_stabilize;
      18           3 :         break;
      19           1 :     case Mode::Number::TRAINING:
      20           1 :         ret = &mode_training;
      21           1 :         break;
      22           4 :     case Mode::Number::ACRO:
      23           4 :         ret = &mode_acro;
      24           4 :         break;
      25         417 :     case Mode::Number::FLY_BY_WIRE_A:
      26         417 :         ret = &mode_fbwa;
      27         417 :         break;
      28           6 :     case Mode::Number::FLY_BY_WIRE_B:
      29           6 :         ret = &mode_fbwb;
      30           6 :         break;
      31          68 :     case Mode::Number::CRUISE:
      32          68 :         ret = &mode_cruise;
      33          68 :         break;
      34           3 :     case Mode::Number::AUTOTUNE:
      35           3 :         ret = &mode_autotune;
      36           3 :         break;
      37         197 :     case Mode::Number::AUTO:
      38         197 :         ret = &mode_auto;
      39         197 :         break;
      40          21 :     case Mode::Number::RTL:
      41          21 :         ret = &mode_rtl;
      42          21 :         break;
      43          35 :     case Mode::Number::LOITER:
      44          35 :         ret = &mode_loiter;
      45          35 :         break;
      46           1 :     case Mode::Number::AVOID_ADSB:
      47             : #if HAL_ADSB_ENABLED
      48           1 :         ret = &mode_avoidADSB;
      49           1 :         break;
      50             : #endif
      51             :     // if ADSB is not compiled in then fallthrough to guided
      52          49 :     case Mode::Number::GUIDED:
      53          49 :         ret = &mode_guided;
      54          49 :         break;
      55           0 :     case Mode::Number::INITIALISING:
      56           0 :         ret = &mode_initializing;
      57           0 :         break;
      58             : #if HAL_QUADPLANE_ENABLED
      59           4 :     case Mode::Number::QSTABILIZE:
      60           4 :         ret = &mode_qstabilize;
      61           4 :         break;
      62          26 :     case Mode::Number::QHOVER:
      63          26 :         ret = &mode_qhover;
      64          26 :         break;
      65          78 :     case Mode::Number::QLOITER:
      66          78 :         ret = &mode_qloiter;
      67          78 :         break;
      68          15 :     case Mode::Number::QLAND:
      69          15 :         ret = &mode_qland;
      70          15 :         break;
      71          17 :     case Mode::Number::QRTL:
      72          17 :         ret = &mode_qrtl;
      73          17 :         break;
      74           3 :     case Mode::Number::QACRO:
      75           3 :         ret = &mode_qacro;
      76           3 :         break;
      77             : #if QAUTOTUNE_ENABLED
      78           1 :     case Mode::Number::QAUTOTUNE:
      79           1 :         ret = &mode_qautotune;
      80           1 :         break;
      81             : #endif
      82             : #endif  // HAL_QUADPLANE_ENABLED
      83          53 :     case Mode::Number::TAKEOFF:
      84          53 :         ret = &mode_takeoff;
      85          53 :         break;
      86             : #if MODE_AUTOLAND_ENABLED
      87           3 :     case Mode::Number::AUTOLAND:
      88           3 :         ret = &mode_autoland;
      89           3 :         break;
      90             : #endif //MODE_AUTOLAND_ENABLED
      91           1 :     case Mode::Number::THERMAL:
      92             : #if HAL_SOARING_ENABLED
      93           1 :         ret = &mode_thermal;
      94             : #endif
      95           1 :         break;
      96             : #if HAL_QUADPLANE_ENABLED
      97           0 :     case Mode::Number::LOITER_ALT_QLAND:
      98           0 :         ret = &mode_loiter_qland;
      99           0 :         break;
     100             : #endif  // HAL_QUADPLANE_ENABLED
     101             : 
     102             :     }
     103        2550 :     return ret;
     104             : }
     105             : 
     106      390652 : void RC_Channels_Plane::read_mode_switch()
     107             : {
     108      390652 :     if (millis() - plane.failsafe.last_valid_rc_ms > 100) {
     109             :         // only use signals that are less than 0.1s old.
     110         289 :         return;
     111             :     }
     112      390363 :     RC_Channels::read_mode_switch();
     113             : }
     114             : 
     115         700 : void RC_Channel_Plane::mode_switch_changed(modeswitch_pos_t new_pos)
     116             : {
     117         700 :     if (new_pos < 0 || (uint8_t)new_pos >= ARRAY_SIZE(plane.g.flight_modes)) {
     118             :         // should not have been called
     119           0 :         return;
     120             :     }
     121             : 
     122         700 :     plane.set_mode_by_number((Mode::Number)plane.g.flight_modes[new_pos].get(), ModeReason::RC_COMMAND);
     123             : }
     124             : 
     125             : /*
     126             :   called when entering autotune
     127             :  */
     128           4 : void Plane::autotune_start(void)
     129             : {
     130           4 :     const bool tune_roll = g2.axis_bitmask.get() & int8_t(AutoTuneAxis::ROLL);
     131           4 :     const bool tune_pitch = g2.axis_bitmask.get() & int8_t(AutoTuneAxis::PITCH);
     132           4 :     const bool tune_yaw = g2.axis_bitmask.get() & int8_t(AutoTuneAxis::YAW);
     133           4 :     if (tune_roll || tune_pitch || tune_yaw) {
     134           4 :         gcs().send_text(MAV_SEVERITY_INFO, "Started autotune");
     135           4 :         if (tune_roll) { 
     136           4 :             rollController.autotune_start();
     137             :         }
     138           4 :         if (tune_pitch) { 
     139           4 :             pitchController.autotune_start();
     140             :         }
     141           4 :         if (tune_yaw) { 
     142           4 :             yawController.autotune_start();
     143             :         }
     144           4 :         autotuning = true;
     145           4 :         gcs().send_text(MAV_SEVERITY_INFO, "Autotuning %s%s%s", tune_roll?"roll ":"", tune_pitch?"pitch ":"", tune_yaw?"yaw":"");
     146             :     } else {
     147           0 :         gcs().send_text(MAV_SEVERITY_INFO, "No axis selected for tuning!");
     148             :     }        
     149           4 : }
     150             : 
     151             : /*
     152             :   called when exiting autotune
     153             :  */
     154        1924 : void Plane::autotune_restore(void)
     155             : {
     156        1924 :     rollController.autotune_restore();
     157        1924 :     pitchController.autotune_restore();
     158        1924 :     yawController.autotune_restore();
     159        1924 :     if (autotuning) {
     160           4 :         autotuning = false;
     161           4 :         gcs().send_text(MAV_SEVERITY_INFO, "Stopped autotune");
     162             :     }
     163        1924 : }
     164             : 
     165             : /*
     166             :   enable/disable autotune for AUTO modes
     167             :  */
     168           2 : void Plane::autotune_enable(bool enable)
     169             : {
     170           2 :     if (enable) {
     171           1 :         autotune_start();
     172             :     } else {
     173           1 :         autotune_restore();
     174             :     }
     175           2 : }
     176             : 
     177             : /*
     178             :   are we flying inverted?
     179             :  */
     180    20050885 : bool Plane::fly_inverted(void)
     181             : {
     182    20050885 :     if (control_mode == &plane.mode_manual) {
     183          17 :         return false;
     184             :     }
     185    20050868 :     if (inverted_flight) {
     186             :         // controlled with aux switch
     187       12781 :         return true;
     188             :     }
     189    20038087 :     if (control_mode == &mode_auto && auto_state.inverted_flight) {
     190        2625 :         return true;
     191             :     }
     192    20035462 :     return false;
     193             : }

Generated by: LCOV version 1.14