Преглед на файлове

add mono virtual display

HelloByeAll преди 5 години
родител
ревизия
a1dc5efae9

+ 12 - 11
Examples/MainTask.c

@@ -8,9 +8,10 @@
 *              
 *	修改记录 :
 *		版本号   日期         作者          说明
-*		V1.0    2020-11-15   Eric2013  	    首版    
-*                                     
-*	Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
+*		V1.0    2020-11-15   Eric2013  	    安富莱电子 www.armfly.com    
+*       V1.1    2020-11-20   HelloByeAll    移植到rt-thrad           
+*       V1.2    2020-11-26   HelloByeAll    添加虚拟mono设备
+* 
 *
 *********************************************************************************************************
 */
@@ -74,6 +75,11 @@ static void stm32_monochrome_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirt
     /* 获得OLED画布的地址 */
     p = (uint8_t *)display_1_canvas_memory;
 
+#ifdef GUIX_VIRTUAL_DISPLAY_MONO
+    extern void show_virtual_display(rt_uint8_t * p);
+    show_virtual_display(p);
+#endif // GUIX_VIRTUAL_DISPLAY_MONO
+
     /* 将画布的内容绘制到OLED显存 */
 
     for (int y = 0; y < 128; y++)
@@ -136,18 +142,13 @@ void MainTask(void)
     gx_studio_display_configure(DISPLAY_1, stm32_graphics_driver_setup_monochrome,
                                 LANGUAGE_ENGLISH, DISPLAY_1_THEME_2, &root);
     /* 创建窗口 */
-    gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
-
+    gx_studio_named_widget_create("window", (GX_WIDGET *)GX_NULL, (GX_WIDGET **)&pScreen);
+    gx_studio_named_widget_create("window_1", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
     /* 显示根窗口 */
     gx_widget_show(root);
 
     /* 启动GUIX */
     gx_system_start();
-
-    while (1)
-    {
-        rt_thread_mdelay(20);
-    }
 }
 
 /* 调用此函数可更换主题 */
@@ -162,4 +163,4 @@ void gui_theme_switching(void)
                                 LANGUAGE_ENGLISH, theme_id, &root);
 }
 MSH_CMD_EXPORT(gui_theme_switching, gui_theme_switching);
-/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
+/*************************************** (END OF FILE) ****************************************/

+ 4 - 11
Examples/MainTask.h

@@ -7,9 +7,9 @@
 *	说    明 : GUI界面主函数
 *
 *		版本号   日期         作者            说明
-*		v1.0    2020-07-06  Eric2013  	      首版
-*
-*	Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
+*		v1.0    2020-07-06  Eric2013  	    安富莱电子 www.armfly.com
+*       V1.1    2020-11-20   HelloByeAll    移植到rt-thrad           
+*       V1.2    2020-11-26   HelloByeAll    添加虚拟mono设备
 *
 *********************************************************************************************************
 */
@@ -17,33 +17,26 @@
 #ifndef __MainTask_H
 #define __MainTask_H
 #include "main.h"
-//#include "bsp.h"
 #include "gx_user.h"
 #include "guiapp_resources.h"
 #include "guiapp_specifications.h"
-//#include "tx_api.h"
 #include "gx_system.h"
 #include "gx_display.h"
 #include "gx_utility.h"
 
-
 /*
 ************************************************************************
 *						宏定义
 ************************************************************************
 */
 
-
-
 /*
 ************************************************************************
 *						供外部文件调用
 ************************************************************************
 */
 extern void MainTask(void);
-extern void TOUCH_Calibration(uint8_t _PointCount);
-extern void gx_initconfig(void);
 
 #endif
 
-/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
+/*************************************** (END OF FILE) ****************************************/

+ 46 - 5
Examples/guiapp_resources.c

@@ -6,7 +6,7 @@
 /*  Studio User Guide, or visit our web site at azure.com/rtos                 */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -200,6 +200,43 @@ GX_CONST GX_PIXELMAP DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap =
     16                                       /* height in pixel                */
 };
 
+/* THEME_1_QQ__20201124221312 pixelmap data                                    */
+
+static GX_CONST GX_UBYTE DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data[211] =
+{
+    0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 
+    0xff, 0x97, 0xff, 0xff, 0x97, 0xf3, 0x9d, 0xff, 0x03, 0xeb, 0xad, 0xfb, 0xe7, 
+    0xb5, 0xf7, 0xe3, 0xbd, 0xf3, 0xdf, 0x95, 0x03, 0x8d, 0x03, 0x95, 0xef, 0xdf, 
+    0x91, 0x13, 0x01, 0x03, 0x01, 0x01, 0x8b, 0x91, 0xef, 0xdf, 0x91, 0x03, 0x95, 
+    0x03, 0x91, 0xef, 0xdb, 0x95, 0x13, 0x01, 0x03, 0x01, 0x01, 0x8b, 0x95, 0xeb, 
+    0xdb, 0x99, 0x03, 0x8d, 0x03, 0x99, 0xeb, 0xdb, 0xcd, 0xeb, 0xdb, 0xa1, 0x07, 
+    0x03, 0xa1, 0xeb, 0xdb, 0x91, 0xa7, 0x91, 0xeb, 0xdb, 0xcd, 0xeb, 0xd7, 0xd1, 
+    0xeb, 0xd7, 0xd5, 0xe7, 0xd7, 0xd5, 0xe7, 0xd3, 0xdd, 0xe3, 0xd3, 0x8d, 0x07, 
+    0x03, 0xad, 0x03, 0x91, 0xe3, 0xd3, 0x8d, 0x07, 0x03, 0x8d, 0xa7, 0x8d, 0xe3, 
+    0xcf, 0x91, 0x07, 0x03, 0x8d, 0xa7, 0x91, 0xdf, 0xcf, 0x91, 0x07, 0x03, 0x8d, 
+    0xa7, 0x91, 0xdf, 0xcf, 0x91, 0x07, 0x03, 0x8d, 0xa7, 0x91, 0xdf, 0xcf, 0x91, 
+    0xbf, 0x91, 0xdf, 0xcf, 0x91, 0xbf, 0x91, 0xdf, 0xcb, 0x89, 0x03, 0x89, 0xb7, 
+    0x89, 0x0b, 0x01, 0x01, 0xdf, 0xcf, 0x09, 0x03, 0x03, 0x89, 0xb7, 0x89, 0x0b, 
+    0x03, 0x01, 0xdf, 0xdf, 0x89, 0xaf, 0x89, 0xef, 0xe3, 0x89, 0xa7, 0x89, 0xf3, 
+    0xe3, 0x95, 0x8f, 0x95, 0xf3, 0xeb, 0xc1, 0xe7, 0xf3, 0xb9, 0xe7, 0xff, 0xff, 
+    0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 
+    0xff, 0xff, 0x97
+};
+GX_CONST GX_PIXELMAP DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap =
+{
+    0x00000001,                              /* major version                  */
+    0x00000000,                              /* minor version                  */
+    GX_PIXELMAP_COMPRESSED|GX_PIXELMAP_TRANSPARENT,         /* flags           */
+    GX_COLOR_FORMAT_MONOCHROME,              /* Format                         */
+    (GX_UBYTE *) DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data,
+    sizeof(DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data),    /* the size of pixelmap_data*/
+    NULL,
+    0,                                       /* auxiliary data size            */
+    0x00,                                    /* used for transparent iamges    */
+    70,                                      /* width in pixel                 */
+    43                                       /* height in pixel                */
+};
+
 /* THEME_1_YXYL_LOGO pixelmap data                                             */
 
 static GX_CONST GX_UBYTE DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap_data[785] =
@@ -291,6 +328,7 @@ GX_CONST GX_PIXELMAP *display_1_theme_1_pixelmap_table[] =
     &DISPLAY_1_THEME_1_RADIO_OFF_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_ON_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap,
+    &DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap,
     &DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap
 };
 GX_CONST GX_PIXELMAP *display_1_theme_2_pixelmap_table[] =
@@ -300,6 +338,7 @@ GX_CONST GX_PIXELMAP *display_1_theme_2_pixelmap_table[] =
     &DISPLAY_1_THEME_1_RADIO_OFF_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_ON_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap,
+    &DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap,
     &DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap
 };
 
@@ -315,10 +354,11 @@ GX_CONST GX_UBYTE display_1_STRING_7_English[] = "The Second Window";
 GX_CONST GX_UBYTE display_1_STRING_8_English[] = "The Third Window";
 GX_CONST GX_UBYTE display_1_STRING_9_English[] = "armfly";
 GX_CONST GX_UBYTE display_1_STRING_10_English[] = "armbbs";
+GX_CONST GX_UBYTE display_1_STRING_11_English[] = "this is btn";
 
 /* String Table for display_1 language English                                 */
 
-GX_CONST GX_STRING display_1_English_string_table[11] =
+GX_CONST GX_STRING display_1_English_string_table[12] =
 {
     {GX_NULL, 0},
     {(GX_CONST GX_CHAR *)display_1_STRING_1_English, sizeof(display_1_STRING_1_English) - 1},
@@ -330,7 +370,8 @@ GX_CONST GX_STRING display_1_English_string_table[11] =
     {(GX_CONST GX_CHAR *)display_1_STRING_7_English, sizeof(display_1_STRING_7_English) - 1},
     {(GX_CONST GX_CHAR *)display_1_STRING_8_English, sizeof(display_1_STRING_8_English) - 1},
     {(GX_CONST GX_CHAR *)display_1_STRING_9_English, sizeof(display_1_STRING_9_English) - 1},
-    {(GX_CONST GX_CHAR *)display_1_STRING_10_English, sizeof(display_1_STRING_10_English) - 1}
+    {(GX_CONST GX_CHAR *)display_1_STRING_10_English, sizeof(display_1_STRING_10_English) - 1},
+    {(GX_CONST GX_CHAR *)display_1_STRING_11_English, sizeof(display_1_STRING_11_English) - 1}
 };
 
 /*  Language Table                                                             */
@@ -379,7 +420,7 @@ GX_THEME display_1_theme_1 =
     GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_HORIZONTAL,
     29,                                      /* color table size               */
     4,                                       /* font table size                */
-    6,                                       /* pixelmap table size            */
+    7,                                       /* pixelmap table size            */
     0                                        /* palette size                   */
 
 };
@@ -422,7 +463,7 @@ GX_THEME display_1_theme_2 =
     GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_HORIZONTAL,
     29,                                      /* color table size               */
     4,                                       /* font table size                */
-    6,                                       /* pixelmap table size            */
+    7,                                       /* pixelmap table size            */
     0                                        /* palette size                   */
 
 };

+ 6 - 4
Examples/guiapp_resources.h

@@ -6,7 +6,7 @@
 /*  Studio User Guide, or visit our web site at azure.com/rtos                 */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -40,8 +40,9 @@
 
 /* Pixelmap ID definitions                                                     */
 
-#define GX_PIXELMAP_ID_YXYL_LOGO 5
-#define DISPLAY_1_PIXELMAP_TABLE_SIZE 6
+#define GX_PIXELMAP_ID_QQ__20201124221312 5
+#define GX_PIXELMAP_ID_YXYL_LOGO 6
+#define DISPLAY_1_PIXELMAP_TABLE_SIZE 7
 
 /* String Ids                                                                  */
 
