OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6587|回复: 3

实体按键使用GUI_StoreKeyMsg和GUI_SendKeyMsg。发现GUI_StoreKeyMsg不能连续工作

[复制链接]

12

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-9-21
在线时间
59 小时
发表于 2016-12-18 14:30:24 | 显示全部楼层 |阅读模式
1金钱
正点原子的F407开发板:
将原先用于更新字库的任务,改成键盘扫描功能;GUI功能,是安富莱那边抄过来的:
key0对应GUI_KEY_ENTER键值。对话框的WM_KEY 消息处理中,是开印Log。
我发现GUI_StoreKeyMsg能连续工作,而GUI_SendKeyMsg会导致HardFault_Handler。  什么原因,大虾指点!

void fontupdata_task(void *pdata)
{
    OS_ERR err;
    while(1)
    {
        if(KEY0 == 0)                //KEY0键按下
        {
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
            if(KEY0 == 0)            //还KEY0键
            {               
                //WM_KEY中只是打印来观察,发现
                GUI_SendKeyMsg(GUI_KEY_ENTER, 1);//不能连续执行,会进入HardFault_Handler
                //GUI_StoreKeyMsg(GUI_KEY_ENTER, 1);//能连续执行
            }        
        }
        if(KEY1 == 0)                //KEY1键按下
        {
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
            if(KEY1 == 0)            //还KEY1键
            {
                GUI_StoreKeyMsg(GUI_KEY_ESCAPE, 1);//能连续执行   
            }        
        }   
        if(KEY2 == 0)                //KEY2键按下
        {
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
            if(KEY2 == 0)            //还KEY2键
            {
                GUI_StoreKeyMsg(0x41, 1);//能连续执行
   
            }        
        }   
        if(WK_UP == 1)                //WK_UP键按下
        {
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
            if(WK_UP == 1)            //还WK_UP键
            {
                GUI_StoreKeyMsg(0x61, 1);//能连续执行   
            }        
        }        
        OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
    }
}

//**************************************************************************
#include <stddef.h>
#include "DIALOG.h"
#include "keypad.h"
#include "ILI93xx.h"
#include "string.h"
#include "stdlib.h"
#include "usart.h"
#include "pyinput.h"
#include "EmWinHZFont.h"
#include "led.h"
#include "WM.h"

#include "usart.h"

