//**********************************************************************
// Print menu items primary subroutine
//
// Usage:
// top = position in submenu list
// start = start of submenu text list. (top - start) gives the offset into the list.
// values = pointer to array of values to change
// multiplier = display/actual if type = 2, otherwise defaults to 1
// menu_ranges = pointer to array of min/max/inc/style/defaults
// rangetype = unique (0) all values are different, copied (1) all values are the same
// MenuOffsets = originally an array, now just a fixed horizontal offset for the value text
// text_link = pointer to the text list for the values if not numeric
// cursor = cursor position
//**********************************************************************
void print_menu_items(uint8_t top, uint8_t start, int8_t values[], uint8_t mult, prog_uchar* menu_ranges, uint8_t rangetype, uint8_t MenuOffsets, prog_uchar* text_link, uint8_t cursor)
{
	menu_range_t	range1;
	uint8_t multiplier;
		
	// Clear buffer before each update
	clear_buffer(buffer);
	print_menu_frame(0);
	
	// Print each line
	for (uint8_t i = 0; i < 4; i++)
	{
		LCD_Display_Text(top+i,(prog_uchar*)Verdana8,ITEMOFFSET,(uint8_t)pgm_read_byte(&lines[i]));

		// Handle unique or copied ranges (to reduce space)
		if (rangetype == 0)
		{
			// Use each unique entry
			memcpy_P(&range1, &menu_ranges[(top+i - start)* sizeof(range1)], sizeof(range1));
		}
		else
		{
			// Use just the first entry in array for all 
			memcpy_P(&range1, &menu_ranges[0], sizeof(range1));
		}
	
		if (range1.style == 2)
		{
			multiplier = mult;
		}
		else
		{
			multiplier = 1;
		}

		print_menu_text((values[top+i - start] * multiplier), range1.style, (pgm_read_byte(&text_link[top+i - start]) + values[top+i - start]), MenuOffsets, (uint8_t)pgm_read_byte(&lines[i]));
	}

	print_cursor(cursor);	// Cursor
	write_buffer(buffer,1);
	poll_buttons(true);
}
示例#2
0
void Display_status(void)
{
	int16_t temp, range, scale;
	uint16_t vbat_temp;
	int8_t	pos1, pos2, pos3;
	mugui_size16_t size;

	clear_buffer(buffer);

	// Display text
	LCD_Display_Text(4,(const unsigned char*)Verdana8,0,0); 	// Preset
	LCD_Display_Text(3,(const unsigned char*)Verdana8,0,11); 	// Version text
	LCD_Display_Text(138,(const unsigned char*)Verdana8,0,22); 	// RX sync
	LCD_Display_Text(139,(const unsigned char*)Verdana8,0,33); 	// RX sync
	LCD_Display_Text(6,(const unsigned char*)Verdana8,0,44); 	// Profile

	// Display menu and markers
	LCD_Display_Text(9, (const unsigned char*)Wingdings, 0, 59);// Down
	LCD_Display_Text(14,(const unsigned char*)Verdana8,10,55);	// Menu

	// Display values
	print_menu_text(0, 1, (22 + Config.MixMode), 45, 0);
	print_menu_text(0, 1, (48 + Config.RxModeIn), 45, 22);
	print_menu_text(0, 1, (48 + Config.RxModeOut), 45, 33);
	mugui_lcd_puts(itoa((Config.Flight + 1),pBuffer,10),(const unsigned char*)Verdana8,45,44);
	
	// Draw battery
	drawrect(buffer, 100,4, 28, 50, 1);					// Battery body
	drawrect(buffer, 110,0, 8, 5, 1);					// Battery terminal

	vbat_temp = GetVbat();

	// Calculate battery voltage limits
	range = SystemVoltage - Config.PowerTriggerActual;
	scale = range / 50;

	// Look out for that divide-by-zero... :)
	if ((vbat_temp >= Config.PowerTriggerActual) && (scale > 0))
	{
		temp = (vbat_temp - Config.PowerTriggerActual) / scale;
	}
	else
	{
		temp = 0;
	}

	if (temp > 50) temp = 50;

	fillrect(buffer, 100,54-temp, 28, temp, 1);				// Battery filler (max is 60)

	// Display voltage
	uint8_t x_loc = 102;	// X location of voltage display
	uint8_t y_loc = 55;		// Y location of voltage display

	temp = vbat_temp/100;	// Display whole decimal part first
	mugui_text_sizestring(itoa(temp,pBuffer,10), (const unsigned char*)Verdana8, &size);
	mugui_lcd_puts(itoa(temp,pBuffer,10),(const unsigned char*)Verdana8,x_loc,y_loc);
	pos1 = size.x;

	vbat_temp = vbat_temp - (temp * 100); // Now display the parts to the right of the decimal point

	LCD_Display_Text(7,(const unsigned char*)Verdana8,(x_loc + pos1),y_loc);
	mugui_text_sizestring(".", (const unsigned char*)Verdana8, &size);
	pos3 = size.x;
	mugui_text_sizestring("0", (const unsigned char*)Verdana8, &size);
	pos2 = size.x;

	if (vbat_temp >= 10)
	{
		mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
	}
	else
	{
		LCD_Display_Text(8,(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
		mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos2 + pos3),y_loc);
	}

	// Draw error messages, if any
	if ((General_error != 0) || (Flight_flags & (1 << FailsafeFlag)))
	{
		// Create message box
		fillrect(buffer, 14,8, 96, 48, 0);	// White box
		drawrect(buffer, 14,8, 96, 48, 1); 	// Outline

		// Prioritise error from top to bottom
		if (General_error & (1 << LVA_ALARM))
		{
			LCD_Display_Text(134,(const unsigned char*)Verdana14,33,14); // Battery
			LCD_Display_Text(119,(const unsigned char*)Verdana14,46,34); // Low
		}
		else if (Flight_flags & (1 << FailsafeFlag))
		{
			LCD_Display_Text(75,(const unsigned char*)Verdana14,51,13); // No
			LCD_Display_Text(76,(const unsigned char*)Verdana14,39,33); // Signal
		}
		else if (General_error & (1 << THROTTLE_HIGH))
		{
			LCD_Display_Text(105,(const unsigned char*)Verdana14,28,14); // Throttle
			LCD_Display_Text(121,(const unsigned char*)Verdana14,46,34); // High
		}
	}

	// Write buffer to complete
	write_buffer(buffer);
	clear_buffer(buffer);
}
示例#3
0
void Display_status(void)
{
	int16_t temp, min, max, range, scale;
	int8_t	pos1, pos2, pos3;
	mugui_size16_t size;

	clear_buffer(buffer);

	// Display text
	LCD_Display_Text(4,(prog_uchar*)Verdana8,0,0); 		// Mode
	LCD_Display_Text(3,(prog_uchar*)Verdana8,0,11); 	// Version text
	LCD_Display_Text(5,(prog_uchar*)Verdana8,0,22); 	// Input
	LCD_Display_Text(46,(prog_uchar*)Verdana8,0,33); 	// Stability
	LCD_Display_Text(47,(prog_uchar*)Verdana8,0,44); 	// Autolevel

	// Display menu and markers
	LCD_Display_Text(9, (prog_uchar*)Wingdings, 0, 59);	// Down
	LCD_Display_Text(14,(prog_uchar*)Verdana8,10,55);	// Menu

	// Display values
	print_menu_text(0, 1, (18 + Config.RxMode), 50, 22);
	LCD_Display_Text(0,(prog_uchar*)Verdana8,50,11); 
	print_menu_text(0, 1, (22 + Config.MixMode), 33, 0);
	print_menu_text(0, 1, (101 + Stability), 50, 44);
	print_menu_text(0, 1, (101 + AutoLevel), 50, 33);

	// Draw battery
	drawrect(buffer, 100,4, 28, 50, 1);					// Battery body
	drawrect(buffer, 110,0, 8, 4, 1);					// Battery terminal

	GetVbat();

	min = Config.MinVoltage * Config.BatteryCells;		// Calculate battery voltage limits
	max = Config.MaxVoltage * Config.BatteryCells;
	range = max - min;
	scale = range / 50;

	if (vBat >= min) 
	{
		temp =(vBat - min) / scale;
	}
	else
	{
		temp = 0;
	}
	if (temp <= 0) temp = 0;
	if (temp > 50) temp = 50;

	fillrect(buffer, 100,54-temp, 28, temp, 1);				// Battery filler (max is 60)

	// Display voltage
	uint8_t x_loc = 102;	// X location of voltage display
	uint8_t y_loc = 55;		// Y location of voltage display

	temp = vBat/100;		// Display whole decimal part first
	mugui_text_sizestring(itoa(temp,pBuffer,10), (prog_uchar*)Verdana8, &size);
	mugui_lcd_puts(itoa(temp,pBuffer,10),(prog_uchar*)Verdana8,x_loc,y_loc);
	pos1 = size.x;

	vBat = vBat - (temp * 100); // Now display the parts to the right of the decimal point

	LCD_Display_Text(7,(prog_uchar*)Verdana8,(x_loc + pos1),y_loc);
	mugui_text_sizestring(".", (prog_uchar*)Verdana8, &size);
	pos3 = size.x;
	mugui_text_sizestring("0", (prog_uchar*)Verdana8, &size);
	pos2 = size.x;

	if (vBat >= 10)
	{
		mugui_lcd_puts(itoa(vBat,pBuffer,10),(prog_uchar*)Verdana8,(x_loc + pos1 + pos3),y_loc);
	}
	else
	{
		LCD_Display_Text(8,(prog_uchar*)Verdana8,(x_loc + pos1 + pos3),y_loc);
		mugui_lcd_puts(itoa(vBat,pBuffer,10),(prog_uchar*)Verdana8,(x_loc + pos1 + pos2 + pos3),y_loc);
	}

	// Draw error messages, if any
	if (General_error != 0)
	{
		// Create message box
		fillrect(buffer, 14,8, 96, 48, 0);	// White box
		drawrect(buffer, 14,8, 96, 48, 1); 	// Outline

		// Prioritise error from top to bottom
		if((General_error & (1 << SENSOR_ERROR)) != 0)
		{
			LCD_Display_Text(72,(prog_uchar*)Verdana14,35,14); // Sensor
			LCD_Display_Text(98,(prog_uchar*)Verdana14,43,34); // Error
			menu_beep(9);
		}
		else if((General_error & (1 << LOW_BATT)) != 0)
		{
			LCD_Display_Text(82,(prog_uchar*)Verdana14,33,14); 	// Battery
			LCD_Display_Text(119,(prog_uchar*)Verdana14,46,34); // Low
		}
		else if((General_error & (1 << NO_SIGNAL)) != 0)
		{
			LCD_Display_Text(75,(prog_uchar*)Verdana14,51,13); 	// No
			LCD_Display_Text(76,(prog_uchar*)Verdana14,39,33);  // Signal
			menu_beep(3);
		}
		else if((General_error & (1 << LOST_MODEL)) != 0)
		{
			LCD_Display_Text(99,(prog_uchar*)Verdana14,45,14); // Lost
			LCD_Display_Text(100,(prog_uchar*)Verdana14,40,34);// Model
		}
		else if((General_error & (1 << THROTTLE_HIGH)) != 0)
		{
			LCD_Display_Text(105,(prog_uchar*)Verdana14,28,14); // Throttle
			LCD_Display_Text(120,(prog_uchar*)Verdana14,46,34);	// High
			menu_beep(6);
		}
	}

	// Write buffer to complete
	write_buffer(buffer,1);
	clear_buffer(buffer);
}
void Display_status(void)
{
    int16_t temp;
    uint16_t vbat_temp;
    int8_t	pos1, pos2, pos3;
    mugui_size16_t size;

    clear_buffer(buffer);

    // Display text
    LCD_Display_Text(3,(const unsigned char*)Verdana8,0,0); 		// Version text
    LCD_Display_Text(5,(const unsigned char*)Verdana8,0,16); 	// RX sync
    LCD_Display_Text(6,(const unsigned char*)Verdana8,0,27); 	// Profile
    LCD_Display_Text(23,(const unsigned char*)Verdana8,88,27); 	// Pos
    LCD_Display_Text(133,(const unsigned char*)Verdana8,0,38); 	// Battery

    // Display menu and markers
    LCD_Display_Text(9, (const unsigned char*)Wingdings, 0, 59);	// Down
    LCD_Display_Text(14,(const unsigned char*)Verdana8,10,55);	// Menu

    // Display values
    print_menu_text(0, 1, (62 + Config.RxMode), 45, 16); // Rx mode
    mugui_lcd_puts(itoa(transition,pBuffer,10),(const unsigned char*)Verdana8,110,27); // Raw transition value

    if (Config.RxMode == PWM)
    {
        LCD_Display_Text(24,(const unsigned char*)Verdana8,77,38); // Interrupt counter text
        mugui_lcd_puts(itoa(InterruptCount,pBuffer,10),(const unsigned char*)Verdana8,110,38); // Interrupt counter
    }

    // Display transition point
    if (transition <= 0)
    {
        LCD_Display_Text(48,(const unsigned char*)Verdana8,45,27);
    }
    else if (transition >= 100)
    {
        LCD_Display_Text(50,(const unsigned char*)Verdana8,45,27);
    }
    else if (transition == Config.Transition_P1n)
    {
        LCD_Display_Text(49,(const unsigned char*)Verdana8,45,27);
    }
    else if (transition < Config.Transition_P1n)
    {
        LCD_Display_Text(51,(const unsigned char*)Verdana8,45,27);
    }
    else if (transition > Config.Transition_P1n)
    {
        LCD_Display_Text(52,(const unsigned char*)Verdana8,45,27);
    }

    // Display voltage
    uint8_t x_loc = 45;		// X location of voltage display
    uint8_t y_loc = 38;		// Y location of voltage display

    vbat_temp = GetVbat();
    temp = vbat_temp/100;	// Display whole decimal part first
    mugui_text_sizestring(itoa(temp,pBuffer,10), (const unsigned char*)Verdana8, &size);
    mugui_lcd_puts(itoa(temp,pBuffer,10),(const unsigned char*)Verdana8,x_loc,y_loc);
    pos1 = size.x;

    vbat_temp = vbat_temp - (temp * 100); // Now display the parts to the right of the decimal point

    LCD_Display_Text(7,(const unsigned char*)Verdana8,(x_loc + pos1),y_loc);
    mugui_text_sizestring(".", (const unsigned char*)Verdana8, &size);
    pos3 = size.x;
    mugui_text_sizestring("0", (const unsigned char*)Verdana8, &size);
    pos2 = size.x;

    if (vbat_temp >= 10)
    {
        mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
    }
    else
    {
        LCD_Display_Text(8,(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
        mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos2 + pos3),y_loc);
    }

    // Display error messages
    if (General_error != 0)
    {
        // Create message box
        fillrect(buffer, 14,8, 96, 48, 0);	// White box
        drawrect(buffer, 14,8, 96, 48, 1); 	// Outline

        // Prioritise error from top to bottom
        if((General_error & (1 << LVA_ALARM)) != 0)
        {
            LCD_Display_Text(134,(const unsigned char*)Verdana14,33,14); // Battery
            LCD_Display_Text(73,(const unsigned char*)Verdana14,46,34); 	// Low
        }
        else if((General_error & (1 << NO_SIGNAL)) != 0)
        {
            LCD_Display_Text(75,(const unsigned char*)Verdana14,51,13); 	// No
            LCD_Display_Text(76,(const unsigned char*)Verdana14,39,33);  // Signal
        }
        else if((General_error & (1 << THROTTLE_HIGH)) != 0)
        {
            LCD_Display_Text(105,(const unsigned char*)Verdana14,28,14); // Throttle
            LCD_Display_Text(55,(const unsigned char*)Verdana14,46,34);	// High
        }
        else if((General_error & (1 << DISARMED)) != 0)
        {
            LCD_Display_Text(18,(const unsigned char*)Verdana14,25,24); 	// Disarmed
        }
    }

    // Write buffer to complete
    write_buffer(buffer,1);
    clear_buffer(buffer);
}
示例#5
0
void Display_status(void)
{
	int16_t temp;
	uint16_t vbat_temp; 
	int8_t	pos1, pos2, pos3;
	mugui_size16_t size;

	clear_buffer(buffer);

	// Display text
	LCD_Display_Text(264,(const unsigned char*)Verdana8,0,0); 	// Version text
	LCD_Display_Text(266,(const unsigned char*)Verdana8,0,12); 	// RX sync
	LCD_Display_Text(267,(const unsigned char*)Verdana8,0,24); 	// Profile
	LCD_Display_Text(23,(const unsigned char*)Verdana8,88,24); 	// Pos
		
	// Display menu and markers
	LCD_Display_Text(9, (const unsigned char*)Wingdings, 0, 59);// Down
	LCD_Display_Text(14,(const unsigned char*)Verdana8,10,55);	// Menu

	// Display values
	print_menu_text(0, 1, (62 + Config.RxMode), 45, 12); // Rx mode
	mugui_lcd_puts(itoa(transition,pBuffer,10),(const unsigned char*)Verdana8,110,24); // Raw transition value

	if (Config.RxMode == PWM)
	{
		LCD_Display_Text(24,(const unsigned char*)Verdana8,77,12); // Interrupt counter text 
		mugui_lcd_puts(itoa(InterruptCount,pBuffer,10),(const unsigned char*)Verdana8,110,12); // Interrupt counter
	}

	// Display transition point
	if (transition <= 0)
	{
		LCD_Display_Text(48,(const unsigned char*)Verdana8,45,24);
	}
	else if (transition >= 100)
	{
		LCD_Display_Text(50,(const unsigned char*)Verdana8,45,24);
	}
	else if (transition == Config.Transition_P1n)
	{
		LCD_Display_Text(49,(const unsigned char*)Verdana8,45,24);
	}
	else if (transition < Config.Transition_P1n)
	{
		LCD_Display_Text(51,(const unsigned char*)Verdana8,45,24);
	}
	else
	{
		LCD_Display_Text(52,(const unsigned char*)Verdana8,45,24);
	}

	// Don't display battery text if there are error messages
	if (General_error == 0)
	{
		// Display voltage
		uint8_t x_loc = 45;		// X location of voltage display
		uint8_t y_loc = 36;		// Y location of voltage display

		LCD_Display_Text(289,(const unsigned char*)Verdana8,0,36); 	// Battery

		vbat_temp = GetVbat();
		temp = vbat_temp/100;	// Display whole decimal part first
		mugui_text_sizestring(itoa(temp,pBuffer,10), (const unsigned char*)Verdana8, &size);
		mugui_lcd_puts(itoa(temp,pBuffer,10),(const unsigned char*)Verdana8,x_loc,y_loc);
		pos1 = size.x;

		vbat_temp = vbat_temp - (temp * 100); // Now display the parts to the right of the decimal point

		LCD_Display_Text(268,(const unsigned char*)Verdana8,(x_loc + pos1),y_loc);
		mugui_text_sizestring(".", (const unsigned char*)Verdana8, &size);
		pos3 = size.x;
		mugui_text_sizestring("0", (const unsigned char*)Verdana8, &size);
		pos2 = size.x;

		if (vbat_temp >= 10)
		{
			mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
		}
		else
		{
			LCD_Display_Text(269,(const unsigned char*)Verdana8,(x_loc + pos1 + pos3),y_loc);
			mugui_lcd_puts(itoa(vbat_temp,pBuffer,10),(const unsigned char*)Verdana8,(x_loc + pos1 + pos2 + pos3),y_loc);
		}
	
		// Display vibration info is set to "ON"
		if (Config.Vibration == ON)
		{
			// Create message box
			fillrect(buffer, 29,11, 70, 42, 0);		// White box
			drawrect(buffer, 29,11, 70, 42, 1); 	// Outline

			// Display vibration data
			temp = (int16_t)GyroAvgNoise;
			
			// Work out pixel size of number to display
			mugui_text_sizestring(itoa(temp,pBuffer,10), (const unsigned char*)Verdana22, &size);
			
			// Center the number in the box automatically
			mugui_lcd_puts(itoa(temp,pBuffer,10),(const unsigned char*)Verdana22,64 - (size.x / 2),20);
			
		} // if (Config.Vibration == ON)	
	}
	
	// Display error messages
	else
	{
		// Prioritise error from top to bottom
		if(General_error & (1 << LVA_ALARM))
		{
			LCD_Display_Text(134,(const unsigned char*)Verdana14,15,37);	// Battery
			LCD_Display_Text(271,(const unsigned char*)Verdana14,79,37);	// low
		}
		else if(General_error & (1 << NO_SIGNAL))
		{
			LCD_Display_Text(75,(const unsigned char*)Verdana14,30,37); 	// No
			LCD_Display_Text(272,(const unsigned char*)Verdana14,55,37);	// signal
		}
		else if(General_error & (1 << THROTTLE_HIGH))
		{
			LCD_Display_Text(105,(const unsigned char*)Verdana14,11,37);	// Throttle
			LCD_Display_Text(270,(const unsigned char*)Verdana14,82,37);	// high
		}
		else if(General_error & (1 << DISARMED))
		{
			LCD_Display_Text(18,(const unsigned char*)Verdana14,25,37); 	// Disarmed
		}
	}

	// Write buffer to complete
	write_buffer(buffer);
	clear_buffer(buffer);
}