@@ -55,6 +56,7 @@
 #define GX_STRING_ID_STRING_8 8
 #define GX_STRING_ID_STRING_9 9
 #define GX_STRING_ID_STRING_10 10
-#define DISPLAY_1_STRING_TABLE_SIZE 11
+#define GX_STRING_ID_STRING_11 11
+#define DISPLAY_1_STRING_TABLE_SIZE 12
 
 #endif                                       /* sentry                         */

+ 368 - 84
Examples/guiapp_specifications.c

@@ -6,7 +6,7 @@
 /*  GUIX Studio User Guide, or visit our web site at azure.com/rtos            */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -16,8 +16,8 @@
 #include "guiapp_specifications.h"
 
 static GX_WIDGET *gx_studio_nested_widget_create(GX_BYTE *control, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent);
-WINDOW_1_CONTROL_BLOCK window_1;
 WINDOW_CONTROL_BLOCK window;
+WINDOW_1_CONTROL_BLOCK window_1;
 GX_DISPLAY display_1_control_block;
 GX_WINDOW_ROOT display_1_root_window;
 GX_CANVAS  display_1_canvas_control_block;
@@ -46,6 +46,297 @@ GX_STUDIO_DISPLAY_INFO guiapp_display_table[1] =
     }
 };
 
+static VOID gx_studio_screen_toggle(GX_WIDGET *target1, GX_WIDGET *target2)
+{
+    GX_WIDGET *parent = target1->gx_widget_parent;
+    if (parent)
+    {
+        gx_widget_detach(target1);
+        gx_widget_attach(parent, target2);
+        if (target1->gx_widget_status & GX_STATUS_STUDIO_CREATED)
+        {
+            gx_widget_delete(target1);
+        }
+    }
+}
+
+static GX_WIDGET *gx_studio_action_target_get(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    INT        search_depth;
+    GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET)
+    {
+                                             /* dynamically create the target widget */
+        widget_define = (GX_STUDIO_WIDGET *) action->target;
+        if(action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+        {
+            gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent);
+            search_depth = GX_SEARCH_DEPTH_INFINITE;
+        }
+        else
+        {
+            parent = (GX_WIDGET *)action->parent;
+            search_depth = 1;
+        }
+        gx_widget_find(parent, widget_define->widget_id, search_depth, &target);
+        if (target == GX_NULL)
+        {
+            target = gx_studio_widget_create(GX_NULL, widget_define, GX_NULL);
+        }
+        if (target)
+        {
+            target->gx_widget_status |= GX_STATUS_STUDIO_CREATED;
+        }
+    }
+    else
+    {
+        target = (GX_WIDGET *) action->target;
+    }
+    return target;
+}
+
+static GX_WIDGET *gx_studio_action_target_find(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET)
+    {
+                                             /* Find the dynamically created target */
+        widget_define = (GX_STUDIO_WIDGET *) action->target;
+        if(action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+        {
+            gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent);
+        }
+        else
+        {
+            parent = (GX_WIDGET *)action->parent;
+        }
+        gx_widget_find(parent, widget_define->widget_id, GX_SEARCH_DEPTH_INFINITE, &target);
+    }
+    else
+    {
+        target = (GX_WIDGET *) action->target;
+    }
+    return target;
+}
+
+static GX_WIDGET *gx_studio_action_parent_find(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+GX_WIDGET *parent = GX_NULL;
+GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+    {
+                                             /* Find the dynamically created target */
+        widget_define = (GX_STUDIO_WIDGET *)action->parent; 
+        gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent); 
+        gx_widget_find(parent, widget_define->widget_id, GX_SEARCH_DEPTH_INFINITE, &parent); 
+    }
+    else
+    {
+        parent = (GX_WIDGET *)action->parent; 
+    }
+    return parent; 
+}
+
+static VOID gx_studio_animation_execute(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_ANIMATION *animation;
+    GX_ANIMATION_INFO animation_info;
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    gx_system_animation_get(&animation);
+    if (animation)
+    {
+        animation_info = *action->animation;
+
+        if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+           (action->flags & GX_ACTION_FLAG_POP_PARENT))
+        {
+            gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+        }
+
+        if(action->flags & GX_ACTION_FLAG_POP_TARGET)
+        {
+            animation_info.gx_animation_target = target;
+        }
+
+        if(action->flags & GX_ACTION_FLAG_POP_PARENT)
+        {
+            animation_info.gx_animation_parent = (GX_WIDGET *)parent;
+        }
+
+        if ((!animation_info.gx_animation_target) &&
+            (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET))
+        {
+            target = gx_studio_action_target_get(current, action);
+            animation_info.gx_animation_target = target;
+        }
+
+        if (!animation_info.gx_animation_parent)
+        {
+            animation_info.gx_animation_parent = gx_studio_action_parent_find(current, action);
+        }
+
+        if (animation_info.gx_animation_target &&
+            animation_info.gx_animation_parent)
+        {
+            gx_animation_start(animation, &animation_info);
+        }
+    }
+}
+
+UINT gx_studio_auto_event_handler(GX_WIDGET *widget, GX_EVENT *event_ptr, GX_CONST GX_STUDIO_EVENT_PROCESS *record)
+{
+    UINT status = GX_SUCCESS;
+    GX_CONST GX_STUDIO_ACTION *action;
+    GX_CONST GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    GX_CONST GX_STUDIO_EVENT_ENTRY *entry = record->event_table;
+
+    while(entry->event_type)
+    {
+        if (entry->event_type == event_ptr->gx_event_type)
+        {
+            if((entry->event_type == GX_EVENT_ANIMATION_COMPLETE) &&
+               (entry->event_sender != event_ptr->gx_event_sender))
+            {
+                entry++;
+                continue;
+            }
+            action = entry->action_list;
+
+            while(action->opcode)
+            {
+                switch(action->opcode)
+                {
+                case GX_ACTION_TYPE_ATTACH:
+                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+                    }
+
+                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        parent = action->parent;
+                    }
+                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    if (parent && target)
+                    {
+                        gx_widget_attach(parent, target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_DETACH:
+                    target = gx_studio_action_target_find(widget, action);
+                    if (target)
+                    {
+                        gx_widget_detach(target);
+                        if (target->gx_widget_status & GX_STATUS_STUDIO_CREATED)
+                        {
+                            gx_widget_delete(target);
+                        }
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_TOGGLE:
+                    if(action->flags & GX_ACTION_FLAG_POP_TARGET)
+                    {
+                       gx_system_screen_stack_get(GX_NULL, &target);
+                    }
+                    else
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    gx_studio_screen_toggle(widget, target);
+                    break;
+
+                case GX_ACTION_TYPE_SHOW:
+                    target = gx_studio_action_target_get(widget, action);
+                    if(target)
+                    {
+                        gx_widget_show(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_HIDE:
+                    target = gx_studio_action_target_find(widget, action);
+                    if(target)
+                    {
+                        gx_widget_hide(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_ANIMATION:
+                    gx_studio_animation_execute(widget, action);
+                    break;
+
+                case GX_ACTION_TYPE_WINDOW_EXECUTE:
+                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+                    }
+
+                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        parent = widget->gx_widget_parent;
+                    }
+                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    if (parent && target)
+                    {
+                        gx_widget_attach(parent, target);
+                        gx_window_execute((GX_WINDOW *) target, GX_NULL);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_WINDOW_EXECUTE_STOP:
+                    return event_ptr->gx_event_sender;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_PUSH:
+                    target = gx_studio_action_target_get(widget, action);
+                    if(target)
+                    {
+                        gx_system_screen_stack_push(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_POP:
+                    gx_system_screen_stack_pop();
+                    break;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_RESET:
+                    gx_system_screen_stack_reset();
+                    break;
+
+                default:
+                    break;
+                }
+                action++;
+            }
+        }
+        entry++;
+    }
+
+    if (record->chain_event_handler)
+    {
+        status = record->chain_event_handler(widget, event_ptr);
+    }
+    return status;
+}
+
 
 UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
 {
@@ -65,24 +356,6 @@ UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *co
     return status;
 }
 
-UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
-{
-    UINT status;
-    GX_PROMPT *prompt = (GX_PROMPT *) control_block;
-    GX_PROMPT_PROPERTIES *props = (GX_PROMPT_PROPERTIES *) info->properties;
-    status = gx_prompt_create(prompt, info->widget_name, parent, props->string_id, info->style, info->widget_id, &info->size);
-    if (status == GX_SUCCESS)
-    {
-        gx_prompt_font_set(prompt, props->font_id);
-#if defined(GUIX_5_4_0_COMPATIBILITY)
-        gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id);
-#else
-        gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id, props->disabled_text_color_id);
-#endif
-    }
-    return status;
-}
-
 UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
 {
     UINT status;
@@ -98,49 +371,71 @@ UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control
     }
     return status;
 }
-GX_WINDOW_PROPERTIES window_1_properties =
+GX_WINDOW_PROPERTIES window_properties =
 {
-    0                                        /* wallpaper pixelmap id          */
+    GX_PIXELMAP_ID_QQ__20201124221312        /* wallpaper pixelmap id          */
 };
-GX_TEXT_BUTTON_PROPERTIES window_1_button_properties =
-{
-    GX_STRING_ID_STRING_9,                   /* string id                      */
-    GX_FONT_ID_BUTTON,                       /* font id                        */
-    GX_COLOR_ID_BTN_TEXT,                    /* normal text color              */
-    GX_COLOR_ID_BTN_TEXT,                    /* selected text color            */
-    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
+
+GX_ANIMATION_INFO window_animation_1 = {
+    (GX_WIDGET *) &window_1,
+    (GX_WIDGET *) &display_1_root_window,
+    GX_NULL,
+    GX_ANIMATION_TRANSLATE, 0, 0, 1,
+    {0, 50}, {0, 0}, 255, 255, 10
 };
-GX_PROMPT_PROPERTIES window_1_prompt_properties =
-{
-    GX_STRING_ID_STRING_10,                  /* string id                      */
-    GX_FONT_ID_PROMPT,                       /* font id                        */
-    GX_COLOR_ID_TEXT,                        /* normal text color              */
-    GX_COLOR_ID_SELECTED_TEXT,               /* selected text color            */
-    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
+
+
+GX_STUDIO_ACTION window_on_gx_event_pen_downactions[2] = {
+    {GX_ACTION_TYPE_ANIMATION, 0, &display_1_root_window, &window_1, &window_animation_1},
+    {0, 0, GX_NULL, GX_NULL, GX_NULL}
+};
+
+static GX_STUDIO_EVENT_ENTRY gx_studio_window_event_table[] = {
+    { GX_EVENT_PEN_DOWN, 0, window_on_gx_event_pen_downactions},
+    {0, 0, GX_NULL}
 };
 
-GX_CONST GX_STUDIO_WIDGET window_1_prompt_define =
+GX_STUDIO_EVENT_PROCESS window_event_chain = {gx_studio_window_event_table, (UINT (*)(GX_WIDGET *, GX_EVENT *))gx_window_event_process};
+static UINT gx_studio_window_event_process(GX_WIDGET *target, GX_EVENT *event_ptr)
+{
+    return (gx_studio_auto_event_handler(target, event_ptr, &window_event_chain));
+}
+
+
+GX_CONST GX_STUDIO_WIDGET window_define =
 {
-    "prompt",
-    GX_TYPE_PROMPT,                          /* widget type                    */
-    GX_ID_NONE,                              /* widget id                      */
+    "window",
+    GX_TYPE_WINDOW,                          /* widget type                    */
+    GUIX_ID_WINDOW_Logo,                     /* widget id                      */
     #if defined(GX_WIDGET_USER_DATA)
     0,                                       /* user data                      */
     #endif
-    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED|GX_STYLE_TEXT_CENTER,   /* style flags */
+    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED,   /* style flags                    */
     GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
-    sizeof(GX_PROMPT),                       /* control block size             */
-    GX_COLOR_ID_WIDGET_FILL,                 /* normal color id                */
-    GX_COLOR_ID_SELECTED_FILL,               /* selected color id              */
+    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
+    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
+    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
     GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
-    gx_studio_prompt_create,                 /* create function                */
+    gx_studio_window_create,                 /* create function                */
     GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
-    {19, 6, 98, 29},                         /* widget size                    */
-    GX_NULL,                                 /* no next widget                 */
-    GX_NULL,                                 /* no child widgets               */ 
-    offsetof(WINDOW_1_CONTROL_BLOCK, window_1_prompt), /* control block        */
-    (void *) &window_1_prompt_properties     /* extended properties            */
+    (UINT (*)(GX_WIDGET *, GX_EVENT *)) gx_studio_window_event_process, /* event function override */
+    {0, 41, 127, 93},                        /* widget size                    */
+    GX_NULL,                                 /* next widget                    */
+    GX_NULL,                                 /* child widget                   */
+    0,                                       /* control block                  */
+    (void *) &window_properties              /* extended properties            */
+};
+GX_WINDOW_PROPERTIES window_1_properties =
+{
+    0                                        /* wallpaper pixelmap id          */
+};
+GX_TEXT_BUTTON_PROPERTIES window_1_button_properties =
+{
+    GX_STRING_ID_STRING_11,                  /* string id                      */
+    GX_FONT_ID_BUTTON,                       /* font id                        */
+    GX_COLOR_ID_BTN_TEXT,                    /* normal text color              */
+    GX_COLOR_ID_BTN_TEXT,                    /* selected text color            */
+    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
 };
 
 GX_CONST GX_STUDIO_WIDGET window_1_button_define =
@@ -160,18 +455,35 @@ GX_CONST GX_STUDIO_WIDGET window_1_button_define =
     gx_studio_text_button_create,            /* create function                */
     GX_NULL,                                 /* drawing function override      */
     GX_NULL,                                 /* event function override        */
-    {21, 37, 100, 60},                       /* widget size                    */
-    &window_1_prompt_define,                 /* next widget definition         */
+    {15, 51, 116, 74},                       /* widget size                    */
+    GX_NULL,                                 /* no next widget                 */
     GX_NULL,                                 /* no child widgets               */ 
     offsetof(WINDOW_1_CONTROL_BLOCK, window_1_button), /* control block        */
     (void *) &window_1_button_properties     /* extended properties            */
 };
 
+GX_STUDIO_ACTION window_1__gui_id_textbutton0_gx_event_clicked_actions[2] = {
+    {GX_ACTION_TYPE_TOGGLE, 0, &display_1_root_window, &window, GX_NULL},
+    {0, 0, GX_NULL, GX_NULL, GX_NULL}
+};
+
+static GX_STUDIO_EVENT_ENTRY gx_studio_window_1_event_table[] = {
+    {GX_SIGNAL(GUI_ID_TextButton0, GX_EVENT_CLICKED), 0, window_1__gui_id_textbutton0_gx_event_clicked_actions},
+    {0, 0, GX_NULL}
+};
+
+GX_STUDIO_EVENT_PROCESS window_1_event_chain = {gx_studio_window_1_event_table, (UINT (*)(GX_WIDGET *, GX_EVENT *))gx_window_event_process};
+static UINT gx_studio_window_1_event_process(GX_WIDGET *target, GX_EVENT *event_ptr)
+{
+    return (gx_studio_auto_event_handler(target, event_ptr, &window_1_event_chain));
+}
+
+
 GX_CONST GX_STUDIO_WIDGET window_1_define =
 {
     "window_1",
     GX_TYPE_WINDOW,                          /* widget type                    */
-    GUIX_ID_WINDOW0,                         /* widget id                      */
+    GUIX_ID_WINDOW_Main,                     /* widget id                      */
     #if defined(GX_WIDGET_USER_DATA)
     0,                                       /* user data                      */
     #endif
@@ -183,45 +495,17 @@ GX_CONST GX_STUDIO_WIDGET window_1_define =
     GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
     gx_studio_window_create,                 /* create function                */
     GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
+    (UINT (*)(GX_WIDGET *, GX_EVENT *)) gx_studio_window_1_event_process, /* event function override */
     {0, 0, 127, 127},                        /* widget size                    */
     GX_NULL,                                 /* next widget                    */
     &window_1_button_define,                 /* child widget                   */
     0,                                       /* control block                  */
     (void *) &window_1_properties            /* extended properties            */
 };
-GX_WINDOW_PROPERTIES window_properties =
-{
-    GX_PIXELMAP_ID_YXYL_LOGO                 /* wallpaper pixelmap id          */
-};
-
-GX_CONST GX_STUDIO_WIDGET window_define =
-{
-    "window",
-    GX_TYPE_WINDOW,                          /* widget type                    */
-    GX_ID_NONE,                              /* widget id                      */
-    #if defined(GX_WIDGET_USER_DATA)
-    0,                                       /* user data                      */
-    #endif
-    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED,   /* style flags                    */
-    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
-    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
-    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
-    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
-    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
-    gx_studio_window_create,                 /* create function                */
-    GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
-    {0, 37, 127, 89},                        /* widget size                    */
-    GX_NULL,                                 /* next widget                    */
-    GX_NULL,                                 /* child widget                   */
-    0,                                       /* control block                  */
-    (void *) &window_properties              /* extended properties            */
-};
 GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
 {
-    { &window_1_define, (GX_WIDGET *) &window_1 },
     { &window_define, (GX_WIDGET *) &window },
+    { &window_1_define, (GX_WIDGET *) &window_1 },
     {GX_NULL, GX_NULL}
 };
 

+ 37 - 20
Examples/guiapp_specifications.h

@@ -6,7 +6,7 @@
 /*  GUIX Studio User Guide, or visit our web site at azure.com/rtos            */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -22,8 +22,9 @@ extern   "C" {
 
 /* Define widget ids                                                           */
 
-#define GUIX_ID_WINDOW0 1
-#define GUI_ID_TextButton0 2
+#define GUIX_ID_WINDOW_Logo 1
+#define GUIX_ID_WINDOW_Main 2
+#define GUI_ID_TextButton0 3
 
 
 /* Define animation ids                                                        */
@@ -35,6 +36,32 @@ extern   "C" {
 
 #define GX_NEXT_USER_EVENT_ID GX_FIRST_USER_EVENT
 
+#define GX_ACTION_FLAG_DYNAMIC_TARGET 0x01
+#define GX_ACTION_FLAG_DYNAMIC_PARENT 0x02
+#define GX_ACTION_FLAG_POP_TARGET     0x04
+#define GX_ACTION_FLAG_POP_PARENT     0x08
+
+typedef struct GX_STUDIO_ACTION_STRUCT
+{
+    GX_UBYTE opcode;
+    GX_UBYTE flags;
+    GX_CONST VOID *parent;
+    GX_CONST VOID *target;
+    GX_CONST GX_ANIMATION_INFO  *animation;
+} GX_STUDIO_ACTION;
+
+typedef struct GX_STUDIO_EVENT_ENTRY_STRUCT
+{
+    ULONG event_type;
+    USHORT event_sender;
+    GX_CONST GX_STUDIO_ACTION *action_list;
+} GX_STUDIO_EVENT_ENTRY;
+
+typedef struct GX_STUDIO_EVENT_PROCESS_STRUCT 
+{
+    GX_CONST GX_STUDIO_EVENT_ENTRY *event_table;
+    UINT (*chain_event_handler)(GX_WIDGET *, GX_EVENT *);
+} GX_STUDIO_EVENT_PROCESS;
 
 /* Declare properties structures for each utilized widget type                 */
 
@@ -77,15 +104,6 @@ typedef struct
     GX_RESOURCE_ID disabled_text_color_id;
 } GX_TEXT_BUTTON_PROPERTIES;
 
-typedef struct
-{
-    GX_RESOURCE_ID string_id;
-    GX_RESOURCE_ID font_id;
-    GX_RESOURCE_ID normal_text_color_id;
-    GX_RESOURCE_ID selected_text_color_id;
-    GX_RESOURCE_ID disabled_text_color_id;
-} GX_PROMPT_PROPERTIES;
-
 typedef struct
 {
     GX_RESOURCE_ID wallpaper_id;
@@ -94,24 +112,23 @@ typedef struct
 
 /* Declare top-level control blocks                                            */
 
-typedef struct WINDOW_1_CONTROL_BLOCK_STRUCT
+typedef struct WINDOW_CONTROL_BLOCK_STRUCT
 {
     GX_WINDOW_MEMBERS_DECLARE
-    GX_TEXT_BUTTON window_1_button;
-    GX_PROMPT window_1_prompt;
-} WINDOW_1_CONTROL_BLOCK;
+} WINDOW_CONTROL_BLOCK;
 
-typedef struct WINDOW_CONTROL_BLOCK_STRUCT
+typedef struct WINDOW_1_CONTROL_BLOCK_STRUCT
 {
     GX_WINDOW_MEMBERS_DECLARE
-} WINDOW_CONTROL_BLOCK;
+    GX_TEXT_BUTTON window_1_button;
+} WINDOW_1_CONTROL_BLOCK;
 
 
 /* extern statically defined control blocks                                    */
 
 #ifndef GUIX_STUDIO_GENERATED_FILE
-extern WINDOW_1_CONTROL_BLOCK window_1;
 extern WINDOW_CONTROL_BLOCK window;
+extern WINDOW_1_CONTROL_BLOCK window_1;
 #endif
 
 /* Declare event process functions, draw functions, and callback functions     */
@@ -142,11 +159,11 @@ typedef struct GX_STUDIO_DISPLAY_INFO_STRUCT
 /* Declare Studio-generated functions for creating top-level widgets           */
 
 UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
-UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
 UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
 GX_WIDGET *gx_studio_widget_create(GX_BYTE *storage, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent);
 UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget);
 UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *), GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root);
+UINT gx_studio_auto_event_handler(GX_WIDGET *widget, GX_EVENT *event_ptr, GX_CONST GX_STUDIO_EVENT_PROCESS *record);
 
 /* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.                                                 */

+ 126 - 98
GUIX Studio OLED Demo/guiapp.gxp

@@ -1234,63 +1234,35 @@
 <output_file_enabled>FALSE</output_file_enabled>
 <palette_type>None</palette_type>
 </resource>
-</resource>
-</resource>
-<resource>
-<type>GROUP</type>
-<name>Strings</name>
-<pathinfo>
-<pathtype>project_relative</pathtype>
-</pathinfo>
-<is_default>FALSE</is_default>
-<enabled>TRUE</enabled>
-<compress>FALSE</compress>
-<folder_id>4099</folder_id>
-<resource>
-<name>Add New String</name>
-<pathinfo>
-<pathtype>project_relative</pathtype>
-</pathinfo>
-<is_default>FALSE</is_default>
-<enabled>TRUE</enabled>
-<compress>FALSE</compress>
-</resource>
 <resource>
-<name>Add New String</name>
+<type>PIXELMAP</type>
+<name>QQ__20201124221312</name>
 <pathinfo>
+<pathname>..\..\..\..\QQ截图20201124221312.png</pathname>
 <pathtype>project_relative</pathtype>
 </pathinfo>
 <is_default>FALSE</is_default>
 <enabled>TRUE</enabled>
-<compress>FALSE</compress>
+<compress>TRUE</compress>
+<alpha>TRUE</alpha>
+<dither>FALSE</dither>
+<raw>FALSE</raw>
+<color_format>0</color_format>
+<output_file_enabled>FALSE</output_file_enabled>
+<palette_type>None</palette_type>
 </resource>
-<resource>
-<name>Add New String</name>
-<pathinfo>
-<pathtype>project_relative</pathtype>
-</pathinfo>
-<is_default>FALSE</is_default>
-<enabled>TRUE</enabled>
-<compress>FALSE</compress>
 </resource>
-<resource>
-<name>Add New String</name>
-<pathinfo>
-<pathtype>project_relative</pathtype>
-</pathinfo>
-<is_default>FALSE</is_default>
-<enabled>TRUE</enabled>
-<compress>FALSE</compress>
 </resource>
 <resource>
-<name>Add New String</name>
+<type>GROUP</type>
+<name>Strings</name>
 <pathinfo>
 <pathtype>project_relative</pathtype>
 </pathinfo>
 <is_default>FALSE</is_default>
 <enabled>TRUE</enabled>
 <compress>FALSE</compress>
-</resource>
+<folder_id>4099</folder_id>
 <resource>
 <name>Add New String</name>
 <pathinfo>
@@ -2490,27 +2462,35 @@
 <output_file_enabled>FALSE</output_file_enabled>
 <palette_type>None</palette_type>
 </resource>
-</resource>
-</resource>
 <resource>
-<type>GROUP</type>
-<name>Strings</name>
+<type>PIXELMAP</type>
+<name>QQ__20201124221312</name>
 <pathinfo>
+<pathname>..\..\..\..\QQ截图20201124221312.png</pathname>
 <pathtype>project_relative</pathtype>
 </pathinfo>
 <is_default>FALSE</is_default>
 <enabled>TRUE</enabled>
-<compress>FALSE</compress>
-<folder_id>4099</folder_id>
+<compress>TRUE</compress>
+<alpha>TRUE</alpha>
+<dither>FALSE</dither>
+<raw>FALSE</raw>
+<color_format>0</color_format>
+<output_file_enabled>FALSE</output_file_enabled>
+<palette_type>None</palette_type>
+</resource>
+</resource>
+</resource>
 <resource>
-<name>Add New String</name>
+<type>GROUP</type>
+<name>Strings</name>
 <pathinfo>
 <pathtype>project_relative</pathtype>
 </pathinfo>
 <is_default>FALSE</is_default>
 <enabled>TRUE</enabled>
 <compress>FALSE</compress>
-</resource>
+<folder_id>4099</folder_id>
 <resource>
 <name>Add New String</name>
 <pathinfo>
@@ -2593,7 +2573,7 @@
 <English>TRUE</English>
 <string_table>
 <sort_column>0</sort_column>
-<num_strings>11</num_strings>
+<num_strings>12</num_strings>
 <num_languages>1</num_languages>
 <string_record>
 <id>STRING_1</id>
@@ -2645,11 +2625,101 @@
 <font>0</font>
 <val>armbbs</val>
 </string_record>
+<string_record>
+<id>STRING_11</id>
+<font>0</font>
+<val>this is btn</val>
+</string_record>
 </string_table>
+<screen_flow>
+<scale>100</scale>
+<flow_item>
+<screen_name>window_1</screen_name>
+<rect>
+<left>139</left>
+<top>40</top>
+<right>247</right>
+<bottom>118</bottom>
+</rect>
+<enabled>TRUE</enabled>
+<trigger_info>
+<trigger_name>on_gx_signal(gui_id_textbutton0, gx_event_clicked)</trigger_name>
+<signal_id_name>GUI_ID_TextButton0</signal_id_name>
+<trigger_type>child_signal</trigger_type>
+<event_type>GX_EVENT_CLICKED</event_type>
+<action_list>
+<action_info>
+<action_name>Toggle</action_name>
+<action_type>Toggle</action_type>
+<target_widget_name>window</target_widget_name>
+<target_show_child_widgets>FALSE</target_show_child_widgets>
+<parent_show_child_widgets>FALSE</parent_show_child_widgets>
+</action_info>
+</action_list>
+</trigger_info>
+</flow_item>
+<flow_item>
+<screen_name>window</screen_name>
+<rect>
+<left>10</left>
+<top>40</top>
+<right>118</right>
+<bottom>118</bottom>
+</rect>
+<enabled>TRUE</enabled>
+<trigger_info>
+<trigger_name>on_gx_event_pen_down</trigger_name>
+<trigger_type>system_event</trigger_type>
+<event_type>GX_EVENT_PEN_DOWN</event_type>
+<action_list>
+<action_info>
+<action_name>Animation</action_name>
+<action_type>Animation</action_type>
+<target_widget_name>window_1</target_widget_name>
+<target_show_child_widgets>FALSE</target_show_child_widgets>
+<parent_show_child_widgets>FALSE</parent_show_child_widgets>
+<animation_info>
+<start_x>0</start_x>
+<start_y>50</start_y>
+<end_x>0</end_x>
+<end_y>0</end_y>
+<steps>10</steps>
+<frame_interval>1</frame_interval>
+<start_delay>0</start_delay>
+<start_alpha>255</start_alpha>
+<end_alpha>255</end_alpha>
+<detach_target>FALSE</detach_target>
+<push_target>FALSE</push_target>
+</animation_info>
+</action_info>
+</action_list>
+</trigger_info>
+</flow_item>
+</screen_flow>
 <widget_folder>
 <folder_name>default_folder</folder_name>
 <widget>
 <type>window</type>
+<app_name>window</app_name>
+<size>
+<left>0</left>
+<top>41</top>
+<right>127</right>
+<bottom>93</bottom>
+</size>
+<style>1073741824</style>
+<allocation>0</allocation>
+<accepts_focus>TRUE</accepts_focus>
+<normal_fill_color>WINDOW_FILL</normal_fill_color>
+<selected_fill_color>WINDOW_FILL</selected_fill_color>
+<disabled_fill_color>DISABLED_FILL</disabled_fill_color>
+<id_name>GUIX_ID_WINDOW_Logo</id_name>
+<template>FALSE</template>
+<visible_at_startup>FALSE</visible_at_startup>
+<wallpaper>QQ__20201124221312</wallpaper>
+</widget>
+<widget>
+<type>window</type>
 <app_name>window_1</app_name>
 <size>
 <left>0</left>
@@ -2663,17 +2733,17 @@
 <normal_fill_color>WINDOW_FILL</normal_fill_color>
 <selected_fill_color>WINDOW_FILL</selected_fill_color>
 <disabled_fill_color>DISABLED_FILL</disabled_fill_color>
-<id_name>GUIX_ID_WINDOW0</id_name>
+<id_name>GUIX_ID_WINDOW_Main</id_name>
 <template>FALSE</template>
 <visible_at_startup>TRUE</visible_at_startup>
 <widget>
 <type>text_button</type>
 <app_name>button</app_name>
 <size>
-<left>21</left>
-<top>37</top>
-<right>100</right>
-<bottom>60</bottom>
+<left>15</left>
+<top>51</top>
+<right>116</right>
+<bottom>74</bottom>
 </size>
 <style>1073758209</style>
 <allocation>0</allocation>
@@ -2684,54 +2754,12 @@
 <id_name>GUI_ID_TextButton0</id_name>
 <template>FALSE</template>
 <visible_at_startup>FALSE</visible_at_startup>
-<text_id>STRING_9</text_id>
+<text_id>STRING_11</text_id>
 <font_id>BUTTON</font_id>
 <normal_text_color>BTN_TEXT</normal_text_color>
 <selected_text_color>BTN_TEXT</selected_text_color>
 <disabled_text_color>DISABLED_TEXT</disabled_text_color>
 </widget>
-<widget>
-<type>prompt</type>
-<app_name>prompt</app_name>
-<size>
-<left>19</left>
-<top>6</top>
-<right>98</right>
-<bottom>29</bottom>
-</size>
-<style>1073758208</style>
-<allocation>0</allocation>
-<accepts_focus>TRUE</accepts_focus>
-<normal_fill_color>WIDGET_FILL</normal_fill_color>
-<selected_fill_color>SELECTED_FILL</selected_fill_color>
-<disabled_fill_color>DISABLED_FILL</disabled_fill_color>
-<template>FALSE</template>
-<visible_at_startup>FALSE</visible_at_startup>
-<string_id>STRING_10</string_id>
-<font_id>PROMPT</font_id>
-<normal_text_color>TEXT</normal_text_color>
-<selected_text_color>SELECTED_TEXT</selected_text_color>
-<disabled_text_color>DISABLED_TEXT</disabled_text_color>
-</widget>
-</widget>
-<widget>
-<type>window</type>
-<app_name>window</app_name>
-<size>
-<left>0</left>
-<top>37</top>
-<right>127</right>
-<bottom>89</bottom>
-</size>
-<style>1073741824</style>
-<allocation>0</allocation>
-<accepts_focus>TRUE</accepts_focus>
-<normal_fill_color>WINDOW_FILL</normal_fill_color>
-<selected_fill_color>WINDOW_FILL</selected_fill_color>
-<disabled_fill_color>DISABLED_FILL</disabled_fill_color>
-<template>FALSE</template>
-<visible_at_startup>FALSE</visible_at_startup>
-<wallpaper>YXYL_LOGO</wallpaper>
 </widget>
 </widget_folder>
 </display_info>

+ 46 - 5
GUIX Studio OLED Demo/guiapp_resources.c

@@ -6,7 +6,7 @@
 /*  Studio User Guide, or visit our web site at azure.com/rtos                 */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -200,6 +200,43 @@ GX_CONST GX_PIXELMAP DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap =
     16                                       /* height in pixel                */
 };
 