#define GUI_KEY_ADD  (GUI_ID_USER + 1)
/*
********************************************************************************************************
*                             静态数据
********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
    { FRAMEWIN_CreateIndirect, "Edit winmode", 0,         90,  90, 140, 130, FRAMEWIN_CF_MOVEABLE},
    { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT0,    10,  10, 110,  20, 0, 15},
    { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT1,    10,  40, 110,  20, 0, 15},
    { BUTTON_CreateIndirect,   "Ok",     GUI_ID_OK,       10,  80,  50,  20 },
    { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   70,  80,  50,  20 },
};

static char * _apExplain[] =
{
    "This sample shows how to use edit widgets with a",
    "user defined callback function and how to set a",
    "user defined AddKey function. It selects the",
    "contents of the edit field on receiving the focus",
    "and overwrites the contents if a key other than",
    "a cursor key is pressed.",
};

/*
*********************************************************************************************************
*    函 数 名: _cbDialog
*    功能说明: 对话框的回调函数
*    形    参: pMsg 消息指针
*    返 回 值: 无
*********************************************************************************************************
*/
static void _cbDialog(WM_MESSAGE * pMsg)
{
    int     i;
    int     NCode;
    int     Id;
    WM_HWIN hDlg;
    WM_HWIN hItem;
  printf("_cbDialog %d\r\n",pMsg->MsgId);    //pnhhit add 跟踪观察用   
    hDlg = pMsg->hWin;
   
    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG:
            FRAMEWIN_SetFont(pMsg->hWin, &GUI_Font13_ASCII);
            FRAMEWIN_SetTextAlign(pMsg->hWin, GUI_TA_HCENTER);
            for (i = 0; i < 2; i++)
            {
                hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i);  // Get the handle of the edit widget
                //EDIT_AddKey(hItem, GUI_KEY_ADD);//向指定的编辑字段(Edit窗口)添加用户输入。EDIT_AddKey(hItem, 'A');
                EDIT_SetText(hItem, "Hello world!");             // Fill widget with text
        //很奇怪,会选中第一个文本框(hItem=5),而不是第二(hItem=A)个!
                EDIT_SetSel(hItem, 0, -1);                       // Select the whole contents of the edit field 选定的字符通常反色显示
                //EDIT_SetSel((WM_HWIN)0xA, 0, -1);                       // 失败
            }
            break;
            
         case WM_KEY://对话框接受按键事件,当焦点在文本框,按键触发的不同Key值,如果是有效输入key,对话框收到38消息;如果是无效,将是WM_KEY消息
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
   
                                case 0x41://文本框能接受的输入字数有限,后面再按,文本框没反应,对话框也收不到38消息
                                      printf("_cbDialog 0x41 Key2\r\n");//焦点在行文本框,不会执行,是个有效Key(输入A)。对话框收到38消息
                                        //GUI_EndDialog(hDlg, 1);
                    break;
               
                case 0x61://文本框能接受的输入字数有限,后面再按,文本框没反应,对话框也收不到38消息
                                      printf("_cbDialog 0x61 KeyUp\r\n");//焦点在行文本框,不会执行,是个有效Key(输入a)。对话框收到38消息
                    //GUI_EndDialog(hFrame, 0);
                    break;
                                case GUI_KEY_ESCAPE:
                                      printf("_cbDialog GUI_KEY_ESCAPE key1\r\n");    //焦点在行文本框,会执行,是个无效Key。对话框收到14消息
                    //GUI_EndDialog(hDlg, 1);
                    break;
               
                case GUI_KEY_ENTER:
                                      printf("_cbDialog GUI_KEY_ENTER key0\r\n");    //焦点在行文本框,会执行,是个无效Key。对话框收到14消息
                    //GUI_EndDialog(hDlg, 0);
                    break;                                    
            }
            break;
        case WM_NOTIFY_PARENT:
            Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
            NCode = pMsg->Data.v;                 // Notification code
            switch (NCode)
            {
                case WM_NOTIFICATION_RELEASED:      // React only if released
                    if (Id == GUI_ID_OK)
                    {         // OK Button
                        GUI_EndDialog(hDlg, 0);
                    }
                    if (Id == GUI_ID_CANCEL)
                    {        // Cancel Button
                        GUI_EndDialog(hDlg, 1);
                    }
                    
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

/*
*********************************************************************************************************
*    函 数 名: _cbDesktop
*    功能说明: 桌面窗口的回调函数
*    形    参: pMsg 消息指针
*    返 回 值: 无
*********************************************************************************************************
*/
static void _cbDesktop(WM_MESSAGE * pMsg)
{
    unsigned i;
  printf("_cbDesktop %d\r\n",pMsg->MsgId);    //pnhhit add 跟踪观察用   
    switch (pMsg->MsgId)
    {
        /* 重绘 */
        case WM_PAINT:
            GUI_SetBkColor(GUI_RED);
            GUI_Clear();
            GUI_SetFont(&GUI_Font24_ASCII);
            GUI_DispStringHCenterAt("WIDGET_EditWinmode", 160, 5);
            GUI_DispNextLine();//将光标移至下一行的开始。
            GUI_SetFont(GUI_DEFAULT_FONT);
            GUI_DispNextLine();
            for (i = 0; i < GUI_COUNTOF(_apExplain); i++)
            {
                GUI_DispStringHCenterAt(_apExplain, 160, GUI_GetDispPosY());
                GUI_DispNextLine();
            }
            break;
    }
}

/*
*********************************************************************************************************
*    函 数 名: MainTask
*    功能说明: GUI主函数
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
void keypad_demo(void)
{
    //GUI_Init();
    WM_SetCallback(WM_HBKWIN, _cbDesktop);
   
    while(1)
    {
        /* 创建阻塞式对话框 */
        //阻塞式对话框会阻塞执行的线程,默认情况下,它有输入焦点(外部按键GUI_SendKeyMsg将消息发送到这个对话框中),用户必须先关闭它,线程才能继续执行
        GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0);
        GUI_Delay(1000);
    }
   
        //创建非阻塞式对话框。 输入焦点好像还在对话框上!
//    GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0);   
//  WM_SetFocus(WM_HBKWIN);    //增加这个控制,输入焦点还在对话框上!
//    while(1)
//    {
//        GUI_Delay(1000);
//    }   
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-9-21
在线时间
59 小时
 楼主| 发表于 2016-12-18 14:39:05 | 显示全部楼层
更新一下,GUI_SendKeyMsg执行结果:GUI_SendKeyMsg(GUI_KEY_ENTER, 1);// 对话框的消息执行第一次WM_KEY后,系统进入会进入HardFault_Handler
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-7-8
在线时间
4 小时
发表于 2017-7-16 15:27:35 | 显示全部楼层
楼主的问题解决了么 我这个也是上了ucosIII 后 发送GUI_StoreKeyMsg 进hard fault
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-6-12
在线时间
26 小时
发表于 2019-8-2 15:04:15 | 显示全部楼层
在多任务情况下,如果UI主任务和按键任务相互独立,那么在按键任务中调用GUI_SendKeyMsg会导致死机,而GUI_StoreKeyMsg不会。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 22:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表