GUI_OnKey.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:4k
源码类别:

uCOS

开发平台:

C/C++

  1. /*********************************************************************
  2. *                SEGGER MICROCONTROLLER SYSTEME GmbH                 *
  3. *        Solutions for real time microcontroller applications        *
  4. **********************************************************************
  5. *                                                                    *
  6. *        (c) 2002         SEGGER Microcontroller Systeme GmbH        *
  7. *                                                                    *
  8. *        Internet: www.segger.com    Support:  support@segger.com    *
  9. *                                                                    *
  10. **********************************************************************
  11. **** emWin/GSC Grafical user interface for embedded applications ****
  12. emWin is protected by international copyright laws. Knowledge of the
  13. source code may not be used to write a similar product. This file may
  14. only be used in accordance with a license and should not be re-
  15. distributed in any way. We appreciate your understanding and fairness.
  16. ----------------------------------------------------------------------
  17. File        : GUI_OnKey.c
  18. Purpose     : Implementation of GUI_StoreKeyMsg
  19. ---------------------------END-OF-HEADER------------------------------
  20. */
  21. #include "GUI_Protected.H"
  22. #include "Includes.h"
  23. static OS_EVENT * _KeySem;
  24. static int _Key;
  25. static int _KeyMsgCnt;
  26. static struct {
  27.   int Key;
  28.   int PressedCnt;
  29. } _KeyMsg;
  30. /*********************************************************************
  31. *
  32. *       Public code
  33. *
  34. **********************************************************************
  35. */
  36. void GUI_Key_Init(void)
  37. {
  38.     _KeySem = OSMboxCreate ((void *)0);        // 初始化一个二值按键事件信号量.
  39. }
  40. int GUI_WaitKey(void) {
  41.   int r;
  42.   INT8U err;
  43.   do {
  44.     OSMboxPend (_KeySem,0, &err);
  45.     r =  GUI_GetKey();
  46.     if (r)
  47.       break;
  48. //    GUI_Exec();
  49.   } while (1);
  50.   return r;
  51. }
  52. /*******************************************************************
  53. *
  54. *                  GUI_GetKey
  55. */
  56. int GUI_GetKey(void) {
  57.   int r = _Key;
  58.   _Key = 0;
  59.   return r;
  60. }
  61. /*******************************************************************
  62. *
  63. *                  GUI_StoreKey
  64. */
  65. void GUI_StoreKey(int Key) {
  66.   if (!_Key) {
  67.     _Key = Key;
  68.     OSMboxPost (_KeySem, (void *)1);
  69.   }
  70. }
  71. /*******************************************************************
  72. *
  73. *                  GUI_ClearKeyBuffer
  74. */
  75. void GUI_ClearKeyBuffer(void) {
  76.   while (GUI_GetKey());
  77. }
  78. /*********************************************************************
  79. *
  80. *     GUI_StoreKeyMsg
  81. */
  82. void GUI_StoreKeyMsg(int Key, int PressedCnt) {
  83.   #if GUI_WINSUPPORT    /* If 0, WM will not generate any code */
  84.   _KeyMsg.Key = Key;
  85.   _KeyMsg.PressedCnt = PressedCnt;
  86.   _KeyMsgCnt = 1;
  87.   #else
  88.     GUI_USE_PARA(PressedCnt);
  89.     GUI_StoreKey(Key);
  90.   #endif
  91. }
  92. /*********************************************************************
  93. *
  94. *     GUI_PollKeyMsg
  95. */
  96. #if GUI_WINSUPPORT    /* If 0, WM will not generate any code */
  97. int GUI_PollKeyMsg(void) 
  98. {
  99.   int r = 0;
  100.   if (_KeyMsgCnt) 
  101.   {
  102.     int Key;
  103.     Key = _KeyMsg.Key;
  104.     if (WM_OnKey(Key, _KeyMsg.PressedCnt) == 0) 
  105.     {
  106.       if (_KeyMsg.PressedCnt == 1) 
  107.       {
  108.         GUI_StoreKey(Key);
  109.       }
  110.     }
  111.     _KeyMsgCnt--;
  112.     r = 1;              /* We have done something */
  113.   }
  114.   return r;
  115. }
  116. #endif
  117. /*********************************************************************
  118. *
  119. *     GUI_SendKeyMsg
  120. *
  121. * Purpose:
  122. *   Send the key to a window using the window manager (if available).
  123. *   If no window is ready to take the input, we call the store routine
  124. *   and wait for somebody to poll the buffer.
  125. */
  126. void GUI_SendKeyMsg(int Key, int PressedCnt) {
  127.   #if GUI_WINSUPPORT    /* If 0, WM will not generate any code */
  128.   if (!WM_OnKey(Key, PressedCnt)) {
  129.     GUI_StoreKeyMsg(Key, PressedCnt);
  130.   }
  131.   #else
  132.   GUI_StoreKeyMsg(Key, PressedCnt);
  133.   #endif
  134. }