Files
2023-09-28 11:17:06 +08:00

216 lines
7.7 KiB
C

/*
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include "esp_log.h"
#include "bsp_board.h"
#include "lvgl.h"
#include "ui_main.h"
#include "ui_player.h"
static const char *TAG = "ui_sr";
LV_FONT_DECLARE(font_cn_gb1_28);
static bool g_sr_anim_active = false;
static int32_t g_sr_anim_count = 0;
static lv_obj_t *g_sr_label = NULL;
static lv_obj_t *g_sr_mask = NULL;
static lv_obj_t *g_sr_bar[8] = {NULL};
lv_timer_t *sr_timer;
static int int16_sin(int32_t deg)
{
static const int16_t sin_0_90_table[] = {
0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481,
9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14364, 14876, 15383, 15886, 16383, 16876,
17364, 17846, 18323, 18794, 19260, 19720, 20173, 20621, 21062, 21497, 21925, 22347, 22762, 23170, 23571, 23964,
24351, 24730, 25101, 25465, 25821, 26169, 26509, 26841, 27165, 27481, 27788, 28087, 28377, 28659, 28932, 29196,
29451, 29697, 29934, 30162, 30381, 30591, 30791, 30982, 31163, 31335, 31498, 31650, 31794, 31927, 32051, 32165,
32269, 32364, 32448, 32523, 32587, 32642, 32687, 32722, 32747, 32762, 32767
};
if (deg < 0) {
deg = -deg;
}
deg = deg % 360;
if (deg <= 90) {
return sin_0_90_table[deg];
} else if (deg <= 180) {
return sin_0_90_table[180 - deg];
} else if (deg <= 270) {
return -sin_0_90_table[deg - 270];
} else {
return -sin_0_90_table[360 - deg];
}
}
static void sr_label_event_handler(lv_event_t *event)
{
char *text = (char *) event-> param;
if (NULL != text) {
lv_label_set_text_static(g_sr_label, text);
}
}
static void sr_mask_event_handler(lv_event_t *event)
{
bool active = (bool) event->param;
lv_obj_t *player_page = get_player_page();
if (active) {
if (player_page) {
lv_obj_add_flag(player_page, LV_OBJ_FLAG_HIDDEN);
}
lv_indev_t *indev = lv_indev_get_next(NULL);
lv_indev_enable(indev, false);
g_sr_anim_count = 0;
g_sr_anim_active = true;
lv_timer_resume(sr_timer);
} else {
lv_indev_t *indev = lv_indev_get_next(NULL);
lv_indev_enable(indev, true);
g_sr_anim_active = false;
}
}
static void ui_speech_anim_cb(lv_timer_t *timer)
{
const int32_t step = 40;
lv_obj_t *player_page = get_player_page();
if (g_sr_anim_active) {
// /* Will hide hint message after wakeup */
// static bool hint_hide = false;
// if (hint_hide != true) {
// ui_hint(false);
// hint_hide = true;
// }
/* Show sr animate mask and move to foreground */
if (lv_obj_has_flag(g_sr_mask, LV_OBJ_FLAG_HIDDEN)) {
lv_obj_clear_flag(g_sr_mask, LV_OBJ_FLAG_HIDDEN);
lv_obj_move_foreground(g_sr_mask);
}
if (player_page) {
lv_obj_add_flag(player_page, LV_OBJ_FLAG_HIDDEN);
}
/* Set bar value */
int32_t sr_val[4] = {
abs(int16_sin(g_sr_anim_count * step + step * 0)) / (32768 >> 7),
abs(int16_sin(g_sr_anim_count * step + step * 1)) / (32768 >> 7),
abs(int16_sin(g_sr_anim_count * step + step * 2)) / (32768 >> 7),
abs(int16_sin(g_sr_anim_count * step + step * 3)) / (32768 >> 7),
};
for (size_t i = 0; i < 4; i++) {
lv_bar_set_value(g_sr_bar[i], sr_val[i] > 20 ? sr_val[i] : 20, LV_ANIM_ON);
lv_bar_set_value(g_sr_bar[7 - i], sr_val[i] > 20 ? sr_val[i] : 20, LV_ANIM_ON);
lv_bar_set_start_value(g_sr_bar[i], sr_val[i] > 20 ? -sr_val[i] : -20, LV_ANIM_ON);
lv_bar_set_start_value(g_sr_bar[7 - i], sr_val[i] > 20 ? -sr_val[i] : -20, LV_ANIM_ON);
}
g_sr_anim_count++;
} else {
/* The first timer callback will set the bars to 0 */
if (g_sr_anim_count != 0) {
for (size_t i = 0; i < 8; i++) {
lv_bar_set_value(g_sr_bar[i], 0, LV_ANIM_ON);
lv_bar_set_start_value(g_sr_bar[i], -0, LV_ANIM_ON);
}
g_sr_anim_count = 0;
} else {
/* The second timer callback will hide sr mask */
if (!lv_obj_has_flag(g_sr_mask, LV_OBJ_FLAG_HIDDEN)) {
lv_obj_add_flag(g_sr_mask, LV_OBJ_FLAG_HIDDEN);
}
if (player_page) {
lv_obj_clear_flag(player_page, LV_OBJ_FLAG_HIDDEN);
}
}
}
}
void ui_sr_anim_init(void)
{
ESP_LOGI(TAG, "sr animation initialize");
g_sr_mask = lv_obj_create(lv_scr_act());
lv_obj_set_size(g_sr_mask, lv_obj_get_width(lv_obj_get_parent(g_sr_mask)), lv_obj_get_height(lv_obj_get_parent(g_sr_mask)));
lv_obj_clear_flag(g_sr_mask, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_add_flag(g_sr_mask, LV_OBJ_FLAG_HIDDEN);
lv_obj_set_style_radius(g_sr_mask, 0, LV_STATE_DEFAULT);
lv_obj_set_style_border_width(g_sr_mask, 0, LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(g_sr_mask, lv_obj_get_style_bg_color(lv_obj_get_parent(g_sr_mask), LV_PART_MAIN), LV_STATE_DEFAULT);
lv_obj_align(g_sr_mask, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(g_sr_mask, sr_mask_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_t *obj_img = NULL;
obj_img = lv_obj_create(g_sr_mask);
lv_obj_set_size(obj_img, 80, 80);
lv_obj_clear_flag(obj_img, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_style_radius(obj_img, 40, LV_STATE_DEFAULT);
lv_obj_set_style_border_width(obj_img, 0, LV_STATE_DEFAULT);
lv_obj_set_style_shadow_width(obj_img, 40, LV_STATE_DEFAULT);
lv_obj_set_style_shadow_opa(obj_img, LV_OPA_30, LV_STATE_DEFAULT);
lv_obj_align(obj_img, LV_ALIGN_CENTER, 0, -30);
lv_obj_t *img_mic_logo = lv_img_create(obj_img);
LV_IMG_DECLARE(mic_logo)
lv_img_set_src(img_mic_logo, &mic_logo);
lv_obj_center(img_mic_logo);
g_sr_label = lv_label_create(g_sr_mask);
lv_label_set_text_static(g_sr_label, "----");
lv_obj_set_style_text_font(g_sr_label, &font_cn_gb1_28, LV_STATE_DEFAULT);
lv_obj_set_style_text_color(g_sr_label, lv_color_black(), LV_STATE_DEFAULT);
lv_obj_align(g_sr_label, LV_ALIGN_CENTER, 0, 80);
lv_obj_add_event_cb(g_sr_label, sr_label_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
for (size_t i = 0; i < sizeof(g_sr_bar) / sizeof(g_sr_bar[0]); i++) {
g_sr_bar[i] = lv_bar_create(g_sr_mask);
lv_obj_set_size(g_sr_bar[i], 5, 60);
lv_obj_set_style_anim_time(g_sr_bar[i], 400, LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(g_sr_bar[i], lv_color_make(237, 238, 239), LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(g_sr_bar[i], lv_color_make(246, 175, 171), LV_PART_INDICATOR);
lv_bar_set_range(g_sr_bar[i], -100, 100);
lv_bar_set_value(g_sr_bar[i], 20, LV_ANIM_OFF);
lv_bar_set_start_value(g_sr_bar[i], -20, LV_ANIM_OFF);
lv_obj_set_style_anim_time(g_sr_bar[i], 400, LV_STATE_DEFAULT);
}
for (size_t i = 0; i < sizeof(g_sr_bar) / sizeof(g_sr_bar[0]) / 2; i++) {
lv_obj_align_to(g_sr_bar[i], obj_img, LV_ALIGN_OUT_LEFT_MID, 15 * i - 65, 0);
lv_obj_align_to(g_sr_bar[i + 4], obj_img, LV_ALIGN_OUT_RIGHT_MID, 15 * i + 20, 0);
}
g_sr_anim_count = 0;
g_sr_anim_active = false;
sr_timer = lv_timer_create(ui_speech_anim_cb, 500, NULL);
lv_timer_pause(sr_timer);
}
void sr_anim_start(void)
{
lv_event_send(g_sr_mask, LV_EVENT_VALUE_CHANGED, (void *) true);
}
void sr_anim_stop(void)
{
lv_event_send(g_sr_mask, LV_EVENT_VALUE_CHANGED, (void *) false);
}
void sr_anim_set_text(char *text)
{
ui_acquire();
lv_label_set_text_static(g_sr_label, text);
ui_release();
}