sensor.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2014-08-03 Bernard the first version
  9. */
  10. #include <stddef.h>
  11. #include <string.h>
  12. #include "sensor.h"
  13. /**
  14. * SensorBase
  15. */
  16. SensorBase::SensorBase(int type)
  17. {
  18. memset(&(this->config), 0x0, sizeof(SensorConfig));
  19. this->type = type;
  20. this->next = this->prev = NULL;
  21. subscribe(NULL, NULL);
  22. }
  23. SensorBase::~SensorBase()
  24. {
  25. }
  26. int SensorBase::getType(void)
  27. {
  28. return this->type;
  29. }
  30. int SensorBase::setConfig(SensorConfig *config)
  31. {
  32. int result;
  33. /* configure to the low level sensor */
  34. result = this->configure(config);
  35. if (result == 0)
  36. {
  37. this->config = *config;
  38. }
  39. return result;
  40. }
  41. int SensorBase::getConfig(SensorConfig *config)
  42. {
  43. *config = this->config;
  44. return 0;
  45. }
  46. int SensorBase::subscribe(SensorEventHandler_t handler, void *user_data)
  47. {
  48. this->evtHandler = handler;
  49. this->userData = user_data;
  50. return 0;
  51. }
  52. int SensorBase::publish(void)
  53. {
  54. if (this->evtHandler != NULL)
  55. {
  56. /* invoke subscribed handler */
  57. (*evtHandler)(this->userData);
  58. }
  59. return 0;
  60. }
  61. /**
  62. * Sensor Manager
  63. */
  64. /* sensors list */
  65. static SensorBase *sensor_list = NULL;
  66. SensorManager::SensorManager()
  67. {
  68. }
  69. SensorManager::~SensorManager()
  70. {
  71. }
  72. int SensorManager::registerSensor(SensorBase *sensor)
  73. {
  74. RT_ASSERT(sensor != RT_NULL);
  75. /* add sensor into the list */
  76. if (sensor_list == NULL)
  77. {
  78. sensor->prev = sensor->next = sensor;
  79. }
  80. else
  81. {
  82. sensor_list->prev->next = sensor;
  83. sensor->prev = sensor_list->prev;
  84. sensor_list->prev = sensor;
  85. sensor->next = sensor_list;
  86. }
  87. /* point the sensorList to this sensor */
  88. sensor_list = sensor;
  89. return 0;
  90. }
  91. int SensorManager::unregisterSensor(SensorBase *sensor)
  92. {
  93. /* disconnect sensor list */
  94. sensor->next->prev = sensor->prev;
  95. sensor->prev->next = sensor->next;
  96. /* check the sensorList */
  97. if (sensor == sensor_list)
  98. {
  99. if (sensor->next == sensor) sensor_list = NULL; /* empty list */
  100. else sensor_list = sensor->next;
  101. }
  102. /* re-initialize sensor node */
  103. sensor->next = sensor->prev = sensor;
  104. return 0;
  105. }
  106. SensorBase *SensorManager::getDefaultSensor(int type)
  107. {
  108. SensorBase *sensor = sensor_list;
  109. if (sensor == NULL) return NULL;
  110. do
  111. {
  112. /* find the same type */
  113. if (sensor->getType() == type) return sensor;
  114. sensor = sensor->next;
  115. }while (sensor != sensor_list);
  116. return NULL;
  117. }
  118. int SensorManager::subscribe(int type, SensorEventHandler_t handler, void *user_data)
  119. {
  120. SensorBase *sensor;
  121. sensor = SensorManager::getDefaultSensor(type);
  122. if (sensor != NULL)
  123. {
  124. sensor->subscribe(handler, user_data);
  125. return 0;
  126. }
  127. return -1;
  128. }
  129. int SensorManager::sensorEventReady(SensorBase *sensor)
  130. {
  131. return 0;
  132. }
  133. int SensorManager::pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration)
  134. {
  135. rt_tick_t tick;
  136. int result, index;
  137. if (sensor == NULL) return -1;
  138. tick = rt_tick_get();
  139. for (index = 0; index < number; index ++)
  140. {
  141. result = sensor->poll(&events[index]);
  142. if (result < 0) break;
  143. if (rt_tick_get() - tick > duration) break;
  144. }
  145. return index;
  146. }
  147. rt_sensor_t rt_sensor_get_default(int type)
  148. {
  149. return (rt_sensor_t)SensorManager::getDefaultSensor(type);
  150. }
  151. int rt_sensor_subscribe(rt_sensor_t sensor, SensorEventHandler_t handler, void *user_data)
  152. {
  153. SensorBase *sensor_base;
  154. if (sensor == NULL) return -1;
  155. sensor_base = (SensorBase*)sensor;
  156. return sensor_base->subscribe(handler, user_data);
  157. }
  158. int rt_sensor_poll(rt_sensor_t sensor, sensors_event_t *event)
  159. {
  160. SensorBase *sensor_base;
  161. if (sensor == NULL || event == NULL) return -1;
  162. sensor_base = (SensorBase*)sensor;
  163. return sensor_base->poll(event);
  164. }
  165. int rt_sensor_configure(rt_sensor_t sensor, SensorConfig *config)
  166. {
  167. SensorBase *sensor_base;
  168. if (sensor == NULL || config == NULL) return -1;
  169. sensor_base = (SensorBase*)sensor;
  170. return sensor_base->setConfig(config);
  171. }
  172. int rt_sensor_activate(rt_sensor_t sensor, int enable)
  173. {
  174. SensorBase *sensor_base;
  175. if (sensor == NULL) return -1;
  176. sensor_base = (SensorBase*)sensor;
  177. return sensor_base->activate(enable);
  178. }