dummy.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /****************************************************************************
  2. * drivers/rc/dummy.c
  3. *
  4. * Licensed to the Apache Software Foundation (ASF) under one or more
  5. * contributor license agreements. See the NOTICE file distributed with
  6. * this work for additional information regarding copyright ownership. The
  7. * ASF licenses this file to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance with the
  9. * License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  16. * License for the specific language governing permissions and limitations
  17. * under the License.
  18. *
  19. ****************************************************************************/
  20. /****************************************************************************
  21. * Included Files
  22. ****************************************************************************/
  23. #include <nuttx/config.h>
  24. #include <nuttx/rc/lirc_dev.h>
  25. #include <nuttx/kmalloc.h>
  26. #include <nuttx/wqueue.h>
  27. #include <nuttx/clock.h>
  28. #include <debug.h>
  29. #include <inttypes.h>
  30. #include <stdio.h>
  31. #include <errno.h>
  32. /****************************************************************************
  33. * Pre-processor Definitions
  34. ****************************************************************************/
  35. #define DUMMY_MAX_EVENT_SIZE 512
  36. #define DUMMY_WORK_PERIOD SEC2TICK(1)
  37. /****************************************************************************
  38. * Private
  39. ****************************************************************************/
  40. /****************************************************************************
  41. * Private Function Prototypes
  42. ****************************************************************************/
  43. static int dummy_open(FAR struct lirc_lowerhalf_s *lower);
  44. static void dummy_close(FAR struct lirc_lowerhalf_s *lower);
  45. static int dummy_s_tx_mask(FAR struct lirc_lowerhalf_s *lower,
  46. unsigned int mask);
  47. static int dummy_s_tx_carrier(FAR struct lirc_lowerhalf_s *lower,
  48. unsigned int carrier);
  49. static int dummy_s_tx_duty_cycle(FAR struct lirc_lowerhalf_s *lower,
  50. unsigned int duty_cycle);
  51. static int dummy_s_rx_carrier_range(FAR struct lirc_lowerhalf_s *lower,
  52. unsigned int min, unsigned int max);
  53. static int dummy_tx_ir(FAR struct lirc_lowerhalf_s *lower,
  54. FAR unsigned int *txbuf, unsigned int n);
  55. static int dummy_tx_scancode(FAR struct lirc_lowerhalf_s *lower,
  56. FAR struct lirc_scancode *txbuf);
  57. static int dummy_s_learning_mode(FAR struct lirc_lowerhalf_s *lower,
  58. int enable);
  59. static int dummy_s_carrier_report(FAR struct lirc_lowerhalf_s *lower,
  60. int enable);
  61. static int dummy_s_timeout(FAR struct lirc_lowerhalf_s *lower,
  62. unsigned int timeout);
  63. /****************************************************************************
  64. * Private Types
  65. ****************************************************************************/
  66. struct dummy_dev_s
  67. {
  68. struct lirc_lowerhalf_s lower;
  69. struct work_s work;
  70. unsigned test_sample;
  71. };
  72. /****************************************************************************
  73. * Private Data
  74. ****************************************************************************/
  75. static const struct lirc_ops_s g_dummy_ops =
  76. {
  77. .driver_type = LIRC_DRIVER_IR_RAW,
  78. .open = dummy_open,
  79. .close = dummy_close,
  80. .s_tx_mask = dummy_s_tx_mask,
  81. .s_tx_carrier = dummy_s_tx_carrier,
  82. .s_tx_duty_cycle = dummy_s_tx_duty_cycle,
  83. .s_rx_carrier_range = dummy_s_rx_carrier_range,
  84. .tx_ir = dummy_tx_ir,
  85. .tx_scancode = dummy_tx_scancode,
  86. .s_learning_mode = dummy_s_learning_mode,
  87. .s_carrier_report = dummy_s_carrier_report,
  88. .s_timeout = dummy_s_timeout,
  89. };
  90. /****************************************************************************
  91. * Private Functions
  92. ****************************************************************************/
  93. static void dummy_worker(FAR void *arg)
  94. {
  95. struct dummy_dev_s *dummy = arg;
  96. unsigned sample = dummy->test_sample;
  97. if (sample % 2 == 0)
  98. {
  99. sample = LIRC_SPACE(sample);
  100. }
  101. else
  102. {
  103. sample = LIRC_PULSE(sample);
  104. }
  105. lirc_sample_event(&dummy->lower, sample);
  106. rcinfo("Dummy RC read Raw Data from device:%d\n", sample);
  107. dummy->test_sample++;
  108. work_queue(LPWORK, &dummy->work, dummy_worker, dummy,
  109. DUMMY_WORK_PERIOD);
  110. }
  111. static int dummy_open(FAR struct lirc_lowerhalf_s *lower)
  112. {
  113. struct dummy_dev_s *dummy = (struct dummy_dev_s *)lower;
  114. rcinfo("Called %s\n", __func__);
  115. dummy->test_sample = 0;
  116. return work_queue(LPWORK, &dummy->work, dummy_worker, dummy,
  117. DUMMY_WORK_PERIOD);
  118. }
  119. static void dummy_close(FAR struct lirc_lowerhalf_s *lower)
  120. {
  121. struct dummy_dev_s *dummy = (struct dummy_dev_s *)lower;
  122. rcinfo("Called %s\n", __func__);
  123. work_cancel(LPWORK, &dummy->work);
  124. }
  125. static int dummy_s_tx_mask(FAR struct lirc_lowerhalf_s *lower,
  126. unsigned int mask)
  127. {
  128. rcinfo("Called %s, mask:%u\n", __func__, mask);
  129. return 0;
  130. }
  131. static int dummy_s_tx_carrier(FAR struct lirc_lowerhalf_s *lower,
  132. unsigned int carrier)
  133. {
  134. rcinfo("Called %s, carrier:%u\n", __func__, carrier);
  135. return 0;
  136. }
  137. static int dummy_s_tx_duty_cycle(FAR struct lirc_lowerhalf_s *lower,
  138. unsigned int duty_cycle)
  139. {
  140. rcinfo("Called %s, duty_cycle:%u\n", __func__, duty_cycle);
  141. return 0;
  142. }
  143. static int dummy_s_rx_carrier_range(FAR struct lirc_lowerhalf_s *lower,
  144. unsigned int min, unsigned int max)
  145. {
  146. rcinfo("Called %s, min:%u, max:%u\n", __func__, min, max);
  147. return 0;
  148. }
  149. static int dummy_tx_ir(FAR struct lirc_lowerhalf_s *lower,
  150. unsigned *txbuf, unsigned int n)
  151. {
  152. rcinfo("Dummy RC send raw data:%d(size:%d) to device\n", *txbuf, n);
  153. return n;
  154. }
  155. static int dummy_tx_scancode(FAR struct lirc_lowerhalf_s *lower,
  156. FAR struct lirc_scancode *txbuf)
  157. {
  158. rcinfo("Dummy RC send scancode data:%" PRIu64 " to device\n",
  159. txbuf->scancode);
  160. return 0;
  161. }
  162. static int dummy_s_learning_mode(FAR struct lirc_lowerhalf_s *lower,
  163. int enable)
  164. {
  165. rcinfo("Called %s, enable:%d\n", __func__, enable);
  166. return 0;
  167. }
  168. static int dummy_s_carrier_report(FAR struct lirc_lowerhalf_s *lower,
  169. int enable)
  170. {
  171. rcinfo("Called %s, enable:%d\n", __func__, enable);
  172. return 0;
  173. }
  174. static int dummy_s_timeout(FAR struct lirc_lowerhalf_s *lower,
  175. unsigned int timeout)
  176. {
  177. rcinfo("Called %s, timeout:%u\n", __func__, timeout);
  178. return 0;
  179. }
  180. /****************************************************************************
  181. * Public Functions
  182. ****************************************************************************/
  183. int rc_dummy_initialize(int devno)
  184. {
  185. struct dummy_dev_s *dummy;
  186. dummy = kmm_malloc(sizeof(*dummy));
  187. if (!dummy)
  188. {
  189. rcerr("failed to alloc memory for dummy\n");
  190. return -ENOMEM;
  191. }
  192. dummy->lower.ops = &g_dummy_ops;
  193. dummy->lower.buffer_bytes = DUMMY_MAX_EVENT_SIZE * sizeof(unsigned);
  194. dummy->work.worker = NULL;
  195. dummy->test_sample = 0;
  196. return lirc_register(&dummy->lower, devno);
  197. }