sensor.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 "sensor.h"
  16. /**
  17. * Sensor
  18. */
  19. Sensor::Sensor()
  20. {
  21. this->next = this->prev = NULL;
  22. Subscribe(NULL, NULL);
  23. }
  24. Sensor::~Sensor()
  25. {
  26. }
  27. int Sensor::GetType(void)
  28. {
  29. return this->type;
  30. }
  31. int Sensor::Subscribe(SensorEventHandler_t *handler, void *user_data)
  32. {
  33. this->evtHandler = handler;
  34. this->userData = user_data;
  35. return 0;
  36. }
  37. int Sensor::Publish(sensors_event_t *event)
  38. {
  39. if (this->evtHandler != NULL)
  40. {
  41. /* invoke subscribed handler */
  42. (*evtHandler)(this, event, this->userData);
  43. }
  44. return 0;
  45. }
  46. /**
  47. * Sensor Manager
  48. */
  49. /* sensor manager instance */
  50. static SensorManager _sensor_manager;
  51. SensorManager::SensorManager()
  52. {
  53. sensorList = NULL;
  54. }
  55. SensorManager::~SensorManager()
  56. {
  57. }
  58. int SensorManager::RegisterSensor(Sensor *sensor)
  59. {
  60. SensorManager *self = &_sensor_manager;
  61. RT_ASSERT(sensor != RT_NULL);
  62. /* add sensor into the list */
  63. if (self->sensorList == NULL)
  64. {
  65. sensor->prev = sensor->next = sensor;
  66. }
  67. else
  68. {
  69. sensor->prev = self->sensorList;
  70. sensor->next = self->sensorList->next;
  71. self->sensorList->next->prev = sensor;
  72. self->sensorList->next = sensor;
  73. }
  74. /* point the sensorList to this sensor */
  75. self->sensorList = sensor;
  76. return 0;
  77. }
  78. int SensorManager::DeregisterSensor(Sensor *sensor)
  79. {
  80. SensorManager *self = &_sensor_manager;
  81. /* disconnect sensor list */
  82. sensor->next->prev = sensor->prev;
  83. sensor->prev->next = sensor->next;
  84. /* check the sensorList */
  85. if (sensor == self->sensorList)
  86. {
  87. if (sensor->next == sensor) self->sensorList = NULL; /* empty list */
  88. else self->sensorList = sensor->next;
  89. }
  90. /* re-initialize sensor node */
  91. sensor->next = sensor->prev = sensor;
  92. return 0;
  93. }
  94. Sensor *SensorManager::GetDefaultSensor(int type)
  95. {
  96. SensorManager *self = &_sensor_manager;
  97. Sensor *sensor = self->sensorList;
  98. if (sensor == NULL) return NULL;
  99. do
  100. {
  101. /* find the same type */
  102. if (sensor->GetType() == type) return sensor;
  103. sensor = sensor->next;
  104. }while (sensor != self->sensorList);
  105. return NULL;
  106. }
  107. int SensorManager::Subscribe(int type, SensorEventHandler_t *handler, void *user_data)
  108. {
  109. Sensor *sensor;
  110. sensor = SensorManager::GetDefaultSensor(type);
  111. if (sensor != NULL)
  112. {
  113. sensor->Subscribe(handler, user_data);
  114. return 0;
  115. }
  116. return -1;
  117. }