+/* THEME_1_QQ__20201124221312 pixelmap data                                    */
+
+static GX_CONST GX_UBYTE DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data[211] =
+{
+    0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 
+    0xff, 0x97, 0xff, 0xff, 0x97, 0xf3, 0x9d, 0xff, 0x03, 0xeb, 0xad, 0xfb, 0xe7, 
+    0xb5, 0xf7, 0xe3, 0xbd, 0xf3, 0xdf, 0x95, 0x03, 0x8d, 0x03, 0x95, 0xef, 0xdf, 
+    0x91, 0x13, 0x01, 0x03, 0x01, 0x01, 0x8b, 0x91, 0xef, 0xdf, 0x91, 0x03, 0x95, 
+    0x03, 0x91, 0xef, 0xdb, 0x95, 0x13, 0x01, 0x03, 0x01, 0x01, 0x8b, 0x95, 0xeb, 
+    0xdb, 0x99, 0x03, 0x8d, 0x03, 0x99, 0xeb, 0xdb, 0xcd, 0xeb, 0xdb, 0xa1, 0x07, 
+    0x03, 0xa1, 0xeb, 0xdb, 0x91, 0xa7, 0x91, 0xeb, 0xdb, 0xcd, 0xeb, 0xd7, 0xd1, 
+    0xeb, 0xd7, 0xd5, 0xe7, 0xd7, 0xd5, 0xe7, 0xd3, 0xdd, 0xe3, 0xd3, 0x8d, 0x07, 
+    0x03, 0xad, 0x03, 0x91, 0xe3, 0xd3, 0x8d, 0x07, 0x03, 0x8d, 0xa7, 0x8d, 0xe3, 
+    0xcf, 0x91, 0x07, 0x03, 0x8d, 0xa7, 0x91, 0xdf, 0xcf, 0x91, 0x07, 0x03, 0x8d, 
+    0xa7, 0x91, 0xdf, 0xcf, 0x91, 0x07, 0x03, 0x8d, 0xa7, 0x91, 0xdf, 0xcf, 0x91, 
+    0xbf, 0x91, 0xdf, 0xcf, 0x91, 0xbf, 0x91, 0xdf, 0xcb, 0x89, 0x03, 0x89, 0xb7, 
+    0x89, 0x0b, 0x01, 0x01, 0xdf, 0xcf, 0x09, 0x03, 0x03, 0x89, 0xb7, 0x89, 0x0b, 
+    0x03, 0x01, 0xdf, 0xdf, 0x89, 0xaf, 0x89, 0xef, 0xe3, 0x89, 0xa7, 0x89, 0xf3, 
+    0xe3, 0x95, 0x8f, 0x95, 0xf3, 0xeb, 0xc1, 0xe7, 0xf3, 0xb9, 0xe7, 0xff, 0xff, 
+    0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 0xff, 0xff, 0x97, 
+    0xff, 0xff, 0x97
+};
+GX_CONST GX_PIXELMAP DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap =
+{
+    0x00000001,                              /* major version                  */
+    0x00000000,                              /* minor version                  */
+    GX_PIXELMAP_COMPRESSED|GX_PIXELMAP_TRANSPARENT,         /* flags           */
+    GX_COLOR_FORMAT_MONOCHROME,              /* Format                         */
+    (GX_UBYTE *) DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data,
+    sizeof(DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap_data),    /* the size of pixelmap_data*/
+    NULL,
+    0,                                       /* auxiliary data size            */
+    0x00,                                    /* used for transparent iamges    */
+    70,                                      /* width in pixel                 */
+    43                                       /* height in pixel                */
+};
+
 /* THEME_1_YXYL_LOGO pixelmap data                                             */
 
 static GX_CONST GX_UBYTE DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap_data[785] =
