Page 357 - 2
P. 357

//Generate a packed byte of all four GPS boxes.
                uint8_t gps_modes_check = (rcOptions[BOXLAND]<< 3) + (rcOptions[BOXGPSHOME]<< 2)
            + (rcOptions[BOXGPSHOLD]<<1) + (rcOptions[BOXGPSNAV]);


                if (f.ARMED ) {                       //Check GPS status and armed
                  //TODO: implement f.GPS_Trusted flag, idea from Dramida - Check for degraded HDOP an
            d sudden speed jumps
                  if (f.GPS_FIX) {
                    if (GPS_numSat >5 ) {
                      if (prv_gps_modes != gps_modes_check) {                              //Check for chang
            e since last loop
                        NAV_error = NAV_ERROR_NONE;
                        if (rcOptions[BOXGPSHOME]) {                                        // RTH has the p
            riotity over everything else
                          init_RTH();
                        } else if (rcOptions[BOXGPSHOLD]) {                                 //Position hold ha
            s priority over mission execution  //But has less priority than RTH
                          if (f.GPS_mode == GPS_MODE_NAV)
                            NAV_paused_at = mission_step.number;
                          f.GPS_mode = GPS_MODE_HOLD;
                          f.GPS_BARO_MODE = false;
                          GPS_set_next_wp(&GPS_coord[LAT], &GPS_coord[LON],&GPS_coord[LAT], & GPS
            _coord[LON]); //hold at the current position
                          set_new_altitude(alt.EstAlt);                              //and current altitude
                          NAV_state = NAV_STATE_HOLD_INFINIT;
                        } else if (rcOptions[BOXLAND]) {                                   //Land now (It has
            priority over Navigation)
                          f.GPS_mode = GPS_MODE_HOLD;
                          f.GPS_BARO_MODE = true;
                          GPS_set_next_wp(&GPS_coord[LAT], &GPS_coord[LON],&GPS_coord[LAT], & GPS
            _coord[LON]);
                          set_new_altitude(alt.EstAlt);
                          NAV_state = NAV_STATE_LAND_START;
                        } else if (rcOptions[BOXGPSNAV]) {                                //Start navigation
                          f.GPS_mode = GPS_MODE_NAV;                                        //Nav mode start
                          f.GPS_BARO_MODE = true;
                          GPS_prev[LAT] = GPS_coord[LAT];
                          GPS_prev[LON] = GPS_coord[LON];
                          if (NAV_paused_at != 0) {
                            next_step = NAV_paused_at;
                            NAV_paused_at = 0;                                           //Clear paused step
                          } else {
                            next_step = 1;
                            jump_times = -10;                                           //Reset jump counter


                                                         - 357 -
   352   353   354   355   356   357   358   359   360   361   362