1
0

sensor.cpp 4.5 KB

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