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

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        : EditHex
  16. Purpose     : Edit hexadecimal values
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <string.h>
  20. #include "EDIT.h"
  21. #include "GUIDebug.h"
  22. #include "GUI_Protected.h"
  23. #include "EDIT_Private.h"
  24. #if GUI_WINSUPPORT
  25. /*********************************************************************
  26. *
  27. *        Defaults for config switches
  28. *
  29. **********************************************************************
  30. */
  31. #ifndef EDIT_HEX_DIGITONLY
  32.   #define EDIT_HEX_DIGITONLY     0
  33. #endif
  34. /*********************************************************************
  35. *
  36. *             Helpers
  37. *
  38. **********************************************************************
  39. */
  40. static int _HexChar2Int(int Char) {
  41.   if ((Char >= '0') && (Char <= '9'))
  42.     return Char - '0';
  43.   Char &= ~0x20;
  44.   if ((Char >= 'A') && (Char <= 'F'))
  45.     return Char - 'A' + 10;
  46.   return -1;
  47. }
  48. static void _UpdateBuffer(EDIT_Obj* pObj) {
  49.   char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  50.   GUI_AddHex(pObj->CurrentValue, pObj->MaxLen, &s);
  51. }
  52. static void _EditHex(int Nibble, EDIT_Obj* pObj, EDIT_Handle hObj) {
  53.   int Pos = pObj->MaxLen - pObj->CursorPos - 1;   /* Nibble position */
  54.   U32 AndMask = ~(15     << (Pos << 2));
  55.   U32 OrMask  =   Nibble << (Pos << 2);
  56.   I32 Result  = pObj->CurrentValue & AndMask;
  57.   Result     |= OrMask;
  58.   EDIT_SetValue(hObj, Result);
  59. }
  60. #if EDIT_HEX_DIGITONLY
  61.   static U8 _GetCurrentNibble(EDIT_Obj* pObj) {
  62.     int Pos = pObj->MaxLen - pObj->CursorPos - 1;   /* Nibble position */
  63.     U32 AndMask = 0xf << (Pos << 2);
  64.     U8 Nibble = (pObj->CurrentValue & AndMask) >> (Pos << 2);
  65.     return Nibble;
  66.   }
  67. #endif
  68. static int _GetNumDigits(U32 Value) {
  69.   int Ret;
  70.   for (Ret = 0; Value; Value >>= 4, Ret++);
  71.   return Ret;
  72. }
  73. static void _AddPosition(EDIT_Obj* pObj, EDIT_Handle hObj, int Sign) {
  74.   int Pos;
  75.   U32 v;
  76.   v = 1;
  77.   Pos = pObj->MaxLen - pObj->CursorPos-1;
  78.   while (Pos--) {
  79.     v <<= 4;
  80.   }
  81.   if (Sign <0)
  82.     v = ~v;
  83.   EDIT_SetValue(hObj, pObj->CurrentValue + v);
  84. }
  85. /*********************************************************************
  86. *
  87. *             Handle input
  88. *
  89. **********************************************************************
  90. */
  91. static void AddKeyHex(EDIT_Obj* pObj, EDIT_Handle hObj, int Key) {
  92.   if (pObj) {
  93.     switch (Key) {
  94.       #if EDIT_HEX_DIGITONLY
  95.       case GUI_KEY_UP:
  96.         {
  97.           int Nibble = (_GetCurrentNibble(pObj) + 1) & 15;
  98.           _EditHex(Nibble, pObj, hObj);
  99.         }
  100.         break;
  101.       case GUI_KEY_DOWN:
  102.         {
  103.           int Nibble = (_GetCurrentNibble(pObj) + 1) & 15;
  104.           _EditHex(Nibble, pObj, hObj);
  105.         }
  106.         break;
  107.       #else
  108.       case GUI_KEY_UP:
  109.         _AddPosition(pObj, hObj, 1);
  110.         break;
  111.       case GUI_KEY_DOWN:
  112.         _AddPosition(pObj, hObj, -1);
  113.         break;
  114.       #endif
  115.       case GUI_KEY_RIGHT:
  116.         if (pObj->CursorPos < (pObj->MaxLen - 1))
  117.           pObj->CursorPos++;
  118.         break;
  119.       case GUI_KEY_LEFT:
  120.         if (pObj->CursorPos > 0)
  121.           pObj->CursorPos--;
  122.         break;
  123.       default:
  124.         {
  125.           int Nibble = _HexChar2Int(Key);
  126.           if (Nibble >= 0) {
  127.             _EditHex(Nibble, pObj, hObj);
  128.             if (pObj->CursorPos < (pObj->MaxLen - 1))
  129.               pObj->CursorPos++;
  130.           }
  131.         }
  132.         break;
  133.     }
  134.   }
  135.   _UpdateBuffer(pObj);
  136. }
  137. /*********************************************************************
  138. *
  139. *             Exported routines
  140. *
  141. **********************************************************************
  142. */
  143. void EDIT_SetHexMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max) {
  144.   EDIT_Obj* pObj;
  145.   int MaxLen;
  146.   WM_LOCK();
  147.   pObj = EDIT_H2P(hEdit);
  148.   pObj->pfAddKeyEx = AddKeyHex;
  149.   pObj->CurrentValue = Value;
  150.   pObj->CursorPos = 0;
  151.   MaxLen = pObj->MaxLen;
  152.   if (MaxLen <= 0 ) {
  153.     MaxLen = _GetNumDigits(Max);
  154.   }
  155.   if (MaxLen > 8) {
  156.     MaxLen = 8;
  157.   }
  158.   if (MaxLen != pObj->MaxLen) {
  159.     EDIT_SetMaxLen(hEdit, MaxLen);
  160.   }
  161.   pObj->Min = Min;
  162.   pObj->Max = Max;
  163.   pObj->EditMode = GUI_EDIT_MODE_OVERWRITE;
  164.   _UpdateBuffer(pObj);
  165.   WM_UNLOCK();
  166. }
  167. #else  /* avoid empty object files */
  168. void EditHex_C(void);
  169. #endif /* GUI_WINSUPPORT */