@@ -291,6 +328,7 @@ GX_CONST GX_PIXELMAP *display_1_theme_1_pixelmap_table[] =
     &DISPLAY_1_THEME_1_RADIO_OFF_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_ON_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap,
+    &DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap,
     &DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap
 };
 GX_CONST GX_PIXELMAP *display_1_theme_2_pixelmap_table[] =
@@ -300,6 +338,7 @@ GX_CONST GX_PIXELMAP *display_1_theme_2_pixelmap_table[] =
     &DISPLAY_1_THEME_1_RADIO_OFF_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_ON_pixelmap,
     &DISPLAY_1_THEME_1_CHECKBOX_OFF_pixelmap,
+    &DISPLAY_1_THEME_1_QQ__20201124221312_pixelmap,
     &DISPLAY_1_THEME_1_YXYL_LOGO_pixelmap
 };
 
@@ -315,10 +354,11 @@ GX_CONST GX_UBYTE display_1_STRING_7_English[] = "The Second Window";
 GX_CONST GX_UBYTE display_1_STRING_8_English[] = "The Third Window";
 GX_CONST GX_UBYTE display_1_STRING_9_English[] = "armfly";
 GX_CONST GX_UBYTE display_1_STRING_10_English[] = "armbbs";
+GX_CONST GX_UBYTE display_1_STRING_11_English[] = "this is btn";
 
 /* String Table for display_1 language English                                 */
 
