Exemplo n.º 1
0
void gui_pages_loop()
{
	uint8_t start_x;
	uint8_t wtype;

	switch (page_state)
	{
	case(PAGE_IDLE):
		widgets_draw(active_page);
		gui_statusbar();
	break;

	case(PAGE_WIDGET_SELECT):
		//draw widgets
		widgets_draw(active_page);
		gui_statusbar();

		//Highlight selected widget
		uint8_t x, y, w, h;
		layout_get_widget_rect(pages[active_page].type, active_widget, &x, &y, &w, &h);


		disp.Invert(x, y, x + w - 1, y + h - 1);
		disp.InvertPixel(x, y);
		disp.InvertPixel(x + w - 1, y);
		disp.InvertPixel(x, y + h - 1);
		disp.InvertPixel(x + w - 1, y + h - 1);

		if (page_state_timer < task_get_ms_tick())
			page_state = PAGE_IDLE;
	break;

	case(PAGE_WIDGET_MENU):
		wtype = widget_get_type(active_page, active_widget);
		widget_array[wtype].menu_loop(widget_array[wtype].flags);

		if (page_state_timer < task_get_ms_tick())
			page_state = PAGE_IDLE;
	break;

	case(PAGE_CHANGE):
		page_state_step--;

		int8_t split;
		if (page_change_dir)
			split = (n5110_width / PAGE_SWITCH_STEPS) * page_state_step;
		else
			split = n5110_width - ((n5110_width / PAGE_SWITCH_STEPS) * page_state_step);

		disp.SetDrawLayer(1);

		disp.ClearBuffer();
		widgets_draw((!page_change_dir) ? active_page : old_page);
		gui_statusbar();
		disp.CopyToLayerX(0, split - n5110_width);

		disp.ClearBuffer();
		widgets_draw((!page_change_dir) ? old_page : active_page);
		gui_statusbar();
		disp.CopyToLayerX(0, split);

		start_x = ( -NUMBER_OF_PAGES * (8 + 4) + 4 + n5110_width) / 2;
		disp.ClearPart(4, start_x, 5, start_x + NUMBER_OF_PAGES * (8 + 4) + (8 + 4));

		for (uint8_t i = 0; i < NUMBER_OF_PAGES; i++)
		{
			uint8_t x = start_x + i * 12;

			disp.DrawRectangle(x, 8 * 4, x + 8 - 1, 8 * 5 - 1, 1, (i == active_page) ? 1 : 0);
			disp.CopyToLayerPart(0, 4, x, 5, x + 8);
		}

		if (page_state_step == 0)
		{
			page_state_step = PAGE_INFO_STEPS;
			page_state = PAGE_CHANGE_INFO;
		}

		disp.SetDrawLayer(0);
	break;

	case(PAGE_CHANGE_INFO):
		widgets_draw(active_page);
		gui_statusbar();

		disp.SetDrawLayer(1);
		start_x = ( -NUMBER_OF_PAGES * (8 + 4) + 4 + n5110_width) / 2;
		disp.ClearPart(4, start_x, 5, start_x + NUMBER_OF_PAGES * (8 + 4) + (8 + 4));

		for (uint8_t i = 0; i < NUMBER_OF_PAGES; i++)
		{
			uint8_t x = start_x + i * 12;

			disp.DrawRectangle(x, 8 * 4, x + 8 - 1, 8 * 5 - 1, 1, (i == active_page) ? 1 : 0);
			disp.CopyToLayerPart(0, 4, x, 5, x + 8);
		}

		page_state_step--;
		if (page_state_step == 0)
		{
			page_state = PAGE_IDLE;
		}

		disp.SetDrawLayer(0);
	break;

	case(PAGE_MENU):
		widgets_draw(active_page);
		gui_statusbar();

		uint8_t top = GUI_DISP_HEIGHT - PAGE_MENU_HEIGHT + (PAGE_MENU_HEIGHT * ((float)page_state_step/PAGE_MENU_STEPS));

		switch (page_state_dir)
		{
		case (NORMAL):
			if (page_state_step > 0)
				page_state_step--;
			else
			{
				page_state_dir = HOLD;
				page_state_timer = task_get_ms_tick() + PAGE_MENU_POWEROFF;
			}
		break;

		case (HOLD):
			if (page_state_timer < task_get_ms_tick())
			{
				gui_page_power_off();
			}
		break;

		case (WAIT):
			if (task_get_ms_tick() > page_state_timer)
				page_state_dir = REVERSE;
		break;

		case (REVERSE):
			if (page_state_step < PAGE_MENU_STEPS)
				page_state_step++;
			else
				page_state = PAGE_IDLE;
		break;
		}

		disp.DrawRectangle(1, top + 1, GUI_DISP_WIDTH - 2, GUI_DISP_HEIGHT - 1, 0, 1);
		disp.DrawLine(1, top, GUI_DISP_WIDTH - 2, top, 1);
		disp.DrawLine(0, GUI_DISP_HEIGHT - 1, 0, top + 1, 1);
		disp.DrawLine(GUI_DISP_WIDTH - 1, GUI_DISP_HEIGHT - 1, GUI_DISP_WIDTH - 1, top + 1, 1);

		//pwr
		if ((page_state_timer - task_get_ms_tick() > PAGE_MENU_POWEROFF_BLIK) || GUI_BLINK_TGL(200) || page_state_dir != HOLD)
			disp.DrawImage(img_pwr, 36, top + 2);

		//menu
		disp.DrawImage(img_menu, 69, top + 4);

		//layout
		disp.DrawImage(img_layout, 3, top + 4);
	break;


	}
}
Exemplo n.º 2
0
void gui_factory_test_loop()
{
	gui_dialog_P(PSTR("Factory test"));

	bool blik = GUI_BLINK_TGL(1000);
	bool res;
	bool err = false;

	if (f_test_lcd)
	{
		char tmp[16];

		disp.LoadFont(F_TEXT_L);
		switch (f_test_lcd)
		{
			case(FTEST_LCD_MIN_AUTO):
				strcpy_P(tmp, PSTR("Min auto"));
			break;
			case(FTEST_LCD_MIN):
				strcpy_P(tmp, PSTR("Set minimum"));
			break;
			case(FTEST_LCD_MAX_AUTO):
				strcpy_P(tmp, PSTR("Max auto"));
			break;
			case(FTEST_LCD_MAX):
				strcpy_P(tmp, PSTR("Set maximum"));
			break;
			case(FTEST_LCD_MID):
				strcpy_P(tmp, PSTR("Set optimal"));
			break;
		}
		gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP);

		disp.DrawLine(4, 24, 14, 24, 1);
		disp.DrawLine(4, 26, 14, 26, 1);
		disp.DrawLine(4, 28, 14, 28, 1);
		disp.DrawLine(4, 30, 14, 30, 1);
		disp.DrawLine(4, 32, 14, 32, 1);

		disp.DrawLine(16, 24, 16, 32, 1);
		disp.DrawLine(18, 24, 18, 32, 1);
		disp.DrawLine(20, 24, 20, 32, 1);
		disp.DrawLine(22, 24, 22, 32, 1);
		disp.DrawLine(24, 24, 24, 32, 1);

		disp.DrawRectangle(26, 24, 35, 33, 1, 1);

		disp.DrawRectangle(37, 24, 46, 33, 1, 0);

		disp.DrawRectangle(48, 24, 57, 33, 1, 0);
		disp.DrawRectangle(50, 26, 55, 31, 1, 0);
		disp.DrawRectangle(52, 28, 53, 29, 1, 0);

		disp.DrawCircle(71, 35, 1, 1);
		disp.DrawCircle(71, 35, 3, 1);
		disp.DrawCircle(71, 35, 5, 1);
		disp.DrawCircle(71, 35, 7, 1);
		disp.DrawCircle(71, 35, 9, 1);

		disp.LoadFont(F_TEXT_M);
		disp.GotoXY(4, 36);
		fprintf_P(lcd_out, PSTR("%03d"), f_test_lcd_cont_min);
		disp.GotoXY(24, 36);
		fprintf_P(lcd_out, PSTR("%03d"), f_test_lcd_cont);
		disp.GotoXY(44, 36);
		fprintf_P(lcd_out, PSTR("%03d"), f_test_lcd_cont_max);

		if (f_test_lcd == FTEST_LCD_MIN_AUTO || f_test_lcd == FTEST_LCD_MAX_AUTO)
		{
			f_test_lcd_cont = (f_test_lcd_cont + 1) % 128;
		}

		led_set(0, f_test_lcd_cont / 4, 0);

		if (f_test_lcd == FTEST_LCD_MID)
			disp.SetContrast(lcd_contrast_min + ((lcd_contrast_max - lcd_contrast_min) * f_test_lcd_cont) / GUI_CONTRAST_STEPS);
		else
			disp.SetContrast(f_test_lcd_cont);

		return;
	}

	//store contrast values
	eeprom_busy_wait();
	eeprom_update_byte(&config_ro.lcd_contrast_max, f_test_lcd_cont_max);
	eeprom_update_byte(&config_ro.lcd_contrast_min, f_test_lcd_cont_min);
	eeprom_update_byte(&config_ee.gui.contrast, f_test_lcd_cont);
	eeprom_busy_wait();

	//reload contrast value
	gui_load_eeprom();

	disp.LoadFont(F_TEXT_S);
	uint8_t f_h = disp.GetTextHeight();

	if (!mems_i2c_selftest())
	{
		if (blik)
		{
			disp.GotoXY(4, f_h * 3.5 + 3);
			fprintf_P(lcd_out, PSTR("I2C ERROR"));
			assert(0);
		}
		err = true;
	}
	else
	{
		res = ms5611.SelfTest();
		if (!res) err = true;
		if (res || blik)
		{
			disp.GotoXY(4, f_h * 2 + 3);
			fprintf_P(lcd_out, PSTR("MS5611:%s"), (res) ? "OK" : "ERR");
			assert(res);
		}

		res = lsm303d.SelfTest();
		if (!res) err = true;
		if (res || blik)
		{
			disp.GotoXY(4, f_h * 3 + 3);
			fprintf_P(lcd_out, PSTR("LSM303:%s"), (res) ? "OK" : "ERR");
			assert(res);
		}

		res = l3gd20.SelfTest();
		if (!res) err = true;
		if (res || blik)
		{
			disp.GotoXY(4, f_h * 4 + 3);
			fprintf_P(lcd_out, PSTR("L3GD20:%s"), (res) ? "OK" : "ERR");
			assert(res);
		}

		res = sht21.SelfTest();
		if (!res) err = true;
		if (res || blik)
		{
			disp.GotoXY(4, f_h * 5 + 3);
			fprintf_P(lcd_out, PSTR("SHT21:%s"), (res) ? "OK" : "ERR");
			assert(res);
		}
	}

	res = bt_ready();
	if (!res) err = true;
	if (res || blik)
	{
		assert(res);
		disp.GotoXY(4, f_h * 6 + 3);
		if (!res)
		{
			fprintf_P(lcd_out, PSTR("BT:ERR"));
		}
		else
		{
			if (bt_get_module_type() == BT_PAN1322)
				fprintf_P(lcd_out, PSTR("BT:1322"));
			else
				fprintf_P(lcd_out, PSTR("BT:1026"));
		}
	}

	res = storage_ready();
	if (!res) err = true;
	if (res || blik)
	{
		disp.GotoXY(GUI_DISP_WIDTH / 2, f_h * 2 + 3);
		fprintf_P(lcd_out, PSTR("SD:%s"), (res) ? "OK" : "ERR");
		assert(res);
	}

	res = gps_selftest();
	if (!res) err = true;
	if (res || blik)
	{
		disp.GotoXY(GUI_DISP_WIDTH / 2, f_h * 3 + 3);
		fprintf_P(lcd_out, PSTR("GPS:%s"), (res) ? "OK" : "ERR");
		assert(res);
	}

	res = f_test_button_test == 0b00000111;
	if (!res) err = true;
	if (res || blik)
	{
		disp.GotoXY(GUI_DISP_WIDTH / 2, f_h * 4 + 3);
		fprintf_P(lcd_out, PSTR("BUT:%d %d %d"), f_test_button_test & (1 << 0), (f_test_button_test & (1 << 1)) >> 1, (f_test_button_test & (1 << 2)) >> 2);
		assert(res);
	}