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; } }
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); }