mgdrv-ucosii.c
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:7k
源码类别:

GPS编程

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : mgdrv-ucosii.c
  3. //====================================================================
  4. /* 包含MiniGUI的配置头文件(编译配置选项) */
  5. #include "MiniGUI_config.h"
  6. /* 包含MiniGUI头文件 */
  7. #include "common.h"
  8. #include "minigui.h"
  9. #include "gdi.h"
  10. #include "window.h"
  11. #include "control.h"
  12. /* 注意,要跟据驱动SWAP_XY_EN定义来设置这两个宏 */
  13. #define  GUI_LCM_XMAX 320 /* 定义液晶x轴的点数 */
  14. #define  GUI_LCM_YMAX 240 /* 定义液晶y轴的点数 */
  15. #define IAL_MOUSE_LEFTBUTTON    4
  16. #define IAL_MOUSE_MIDDLEBUTTON  2
  17. #define IAL_MOUSE_RIGHTBUTTON   1
  18. #define IO1PIN          (*((volatile unsigned long *) 0xE0028010)) 
  19. extern  void  OSTimeDly(WORD ticks);
  20. // 独立按键,P1口
  21. #define  KEY_TAB (1<<23)
  22. #define  KEY_ENTER (1<<21)
  23. #define  KEY_UP (1<<20)
  24. #define  KEY_DOWN (1<<19)
  25. #define  KEY_LEFT (1<<18)
  26. #define  KEY_RIGHT (1<<22)
  27. #define  KEY_ALL (KEY_TAB | KEY_ENTER | KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT)
  28. /* --------------------- For Common IAL Engine ----------------- */
  29. /* Should be implemented if you use common ial engine in MiniGUI */
  30. #define COMM_MOUSEINPUT    0x01  /* 鼠标或触摸屏事件 */
  31. #define COMM_KBINPUT       0x02  /* 按键事件 */
  32. /*
  33.  * Waits for input for keyboard and touchpanel. 
  34.  * If no data, this function should go into sleep;
  35.  * when data is available, keyboard or touchpanel driver should wake up
  36.  * the task/thread in MiniGUI who call comm_wait_for_input.
  37.  *
  38.  * Normal implementation make this function sleep on a ucosii semaphore.
  39.  * return COMM_MOUSEINPUT or COMM_KBINPUT according to type of the input event.
  40.  */
  41.  // 查询键盘或鼠标事件
  42.  
  43.  static  unsigned char  key_sta=0;
  44.  
  45. /*
  46. int comm_wait_for_input (void)
  47. { int  i;
  48.     
  49. // 扫描按键,若有按键则返回按键事件
  50. for(i=0; i<100; i++)
  51. { if((IO1PIN&KEY_ALL) != KEY_ALL)
  52. { OSTimeDly(2); // 延时10mS,去抖
  53. if((IO1PIN&KEY_ALL) != KEY_ALL)
  54. { key_sta = 1;
  55. return(COMM_KBINPUT); // 确定有按键接下
  56. }
  57. }
  58. }
  59. if(key_sta==1)
  60. { key_sta=0;
  61. return(COMM_KBINPUT); // 有按键放开
  62. }
  63.     OSTimeDly(20); // 没有外部事件,延时100mS,即每100mS扫描一次按键
  64.     
  65.     return 0;
  66. }
  67. */
  68. static  unsigned char  mouse_sta=0;
  69. int comm_wait_for_input (void)
  70. { int  i;
  71.     
  72. // 扫描按键,若有按键则返回鼠标事件
  73. for(i=0; i<100; i++)
  74. { if((IO1PIN&KEY_ALL) != KEY_ALL)
  75. { OSTimeDly(2); // 延时10mS,去抖
  76. if((IO1PIN&KEY_ALL) != KEY_ALL)
  77. { return(COMM_MOUSEINPUT);
  78. }
  79. }
  80. }
  81. if(mouse_sta==1)
  82. { mouse_sta=0;
  83. return(COMM_MOUSEINPUT); // 有按键放开
  84. }
  85.     OSTimeDly(20); // 没有外部事件,延时100mS,即每100mS扫描一次按键
  86.     
  87.     return 0;
  88. }
  89. /*
  90.  * Gets touchpanel position and button data.
  91.  * x, y   : position values
  92.  * button : Non-zero value means pen is down.
  93.  */
  94.  
  95.  // 该函数的返回值可以是IAL_MOUSE_LEFTBUTTON(表示左键按下)、
  96. // IAL_MOUSE_MIDDLEBUTTON(表示中键按下)、IAL_MOUSE_RIGHTBUTTON
  97. // (表示右键按下)等值"或"的结果。
  98.  // 取得鼠标/触摸屏的参数
  99. int comm_ts_getdata (int *x, int *y, int *button)
  100. { unsigned long  io_dat;
  101. io_dat = IO1PIN; // 扫描按键,然后返回
  102. if((io_dat&KEY_DOWN) == 0)
  103. { *y = (*y) + 5;
  104.     if((*y) > (GUI_LCM_YMAX-1))
  105.     { *y = GUI_LCM_YMAX - 1;
  106.     }
  107. return(0);
  108. }
  109. if((io_dat&KEY_UP) == 0)
  110. { *y = (*y) - 5;
  111. if((*y) < 0)
  112. { *y = 0;
  113. }
  114. return(0);
  115. }
  116. if((io_dat&KEY_RIGHT) == 0)
  117. { *x = (*x) + 5;
  118. if((*x) > (GUI_LCM_XMAX-1))
  119. { *x = GUI_LCM_XMAX-1;
  120. }
  121. return(0);
  122. }
  123. if((io_dat&KEY_LEFT) == 0)
  124. { *x = (*x) - 5;
  125. if((*x) < 0)
  126. { *x = 0;
  127. }
  128. return(0);
  129. }
  130. if((io_dat&KEY_ENTER) == 0)
  131. { mouse_sta = 1;
  132. *button = IAL_MOUSE_LEFTBUTTON;
  133. return(0);
  134. }
  135. if((io_dat&KEY_TAB) == 0)
  136. { mouse_sta = 1;
  137. *button = IAL_MOUSE_RIGHTBUTTON;
  138. return(0);
  139. }
  140. if(mouse_sta==0)
  141. { *button = 0;
  142. return(0);
  143. }
  144.     
  145.     return(-1);
  146. }
  147. /*
  148.  * Gets keyboard key data.
  149.  * key        : return MiniGUI scancode of the key.
  150.  * key_status : key down or up, non-zero value means down.
  151.  */
  152.   // 取得按键的参数
  153. int comm_kb_getdata (short *key, short *key_status)
  154. { unsigned long  io_dat;
  155. if(key_sta==1)
  156. { io_dat = IO1PIN; // 扫描按键,然后返回
  157. if((io_dat&KEY_TAB) == 0)
  158. { *key = SCANCODE_TAB;
  159. *key_status = 1;
  160. return(0);
  161. }
  162. if((io_dat&KEY_ENTER) == 0)
  163. { *key = SCANCODE_ENTER;
  164. *key_status = 1;
  165. return(0);
  166. }
  167.     }
  168.     else
  169.     { *key_status = 0; // 按键放开
  170. return(0);
  171.     }
  172.     
  173.     return(-1);
  174. }
  175. /* --------------------- I/O functions -------------------------- */
  176. // for debug purpose
  177. /* Gets a char from uart */
  178. BYTE drv_uart_get_byte (void)
  179. {
  180.     //...
  181.     return(0);
  182. }
  183. /* Sends a char to uart */
  184. void drv_uart_send_byte (BYTE ch)
  185. {
  186.     //...
  187. }
  188. /* ----------------- Implementation of MiniGUI LCD driver interface --------------- */
  189. #define FB_TYPE_RGB565    1  // RGB565 color format for 16 bpp
  190. #define FB_TYPE_RGB332    2  // RGB332 color format for 8 bpp
  191. struct lcd_info {
  192.     short height, width;  // Pixels
  193.     short bpp;            // Depth (bits/pixel)
  194.     short type;           // pixel type
  195.     short rlen;           // Length of one raster line in bytes
  196.     void  *fb;            // Frame buffer
  197. };
  198. int drv_lcd_init (void)
  199. {
  200.     /* Do LCD initialization here, if you have not. */ 
  201.     return 0;
  202. }
  203. int drv_lcd_getinfo (struct lcd_info *li)
  204. {
  205.     /* 
  206.      * Set LCD information in a lcd_info structure pointed by li
  207.      * according to properties of your LCD.
  208.      */
  209. /*     
  210. li->width  = 320;
  211. li->height = 240;
  212. li->bpp    = 16;
  213. li->type   = FB_TYPE_RGB565;
  214. li->rlen   = 320;
  215. li->fb     = (void*)0xc000000;
  216. */
  217.     return 0;
  218. }
  219. /* ------------------- Application entry for uC/OS-II -------------- */
  220. /* for reference only */
  221. /*
  222.  * main task of MiniGUI
  223.  */
  224.  
  225. static void* mg_main_task (void* args)
  226. {
  227.     /*
  228.      * Enter entry in MiniGUI library
  229.      */
  230.     minigui_entry (0, NULL);
  231.     while(1)
  232.     {  OSTimeDly (50);
  233.     }
  234.     
  235.     return NULL;
  236. }
  237. /*
  238.  * MiniGUI entry for uC/OS-II
  239.  * You can call this function before you call OSStart.
  240.  */
  241. void minigui_app_entry (void)
  242. {
  243.     pthread_t main_thread;
  244.     /*
  245.      * Should initialize heap memory management module first
  246.      * before using MiniGUI.
  247.      */
  248.     if (ucos2_malloc_init ()) {
  249.         fprintf (stderr, "Can not init our own malloc implementation for uC/OS-II.n");
  250.         return;
  251.     }
  252.     /*
  253.      * Should initialize POSIX thread module first
  254.      * before using MiniGUI.
  255.      */
  256.     if (ucos2_posix_pthread_init ()) {
  257.         fprintf (stderr, "Can not init our own pthread implementation for uC/OS-II.n");
  258.         return;
  259.     }
  260.     /*
  261.      * Creating a independent thread for MiniGUI main task is a good idea.
  262.      */
  263. pthread_create (&main_thread, NULL, mg_main_task, NULL);
  264. }