firmware+controller: Add generic in-game state
This commit is contained in:
		@@ -3,6 +3,14 @@
 | 
			
		||||
#include "ui.h"
 | 
			
		||||
 | 
			
		||||
static const char* M_VAL_TIME = "VAL TIME?";
 | 
			
		||||
const char *val_ext_gamemodes[] = {
 | 
			
		||||
  "TDM",
 | 
			
		||||
  "DEATHMATCH",
 | 
			
		||||
  "ESCALATION",
 | 
			
		||||
  "SPIKE RUSH",
 | 
			
		||||
  "CUSTOM",
 | 
			
		||||
  "GAME",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const lv_font_t *font_normal = &lv_font_montserrat_24;
 | 
			
		||||
 | 
			
		||||
@@ -441,6 +449,53 @@ void val_ui_pregame(bool is_split) {
 | 
			
		||||
  lv_anim_timeline_start(at_active);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void val_ui_game_generic(const char *gamemode) {
 | 
			
		||||
  setup_next_state();
 | 
			
		||||
 | 
			
		||||
  // Widgets
 | 
			
		||||
  lv_obj_t *l_main = lv_label_create(o_active);
 | 
			
		||||
  lv_obj_add_style(l_main, &s_hero, 0);
 | 
			
		||||
  lv_obj_center(l_main);
 | 
			
		||||
  lv_label_set_text_static(l_main, "HAVE FUN!");
 | 
			
		||||
 | 
			
		||||
  lv_obj_t *l_subtitle = lv_label_create(o_active);
 | 
			
		||||
  lv_obj_add_style(l_subtitle, &s_subtitle, 0);
 | 
			
		||||
  lv_obj_center(l_subtitle);
 | 
			
		||||
  lv_label_set_text_fmt(l_subtitle, "ENJOY YOUR %s!", gamemode);
 | 
			
		||||
 | 
			
		||||
  lv_obj_update_layout(o_active);
 | 
			
		||||
  lv_obj_set_y(
 | 
			
		||||
    l_subtitle,
 | 
			
		||||
    (lv_obj_get_height(l_main) + lv_obj_get_height(l_subtitle)) / 2 + 5);
 | 
			
		||||
 | 
			
		||||
  // Animations
 | 
			
		||||
  lv_anim_t a_title;
 | 
			
		||||
  lv_anim_init(&a_title);
 | 
			
		||||
  lv_anim_set_var(&a_title, l_main);
 | 
			
		||||
  lv_anim_set_values(
 | 
			
		||||
    &a_title,
 | 
			
		||||
    -(lv_obj_get_width(o_container) + lv_obj_get_width(l_main)) / 2, 0);
 | 
			
		||||
  lv_anim_set_exec_cb(&a_title, anim_x_cb);
 | 
			
		||||
  lv_anim_set_path_cb(&a_title, lv_anim_path_bounce);
 | 
			
		||||
  lv_anim_set_duration(&a_title, 750);
 | 
			
		||||
 | 
			
		||||
  lv_anim_t a_sub;
 | 
			
		||||
  lv_anim_init(&a_sub);
 | 
			
		||||
  lv_anim_set_var(&a_sub, l_subtitle);
 | 
			
		||||
  lv_anim_set_values(
 | 
			
		||||
    &a_sub,
 | 
			
		||||
    -(lv_obj_get_width(o_container) + lv_obj_get_width(l_subtitle)) / 2,
 | 
			
		||||
    -(lv_obj_get_width(l_main) - lv_obj_get_width(l_subtitle)) / 2);
 | 
			
		||||
  lv_anim_set_exec_cb(&a_sub, anim_x_cb);
 | 
			
		||||
  lv_anim_set_path_cb(&a_sub, lv_anim_path_bounce);
 | 
			
		||||
  lv_anim_set_completed_cb(&a_sub, anim_state_ready_cb);
 | 
			
		||||
  lv_anim_set_duration(&a_sub, 750);
 | 
			
		||||
 | 
			
		||||
  lv_anim_timeline_add(at_active, 0, &a_title);
 | 
			
		||||
  lv_anim_timeline_add(at_active, 0, &a_sub);
 | 
			
		||||
  lv_anim_timeline_start(at_active);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void val_lvgl_ui(lv_display_t *disp) {
 | 
			
		||||
  color_primary = lv_color_hex(0xff4655);
 | 
			
		||||
  color_secondary = lv_color_hex(0xf7518f);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,9 @@
 | 
			
		||||
 | 
			
		||||
#include "lvgl.h"
 | 
			
		||||
 | 
			
		||||
extern const char *val_ext_gamemodes[];
 | 
			
		||||
#define VAL_EXT_GAMEMODES_SIZE 6
 | 
			
		||||
 | 
			
		||||
LV_FONT_DECLARE(lv_font_tungsten_40)
 | 
			
		||||
LV_FONT_DECLARE(lv_font_tungsten_180)
 | 
			
		||||
 | 
			
		||||
@@ -18,5 +21,6 @@ void val_ui_idle();
 | 
			
		||||
void val_ui_queue_start(bool ms_not_comp);
 | 
			
		||||
void val_ui_match_found(bool is_premier);
 | 
			
		||||
void val_ui_pregame(bool is_split);
 | 
			
		||||
void val_ui_game_generic(const char *gamemode);
 | 
			
		||||
 | 
			
		||||
void val_lvgl_ui(lv_display_t *disp);
 | 
			
		||||
 
 | 
			
		||||
@@ -101,7 +101,7 @@ void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_
 | 
			
		||||
    ESP_LOGE(TAG, "Failed to grab LVGL lock");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if (buf[0] > ST_PREGAME) {
 | 
			
		||||
  if (buf[0] > ST_GAME_GENERIC) {
 | 
			
		||||
    ESP_LOGW(TAG, "Unknown state %hhu", buf[0]);
 | 
			
		||||
    goto ret;
 | 
			
		||||
  }
 | 
			
		||||
@@ -144,6 +144,13 @@ void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_
 | 
			
		||||
    }
 | 
			
		||||
    val_ui_pregame((bool)buf[1]);
 | 
			
		||||
    break;
 | 
			
		||||
  case ST_GAME_GENERIC:
 | 
			
		||||
    if (bufsize < 2 || buf[1] > VAL_EXT_GAMEMODES_SIZE) {
 | 
			
		||||
      ESP_LOGE(TAG, "Invalid ST_PREGAME command");
 | 
			
		||||
      goto ret;
 | 
			
		||||
    }
 | 
			
		||||
    val_ui_game_generic(val_ext_gamemodes[buf[1]]);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
ret:
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ typedef enum val_state {
 | 
			
		||||
  ST_QUEUE_START,
 | 
			
		||||
  ST_MATCH_FOUND,
 | 
			
		||||
  ST_PREGAME,
 | 
			
		||||
  ST_GAME_GENERIC,
 | 
			
		||||
} val_state_t;
 | 
			
		||||
 | 
			
		||||
void val_usb_init(void);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user