-GX_CONST GX_STRING display_1_English_string_table[11] =
+GX_CONST GX_STRING display_1_English_string_table[12] =
 {
     {GX_NULL, 0},
     {(GX_CONST GX_CHAR *)display_1_STRING_1_English, sizeof(display_1_STRING_1_English) - 1},
@@ -330,7 +370,8 @@ GX_CONST GX_STRING display_1_English_string_table[11] =
     {(GX_CONST GX_CHAR *)display_1_STRING_7_English, sizeof(display_1_STRING_7_English) - 1},
     {(GX_CONST GX_CHAR *)display_1_STRING_8_English, sizeof(display_1_STRING_8_English) - 1},
     {(GX_CONST GX_CHAR *)display_1_STRING_9_English, sizeof(display_1_STRING_9_English) - 1},
-    {(GX_CONST GX_CHAR *)display_1_STRING_10_English, sizeof(display_1_STRING_10_English) - 1}
+    {(GX_CONST GX_CHAR *)display_1_STRING_10_English, sizeof(display_1_STRING_10_English) - 1},
+    {(GX_CONST GX_CHAR *)display_1_STRING_11_English, sizeof(display_1_STRING_11_English) - 1}
 };
 
 /*  Language Table                                                             */
@@ -379,7 +420,7 @@ GX_THEME display_1_theme_1 =
     GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_HORIZONTAL,
     29,                                      /* color table size               */
     4,                                       /* font table size                */
-    6,                                       /* pixelmap table size            */
+    7,                                       /* pixelmap table size            */
     0                                        /* palette size                   */
 
 };
@@ -422,7 +463,7 @@ GX_THEME display_1_theme_2 =
     GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_HORIZONTAL,
     29,                                      /* color table size               */
     4,                                       /* font table size                */
-    6,                                       /* pixelmap table size            */
+    7,                                       /* pixelmap table size            */
     0                                        /* palette size                   */
 
 };

+ 6 - 4
GUIX Studio OLED Demo/guiapp_resources.h

@@ -6,7 +6,7 @@
 /*  Studio User Guide, or visit our web site at azure.com/rtos                 */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -40,8 +40,9 @@
 
 /* Pixelmap ID definitions                                                     */
 
-#define GX_PIXELMAP_ID_YXYL_LOGO 5
-#define DISPLAY_1_PIXELMAP_TABLE_SIZE 6
+#define GX_PIXELMAP_ID_QQ__20201124221312 5
+#define GX_PIXELMAP_ID_YXYL_LOGO 6
+#define DISPLAY_1_PIXELMAP_TABLE_SIZE 7
 
 /* String Ids                                                                  */
 
@@ -55,6 +56,7 @@
 #define GX_STRING_ID_STRING_8 8
 #define GX_STRING_ID_STRING_9 9
 #define GX_STRING_ID_STRING_10 10
-#define DISPLAY_1_STRING_TABLE_SIZE 11
+#define GX_STRING_ID_STRING_11 11
+#define DISPLAY_1_STRING_TABLE_SIZE 12
 
 #endif                                       /* sentry                         */

+ 368 - 84
GUIX Studio OLED Demo/guiapp_specifications.c

@@ -6,7 +6,7 @@
 /*  GUIX Studio User Guide, or visit our web site at azure.com/rtos            */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -16,8 +16,8 @@
 #include "guiapp_specifications.h"
 
 static GX_WIDGET *gx_studio_nested_widget_create(GX_BYTE *control, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent);
-WINDOW_1_CONTROL_BLOCK window_1;
 WINDOW_CONTROL_BLOCK window;
+WINDOW_1_CONTROL_BLOCK window_1;
 GX_DISPLAY display_1_control_block;
 GX_WINDOW_ROOT display_1_root_window;
 GX_CANVAS  display_1_canvas_control_block;
@@ -46,6 +46,297 @@ GX_STUDIO_DISPLAY_INFO guiapp_display_table[1] =
     }
 };
 
