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

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        : EditBin
  16. Purpose     : Edit binary 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. *             Helpers
  28. *
  29. **********************************************************************
  30. */
  31. static int _BinChar2Int(int Char) {
  32.   if ((Char >= '0') && (Char <= '1'))
  33.     return Char - '0';
  34.   return -1;
  35. }
  36. static void _UpdateBuffer(EDIT_Obj* pObj) {
  37.   char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  38.   GUI_AddBin(pObj->CurrentValue, pObj->MaxLen, &s);
  39. }
  40. static void _EditBin(U8 Bit, EDIT_Obj* pObj, EDIT_Handle hObj) {
  41.   int Pos = pObj->MaxLen - pObj->CursorPos - 1;   /* Bit position */
  42.   U32 AndMask = ~(1   << Pos);
  43.   U32 OrMask  =   Bit << Pos;
  44.   I32 Result  = pObj->CurrentValue & AndMask;
  45.   Result     |= OrMask;
  46.   EDIT_SetValue(hObj, Result);
  47.   /*
  48.   U32 AndMask = ~(1   << Pos);
  49.   U32 OrMask  =   Bit << Pos;
  50.   pObj->CurrentValue &= AndMask;
  51.   pObj->CurrentValue |= OrMask;
  52.   if (pObj->CurrentValue > (U32)pObj->Max)
  53.     pObj->CurrentValue = pObj->Max;
  54.   if (pObj->CurrentValue < (U32)pObj->Min)
  55.     pObj->CurrentValue = pObj->Min;
  56.   */
  57. }
  58. static U8 _GetCurrentBit(EDIT_Obj* pObj) {
  59.   int Pos = pObj->MaxLen - pObj->CursorPos - 1;   /* Bit position */
  60.   U32 AndMask = 1 << Pos;
  61.   U8 Bit = (pObj->CurrentValue & AndMask) >> Pos;
  62.   return Bit;
  63. }
  64. static int _GetNumDigits(U32 Value) {
  65.   int Ret;
  66.   for (Ret = 0; Value; Value >>= 1, Ret++);
  67.   return Ret;
  68. }
  69. /*********************************************************************
  70. *
  71. *             Handle input
  72. *
  73. **********************************************************************
  74. */
  75. static void _AddKeyBin(EDIT_Obj* pObj, EDIT_Handle hObj, int Key) {
  76.   if (pObj) {
  77.     switch (Key) {
  78.       case GUI_KEY_UP:
  79.         {
  80.           int Bit = _GetCurrentBit(pObj) + 1;
  81.           if (Bit > 1)
  82.             Bit = 0;
  83.           _EditBin(Bit, pObj, hObj);
  84.         }
  85.         break;
  86.       case GUI_KEY_DOWN:
  87.         {
  88.           int Bit = _GetCurrentBit(pObj) - 1;
  89.           if (Bit < 0)
  90.             Bit = 1;
  91.           _EditBin(Bit, pObj, hObj);
  92.         }
  93.         break;
  94.       case GUI_KEY_RIGHT:
  95.         if (pObj->CursorPos < (pObj->MaxLen - 1))
  96.           pObj->CursorPos++;
  97.         break;
  98.       case GUI_KEY_LEFT:
  99.         if (pObj->CursorPos > 0)
  100.           pObj->CursorPos--;
  101.         break;
  102.       default:
  103.         {
  104.           int Bit = _BinChar2Int(Key);
  105.           if (Bit >= 0) {
  106.             _EditBin(Bit, pObj, hObj);
  107.             if (pObj->CursorPos < (pObj->MaxLen - 1))
  108.               pObj->CursorPos++;
  109.           }
  110.         }
  111.         break;
  112.     }
  113.   }
  114.   _UpdateBuffer(pObj);
  115. }
  116. /*********************************************************************
  117. *
  118. *             Exported routines
  119. *
  120. **********************************************************************
  121. */
  122. void EDIT_SetBinMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max) {
  123.   EDIT_Obj* pObj;
  124.   int MaxLen;
  125.   WM_LOCK();
  126.   pObj = EDIT_H2P(hEdit);
  127.   pObj->pfAddKeyEx    = _AddKeyBin;
  128.   pObj->pfUpdateBufer = _UpdateBuffer;
  129.   pObj->CurrentValue = Value;
  130.   pObj->CursorPos = 0;
  131.   MaxLen = pObj->MaxLen;
  132.   if (MaxLen <= 0 ) {
  133.     MaxLen = _GetNumDigits(Max);
  134.   }
  135.   if (MaxLen > 32) {
  136.     MaxLen = 32;
  137.   }
  138.   if (MaxLen != pObj->MaxLen) {
  139.     EDIT_SetMaxLen(hEdit, MaxLen);
  140.   }
  141.   pObj->Min = Min;
  142.   pObj->Max = Max;
  143.   pObj->EditMode = GUI_EDIT_MODE_OVERWRITE;
  144.   _UpdateBuffer(pObj);
  145.   WM_UNLOCK();
  146. }
  147. #else  /* avoid empty object files */
  148. void EditBin_C(void);
  149. #endif /* GUI_WINSUPPORT */