static void poll_key(void) { if(transition) return; int8_t key_pressed = -1; for(uint8_t i = 0; i < 4; ++i) { if(!mcp_keys->input(i)) { if(keys[i]) continue; keys[i] = true; key_pressed = i; } else { keys[i] = false; } } if(key_pressed >= 0) { int8_t result = scr->key(key_pressed); if(result == -1) { screen_render(); return; } transition = true; delete scr; switch(result) { case Screen::SCR_MAIN: scr = new MainScreen(*oled, *state); break; case Screen::SCR_MENU: scr = new MenuScreen(*oled, *state); break; case Screen::SCR_SETTINGS: scr = new SettingsScreen(*oled, *state); break; case Screen::SCR_ABOUT: scr = new AboutScreen(*oled, *state); break; case Screen::SCR_NETWORK: scr = new NetworkScreen(*oled, *state); break; case Screen::SCR_DUMP_TH: scr = new DumpingThresholdScreen(*oled, *state); break; case Screen::SCR_MOTOR_TEST: scr = new MotorTestScreen(*oled, *state); break; case Screen::SCR_CALIBRATION: scr = new CalibrationScreen(*oled, *state); break; case Screen::SCR_ROUTE: scr = new RouteScreen(*oled, *state); break; } transition = false; screen_render(); } }
static void leave_splash(void) { transition = true; delete scr; scr = new MainScreen(*oled, *state); transition = false; screen_render(); }
/* Send data to ncurses and make it update the terminal */ void ScreenUpdate(Screen *s) { screen_render(s); screen_sync(s); }
int update() { if (get_active_screen() == NULL) { return 1; } timestamp_t current = {0}; timestamp_set(¤t); long dt = timestamp_diff(¤t, &timer); if (dt > 0) { timer = current; screen_update(dt); } long fps_dt = timestamp_diff(¤t, &fps_timer); LOGD("DT: %ld", fps_dt); if (fps_dt > 500) { fps = frames * 1000.0f / (float)fps_dt; fps_timer = current; frames = 0; LOGI("FPS: %.2f", fps); } else { ++frames; } char fps_str[32] = {0}; sprintf(fps_str, "FPS: %.2f", fps); const rect_t fps_rect = { 8.0f, 8.0f, 256.0f, 32.0f }; const rgba_t fps_color = { 1.0f, 0.0f, 0.0f, 0.8f }; mat4f_t transform = {0}; mat4_mult(&transform, &camera.proj, &camera.view); rect_t screen = { 0, 0, screen_size.x, screen_size.y }; rgba_t color = {0.7f, 0.7f, 0.0f, 1.0f }; gfx_set_target(gfx, "test_target", &screen); gfx_enable_depth_buffer(gfx, 1); gfx_clear(gfx); screen_render(gfx, &camera); gfx_set_shader(gfx, "text"); gfx_set_uniform_mat4f(gfx, "uMVP", 1, &transform); draw_text(fps_str, &fps_rect, 0.0f, 4.9f, &fps_color); gfx_flush(gfx); static int take_screenshot = 0; if (take_screenshot && frames == 0) { take_screenshot = 0; image_t* img = NULL; if (gfx_take_screenshot(gfx, &img) == 0) { image_save_to_png(img, "screenshot.png"); image_free(img); } } gfx_set_target(gfx, NULL, &screen); gfx_enable_depth_buffer(gfx, 0); gfx_clear(gfx); int32_t sampler = 0; rect_t uv = { 0, screen.height/buffer_size.y, screen.width/buffer_size.x, -screen.height/buffer_size.y }; gfx_set_shader(gfx, "postprocess"); gfx_set_uniform_mat4f(gfx, "uMVP", 1, &transform); gfx_set_uniform_1i(gfx, "uTex", 1, &sampler); gfx_set_texture(gfx, "test_texture", sampler); gfx_render_textured_rect(gfx, &screen, 1.0f, &uv); gfx_set_texture(gfx, NULL, sampler); gfx_flush(gfx); return 0; }