+static VOID gx_studio_screen_toggle(GX_WIDGET *target1, GX_WIDGET *target2)
+{
+    GX_WIDGET *parent = target1->gx_widget_parent;
+    if (parent)
+    {
+        gx_widget_detach(target1);
+        gx_widget_attach(parent, target2);
+        if (target1->gx_widget_status & GX_STATUS_STUDIO_CREATED)
+        {
+            gx_widget_delete(target1);
+        }
+    }
+}
+
+static GX_WIDGET *gx_studio_action_target_get(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    INT        search_depth;
+    GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET)
+    {
+                                             /* dynamically create the target widget */
+        widget_define = (GX_STUDIO_WIDGET *) action->target;
+        if(action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+        {
+            gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent);
+            search_depth = GX_SEARCH_DEPTH_INFINITE;
+        }
+        else
+        {
+            parent = (GX_WIDGET *)action->parent;
+            search_depth = 1;
+        }
+        gx_widget_find(parent, widget_define->widget_id, search_depth, &target);
+        if (target == GX_NULL)
+        {
+            target = gx_studio_widget_create(GX_NULL, widget_define, GX_NULL);
+        }
+        if (target)
+        {
+            target->gx_widget_status |= GX_STATUS_STUDIO_CREATED;
+        }
+    }
+    else
+    {
+        target = (GX_WIDGET *) action->target;
+    }
+    return target;
+}
+
+static GX_WIDGET *gx_studio_action_target_find(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET)
+    {
+                                             /* Find the dynamically created target */
+        widget_define = (GX_STUDIO_WIDGET *) action->target;
+        if(action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+        {
+            gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent);
+        }
+        else
+        {
+            parent = (GX_WIDGET *)action->parent;
+        }
+        gx_widget_find(parent, widget_define->widget_id, GX_SEARCH_DEPTH_INFINITE, &target);
+    }
+    else
+    {
+        target = (GX_WIDGET *) action->target;
+    }
+    return target;
+}
+
+static GX_WIDGET *gx_studio_action_parent_find(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+GX_WIDGET *parent = GX_NULL;
+GX_STUDIO_WIDGET *widget_define;
+
+    if (action->flags & GX_ACTION_FLAG_DYNAMIC_PARENT)
+    {
+                                             /* Find the dynamically created target */
+        widget_define = (GX_STUDIO_WIDGET *)action->parent; 
+        gx_window_root_find(current, (GX_WINDOW_ROOT **)&parent); 
+        gx_widget_find(parent, widget_define->widget_id, GX_SEARCH_DEPTH_INFINITE, &parent); 
+    }
+    else
+    {
+        parent = (GX_WIDGET *)action->parent; 
+    }
+    return parent; 
+}
+
+static VOID gx_studio_animation_execute(GX_WIDGET *current, GX_CONST GX_STUDIO_ACTION *action)
+{
+    GX_ANIMATION *animation;
+    GX_ANIMATION_INFO animation_info;
+    GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    gx_system_animation_get(&animation);
+    if (animation)
+    {
+        animation_info = *action->animation;
+
+        if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+           (action->flags & GX_ACTION_FLAG_POP_PARENT))
+        {
+            gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+        }
+
+        if(action->flags & GX_ACTION_FLAG_POP_TARGET)
+        {
+            animation_info.gx_animation_target = target;
+        }
+
+        if(action->flags & GX_ACTION_FLAG_POP_PARENT)
+        {
+            animation_info.gx_animation_parent = (GX_WIDGET *)parent;
+        }
+
+        if ((!animation_info.gx_animation_target) &&
+            (action->flags & GX_ACTION_FLAG_DYNAMIC_TARGET))
+        {
+            target = gx_studio_action_target_get(current, action);
+            animation_info.gx_animation_target = target;
+        }
+
+        if (!animation_info.gx_animation_parent)
+        {
+            animation_info.gx_animation_parent = gx_studio_action_parent_find(current, action);
+        }
+
+        if (animation_info.gx_animation_target &&
+            animation_info.gx_animation_parent)
+        {
+            gx_animation_start(animation, &animation_info);
+        }
+    }
+}
+
+UINT gx_studio_auto_event_handler(GX_WIDGET *widget, GX_EVENT *event_ptr, GX_CONST GX_STUDIO_EVENT_PROCESS *record)
+{
+    UINT status = GX_SUCCESS;
+    GX_CONST GX_STUDIO_ACTION *action;
+    GX_CONST GX_WIDGET *parent = GX_NULL;
+    GX_WIDGET *target = GX_NULL;
+    GX_CONST GX_STUDIO_EVENT_ENTRY *entry = record->event_table;
+
+    while(entry->event_type)
+    {
+        if (entry->event_type == event_ptr->gx_event_type)
+        {
+            if((entry->event_type == GX_EVENT_ANIMATION_COMPLETE) &&
+               (entry->event_sender != event_ptr->gx_event_sender))
+            {
+                entry++;
+                continue;
+            }
+            action = entry->action_list;
+
+            while(action->opcode)
+            {
+                switch(action->opcode)
+                {
+                case GX_ACTION_TYPE_ATTACH:
+                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+                    }
+
+                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        parent = action->parent;
+                    }
+                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    if (parent && target)
+                    {
+                        gx_widget_attach(parent, target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_DETACH:
+                    target = gx_studio_action_target_find(widget, action);
+                    if (target)
+                    {
+                        gx_widget_detach(target);
+                        if (target->gx_widget_status & GX_STATUS_STUDIO_CREATED)
+                        {
+                            gx_widget_delete(target);
+                        }
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_TOGGLE:
+                    if(action->flags & GX_ACTION_FLAG_POP_TARGET)
+                    {
+                       gx_system_screen_stack_get(GX_NULL, &target);
+                    }
+                    else
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    gx_studio_screen_toggle(widget, target);
+                    break;
+
+                case GX_ACTION_TYPE_SHOW:
+                    target = gx_studio_action_target_get(widget, action);
+                    if(target)
+                    {
+                        gx_widget_show(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_HIDE:
+                    target = gx_studio_action_target_find(widget, action);
+                    if(target)
+                    {
+                        gx_widget_hide(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_ANIMATION:
+                    gx_studio_animation_execute(widget, action);
+                    break;
+
+                case GX_ACTION_TYPE_WINDOW_EXECUTE:
+                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
+                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
+                    }
+
+                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
+                    {
+                        parent = widget->gx_widget_parent;
+                    }
+                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
+                    {
+                        target = gx_studio_action_target_get(widget, action);
+                    }
+                    if (parent && target)
+                    {
+                        gx_widget_attach(parent, target);
+                        gx_window_execute((GX_WINDOW *) target, GX_NULL);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_WINDOW_EXECUTE_STOP:
+                    return event_ptr->gx_event_sender;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_PUSH:
+                    target = gx_studio_action_target_get(widget, action);
+                    if(target)
+                    {
+                        gx_system_screen_stack_push(target);
+                    }
+                    break;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_POP:
+                    gx_system_screen_stack_pop();
+                    break;
+
+                case GX_ACTION_TYPE_SCREEN_STACK_RESET:
+                    gx_system_screen_stack_reset();
+                    break;
+
+                default:
+                    break;
+                }
+                action++;
+            }
+        }
+        entry++;
+    }
+
+    if (record->chain_event_handler)
+    {
+        status = record->chain_event_handler(widget, event_ptr);
+    }
+    return status;
+}
+
 
 UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
 {
@@ -65,24 +356,6 @@ UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *co
     return status;
 }
 
-UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
-{
-    UINT status;
-    GX_PROMPT *prompt = (GX_PROMPT *) control_block;
-    GX_PROMPT_PROPERTIES *props = (GX_PROMPT_PROPERTIES *) info->properties;
-    status = gx_prompt_create(prompt, info->widget_name, parent, props->string_id, info->style, info->widget_id, &info->size);
-    if (status == GX_SUCCESS)
-    {
-        gx_prompt_font_set(prompt, props->font_id);
-#if defined(GUIX_5_4_0_COMPATIBILITY)
-        gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id);
-#else
-        gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id, props->disabled_text_color_id);
-#endif
-    }
-    return status;
-}
-
 UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent)
 {
     UINT status;
@@ -98,49 +371,71 @@ UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control
     }
     return status;
 }
-GX_WINDOW_PROPERTIES window_1_properties =
+GX_WINDOW_PROPERTIES window_properties =
 {
-    0                                        /* wallpaper pixelmap id          */
+    GX_PIXELMAP_ID_QQ__20201124221312        /* wallpaper pixelmap id          */
 };
-GX_TEXT_BUTTON_PROPERTIES window_1_button_properties =
-{
-    GX_STRING_ID_STRING_9,                   /* string id                      */
-    GX_FONT_ID_BUTTON,                       /* font id                        */
-    GX_COLOR_ID_BTN_TEXT,                    /* normal text color              */
-    GX_COLOR_ID_BTN_TEXT,                    /* selected text color            */
-    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
+
+GX_ANIMATION_INFO window_animation_1 = {
+    (GX_WIDGET *) &window_1,
+    (GX_WIDGET *) &display_1_root_window,
+    GX_NULL,
+    GX_ANIMATION_TRANSLATE, 0, 0, 1,
+    {0, 50}, {0, 0}, 255, 255, 10
 };
-GX_PROMPT_PROPERTIES window_1_prompt_properties =
-{
-    GX_STRING_ID_STRING_10,                  /* string id                      */
-    GX_FONT_ID_PROMPT,                       /* font id                        */
-    GX_COLOR_ID_TEXT,                        /* normal text color              */
-    GX_COLOR_ID_SELECTED_TEXT,               /* selected text color            */
-    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
+
+
+GX_STUDIO_ACTION window_on_gx_event_pen_downactions[2] = {
+    {GX_ACTION_TYPE_ANIMATION, 0, &display_1_root_window, &window_1, &window_animation_1},
+    {0, 0, GX_NULL, GX_NULL, GX_NULL}
+};
+
+static GX_STUDIO_EVENT_ENTRY gx_studio_window_event_table[] = {
+    { GX_EVENT_PEN_DOWN, 0, window_on_gx_event_pen_downactions},
+    {0, 0, GX_NULL}
 };
 
-GX_CONST GX_STUDIO_WIDGET window_1_prompt_define =
+GX_STUDIO_EVENT_PROCESS window_event_chain = {gx_studio_window_event_table, (UINT (*)(GX_WIDGET *, GX_EVENT *))gx_window_event_process};
+static UINT gx_studio_window_event_process(GX_WIDGET *target, GX_EVENT *event_ptr)
+{
+    return (gx_studio_auto_event_handler(target, event_ptr, &window_event_chain));
+}
+
+
+GX_CONST GX_STUDIO_WIDGET window_define =
 {
-    "prompt",
-    GX_TYPE_PROMPT,                          /* widget type                    */
-    GX_ID_NONE,                              /* widget id                      */
+    "window",
+    GX_TYPE_WINDOW,                          /* widget type                    */
+    GUIX_ID_WINDOW_Logo,                     /* widget id                      */
     #if defined(GX_WIDGET_USER_DATA)
     0,                                       /* user data                      */
     #endif
-    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED|GX_STYLE_TEXT_CENTER,   /* style flags */
+    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED,   /* style flags                    */
     GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
-    sizeof(GX_PROMPT),                       /* control block size             */
-    GX_COLOR_ID_WIDGET_FILL,                 /* normal color id                */
-    GX_COLOR_ID_SELECTED_FILL,               /* selected color id              */
+    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
+    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
+    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
     GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
-    gx_studio_prompt_create,                 /* create function                */
+    gx_studio_window_create,                 /* create function                */
     GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
-    {19, 6, 98, 29},                         /* widget size                    */
-    GX_NULL,                                 /* no next widget                 */
-    GX_NULL,                                 /* no child widgets               */ 
-    offsetof(WINDOW_1_CONTROL_BLOCK, window_1_prompt), /* control block        */
-    (void *) &window_1_prompt_properties     /* extended properties            */
+    (UINT (*)(GX_WIDGET *, GX_EVENT *)) gx_studio_window_event_process, /* event function override */
+    {0, 41, 127, 93},                        /* widget size                    */
+    GX_NULL,                                 /* next widget                    */
+    GX_NULL,                                 /* child widget                   */
+    0,                                       /* control block                  */
+    (void *) &window_properties              /* extended properties            */
+};
+GX_WINDOW_PROPERTIES window_1_properties =
+{
+    0                                        /* wallpaper pixelmap id          */
+};
+GX_TEXT_BUTTON_PROPERTIES window_1_button_properties =
+{
+    GX_STRING_ID_STRING_11,                  /* string id                      */
+    GX_FONT_ID_BUTTON,                       /* font id                        */
+    GX_COLOR_ID_BTN_TEXT,                    /* normal text color              */
+    GX_COLOR_ID_BTN_TEXT,                    /* selected text color            */
+    GX_COLOR_ID_DISABLED_TEXT                /* disabled text color            */
 };
 
 GX_CONST GX_STUDIO_WIDGET window_1_button_define =
@@ -160,18 +455,35 @@ GX_CONST GX_STUDIO_WIDGET window_1_button_define =
     gx_studio_text_button_create,            /* create function                */
     GX_NULL,                                 /* drawing function override      */
     GX_NULL,                                 /* event function override        */
-    {21, 37, 100, 60},                       /* widget size                    */
-    &window_1_prompt_define,                 /* next widget definition         */
+    {15, 51, 116, 74},                       /* widget size                    */
+    GX_NULL,                                 /* no next widget                 */
     GX_NULL,                                 /* no child widgets               */ 
     offsetof(WINDOW_1_CONTROL_BLOCK, window_1_button), /* control block        */
     (void *) &window_1_button_properties     /* extended properties            */
 };
 
+GX_STUDIO_ACTION window_1__gui_id_textbutton0_gx_event_clicked_actions[2] = {
+    {GX_ACTION_TYPE_TOGGLE, 0, &display_1_root_window, &window, GX_NULL},
+    {0, 0, GX_NULL, GX_NULL, GX_NULL}
+};
+
+static GX_STUDIO_EVENT_ENTRY gx_studio_window_1_event_table[] = {
+    {GX_SIGNAL(GUI_ID_TextButton0, GX_EVENT_CLICKED), 0, window_1__gui_id_textbutton0_gx_event_clicked_actions},
+    {0, 0, GX_NULL}
+};
+
+GX_STUDIO_EVENT_PROCESS window_1_event_chain = {gx_studio_window_1_event_table, (UINT (*)(GX_WIDGET *, GX_EVENT *))gx_window_event_process};
+static UINT gx_studio_window_1_event_process(GX_WIDGET *target, GX_EVENT *event_ptr)
+{
+    return (gx_studio_auto_event_handler(target, event_ptr, &window_1_event_chain));
+}
+
+
 GX_CONST GX_STUDIO_WIDGET window_1_define =
 {
     "window_1",
     GX_TYPE_WINDOW,                          /* widget type                    */
-    GUIX_ID_WINDOW0,                         /* widget id                      */
+    GUIX_ID_WINDOW_Main,                     /* widget id                      */
     #if defined(GX_WIDGET_USER_DATA)
     0,                                       /* user data                      */
     #endif
@@ -183,45 +495,17 @@ GX_CONST GX_STUDIO_WIDGET window_1_define =
     GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
     gx_studio_window_create,                 /* create function                */
     GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
+    (UINT (*)(GX_WIDGET *, GX_EVENT *)) gx_studio_window_1_event_process, /* event function override */
     {0, 0, 127, 127},                        /* widget size                    */
     GX_NULL,                                 /* next widget                    */
     &window_1_button_define,                 /* child widget                   */
     0,                                       /* control block                  */
     (void *) &window_1_properties            /* extended properties            */
 };
-GX_WINDOW_PROPERTIES window_properties =
-{
-    GX_PIXELMAP_ID_YXYL_LOGO                 /* wallpaper pixelmap id          */
-};
-
-GX_CONST GX_STUDIO_WIDGET window_define =
-{
-    "window",
-    GX_TYPE_WINDOW,                          /* widget type                    */
-    GX_ID_NONE,                              /* widget id                      */
-    #if defined(GX_WIDGET_USER_DATA)
-    0,                                       /* user data                      */
-    #endif
-    GX_STYLE_BORDER_NONE|GX_STYLE_ENABLED,   /* style flags                    */
-    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
-    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
-    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
-    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
-    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
-    gx_studio_window_create,                 /* create function                */
-    GX_NULL,                                 /* drawing function override      */
-    GX_NULL,                                 /* event function override        */
-    {0, 37, 127, 89},                        /* widget size                    */
-    GX_NULL,                                 /* next widget                    */
-    GX_NULL,                                 /* child widget                   */
-    0,                                       /* control block                  */
-    (void *) &window_properties              /* extended properties            */
-};
 GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
 {
-    { &window_1_define, (GX_WIDGET *) &window_1 },
     { &window_define, (GX_WIDGET *) &window },
+    { &window_1_define, (GX_WIDGET *) &window_1 },
     {GX_NULL, GX_NULL}
 };
 

+ 37 - 20
GUIX Studio OLED Demo/guiapp_specifications.h

@@ -6,7 +6,7 @@
 /*  GUIX Studio User Guide, or visit our web site at azure.com/rtos            */
 /*                                                                             */
 /*  GUIX Studio Revision 6.1.0.0                                               */
-/*  Date (dd.mm.yyyy): 13.11.2020   Time (hh:mm): 10:10                        */
+/*  Date (dd.mm.yyyy): 24.11.2020   Time (hh:mm): 22:29                        */
 /*******************************************************************************/
 
 
@@ -22,8 +22,9 @@ extern   "C" {
 
 /* Define widget ids                                                           */
 
-#define GUIX_ID_WINDOW0 1
-#define GUI_ID_TextButton0 2
+#define GUIX_ID_WINDOW_Logo 1
+#define GUIX_ID_WINDOW_Main 2
+#define GUI_ID_TextButton0 3
 
 
 /* Define animation ids                                                        */
@@ -35,6 +36,32 @@ extern   "C" {
 
 #define GX_NEXT_USER_EVENT_ID GX_FIRST_USER_EVENT
 
+#define GX_ACTION_FLAG_DYNAMIC_TARGET 0x01
+#define GX_ACTION_FLAG_DYNAMIC_PARENT 0x02
+#define GX_ACTION_FLAG_POP_TARGET     0x04
+#define GX_ACTION_FLAG_POP_PARENT     0x08
+
+typedef struct GX_STUDIO_ACTION_STRUCT
+{
+    GX_UBYTE opcode;
+    GX_UBYTE flags;
+    GX_CONST VOID *parent;
+    GX_CONST VOID *target;
+    GX_CONST GX_ANIMATION_INFO  *animation;
+} GX_STUDIO_ACTION;
+
+typedef struct GX_STUDIO_EVENT_ENTRY_STRUCT
+{
+    ULONG event_type;
+    USHORT event_sender;
+    GX_CONST GX_STUDIO_ACTION *action_list;
+} GX_STUDIO_EVENT_ENTRY;
+
+typedef struct GX_STUDIO_EVENT_PROCESS_STRUCT 
+{
+    GX_CONST GX_STUDIO_EVENT_ENTRY *event_table;
+    UINT (*chain_event_handler)(GX_WIDGET *, GX_EVENT *);
+} GX_STUDIO_EVENT_PROCESS;
 
 /* Declare properties structures for each utilized widget type                 */
 
@@ -77,15 +104,6 @@ typedef struct
     GX_RESOURCE_ID disabled_text_color_id;
 } GX_TEXT_BUTTON_PROPERTIES;
 
-typedef struct
-{
-    GX_RESOURCE_ID string_id;
-    GX_RESOURCE_ID font_id;
-    GX_RESOURCE_ID normal_text_color_id;
-    GX_RESOURCE_ID selected_text_color_id;
-    GX_RESOURCE_ID disabled_text_color_id;
-} GX_PROMPT_PROPERTIES;
-
 typedef struct
 {
     GX_RESOURCE_ID wallpaper_id;
@@ -94,24 +112,23 @@ typedef struct
 
 /* Declare top-level control blocks                                            */
 
-typedef struct WINDOW_1_CONTROL_BLOCK_STRUCT
+typedef struct WINDOW_CONTROL_BLOCK_STRUCT
 {
     GX_WINDOW_MEMBERS_DECLARE
-    GX_TEXT_BUTTON window_1_button;
-    GX_PROMPT window_1_prompt;
-} WINDOW_1_CONTROL_BLOCK;
+} WINDOW_CONTROL_BLOCK;
 
-typedef struct WINDOW_CONTROL_BLOCK_STRUCT
+typedef struct WINDOW_1_CONTROL_BLOCK_STRUCT
 {
     GX_WINDOW_MEMBERS_DECLARE
-} WINDOW_CONTROL_BLOCK;
+    GX_TEXT_BUTTON window_1_button;
+} WINDOW_1_CONTROL_BLOCK;
 
 
 /* extern statically defined control blocks                                    */
 
 #ifndef GUIX_STUDIO_GENERATED_FILE
-extern WINDOW_1_CONTROL_BLOCK window_1;
 extern WINDOW_CONTROL_BLOCK window;
+extern WINDOW_1_CONTROL_BLOCK window_1;
 #endif
 
 /* Declare event process functions, draw functions, and callback functions     */
@@ -142,11 +159,11 @@ typedef struct GX_STUDIO_DISPLAY_INFO_STRUCT
 /* Declare Studio-generated functions for creating top-level widgets           */
 
 UINT gx_studio_text_button_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
-UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
 UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent);
 GX_WIDGET *gx_studio_widget_create(GX_BYTE *storage, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent);
 UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget);
 UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *), GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root);
