Example #1
0
/*!
 * \par  Description:
 *    消息提示型对话框控制流实现。
 * \param[in]    style_id ui editor工具设计的对话框控件模板
 * \param[in]    type 对话框类型,只能是 DIALOG_BUTTON_ANYKEY,DIALOG_INFOR_WAIT,
 *                     DIALOG_INFOR_IMMEDIATE 中的一种
 * \param[in]    str_id 多国语言字符串ID
 * \param[out]   none
 * \return       app_result_e
 * \retval           RESULT_DIALOG_XXX 选择了有效按键后返回,详细参见 app_result_e 定义
 * \retval           RESULT_REDRAW 无效返回,AP需要重绘UI
 * \retval           other 收到返回值不为 RESULT_NULL 应用消息返回,见 app_result_e 定义
 * \ingroup      controls
 * \par          exmaple code
 * \code
 app_result_e result;

 result = gui_dialog_msg(DIALOG_MSG, DIALOG_INFOR_IMMEDIATE, S_WAITING);//显示“请稍后…”
 if(result == RESULT_REDRAW)//显示正常结束返回,重绘UI
 {

 }
 else//其他返回结果,需要做特殊处理
 {

 }
 * \endcode
 * \note
 * \li  对话框类型只能是 DIALOG_BUTTON_ANYKEY,DIALOG_INFOR_WAIT,DIALOG_INFOR_IMMEDIATE
 *      中的一种,否则强制为 DIALOG_INFOR_WAIT。
 *******************************************************************************/
