Пример #1
0
// *************************************************************************************************
// @fn          display_altitude
// @brief       Display routine. Supports display in meters and feet.
// @param       u8 line                 LINE1
//                              u8 update               DISPLAY_LINE_UPDATE_FULL,
// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR
// @return      none
// *************************************************************************************************
void display_altitude(int16_t alt, uint8_t scr)
{
    int16_t ft;
	uint16_t value;

		
	if(useMetric){
		// Display altitude in xxxx m format, allow 3 leading blank digits
		if (alt >= 0)
		{
			value = alt;
			display_symbol(scr, LCD_SYMB_ARROW_UP, SEG_ON);
			display_symbol(scr, LCD_SYMB_ARROW_DOWN, SEG_OFF);
		}
		else
		{
			value = alt * (-1);
			display_symbol(scr, LCD_SYMB_ARROW_UP, SEG_OFF);
			display_symbol(scr, LCD_SYMB_ARROW_DOWN, SEG_ON);
		}
		display_symbol(scr, LCD_UNIT_L1_M, SEG_ON);
	}else{

		// Convert from meters to feet
		ft = convert_m_to_ft(alt);

		// Limit to 9999ft (3047m)
		if (ft > 9999)
			ft = 9999;

		// Display altitude in xxxx ft format, allow 3 leading blank digits
		if (ft >= 0)
		{
			value = ft;
			display_symbol(scr, LCD_SYMB_ARROW_UP, SEG_ON);
			display_symbol(scr, LCD_SYMB_ARROW_DOWN, SEG_OFF);
		}
		else
		{
			value = ft * -1;
			display_symbol(scr, LCD_SYMB_ARROW_UP, SEG_OFF);
			display_symbol(scr, LCD_SYMB_ARROW_DOWN, SEG_ON);
		}
		display_symbol(scr, LCD_UNIT_L1_FT, SEG_ON);
	}
	
	_printf(scr, LCD_SEG_L1_3_0, "%4u", value);
}
Пример #2
0
void display_altitude(u8 line, u8 update)
{
    u8 * str;
#ifndef CONFIG_METRIC_ONLY
    s16 ft;
#endif

    // redraw whole screen
    if (update == DISPLAY_LINE_UPDATE_FULL)
    {
        // Enable pressure measurement
        sAlt.state = MENU_ITEM_VISIBLE;

        // Start measurement
        start_altitude_measurement();
#ifdef CONFIG_ALTI_ACCUMULATOR
        display_chars(LCD_SEG_L1_3_0, (u8*)"ALT ", SEG_ON);
#endif
#ifdef CONFIG_METRIC_ONLY
        display_symbol(LCD_UNIT_L1_M, SEG_ON);
#else
        if (sys.flag.use_metric_units)
        {
            // Display "m" symbol
            display_symbol(LCD_UNIT_L1_M, SEG_ON);
        }
        else
        {
            // Display "ft" symbol
            display_symbol(LCD_UNIT_L1_FT, SEG_ON);
        }
#endif
        // Display altitude
        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
    }
    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)
    {
        // Update display only while measurement is active
        if (sAlt.timeout > 0)
        {
#ifndef CONFIG_METRIC_ONLY
            if (sys.flag.use_metric_units)
            {
#endif
                // Display altitude in xxxx m format, allow 3 leading blank digits
                if (sAlt.altitude >= 0)
                {
#ifdef CONFIG_ALTI_ACCUMULATOR
                    str = _itoa(sAlt.altitude, 5, 4);
#else
                    str = _itoa(sAlt.altitude, 4, 3);
#endif
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                }
                else
                {
#ifdef CONFIG_ALTI_ACCUMULATOR
                    str = _itoa(sAlt.altitude*(-1), 4, 3);
#else
                    str = _itoa(sAlt.altitude*(-1), 5, 4);
#endif
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                }
#ifndef CONFIG_METRIC_ONLY
            }
            else
            {
                // Convert from meters to feet
                ft = convert_m_to_ft(sAlt.altitude);
#ifndef CONFIG_ALTI_ACCUMULATOR
                // Limit to 9999ft (3047m)
                if (ft > 9999) ft = 9999;
#endif
                // Display altitude in xxxx ft format, allow 3 leading blank digits
                if (ft >= 0)
                {
#ifdef CONFIG_ALTI_ACCUMULATOR
                    str = _itoa(ft, 4, 3);
#else
                    str = _itoa(ft, 5, 4);
#endif
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                }
                else
                {
#ifdef CONFIG_ALTI_ACCUMULATOR
                    str = _itoa(ft*(-1), 4, 3);
#else
                    str = _itoa(ft*(-1), 5, 4);
#endif
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                }
            }
#endif
#ifdef CONFIG_ALTI_ACCUMULATOR
            // display altitude on bottom line (5 digits)
            clear_line(LINE2);
            display_chars(LCD_SEG_L2_4_0, str, SEG_ON);
#else
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
#endif
        }
    }
    else if (update == DISPLAY_LINE_CLEAR)
    {
        // Disable pressure measurement
        sAlt.state = MENU_ITEM_NOT_VISIBLE;

        // Stop measurement
        stop_altitude_measurement();

        // Clean up function-specific segments before leaving function
#ifdef CONFIG_ALTI_ACCUMULATOR
        // clear off the altitude display from the second line
        clear_line(LINE2);
        // should really try to get the date displayed here again too
#endif
        display_symbol(LCD_UNIT_L1_M, SEG_OFF);
        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
    }
}
Пример #3
0
// *************************************************************************************************
// @fn          mx_altitude
// @brief       Mx button handler to set the altitude offset.
// @param       u8 line		LINE1
// @return      none
// *************************************************************************************************
void mx_altitude(u8 line)
{
    s32 altitude;
    s32	limit_high, limit_low;

    // Clear display
    clear_display_all();
#ifdef CONFIG_ALTI_ACCUMULATOR
    // Display "ALt" on top line
    display_chars(LCD_SEG_L1_3_0, (u8*)"ALT ", SEG_ON);
    clear_line(LINE2);
#endif

    // Set lower and upper limits for offset correction
#ifdef CONFIG_METRIC_ONLY
    display_symbol(LCD_UNIT_L1_M, SEG_ON);

    // Convert global variable to local variable
    altitude  = sAlt.altitude;

    // Limits for set_value function
    limit_low = -100;
    limit_high = 9000;
#else
    if (sys.flag.use_metric_units)
    {
        // Display "m" symbol
        display_symbol(LCD_UNIT_L1_M, SEG_ON);

        // Convert global variable to local variable
        altitude  = sAlt.altitude;

        // Limits for set_value function
        limit_low = -100;
        limit_high = 9000;
    }
    else // English units
    {
        // Display "ft" symbol
        display_symbol(LCD_UNIT_L1_FT, SEG_ON);

        // Convert altitude in meters to feet
        altitude = sAlt.altitude;

        // Convert from meters to feet
        altitude = convert_m_to_ft(altitude);

        // Limits for set_value function
        limit_low = -500;
#ifdef CONFIG_ALTI_ACCUMULATOR
        limit_high = 33000;
#else
        limit_high = 9999;
#endif
    }
#endif
    // Loop values until all are set or user breaks	set
    while(1)
    {
        // Idle timeout: exit without saving
        if (sys.flag.idle_timeout) break;

        // Button STAR (short): save, then exit
        if (button.flag.star)
        {
            // When using English units, convert ft back to m before updating pressure table
#ifndef CONFIG_METRIC_ONLY
            if (!sys.flag.use_metric_units) altitude = convert_ft_to_m((s16)altitude);
#endif

            // Update pressure table
            update_pressure_table((s16)altitude, sAlt.pressure, sAlt.temperature);

            // Set display update flag
            display.flag.line1_full_update = 1;

            break;
        }

        // Set current altitude - offset is set when leaving function
#ifdef CONFIG_ALTI_ACCUMULATOR
        // use 2nd line as it displays larger numbers
        set_value(&altitude, 5, 4, limit_low, limit_high, SETVALUE_DISPLAY_VALUE + SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS, LCD_SEG_L2_4_0, display_value1);
#else
        set_value(&altitude, 4, 3, limit_low, limit_high, SETVALUE_DISPLAY_VALUE + SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS, LCD_SEG_L1_3_0, display_value1);
#endif
    }

    // Clear button flags
    button.all_flags = 0;
}
Пример #4
0
// *************************************************************************************************
// @fn          display_altitude
// @brief       Display routine. Supports display in meters and feet. 
// @param       u8 line                 LINE1
//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR
// @return      none
// *************************************************************************************************
void display_altitude(u8 line, u8 update)
{
   u8 *str;
   s16 ft;

   // Start measurement
   start_altitude_measurement();

   // redraw whole screen
   if (update == DISPLAY_LINE_UPDATE_FULL)
   {
      if (sys.flag.use_metric_units)
      {
         // Display "m" symbol
         display_symbol(LCD_UNIT_L1_M, SEG_ON);
      }
      else
      {
         // Display "ft" symbol
         display_symbol(LCD_UNIT_L1_FT, SEG_ON);
      }

      // Display altitude
      display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
   }
   else if (update == DISPLAY_LINE_UPDATE_PARTIAL)
   {
      if (sys.flag.use_metric_units)
      {
         // Display altitude in xxxx m format, allow 3 leading blank digits
         if (sAlt.altitude >= 0)
         {
            str = int_to_array(sAlt.altitude, 4, 3);
            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
         }
         else
         {
            str = int_to_array(sAlt.altitude * (-1), 4, 3);
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
         }
      }
      else
      {
         // Convert from meters to feet
         ft = convert_m_to_ft(sAlt.altitude);

         // Limit to 9999ft (3047m)
         if (ft > 9999)
            ft = 9999;

         // Display altitude in xxxx ft format, allow 3 leading blank digits
         if (ft >= 0)
         {
            str = int_to_array(ft, 4, 3);
            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
         }
         else
         {
            str = int_to_array(ft * (-1), 4, 3);
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
         }
      }
      display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
   }
   else if (update == DISPLAY_LINE_CLEAR)
   {
      // Stop measurement
      stop_altitude_measurement();

      // Clean up function-specific segments before leaving function
      display_symbol(LCD_UNIT_L1_M, SEG_OFF);
      display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
      display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
      display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
   }
}
Пример #5
0
// *************************************************************************************************
// @fn          display_altitude
// @brief       Display routine. Supports display in meters and feet.
// @param       u8 line                 LINE1
//                              u8 update               DISPLAY_LINE_UPDATE_FULL,
// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR
// @return      none
// *************************************************************************************************
void display_altitude(u8 line, u8 update)
{
    u8 *str;
    s16 ft;

    // redraw whole screen
    if (update == DISPLAY_LINE_UPDATE_FULL)
    {
        // Enable pressure measurement
        sAlt.state = MENU_ITEM_VISIBLE;

        // Start measurement
        start_altitude_measurement();


        // Display altitude
        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
    }
    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)
    {
        // Update display only while measurement is active
        if (sAlt.timeout > 0)
        {
          if (sAlt.display == DISPLAY_DEFAULT_VIEW)
          {
            display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);
            display_symbol(LCD_SYMB_AM, SEG_OFF);            
            if (sys.flag.use_metric_units)
            {
               // Display "m" symbol
               display_symbol(LCD_UNIT_L1_M, SEG_ON);
             }
            else
             {
              // Display "ft" symbol
              display_symbol(LCD_UNIT_L1_FT, SEG_ON);
              }        
            if (sys.flag.use_metric_units)
            {
                // Display altitude in xxxx m format, allow 3 leading blank digits
                if (sAlt.altitude >= 0)
                {
                    str = int_to_array(sAlt.altitude, 4, 3);
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                }
                else
                {
                    str = int_to_array((-1)*sAlt.altitude, 4, 3);
                    //const u8 neg_txt[3] ="NEG";
                    //str = (u8 *)neg_txt;
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                }
            }
            else
            {
                // Convert from meters to feet
                ft = convert_m_to_ft(sAlt.altitude);

                // Limit to 9999ft (3047m)
                if (ft > 9999)
                    ft = 9999;

                // Display altitude in xxxx ft format, allow 3 leading blank digits
                if (ft >= 0)
                {
                    str = int_to_array(ft, 4, 3);
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                }
                else
                {
                    str = int_to_array(ft * (-1), 4, 3);
                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                }
            }
  
            display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
          }
          else if (sAlt.display == DISPLAY_ALTERNATIVE_VIEW)
          {
            // Display Pressure in hPa
            
            u16 PressureToDisp = (u16) (((float)sAlt.pressure + 100.00 * (float) sAlt.pressure_offset) / 100.00 + 0.5);
            str = int_to_array(PressureToDisp, 4, 3);
            
            display_symbol(LCD_SYMB_AM, SEG_OFF);            
                    
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
        
            display_symbol(LCD_UNIT_L1_M, SEG_OFF);
            display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
            display_symbol(LCD_UNIT_L1_PER_H, SEG_ON_BLINK_OFF);
            
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
          }
          else if (sAlt.display == DISPLAY_ALTERNATIVE_VIEW1)
          {
            // Display Pressure in mmHg
            u16 PressureToDisp = (u16) (3.0 * ((float)sAlt.pressure + 100.00 * (float)sAlt.pressure_offset) / 400.00  + 0.5);            
            str = int_to_array(PressureToDisp, 4, 3);
            
//            str = int_to_array(sAlt.pressure_delta, 4, 3);            
            
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
        
            display_symbol(LCD_UNIT_L1_M, SEG_OFF);
            display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
            display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);
            display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);
            
            display_symbol(LCD_SYMB_AM, SEG_ON);            
              
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
            
          }
          else if (sAlt.display == DISPLAY_ALTERNATIVE_VIEW2)
          {   
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);              
            display_symbol(LCD_SYMB_AM, SEG_OFF);            
            display_symbol(LCD_UNIT_L1_M, SEG_OFF);
            display_symbol(LCD_UNIT_L1_FT, SEG_OFF);            
            display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);
            display_symbol(LCD_ICON_RECORD, SEG_ON_BLINK_ON);
            
            s16 dp = sAlt.pressure_delta;            
            if (dp > 250)
            {
              // unstable high pressure
              display_chars(LCD_SEG_L1_3_0, (u8 *) "UN H", SEG_ON);
            }
            else if ((dp >= 50) && (dp <= 250))
            {
              // stable good weather
              display_chars(LCD_SEG_L1_3_0, (u8 *) " SUN", SEG_ON);
            }
            else if ((dp >= -50) && (dp < 50))
            {
              // stable              
              display_chars(LCD_SEG_L1_3_0, (u8 *) "STAB", SEG_ON);
            }
            else if ((dp > -250) && (dp < -50))
            {
              // stable rainy
              display_chars(LCD_SEG_L1_3_0, (u8 *) "RAIN", SEG_ON);
            }
            else 
            {
              // unstable low
              display_chars(LCD_SEG_L1_3_0, (u8 *) "UN L", SEG_ON);
            }
 
            
            /*
            u32 Temp = (u32)((float) sAlt.pressure_sum / ((float) sAlt.pressure_counter * 100.0) + 0.5);
            str = int_to_array(Temp, 4, 3);
            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);              
            display_symbol(LCD_SYMB_AM, SEG_OFF);            
            display_symbol(LCD_UNIT_L1_M, SEG_OFF);
            display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
            display_symbol(LCD_UNIT_L1_PER_H, SEG_ON_BLINK_ON); 
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);            
            */
          }
          else
          {                
            if (sAlt.pressure_delta >= 0)
            {
              str = int_to_array(sAlt.pressure_delta, 4, 3);           
              display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
            }
            else
            {
              str = int_to_array(sAlt.pressure_delta * (-1), 4, 3);                        
              display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);              
            }
            display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);
            display_symbol(LCD_SYMB_AM, SEG_OFF);            
            display_symbol(LCD_UNIT_L1_M, SEG_OFF);
            display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
            display_symbol(LCD_UNIT_L1_PER_H, SEG_ON); 
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
          }          
            
        }
    }
    else if (update == DISPLAY_LINE_CLEAR)
    {
        // Disable pressure measurement
        sAlt.state = MENU_ITEM_NOT_VISIBLE;

        // Stop measurement
        stop_altitude_measurement();

        // Clean up function-specific segments before leaving function
        display_symbol(LCD_UNIT_L1_M, SEG_OFF);
        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
        display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF_BLINK_OFF);    
        display_symbol(LCD_SYMB_AM, SEG_OFF);         
        display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);
            
        sAlt.display = DISPLAY_DEFAULT_VIEW;
    }
}
Пример #6
0
// *************************************************************************************************
// @fn          mx_altitude
// @brief       Mx button handler to set the altitude offset.
// @param       u8 line         LINE1
// @return      none
// *************************************************************************************************
void mx_altitude(u8 line)
{
    u8 select;
    s32 altitude;
    s32 limit_high, limit_low;
    s32 offset;
    
    select = 0;  
    
    // Clear display
    clear_display_all();

    offset = sAlt.pressure_offset;
    // Set lower and upper limits for offset correction
    if (sys.flag.use_metric_units)
    {
        // Display "m" symbol
        display_symbol(LCD_UNIT_L1_M, SEG_ON);

        // Convert global variable to local variable
        altitude = sAlt.altitude;        
        // Limits for set_value function
        limit_low = -100;
        limit_high = 4000;
    }
    else                        // English units
    {
        // Display "ft" symbol
        display_symbol(LCD_UNIT_L1_FT, SEG_ON);

        // Convert altitude in meters to feet
        altitude = sAlt.altitude;

        // Convert from meters to feet
        altitude = convert_m_to_ft(altitude);

        // Limits for set_value function
        limit_low = -500;
        limit_high = 9999;
    }

    // Loop values until all are set or user breaks set
    while (1)
    {
        // Idle timeout: exit without saving
        if (sys.flag.idle_timeout)
            break;

        // Button STAR (short): save, then exit
        if (button.flag.star)
        {
            // When using English units, convert ft back to m before updating pressure table
            if (!sys.flag.use_metric_units)
                altitude = convert_ft_to_m((s16) altitude);

            // Update pressure table
            update_pressure_table((s16) altitude, sAlt.pressure, sAlt.temperature);
            sAlt.pressure_offset = offset;
            
            // Set display update flag
            display.flag.line1_full_update = 1;

            break;
        }
        switch (select)
         {
         case 0:
           // Set current altitude - offset is set when leaving function
           if (sys.flag.use_metric_units)
            {
              // Display "m" symbol
              display_symbol(LCD_UNIT_L1_M, SEG_ON);
            }
           else
           {
             //        // Display "ft" symbol
              display_symbol(LCD_UNIT_L1_FT, SEG_ON);
           }
           display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);  
           display_chars(LCD_SEG_L2_5_0, (u8 *) "   ALT", SEG_ON);
           set_value(&altitude, 4, 3, limit_low, limit_high, SETVALUE_DISPLAY_VALUE +
                    SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS + SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_0,
                    display_value);           
           select = 1;
           break;
         case 1:
           // Set pressure offset
           display_symbol(LCD_UNIT_L1_PER_H, SEG_ON);                      
           display_symbol(LCD_UNIT_L1_M, SEG_OFF);
           display_symbol(LCD_UNIT_L1_FT, SEG_OFF);               
           display_chars(LCD_SEG_L2_5_0, (u8 *) " OFFS", SEG_ON);           
          set_value(&offset, 4, 3, -100, 100, SETVALUE_DISPLAY_VALUE +
                  SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS + SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_0,
                  display_value);           
           select = 0;
           break;           
         }        
    }

    // Clear button flags
    button.all_flags = 0;
}
// *************************************************************************************************
// @fn          display_altitude
// @brief       Display routine. Supports display in meters and feet. 
// @param       u8 line         LINE1
//              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR
// @return      none
// *************************************************************************************************
void display_altitude(u8 line, u8 update)
{
    u8 * str;
    s16 ft;
    
    // redraw whole screen
    if (update == DISPLAY_LINE_UPDATE_FULL) 
    {
        // Enable pressure measurement
        sAlt.state = MENU_ITEM_VISIBLE;

        // Start measurement
        start_altitude_measurement();
        
        // Display altitude
        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
    }
    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)
    {
        // Update display only while measurement is active
        if (sAlt.timeout > 0)
        {
            // Altitude view
            if (PressDisplay == DISPLAY_DEFAULT_VIEW)
            {
                display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
                if (sys.flag.use_metric_units)
                {
                    // Display "m" symbol
                    display_symbol(LCD_UNIT_L1_M, SEG_ON);
                    // Display altitude in xxxx m format, allow 3 leading blank digits
                    if (sAlt.altitude >= 0)
                    {
                        str = itoa(sAlt.altitude, 4, 3);
                        display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                    }
                    else
                    {
                        str = itoa(sAlt.altitude*(-1), 4, 3);
                        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                    }
                }
                else
                {
                    // Display "ft" symbol
                    display_symbol(LCD_UNIT_L1_FT, SEG_ON);                 
                    
                    // Convert from meters to feet
                    ft = convert_m_to_ft(sAlt.altitude);
                    
                    // Limit to 9999ft (3047m)
                    if (ft > 9999) ft = 9999;
                    
                    // Display altitude in xxxx ft format, allow 3 leading blank digits
                    if (ft >= 0)
                    {
                        str = itoa(ft, 4, 3);
                        display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
                        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                    }
                    else
                    {
                        str = itoa(ft*(-1), 4, 3);
                        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
                    }               
                }
            }
            // Pressure view, unit: milliBar = hectoPascal
            else if (PressDisplay == DISPLAY_ALTERNATIVE_VIEW)
            {
                display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
                display_symbol(LCD_UNIT_L1_M, SEG_OFF);
                display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
                str = itoa(AmbientPressure, 4, 3);
            }
            // Pressure view, unit: PSI (Pound-force per square inch absolute) 1mbar = 0.01450377 PSI
            else  // DISPLAY_ALTERNATIVE_VIEW_2
            {
                str = itoa((u32)AmbientPressure * 10000L / 6895L, 4, 3);
                display_symbol(LCD_SEG_L1_DP1, SEG_ON);
            }
            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);
        }
    }
    else if (update == DISPLAY_LINE_CLEAR)
    {
        // Disable pressure measurement
        sAlt.state = MENU_ITEM_NOT_VISIBLE;

        // Stop measurement
        stop_altitude_measurement();
        
        // Clean up function-specific segments before leaving function
        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
        display_symbol(LCD_UNIT_L1_M, SEG_OFF);
        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
    }
}