+UINT gx_studio_auto_event_handler(GX_WIDGET *widget, GX_EVENT *event_ptr, GX_CONST GX_STUDIO_EVENT_PROCESS *record);
 
 /* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.                                                 */

+ 3 - 0
Port/SConscript

@@ -5,6 +5,9 @@ import rtconfig
 cwd     = GetCurrentDir()
 src     = Glob('gx_system_rtos_bind_rtthread.c')
 
+if GetDepend(['GUIX_VIRTUAL_DISPLAY_MONO']):
+    src += Glob('guix_virtual_display_mono.c')
+    
 CPPPATH = [cwd]
 
 group = DefineGroup('GUIX/Port', src, depend = ['PKG_USING_AZUREGUIX'], CPPPATH = CPPPATH)

+ 231 - 0
Port/guix_virtual_display_mono.c

@@ -0,0 +1,231 @@
+/* 
+*	模块名称 : GUI单色屏虚拟设备
+*	文件名称 : guix_virtual_display_mono.c
+*	版    本 : V1.0
+*	说    明 : 
+*              
+*	修改记录 :
+*		版本号   日期         作者          说明
+*       V1.0    2020-11-26   HelloByeAll    首版           
+*        
+*
+*/
+
+#include <rtthread.h>
+#include <board.h>
+#include <gx_user.h>
+
+#ifdef GUIX_VIRTUAL_DISPLAY_MONO
+
+#ifndef GUIX_VIRTUAL_DISPLAY_SERIAL_DEV
+#define GUIX_VIRTUAL_DISPLAY_SERIAL_DEV "uart2"
+#endif // !GUIX_VIRTUAL_DISPLAY_SERIAL_DEV
+
+    static rt_sem_t serial_sem;
+static rt_device_t uart_device;
+
+typedef struct
+{
+    rt_uint8_t addr[2];
+    rt_uint16_t len;
+} virtual_display_t;
+
+static virtual_display_t virtual_serial = {0xBB, 0xCC, 2048};
+void show_virtual_display(rt_uint8_t *p)
+{
+    rt_device_write(uart_device, 0, &virtual_serial, 4);
+    rt_device_write(uart_device, 0, p, 2048);
+}
+
+static void key_cb(rt_uint8_t key, rt_uint8_t state)
+{
+    switch (key)
+    {
+    case 1:
+        if (state)
+        {
+            /* 按键1长按 */
+        }
+        else
+        {
+            /* 按键1短按 */
+        }
+        break;
+
+    case 2:
+        if (state)
+        {
+            /* 按键2长按 */
+        }
+        else
+        {
+            /* 按键2短按 */
+        }
+        break;
+
+    case 3:
+        if (state)
+        {
+            /* 按键3长按 */
+        }
+        else
+        {
+            /* 按键3短按 */
+        }
+        break;
+    }
+}
+
+static void send_coordinate_to_guix(rt_uint8_t x, rt_uint8_t y, rt_uint8_t state)
+{
+    extern ULONG display_1_canvas_memory[512];
+    static rt_uint8_t x1, y1, state1;
+
+    GX_EVENT event;
+    event.gx_event_type = 0;
+
+    if (x == 0xEE)
+    {
+        key_cb(y, state);
+        return;
+    }
+
+    if (x1 != x || y1 != y)
+    {
+        x1 = x;
+        y1 = y;
+
+        if (state1 == state && state == 1)
+        {
+            event.gx_event_type = GX_EVENT_PEN_DRAG;
+        }
+    }
+
+    if (state1 != state)
+    {
+        state1 = state;
+        if (state == 1)
+            event.gx_event_type = GX_EVENT_PEN_DOWN;
+        else
+            event.gx_event_type = GX_EVENT_PEN_UP;
+    }
+
+    if (event.gx_event_type != 0)
+    {
+        event.gx_event_payload.gx_event_pointdata.gx_point_x = x1;
+        event.gx_event_payload.gx_event_pointdata.gx_point_y = y1;
+        event.gx_event_sender = 0;
+        event.gx_event_target = 0;
+        event.gx_event_display_handle = (ULONG *)display_1_canvas_memory;
+        gx_system_event_send(&event);
+    }
+
+    // rt_kprintf("x = %d, y = %d  state = %d\r\n", x, y, state);
+}
+
+static void check_data(rt_uint8_t *data)
+{
+    rt_uint8_t sum = 0;
+    for (size_t i = 0; i < 6; i++)
+    {
+        sum += data[i];
+    }
+    if (data[6] == sum)
+    {
+        send_coordinate_to_guix(data[3], data[4], data[5]);
+    }
+}
+
+static void receive_data_prepare(rt_uint8_t ch)
+{
+    static rt_uint8_t len;
+    static rt_uint8_t date[10];
+    date[len] = ch;
+    if (len == 0 && ch == 0xBB)
+        len++;
+
+    else if (len == 1 && ch == 0xCC)
+        len++;
+
+    else if (len == 2 && ch == 0x02)
+        len++;
+
+    else if (len >= 3 && len <= 5)
+        len++;
+
+    else if (len == 6)
+    {
+        check_data(date);
+        len = 0;
+    }
+    else
+        len = 0;
+}
+
+static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
+{
+    rt_sem_release(serial_sem);
+
+    return RT_EOK;
+}
+
+static void virtual_serial_thread_entry(void *par)
+{
+    char ch;
+
+    while (1)
+    {
+        while (rt_device_read(uart_device, -1, &ch, 1) != 1)
+        {
+            rt_sem_take(serial_sem, RT_WAITING_FOREVER);
+        }
+        receive_data_prepare((rt_uint8_t)ch);
+    }
+}
+
+static void rt_virtual_serial_init(char *name)
+{
+    serial_sem = rt_sem_create("mono_sem", 0, RT_IPC_FLAG_FIFO);
+
+    uart_device = rt_device_find(name);
+
+    struct serial_configure use_config = {
+        BAUD_RATE_921600,   /* 921600 bits/s */
+        DATA_BITS_8,        /* 8 databits */
+        STOP_BITS_1,        /* 1 stopbit */
+        PARITY_NONE,        /* No parity  */
+        BIT_ORDER_LSB,      /* LSB first sent */
+        NRZ_NORMAL,         /* Normal mode */
+        RT_SERIAL_RB_BUFSZ, /* Buffer size */
+        0};
+
+    rt_device_open(uart_device, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX);
+
+    if (RT_EOK != rt_device_control(uart_device, RT_DEVICE_CTRL_CONFIG, (void *)&use_config))
+    {
+        rt_kprintf("uart config baud rate failed.\n");
+    }
+
+    rt_device_set_rx_indicate(uart_device, uart_input);
+
+    return;
+}
+
+static void virtual_display_init(void)
+{
+    rt_virtual_serial_init(GUIX_VIRTUAL_DISPLAY_SERIAL_DEV);
+
+    rt_thread_t thread = RT_NULL;
+    /* Create background ticks thread */
+    thread = rt_thread_create("virtual", virtual_serial_thread_entry, RT_NULL, 512, 15, 10);
+    if (thread != RT_NULL)
+    {
+        rt_thread_startup(thread);
+    }
+}
+INIT_APP_EXPORT(virtual_display_init);
+
+#endif // GUIX_VIRTUAL_DISPLAY_MONO
+
+/*************************************** (END OF FILE) ****************************************/
+