app_result_e gui_dialog_msg(uint16 style_id, dialog_type_e type, uint16 str_id)
{
    dialog_com_data_t dialog_param;
    string_desc_t str_desc;

    str_desc.data.id = str_id;
    str_desc.language = UNICODEID;

    //对话框类型 提示
    if (type == DIALOG_BUTTON_INCLUDE)
    {
        type = DIALOG_INFOR_WAIT;
    }
    dialog_param.dialog_type = type;
    dialog_param.icon_id = -1;
    //字符串
    dialog_param.string_desc = &str_desc;

    //按键类型
    dialog_param.button_type = BUTTON_NO_BUTTON;

    //调用 gui_dialog 提示消息
    return gui_dialog(style_id, &dialog_param);
}
Example #2
0
void gui_value_loop()
{
	char tmp[20];
	uint8_t f_h;

	uint8_t sec;
	uint8_t min;
	uint8_t hour;
	uint8_t day;
	uint8_t wday;
	uint8_t month;
	uint16_t year;



	gui_dialog(gui_value_label);
	disp.LoadFont(F_TEXT_L);
	f_h = disp.GetTextHeight();

	switch(gui_value_type)
	{
		case(GUI_VAL_NUMBER):
			sprintf(tmp, gui_value_format, gui_value_tmp);
			gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2);
		break;

		case(GUI_VAL_NUMBER_DISABLE):
			if (gui_value_tmp > 0)
				sprintf(tmp, gui_value_format, gui_value_tmp);
			else
				strcpy_P(tmp, PSTR("disabled"));
			gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2);
		break;

		case(GUI_VAL_VARIO_TEST):
			sprintf(tmp, gui_value_format, gui_value_tmp);
			gui_raligh_text(tmp, GUI_DIALOG_RIGHT - 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2);
			disp.LoadFont(F_TEXT_S);
			f_h = disp.GetTextHeight();
			disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 2);
			fprintf(lcd_out, "f=%0.0f", audio_vario_freq);
			disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 4 + f_h);
			fprintf(lcd_out, "l=%4u", audio_vario_length / 31);
			disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 6 + f_h * 2);
			fprintf(lcd_out, "p=%4u", audio_vario_pause / 31);
		break;



		case(GUI_VAL_TIME):
			time_from_epoch(time_get_actual(), &sec, &min, &hour);

			sprintf_P(tmp, PSTR("%02d : %02d . %02d"), hour, min, sec);
			gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2);
			if (gui_value_index == 0)
				disp.Invert(18, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 32, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
			if (gui_value_index == 1)
				disp.Invert(36, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
			if (gui_value_index == 2)
				disp.Invert(54, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 68, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
		break;

		case(GUI_VAL_DATE):
			datetime_from_epoch(time_get_actual(), &sec, &min, &hour, &day, &wday, &month, &year);

			sprintf_P(tmp, PSTR("%02d / %02d / %04d"), day, month, year);
			gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2);
			if (gui_value_index == 0)
				disp.Invert(10, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 24, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
			if (gui_value_index == 1)
				disp.Invert(30, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 44, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
			if (gui_value_index == 2)
				disp.Invert(50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 76, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2);
		break;

		case(GUI_VAL_CONTRAST):
			gui_value_draw_bar();
		break;

		case(GUI_VAL_BRIGTHNES):
			gui_value_draw_bar();
		break;

		case(GUI_VAL_VOLUME):
			gui_value_draw_bar();
		break;
	}

	if (button_hold(B_LEFT))
	{
		uint8_t t_param = BE_CLICK;
		gui_value_irqh(TASK_IRQ_BUTTON_L, &t_param);
	}

	if (button_hold(B_RIGHT))
	{
		uint8_t t_param = BE_CLICK;
		gui_value_irqh(TASK_IRQ_BUTTON_R, &t_param);
	}
}
Example #3
0
void gui_dialog_loop()
{
	if (gui_dialog_style & GUI_STYLE_NO_TITLE)
	{
		//no title mode (GUI_STYLE_NO_TITLE is set)
		disp.DrawRectangle(0, 0, GUI_DISP_WIDTH - 2, GUI_DISP_HEIGHT - 2, 1, false);
	}
	else
	{
		//normal mode
		gui_dialog(gui_dialog_msg_line0);
	}

	disp.LoadFont(F_TEXT_M);
	uint8_t f_h = disp.GetTextHeight();

	if ((gui_dialog_style & GUI_STYLE_MASK) == GUI_STYLE_STATS)
	{
		//if new flight has begin exit the stat screen
		if (fc.flight.state != FLIGHT_LAND)
		{
			gui_dialog_cb(1);
		}

		uint32_t diff = fc.flight.timer / 1000;
		uint8_t hour, min;

		hour = diff / 3600;
		diff %= 3600;

		min = diff / 60;
		diff %= 60;

		char tmp[32];

		disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 0);
		if (hour > 0)
			fprintf_P(lcd_out, PSTR("%02d:%02d"), hour, min);
		else
			fprintf_P(lcd_out, PSTR("%02d.%02d"), min, diff);

		strcpy_P(tmp, PSTR("Alt"));
		gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 0);
		strcpy_P(tmp, PSTR("Vario"));
		gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 0);

		sprintf_P(tmp, PSTR("%dm"), fc.flight.stats.max_alt);
		gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 1);
		sprintf_P(tmp, PSTR("%dm"), fc.flight.stats.min_alt);
		gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 2);

		sprintf_P(tmp, PSTR("%0.1fm"), (float)fc.flight.stats.max_climb / 100.0);
		gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 1);
		sprintf_P(tmp, PSTR("%0.1fm"), (float)fc.flight.stats.max_sink / 100.0);
		gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 2);

		disp.LoadFont(F_TEXT_S);
		disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 1 + 2);
		fprintf_P(lcd_out, PSTR("max"));
		disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 2 + 2);
		fprintf_P(lcd_out, PSTR("min"));
	}
	else
	{
		uint8_t top;

		if (gui_dialog_style & GUI_STYLE_NO_TITLE)
		{
			//no title mode (GUI_STYLE_NO_TITLE is set)
			top = 3;

			disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 0);
			fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line0);
		}
		else
		{
			//normal mode
			top = GUI_DIALOG_TOP - f_h;
		}

		disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 1);
		fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line1);

		disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 2);
		fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line2);

		disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 3);
		fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line3);
	}

	disp.LoadFont(F_TEXT_S);
	f_h = disp.GetAHeight();

	switch (gui_dialog_style & GUI_STYLE_MASK)
	{
		case(GUI_STYLE_OK):
		case(GUI_STYLE_STATS):
			gui_caligh_text_P(PSTR("OK"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h);
		break;

		case(GUI_STYLE_OKCANCEL):
			gui_caligh_text_P(PSTR("OK"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h);
			gui_raligh_text_P(PSTR("Cancel"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h);
		break;

		case(GUI_STYLE_YESNO):
			gui_caligh_text_P(PSTR("Yes"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h);
			gui_raligh_text_P(PSTR("No"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h);
		break;

		case(GUI_STYLE_TIMESET):
			gui_caligh_text_P(PSTR("GPS"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h);
			gui_raligh_text_P(PSTR("Manual"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h);
		break;

		case(GUI_STYLE_FORMAT):
			gui_caligh_text_P(PSTR("No"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h);
			gui_raligh_text_P(PSTR("Yes"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h);
		break;
	}
}
Example #4
0
/*!
 * \par  Description:
 *    删除文件或目录控件控制流实现。
 * \param[in]    path_info 要删除文件(目录)的路径结构体
 * \param[in]    del_com 删除控制结构体指针
 * \param[out]   path_info 删除文件(目录)后更新的路径结构体
 * \return       app_result_e
 * \retval           RESULT_REDRAW 询问是否删除对话框取消返回AP,重绘UI。
 * \retval           RESULT_DELETE_FILE 删除文件成功返回。
 * \retval           RESULT_DELETE_DIRLIST 删除文件夹或列表成功返回。
 * \retval           RESULT_DELETE_DIRLIST_NOSELF 删除文件夹或列表(不删除自身)成功返回。
 * \retval           RESULT_ERROR 删除文件失败返回 。
 * \retval           dialog other 直接返回其他从 dialog 返回的消息,详细参见 app_result_e 定义。
 * \retval           delete other 收到返回值不为 RESULT_NULL 应用消息返回,见 app_result_e 定义。
 * \ingroup      controls
 * \par          exmaple code
 * \code
 del_com_data_t del_com;
 app_result_e result;

 fsel_browser_select(list_no);
 fsel_browser_get_location(&path_info.file_path, FSEL_TYPE_COMMONDIR);//path_info在之前已经初始化过
 del_com.filename = g_file_name;
 del_com.del_mode = DEL_MODE_FILE;
 del_com.del_playing = FALSE;
 del_com.del_self = TRUE;
 del_com.del_func = ebook_del_func;
 result = gui_delete(&path_info, &del_com);
 if(result == RESULT_DELETE_FILE)//删除文件成功返回
 {
 //返回更新列表等
 }
 else if(result == RESULT_REDRAW)//取消删除,返回重绘
 {

 }
 else//其他返回结果,需要做特殊处理
 {

 }
 * \endcode
 * \note
 * \li  用户必须确保文件系统和文件选择器已经初始化过,并且 path_info 指向要删除的文件或列表。
 *******************************************************************************/
app_result_e gui_delete(file_path_info_t *path_info, del_com_data_t *del_com)
{
    msg_apps_t msg;
    dialog_com_data_t dialog_com;
    string_desc_t delete_ask_str;
    app_result_e result = RESULT_NULL;
    bool ret, restart_music = FALSE;
    uint8 tag_backup;
    gui_direct_e tmp_direct;

    tag_backup = g_this_app_timer_tag;//get_app_timer_tag();
    change_app_timer_tag(APP_TIEMR_TAG_DELETE);
    tmp_direct = com_get_gui_direction();

    //把文件名转换为 "部分..." 形式,在整个 gui_delete 生命周期有效
    com_ellipsis_to_longname(del_com->filename, com_name_buffer, 52);

    //询问是否要删除文件或目录
    delete_ask_str.data.str = com_str_buffer;

    //初始化对话框
    dialog_com.dialog_type = DIALOG_BUTTON_INCLUDE;
    dialog_com.button_type = BUTTON_YESNO;
    dialog_com.icon_id = -1;
    dialog_com.string_desc = &delete_ask_str;
    dialog_com.active_default = 1;

    //for 16KB page nandflash
    if ((g_app_info_state.type == ENGINE_MUSIC)//正在播放音乐
            && (g_app_info_state.state == ENGINE_STATE_PLAYING) && ((g_this_app_info->app_id != APP_ID_MUSIC)
            || (del_com->del_playing != TRUE)))//允许删除正在播放的音乐文件
    {
        delete_string_format(&delete_ask_str, S_CLOSE_MUSIC_DEL, com_name_buffer);

        //询问是否 先关闭音乐播放器后再删除文件
        result = gui_dialog(DIALOG_ASK, &dialog_com);
        if (result != RESULT_DIALOG_YES)
        {
            g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup);
            return result;
        }

        //向 manager ap 发消息要求后台退出
        msg.type = MSG_MENGINE_PAUSE_SYNC;
        send_sync_msg(APP_ID_MENGINE, &msg, NULL, 0);

        restart_music = TRUE;//删除完成后恢复音乐播放
    }
    else
    {
        delete_string_format(&delete_ask_str, S_DEL_FILE_ASK, com_name_buffer);

        //询问是否 删除文件
        if (tmp_direct == GUI_DIRECT_NORMAL)//正常竖屏
        {
            result = gui_dialog(DIALOG_ASK, &dialog_com);
            if (result != RESULT_DIALOG_YES)
            {
                g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup);
                return result;
            }
        }
        /*else//横屏模式
         {
         result = gui_dialog (DIALOG_ASK_V, &dialog_com);
         if(result != RESULT_DIALOG_YES)
         {
         g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup);
         return result;
         }
         }*/
    }

    //显示 正在删除文件
    if (tmp_direct == GUI_DIRECT_NORMAL)//正常竖屏
    {
        gui_dialog_msg(DIALOG_MSG, DIALOG_INFOR_IMMEDIATE, S_DEL_FILE_ING);
    }
    else//横屏模式
    {
        // gui_dialog_msg (DIALOG_MSG_V, DIALOG_INFOR_IMMEDIATE, S_DEL_FILE_ING);
    }

    //执行删除回调函数
    if (del_com->del_func != NULL)
    {
        del_com->del_func();
    }

    //确定删除,删除文件
    if (del_com->del_mode == DEL_MODE_FILE)
    {
        //执行删除文件
        ret = delete_just_file(0, path_info, BROW_DEL_FILE, del_com->del_playing);
        if (ret == TRUE)
        {
            result = deleted_file_display(com_name_buffer);
            if ((result == RESULT_NULL) || (result == RESULT_REDRAW))
            {
                result = RESULT_DELETE_FILE; //删除文件完成返回
            }
        }
        else
        {
            result = RESULT_ERROR;
        }
    }
    //确定删除,删除文件夹或播放列表
    else
    {
        result = deleted_all(path_info, del_com);
        if (result == RESULT_DELETE_DIRLIST)
        {
            result = deleted_file_display(com_name_buffer);
            if (result == RESULT_NULL)
            {
                if (del_com->del_self == TRUE)
                {
                    result = RESULT_DELETE_DIRLIST; //删除文件夹或列表完成返回
                }
                else
                {
                    result = RESULT_DELETE_DIRLIST_NOSELF; //删除文件夹或列表(不删除自身)完成返回
                }
            }
        }
    }

    //恢复音乐播放
    if (restart_music == TRUE)
    {
        //向 manager ap 发消息恢复后台音乐播放
        _resume_music_after_delete(path_info);
    }
    g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup);
    return result;
}