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

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : TEMPLATE.c
  16. Purpose     : Template for new emWin GSC widgets
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ----------------------------------------------------------------------
  20. 0.0     yymmdd RS     Start of development
  21. ----------------------------------------------------------------------
  22. Known problems or limitations with current version
  23. ----------------------------------------------------------------------
  24. None.
  25. ----------------------------------------------------------------------
  26. Open issues
  27. ----------------------------------------------------------------------
  28. None
  29. ---------------------------END-OF-HEADER------------------------------
  30. */
  31. #include <stdlib.h>
  32. #include <string.h>
  33. #include "GUI.h"
  34. #if GUI_WINSUPPORT
  35. #include "TERMINAL.h"
  36. #include "GUIDebug.h"
  37. /*********************************************************************
  38. *
  39. *              Private config defaults
  40. *
  41. **********************************************************************
  42. */
  43. /* None */
  44. /*********************************************************************
  45. *
  46. *                 Object definition
  47. *
  48. **********************************************************************
  49. */
  50. typedef struct {
  51.   WM_Obj WMObj;
  52.   WM_HMEM hpText;
  53.   I16 MaxLen;
  54.   const GUI_FONT* pFont;
  55.   int Flags;
  56.   #if GUI_DEBUG_LEVEL >1
  57.     int DebugId;
  58.   #endif  
  59. } TERMINAL_Obj;
  60. /*********************************************************************
  61. *
  62. *              Static data
  63. *
  64. **********************************************************************
  65. */
  66. /* None */
  67. /*********************************************************************
  68. *
  69. *                 Macros for internal use
  70. *
  71. **********************************************************************
  72. */
  73. #define TERMINAL_H2P(h) ((TERMINAL_Obj*)WM_HMEM2Ptr(h))
  74. #define Invalidate(h) WM_InvalidateWindow(h)
  75. #if GUI_DEBUG_LEVEL >1
  76.   #define OBJECT_ID 0x5565   /* Magic numer, should be unique if possible */
  77.   #define ASSERT_IS_VALID_PTR(p) GUI_DEBUG_ERROROUT_IF(p->DebugId != OBJECT_ID, "EDIT.C: Wrong handle type or Object not init'ed")
  78.   #define INIT_ID(p)   p->DebugId = OBJECT_ID
  79.   #define DEINIT_ID(p) p->DebugId = 0
  80. #else
  81.   #define ASSERT_IS_VALID_PTR(p)
  82.   #define INIT_ID(p)
  83.   #define DEINIT_ID(p)
  84. #endif
  85. /*********************************************************************
  86. *
  87. *                 Static routines
  88. *
  89. **********************************************************************
  90. */
  91. static void Paint(TERMINAL_Obj* pObj/*, GUI_RECT*pRect*/) {
  92.   char*s = (char*) WM_HMEM2Ptr(pObj->hpText);
  93.   GUI_RECT rClient;
  94.   GUI_DEBUG_LOG("TERMINAL: Paint(..)n");
  95.   GUI_GetClientRect(&rClient);
  96. /* Draw background */
  97.   GUI_SetBkColor (GUI_WHITE/*pObj->aBkColor[0]*/);
  98.   GUI_SetColor   (GUI_BLACK /*pObj->aTextColor[0]*/);
  99.   GUI_Clear();
  100. /* Draw the text */  
  101.   {
  102.     GUI_RECT rText = rClient;
  103.     rText.x0 +=3;
  104. //    GUI_SetFont    (pObj->pFont);
  105.     GUI_DispStringInRect(s, &rText, GUI_TA_LEFT);
  106.   }
  107. }
  108. static void Delete(TERMINAL_Obj* pObj) {
  109.   if (pObj->hpText) {
  110.     GUI_ALLOC_Free(pObj->hpText);
  111.     pObj->hpText = 0;
  112.     GUI_DEBUG_LOG("TERMINAL: Delete: Deleting attached stringn");
  113.   }
  114. }
  115. static WM_RESULT _TERMINAL_Callback (/*const*/ WM_MESSAGE*pMsg) {
  116.   TERMINAL_Handle hObj = pMsg->hWin;
  117.   TERMINAL_Obj* pObj = TERMINAL_H2P(hObj);
  118.   switch (pMsg->MsgId) {
  119.   case WM_PAINT:
  120.     GUI_DEBUG_LOG("BUTTON: _Callback(WM_PAINT)n");
  121.     Paint(pObj/*, (GUI_RECT*)pMsg->Data.p*/);
  122.     return;
  123.   case WM_DELETE:
  124.     GUI_DEBUG_LOG("EDIT: _Callback(WM_DELETE)n");
  125.     Delete(pObj);
  126.     break;       /* No return here ... WM_DefaultProc needs to be called */
  127.   }
  128.   WM_DefaultProc(pMsg);
  129. }
  130. /*********************************************************************
  131. *
  132. *           Exported routines:  Create
  133. *
  134. **********************************************************************
  135. */
  136. /* Note: the parameters to a create function may vary.
  137.          Some widgets may have multiple create functions */
  138. TERMINAL_Handle TERMINAL_CreateAsChild( int x0, int y0, int xsize, int ysize, WM_HWIN hWinParent, int MaxLen, int Flags) {
  139.   TERMINAL_Handle hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hWinParent, 
  140.                        Flags, _TERMINAL_Callback,
  141.                        sizeof(TERMINAL_Obj)-sizeof(WM_Obj));
  142.   if (hObj) {
  143.     TERMINAL_Obj* pObj = TERMINAL_H2P(hObj);
  144.     pObj->hpText = WM_ALLOC(MaxLen+1);
  145.     /* init member variables */
  146.     if (pObj->hpText ==0) {
  147.       GUI_DEBUG_ERROROUT("TERMINAL_Create failed to alloc buffer");
  148.       TERMINAL_Delete(hObj);
  149.       hObj =0;
  150.     }
  151.     pObj->MaxLen = MaxLen;
  152.   } else {
  153.     GUI_DEBUG_ERROROUT_IF(hObj==0, "TERMINAL_Create failed")
  154.   }
  155.   return hObj;
  156. }
  157. TERMINAL_Handle TERMINAL_Create(int x0, int y0, int xsize, int ysize, int MaxLen, int Flags) {
  158.   return TERMINAL_CreateAsChild(x0, y0, xsize, ysize, 0/* hWinParent */,  MaxLen, Flags);
  159. }
  160. TERMINAL_Handle TERMINAL_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) {
  161.   TERMINAL_Handle  hThis;
  162.   GUI_USE_PARA(cb);
  163.   hThis = TERMINAL_CreateAsChild(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize,
  164.                                  hWinParent, pCreateInfo->Id, pCreateInfo->Flags);
  165.   return hThis;
  166. }
  167. /*********************************************************************
  168. *
  169. *        Exported routines:  Various methods
  170. *
  171. **********************************************************************
  172. */
  173. void TERMINAL_SetFont(TERMINAL_Handle hObj, const GUI_FONT* pfont) {
  174.   TERMINAL_Obj* pObj = TERMINAL_H2P(hObj);
  175.   pObj->pFont = pfont;
  176.   Invalidate(hObj);
  177. }
  178. void TERMINAL_Add(TERMINAL_Handle hObj, const char* sAdd) {
  179.   if (!sAdd) {
  180.     GUI_DEBUG_WARN("TERMINAL_Add: NULL pointer passed");
  181.     return;
  182.   }
  183.   if (hObj) {
  184.     TERMINAL_Obj* pObj = TERMINAL_H2P(hObj);
  185.     char* sBuffer = (char*) WM_HMEM2Ptr(pObj->hpText);
  186.     int AddLen = strlen(sAdd);
  187.     int NewLen = AddLen+strlen(sBuffer);
  188.     if (AddLen > pObj->MaxLen) {
  189.       GUI_DEBUG_WARN("TERMINAL_Add: String longer than buffer !");
  190.       return;
  191.     }
  192.     /* Make space in buffer if necessary */
  193.     if (NewLen > pObj->MaxLen) {
  194.       *sBuffer =0;
  195.     }
  196.     sBuffer+= strlen(sBuffer); 
  197.     memcpy(sBuffer, sAdd, AddLen);
  198.     *(sBuffer+AddLen) = 0;
  199.     Invalidate(hObj);
  200.   }
  201. }
  202. void TERMINAL_GetText(TERMINAL_Handle hObj, char* sDest, int MaxLen) {
  203.   TERMINAL_Obj* pObj = TERMINAL_H2P(hObj);
  204.   if (pObj) {
  205.     char * sSource = (char*) WM_HMEM2Ptr(pObj->hpText);
  206.     int Len = strlen(sSource);
  207.     if (Len > (MaxLen - 1))
  208.       Len = MaxLen - 1;
  209.     memcpy((void *)sDest, (const void *)sSource, Len);
  210.     *(sDest+Len) = 0;
  211.   }
  212. }
  213. #else
  214. void WIDGET_Terminal(void) {} /* avoid empty object files */
  215. #endif   /* if GUI_WINSUPPORT */