+ 21 - 18
Port/gx_system_rtos_bind_rtthread.c

@@ -1,13 +1,15 @@
-/**************************************************************************/
-/**************************************************************************/
-/**                                                                       */
-/** GUIX Component                                                        */
-/**                                                                       */
-/**   System Management (System)                                          */
-/**                                                                       */
-/**************************************************************************/
-
-//#define GX_SOURCE_CODE
+/* 
+*	模块名称 : guix rt-thread兼容层
+*	文件名称 : gx_system_rtos_bind_rtthread.c
+*	版    本 : V1.0
+*	说    明 : 
+*              
+*	修改记录 :
+*		版本号   日期         作者          说明
+*       V1.0    2020-11-20   HelloByeAll    首版           
+*        
+*
+*/
 
 /* Include necessary system files.  */
 
@@ -15,7 +17,6 @@
 #include "gx_system.h"
 #include "gx_system_rtos_bind.h"
 
-
 #ifndef GX_THREADX_BINDING
 
 /* This is an example of a generic RTOS binding. We have #ifdefed this code out
@@ -49,7 +50,6 @@ char guix_timer_task_stack[GX_TIMER_TASK_STACK_SIZE];
 /* define semaphore for lock/unlock macros */
 struct rt_mutex guix_system_lock_mutex;
 
-
 struct rt_thread guix_tcb;
 struct rt_thread guix_timer_tcb;
 
@@ -65,12 +65,12 @@ typedef struct guix_linked_event_struct
 
 typedef struct guix_event_queue_struct
 {
-    GUIX_LINKED_EVENT *first;    /* first (oldest) event in fifo */
-    GUIX_LINKED_EVENT *last;     /* last (newest) event in fifo  */
-    GUIX_LINKED_EVENT *free;     /* linked list of free events   */
-    GUIX_LINKED_EVENT *free_end; /* end of the free list         */
+    GUIX_LINKED_EVENT *first;      /* first (oldest) event in fifo */
+    GUIX_LINKED_EVENT *last;       /* last (newest) event in fifo  */
+    GUIX_LINKED_EVENT *free;       /* linked list of free events   */
+    GUIX_LINKED_EVENT *free_end;   /* end of the free list         */
     struct rt_semaphore count_sem; /* number of queued events      */
-    struct rt_mutex lock;        /* lock to protect queue update */
+    struct rt_mutex lock;          /* lock to protect queue update */
 } GUIX_EVENT_QUEUE;
 
 /* an array of GX_EVENTs used to implement fifo queue */
@@ -111,7 +111,8 @@ VOID gx_generic_rtos_initialize(VOID)
     rt_sem_init(&guix_event_queue.count_sem, "gx_queue_count", 0, RT_IPC_FLAG_FIFO);
 }
 
-VOID (*gx_system_thread_entry)(ULONG);
+VOID(*gx_system_thread_entry)
+(ULONG);
 
 // A small shell function to convert the void * arg expected by uC/OS to
 // a ULONG parameter expected by GUIX thread entry
@@ -387,3 +388,5 @@ VOID gx_generic_time_delay(int ticks)
 #endif //(GUIX_BINDING_RT_THREAD)
 
 #endif //(GX_THREADX_BINDING)
+
+/*************************************** (END OF FILE) ****************************************/

+ 0 - 1
Port/gx_user.h

@@ -17,7 +17,6 @@
 
 #ifndef __TX_USER_H
 #define __TX_USER_H
-//#include "tx_user.h"
 #include "gx_api.h"
 
 /*

+ 102 - 0
README.md

@@ -2,6 +2,8 @@
 
 改软件包目前只有单色屏,RGB屏需自行修改驱动接口。请阅读pdf寻找修改方式
 
+调用MainTask.c中的MainTask();即可完成初始化
+
 开发者使用时需自行更改Examples中MainTask.c中的下列参数
 
 ```
@@ -29,3 +31,103 @@ extern void transfer_data(uint8_t *data, uint8_t len);
 
 使用GUIX Studio可打开GUIX Studio OLED Demo中的工程
 GUIX Studio生成的文件需要替换Example文件夹中的同名文件才能生效
+
+
+
+##### 虚拟设备 GUIX_VIRTUAL_DISPLAY_MONO
+
+**虚拟设备目前仅为128*128的单色设备**
+
+虚拟设备使用串口发送至上位机,开发者需要根据自身硬件选择波特率,若不使用DMA建议最大波特率设置成460800! 并用中断接收方式打开设备
+
+```
+rt_device_open(uart_device, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX);
+```
+
+
+
+```
+static void rt_virtual_serial_init(char *name)
+{
+    serial_sem = rt_sem_create("mono_sem", 0, RT_IPC_FLAG_FIFO);
+
+    uart_device = rt_device_find(name);
+
+    struct serial_configure use_config = {
+        BAUD_RATE_921600,   /* 921600 bits/s */
+        DATA_BITS_8,        /* 8 databits */
+        STOP_BITS_1,        /* 1 stopbit */
+        PARITY_NONE,        /* No parity  */
+        BIT_ORDER_LSB,      /* LSB first sent */
+        NRZ_NORMAL,         /* Normal mode */
+        RT_SERIAL_RB_BUFSZ, /* Buffer size */
+        0};
+
+    rt_device_open(uart_device, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX);
+
+    if (RT_EOK != rt_device_control(uart_device, RT_DEVICE_CTRL_CONFIG, (void *)&use_config))
+    {
+        rt_kprintf("uart config baud rate failed.\n");
+    }
+
+    rt_device_set_rx_indicate(uart_device, uart_input);
+
+    return;
+}
+```
+
+![Virtual Display](./Virtual Display\Virtual Display.jpg)
+
+1.上位机使用鼠标模拟按键操作 右上角显示为当前坐标和触摸状态。
+
+2.上位机右上方三个按键已绑定数字键盘 ”1",  2“,  "3",已实现长按短按。
+
+用户在
+
+```
+guix_virtual_display_mono.c 文件中加入按键回调即可
+```
+
+
+
+```
+static void key_cb(rt_uint8_t key, rt_uint8_t state)
+{
+    switch (key)
+    {
+    case 1:
+        if (state)
+        {
+            /* 按键1长按 */
+        }
+        else
+        {
+            /* 按键1短按 */
+        }
+        break;
+
+    case 2:
+        if (state)
+        {
+            /* 按键2长按 */
+        }
+        else
+        {
+            /* 按键2短按 */
+        }
+        break;
+
+    case 3:
+        if (state)
+        {
+            /* 按键3长按 */
+        }
+        else
+        {
+            /* 按键3短按 */
+        }
+        break;
+    }
+}
+
+```

BIN
Virtual Display/Virtual Display.exe


BIN
Virtual Display/Virtual Display.jpg