/src/backend/rt-thread/ftk_source_input.c

http://ftk.googlecode.com/ · C · 184 lines · 149 code · 29 blank · 6 comment · 14 complexity · a1b553331854e7de4af55e3fe67bf289 MD5 · raw file

  1. /*
  2. * ftk_source_input.c
  3. *
  4. * Created on: 2011-1-1
  5. * Author: Yi.Qiu
  6. */
  7. #include "ftk_log.h"
  8. #include "ftk_key.h"
  9. #include "ftk_event.h"
  10. #include "ftk_source.h"
  11. typedef struct _PrivInfo
  12. {
  13. int fd;
  14. FtkEvent event;
  15. FtkOnEvent on_event;
  16. void* user_data;
  17. rt_device_t device;
  18. } PrivInfo;
  19. static int s_key_map[0xff] = {0};
  20. static void ftk_keymap_init(void)
  21. {
  22. s_key_map[0x1] = FTK_KEY_ESC;
  23. s_key_map[0xc] = FTK_KEY_MINUS;
  24. s_key_map[0x39] = FTK_KEY_SPACE;
  25. s_key_map[0xd] = FTK_KEY_EQUAL;
  26. s_key_map[0xe] = FTK_KEY_BACKSPACE;
  27. s_key_map[0xf] = FTK_KEY_TAB;
  28. s_key_map[0x1c] = FTK_KEY_ENTER;
  29. s_key_map[0xb] = FTK_KEY_0;
  30. s_key_map[0x2] = FTK_KEY_1;
  31. s_key_map[0x3] = FTK_KEY_2;
  32. s_key_map[0x4] = FTK_KEY_3;
  33. s_key_map[0x5] = FTK_KEY_4;
  34. s_key_map[0x6] = FTK_KEY_5;
  35. s_key_map[0x7] = FTK_KEY_6;
  36. s_key_map[0x8] = FTK_KEY_7;
  37. s_key_map[0x9] = FTK_KEY_8;
  38. s_key_map[0xa] = FTK_KEY_9;
  39. s_key_map[0x3b] = FTK_KEY_F1;
  40. s_key_map[0x3c] = FTK_KEY_F2;
  41. s_key_map[0x3d] = FTK_KEY_F3;
  42. s_key_map[0x3e] = FTK_KEY_F4;
  43. s_key_map[0xef] = FTK_KEY_F5;
  44. s_key_map[0x40] = FTK_KEY_F6;
  45. s_key_map[0x41] = FTK_KEY_F7;
  46. s_key_map[0x42] = FTK_KEY_F8;
  47. s_key_map[0x43] = FTK_KEY_F9;
  48. s_key_map[0x1e] = FTK_KEY_A;
  49. s_key_map[0x30] = FTK_KEY_B;
  50. s_key_map[0x2c] = FTK_KEY_C;
  51. s_key_map[0x20] = FTK_KEY_D;
  52. s_key_map[0x12] = FTK_KEY_E;
  53. s_key_map[0x21] = FTK_KEY_F;
  54. s_key_map[0x22] = FTK_KEY_G;
  55. s_key_map[0x23] = FTK_KEY_H;
  56. s_key_map[0x17] = FTK_KEY_I;
  57. s_key_map[0x24] = FTK_KEY_J;
  58. s_key_map[0x25] = FTK_KEY_K;
  59. s_key_map[0x26] = FTK_KEY_L;
  60. s_key_map[0x32] = FTK_KEY_M;
  61. s_key_map[0x31] = FTK_KEY_N;
  62. s_key_map[0x18] = FTK_KEY_O;
  63. s_key_map[0x19] = FTK_KEY_P;
  64. s_key_map[0x10] = FTK_KEY_Q;
  65. s_key_map[0x13] = FTK_KEY_R;
  66. s_key_map[0x1f] = FTK_KEY_S;
  67. s_key_map[0x14] = FTK_KEY_T;
  68. s_key_map[0x16] = FTK_KEY_U;
  69. s_key_map[0x2f] = FTK_KEY_V;
  70. s_key_map[0x11] = FTK_KEY_W;
  71. s_key_map[0x2d] = FTK_KEY_X;
  72. s_key_map[0x15] = FTK_KEY_Y;
  73. s_key_map[0x2c] = FTK_KEY_Z;
  74. s_key_map[0x4b] = FTK_KEY_LEFT;
  75. s_key_map[0x4d] = FTK_KEY_RIGHT;
  76. s_key_map[0x50] = FTK_KEY_DOWN;
  77. s_key_map[0x2e] = FTK_KEY_DELETE;
  78. s_key_map[0x48] = FTK_KEY_UP;
  79. }
  80. static int ftk_source_input_get_fd(FtkSource* thiz)
  81. {
  82. DECL_PRIV(thiz, priv);
  83. return priv->fd;
  84. }
  85. static int ftk_source_input_check(FtkSource* thiz)
  86. {
  87. return -1;
  88. }
  89. static Ret ftk_source_input_dispatch(FtkSource* thiz)
  90. {
  91. char ch;
  92. int ret = 0;
  93. DECL_PRIV(thiz, priv);
  94. while(rt_device_read(priv->device, 0, &ch, 1) == 1)
  95. {
  96. priv->event.type = (ch & 0x80) ? FTK_EVT_KEY_UP : FTK_EVT_KEY_DOWN;
  97. priv->event.u.key.code = s_key_map[ch & 0x7F];
  98. if(priv->on_event != NULL && priv->event.type != FTK_EVT_NOP)
  99. {
  100. priv->on_event(priv->user_data, &priv->event);
  101. priv->event.type = FTK_EVT_NOP;
  102. }
  103. }
  104. return RET_OK;
  105. }
  106. static void ftk_source_input_destroy(FtkSource* thiz)
  107. {
  108. if (thiz != NULL)
  109. {
  110. DECL_PRIV(thiz, priv);
  111. ftk_rtthread_select_fd_free(priv->fd);
  112. rt_device_close(priv->device);
  113. FTK_ZFREE(thiz, sizeof(thiz) + sizeof(PrivInfo));
  114. }
  115. }
  116. static rt_err_t ftk_source_input_rx_ind(rt_device_t dev, rt_size_t size)
  117. {
  118. FtkSource* thiz = (FtkSource*)dev->user_data;
  119. DECL_PRIV(thiz, priv);
  120. ftk_rtthread_set_file_readble(priv->fd);
  121. return RET_OK;
  122. }
  123. FtkSource* ftk_source_input_create(const char* filename, FtkOnEvent on_event, void* user_data)
  124. {
  125. FtkSource* thiz = (FtkSource*)FTK_ZALLOC(sizeof(FtkSource) + sizeof(PrivInfo));
  126. rt_device_t device = NULL;
  127. if (thiz != NULL)
  128. {
  129. DECL_PRIV(thiz, priv);
  130. thiz->get_fd = ftk_source_input_get_fd;
  131. thiz->check = ftk_source_input_check;
  132. thiz->dispatch = ftk_source_input_dispatch;
  133. thiz->destroy = ftk_source_input_destroy;
  134. thiz->ref = 1;
  135. priv->device = rt_device_find(filename);
  136. if (priv->device == NULL)
  137. {
  138. FTK_ZFREE(thiz, sizeof(thiz) + sizeof(PrivInfo));
  139. return NULL;
  140. }
  141. if (rt_device_open(priv->device, RT_DEVICE_OFLAG_RDONLY) != RT_EOK)
  142. {
  143. FTK_ZFREE(thiz, sizeof(thiz) + sizeof(PrivInfo));
  144. return NULL;
  145. }
  146. priv->device->user_data = (void *)thiz;
  147. rt_device_set_rx_indicate(priv->device, ftk_source_input_rx_ind);
  148. priv->fd = ftk_rtthread_select_fd_alloc();
  149. priv->on_event = on_event;
  150. priv->user_data = user_data;
  151. ftk_keymap_init();
  152. ftk_logd("%s: %d=%s priv->user_data=%p\n", __func__, priv->fd, filename, priv->user_data);
  153. }
  154. return thiz;
  155. }