首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ucos II+ucGUI+s3c2410+LCD+触摸屏整合02

ucos II+ucGUI+s3c2410+LCD+触摸屏整合02

5、某些编译器(如:ads1.2)不会初始化全局变量,因此做如下事:
  1) 修改如下函数为:(位于GUICore.c)
  static void _InitContext(GUI_CONTEXT* pContext) {
  memset(pContext,0,sizeof(GUI_CONTEXT));//add
  #if GUI_SUPPORT_MEMDEV
  GUI_SelectLCD();
  #else
  LCD_SetClipRectMax();//LCD_L0_GetRect
  #endif
  pContext->pLCD_HL      = &LCD_HL_APIList;
  pContext->pAFont       = GUI_DEFAULT_FONT;
  pContext->pClipRect_HL = &GUI_Context.ClipRect;
  pContext->PenSize      = 1;
  pContext->DrawMode = GUI_DRAWMODE_NORMAL;//add
  pContext->TextMode = GUI_TEXTMODE_NORMAL;//add
  pContext->TextAlign = GUI_TA_LEFT|GUI_TA_TOP;//add
  pContext->AA_HiResEnable = 0;//add
  /* Variables in WM module */
  #if GUI_WINSUPPORT
  pContext->hAWin    = WM_GetDesktopWindow();
  #endif
  /* Variables in GUI_AA module */
  pContext->AA_Factor = 3;
  LCD_SetBkColor(GUI_DEFAULT_BKCOLOR);
  LCD_SetColor(GUI_DEFAULT_COLOR);
  }
  修改如下函数为:(位于GUIAlloc.c)
  void GUI_ALLOC_Init(void) {
  ........
  GUI_ALLOC.NumUsedBytes = 0;
  memset(&aBlock,0,sizeof(aBlock[0])*GUI_MAXBLOCKS);/////self
  aBlock[0].Size = (1<<GUI_BLOCK_ALIGN); /* occupy minimum for a block */
  .......
  }
  修改如下函数为:(位于WM.c)(――――――――――New)
  void WM_Init(void) {
  if (!_IsInited) {
  ……….
  memset(&_ClipContext,0,sizeof(WM_IVR_CONTEXT));//add
  NextDrawWin = WM__FirstWin = WM_HWIN_NULL;
  ……………….
  _IsInited =1;
  }
  }
  2)自己编写如下函数(ads1.2):
  void MyInit()
  {
  IsInitialized = 0;//MemDev
  _IsInited = 0;//Win
  WM__CreateFlags = 0;
  GUI_CURSOR_pfTempHide = NULL;
  GUI_Context.hDevData = 0;
  WM__hCapture=0;
  WM__hWinFocus=0;
  WM_pfPollPID = 0;
  WM_pfHandlePID = 0;
  GUI_pfTimerExec = 0;
  _KeyMsgCnt = 0;
  }
  该函数应在GUI_Init()调用之前调用。
  6、改写GUI_Init()函数:
  int GUI_Init(void) {
  int r;
  GUI_DEBUG_LOG("\nGUI_Init()");
  /* Init system wide globals first */
  GUI_DecChar = '.';
  /* Init context */
  _InitContext(&GUI_Context);
  GUITASK_INIT();
  r = LCD_Init();
  #if GUI_WINSUPPORT
  WM_Init();
  #endif
  GUITASK_COPY_CONTEXT();
  GUI_Clear();
  GUI_X_Init();
  GUI_CURSOR_Show();//启动即显示鼠标
  return r;
  }
  三、ucGUI与ucOS的整合,主要修改GUI_X.c文件:
  1、定义信号量及全局量:
  static OS_EVENT *DispSem;
  static OS_EVENT *EventMbox;
  static OS_EVENT *KeySem;
  static int        KeyPressed;
  static char       KeyIsInited;
  2、实现结合函数:
  int GUI_X_GetTime(void)
  {
  return ((int)OSTimeGet());
  }
  void GUI_X_Delay(int period)
  {
  INT32U ticks;
  ticks = (period * 1000) / OS_TICKS_PER_SEC;
  OSTimeDly((INT16U)ticks);
  }
  void GUI_X_Unlock(void)
  {
  OSSemPost(DispSem);
  }
  void GUI_X_Lock(void)
  {
  U8 err;
  OSSemPend(DispSem, 0, &err);
  }
  U32 GUI_X_GetTaskId(void)
  {
  return ((U32)(OSTCBCur->OSTCBPrio));
  }
  void GUI_X_WaitEvent (void)
  {
  INT8U err;
  (void)OSMboxPend(EventMbox, 0, &err);
  }
  void GUI_X_SignalEvent (void)
  {
  (void)OSMboxPost(EventMbox, (void *)1);
  }
  void GUI_X_InitOS(void)
  {
  DispSem   = OSSemCreate(1);
  EventMbox = OSMboxCreate((void *)0);
  }
  void GUI_X_ExecIdle(void) {GUI_X_Delay(1);}
  void GUI_X_Init(void) {
  SetTSInterrupt();//此处接入触摸屏的中断设置
  GUI_TOUCH_SetDefaultCalibration();//用默认值校准触摸屏
  }
  四、与触摸屏有关的函数:
  1、4个功能函数:
  void GUI_TOUCH_X_ActivateX(void) {//空}
  void GUI_TOUCH_X_ActivateY(void) {//空}
  int GUI_TOUCH_X_MeasureX(void) {
  return TX;//返回触摸坐标x
  }
  int  GUI_TOUCH_X_MeasureY(void){
  return TY; //返回触摸坐标y
  }
  2、触摸屏校准任务(进程, 来自示例程序:TOUCH_Calibrate.c):
  #if TOUCH_NEED_CALIBRATE
  static const char * _acPos[] = {
  "(upper left position)",
  "(lower right position)"
  };
  static void _WaitForPressedState(int Pressed) {
  GUI_PID_STATE State;
  /* Wait until touch is pressed */
  do {
  GUI_TOUCH_GetState(&State);
  if (State.Pressed == Pressed) {
  break;
  }
  GUI_Delay (100);
  } while (1);
  }
  static void _DispStringCentered(const char * pString) {
  GUI_RECT Rect;
  Rect.x0 = Rect.y0 = 0;
  Rect.x1 = LCD_GetXSize() - 1;
  Rect.y1 = LCD_GetYSize() - 1;
  GUI_DispStringInRect(pString, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
  }
  static void _GetPhysValues(int LogX, int LogY, int * pPhysX, int * pPhysY, const char * pString) {
  char acText[] = "Press here";
  GUI_RECT Rect;
  int FontSizeY, Align;
  FontSizeY = GUI_GetFontSizeY();
  GUI_Clear();
  GUI_SetColor(GUI_BLACK);
  _DispStringCentered("Runtime calibration,\n"
  "please touch the screen\n"
  "at the center of the ring."); /* Ask user to press the touch */
  /* Calculate the rectangle for the string */
  Rect.y0 = LogY - FontSizeY;
  Rect.y1 = LogY + FontSizeY;
  if (LogX < LCD_GetXSize() / 2) {
  Rect.x0 = LogX + 15;
  Rect.x1 = LCD_GetXSize();
  Align = GUI_TA_LEFT;
  } else {
  Rect.x0 = 0;
  Rect.x1 = LogX - 15;
  Align = GUI_TA_RIGHT;
  }
返回列表