1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-01-28 07:03:11 +08:00
2021-07-28 07:25:38 +00:00

251 lines
9.3 KiB
C

#include "demo_guix_washing_machine.h"
/* Define progress bar animation timer ID. */
#define ID_TIMER_PROGRESS_BAR 1
/* Define progress bar animation properties. */
#define PROGRESS_BAR_ANIMATION_TOTAL_STEPS 9
#define PROGRESS_BAR_ANIMATION_END_VAL -270
/* Define variables. */
static INT progress_bar_animation_step = 10;
static INT selected_button_id = ID_BTN_ECO;
/* Define MODE button control block. */
typedef struct MODE_BTN_INFO_STRUCT {
TEMPLATE_MODE_BTN_CONTROL_BLOCK *button;
TEMPLATE_MODE_BTN_SMALL_CONTROL_BLOCK* button_small;
GX_RESOURCE_ID text_id;
GX_RESOURCE_ID map_id;
GX_RESOURCE_ID map_id_small;
INT minutes;
}MODE_BTN_INFO;
/* Define mode button properties. */
MODE_BTN_INFO mode_button_info_list[] = {
{&mode_select_window.mode_select_window_btn_quick, &mode_select_window.mode_select_window_btn_quick_small, GX_STRING_ID_QUICK, GX_PIXELMAP_ID_CYCLE_QUICK, GX_PIXELMAP_ID_CYCLE_QUICK_SMALL, 30},
{&mode_select_window.mode_select_window_btn_eco, &mode_select_window.mode_select_window_btn_eco_small, GX_STRING_ID_ECO, GX_PIXELMAP_ID_CYCLE_ECO, GX_PIXELMAP_ID_CYCLE_ECO_SMALL, 60},
{&mode_select_window.mode_select_window_btn_deep, &mode_select_window.mode_select_window_btn_deep_small, GX_STRING_ID_DEEP, GX_PIXELMAP_ID_CYCLE_DEEP, GX_PIXELMAP_ID_CYCLE_DEEP_SMALL, 90},
{GX_NULL, GX_NULL, 0, 0, 0, 0}
};
/******************************************************************************************/
/* Initialize mode buttons in mode select window. */
/******************************************************************************************/
VOID mode_select_window_init()
{
MODE_BTN_INFO *entry = mode_button_info_list;
/* Loop through mode buttons. */
while (entry->button)
{
/* Set big mode button background map. */
gx_pixelmap_button_pixelmap_set((GX_PIXELMAP_BUTTON*)entry->button, entry->map_id, entry->map_id, entry->map_id);
/* Set big mode button title text. */
gx_prompt_text_id_set(&entry->button->template_mode_btn_mode_label, entry->text_id);
/* Set total time in big button. */
gx_numeric_prompt_value_set(&entry->button->template_mode_btn_total_time, entry->minutes);
/* Set title text in big button. */
gx_prompt_text_id_set(&entry->button_small->template_mode_btn_small_mode_label, entry->text_id);
/* Set total time in small button. */
gx_numeric_prompt_value_set(&entry->button_small->template_mode_btn_small_total_time, entry->minutes);
/* Set small button background map. */
gx_pixelmap_button_pixelmap_set((GX_PIXELMAP_BUTTON*)entry->button_small, entry->map_id_small, entry->map_id_small, entry->map_id_small);
if (selected_button_id != entry->button->gx_widget_id)
{
/* Hide big button. */
gx_widget_hide(entry->button);
/* Hide progress bar in big button. */
gx_widget_hide(&entry->button->template_mode_btn_mode_progress_bar);
}
else
{
/* Hide small button. */
gx_widget_hide(entry->button_small);
/* Set remain time in big button. */
gx_numeric_prompt_value_set(&entry->button->template_mode_btn_minute, entry->minutes);
gx_numeric_prompt_value_set(&entry->button->template_mode_btn_second, 0);
}
entry++;
}
}
/******************************************************************************************/
/* Get mode button information by button id. */
/******************************************************************************************/
MODE_BTN_INFO *get_mode_button_info(INT button_id)
{
MODE_BTN_INFO* entry = mode_button_info_list;
while (entry->button)
{
if ((button_id == entry->button->gx_widget_id) ||
(button_id == entry->button_small->gx_widget_id))
{
return entry;
}
entry++;
}
return GX_NULL;
}
/******************************************************************************************/
/* Select button by button id. */
/******************************************************************************************/
VOID button_select(INT button_id)
{
MODE_BTN_INFO* info = get_mode_button_info(selected_button_id);
if (info)
{
/* Detach the big button of the selected mode. */
gx_widget_detach(info->button);
/* Attach the small button of the selected mode. */
gx_widget_attach(&mode_select_window, info->button_small);
}
/* Get button information of the new selected mode. */
info = get_mode_button_info(button_id);
if (info)
{
/* Detach the small button of the new selected mode. */
gx_widget_detach(info->button_small);
/* Attach the big button of the new selected mode. */
gx_widget_attach(&mode_select_window, info->button);
/* Set selected button id. */
selected_button_id = info->button->gx_widget_id;
}
}
/******************************************************************************************/
/* Set cycle mode. */
/******************************************************************************************/
VOID set_cycle_mode()
{
MODE_BTN_INFO* entry = mode_button_info_list;
while (entry->button)
{
if (selected_button_id == entry->button->gx_widget_id)
{
gx_prompt_text_id_set(&main_screen.main_screen_wash_cycle_mode, entry->text_id);
gx_widget_detach(&mode_select_window);
gx_widget_attach(entry->button, &entry->button->template_mode_btn_mode_progress_bar);
gx_widget_attach(&main_screen, &wash_cycle_window);
remain_time_set(entry->minutes * 60);
}
else
{
gx_widget_detach(&entry->button->template_mode_btn_mode_progress_bar);
}
entry++;
}
}
/******************************************************************************************/
/* Update radial progress bar animation. */
/******************************************************************************************/
VOID update_radial_progress_bar()
{
MODE_BTN_INFO* info = get_mode_button_info(selected_button_id);
INT value;
progress_bar_animation_step--;
value = PROGRESS_BAR_ANIMATION_END_VAL *
(PROGRESS_BAR_ANIMATION_TOTAL_STEPS - progress_bar_animation_step) /
PROGRESS_BAR_ANIMATION_TOTAL_STEPS;
gx_radial_progress_bar_value_set(&info->button->template_mode_btn_mode_progress_bar, value);
if(progress_bar_animation_step == 0)
{
gx_system_timer_stop(&mode_select_window, ID_TIMER_PROGRESS_BAR);
}
}
/******************************************************************************************/
/* Update remain time. */
/******************************************************************************************/
VOID mode_select_window_remain_time_update(INT remain_seconds)
{
MODE_BTN_INFO *info;
if (remain_seconds)
{
info = get_mode_button_info(selected_button_id);
gx_numeric_prompt_value_set(&info->button->template_mode_btn_minute, remain_seconds / 60);
gx_numeric_prompt_value_set(&info->button->template_mode_btn_second, remain_seconds % 60);
}
}
/******************************************************************************************/
/* Override the default event processing of "wash_cycle_select_window" to handle signals */
/* from my child widgets. */
/******************************************************************************************/
UINT mode_select_window_event_process(GX_WINDOW* window, GX_EVENT* event_ptr)
{
switch (event_ptr->gx_event_type)
{
case GX_SIGNAL(ID_BTN_QUICK, GX_EVENT_CLICKED):
case GX_SIGNAL(ID_BTN_QUICK_SMALL, GX_EVENT_CLICKED):
case GX_SIGNAL(ID_BTN_ECO, GX_EVENT_CLICKED):
case GX_SIGNAL(ID_BTN_ECO_SMALL, GX_EVENT_CLICKED):
case GX_SIGNAL(ID_BTN_DEEP, GX_EVENT_CLICKED):
case GX_SIGNAL(ID_BTN_DEEP_SMALL, GX_EVENT_CLICKED):
if (selected_button_id == event_ptr->gx_event_sender)
{
set_cycle_mode();
}
else
{
button_select(event_ptr->gx_event_sender);
}
break;
case GX_EVENT_SHOW:
gx_window_event_process(window, event_ptr);
gx_widget_detach(&main_screen.main_screen_btn_play);
gx_system_timer_start(window, ID_TIMER_PROGRESS_BAR, 20 / GX_SYSTEM_TIMER_MS, 20 / GX_SYSTEM_TIMER_MS);
progress_bar_animation_step = 10;
break;
case GX_EVENT_HIDE:
gx_window_event_process(window, event_ptr);
gx_widget_attach(&main_screen, &main_screen.main_screen_btn_play);
gx_system_timer_stop(window, 0);
break;
case GX_EVENT_TIMER:
if (event_ptr->gx_event_payload.gx_event_timer_id == ID_TIMER_PROGRESS_BAR)
{
update_radial_progress_bar();
}
break;
default:
return gx_window_event_process(window, event_ptr);
}
return 0;
}