Esempio n. 1
0
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();
	}
}
Esempio n. 2
0
static void leave_splash(void) {
	transition = true;
	delete scr;
	scr = new MainScreen(*oled, *state);
	transition = false;
	screen_render();
}
Esempio n. 3
0
/* Send data to ncurses and make it update the terminal */
void
ScreenUpdate(Screen *s)
{
	screen_render(s);
	screen_sync(s);
}
Esempio n. 4
0
int update()
{
    if (get_active_screen() == NULL)
    {
        return 1;
    }

    timestamp_t current = {0};
    timestamp_set(&current);
    long dt = timestamp_diff(&current, &timer);
    if (dt > 0)
    {
        timer = current;
        screen_update(dt);
    }

    long fps_dt = timestamp_diff(&current, &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;
}