sensor.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "mb.h"
  4. #include "lock.h"
  5. #include "sensor.h"
  6. #include "paras.h"
  7. #define RETRY_TIMES 3
  8. #define TIMEOUT 200
  9. typedef struct {
  10. lock_t lck;
  11. sensor_all_t all;
  12. }sensor_handle_t;
  13. static sensor_handle_t ssHandle={0};
  14. static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  15. {
  16. int i,r=0;
  17. for(i=0; i<RETRY_TIMES; i++) {
  18. r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
  19. if(r==cnt) {
  20. break;
  21. }
  22. }
  23. return (r==cnt)?0:-1;
  24. }
  25. int sensor_init(void)
  26. {
  27. paras_data_t* p_d = paras_get();
  28. sensor_handle_t *h=&ssHandle;
  29. ssHandle.all.data = (sensor_data_t *)malloc(sizeof(sensor_data_t) *MAX_SENSOR);
  30. if(ssHandle.all.data)
  31. {
  32. h->lck = lock_init();
  33. ssHandle.all.max = MAX_SENSOR;
  34. ssHandle.all.cnt = MAX_SENSOR;
  35. //first 温湿度传感器 默认地址1 不允许修改
  36. memcpy(ssHandle.all.data[0].info.name,"Temp-Humi Sensor",strlen("Temp-Humi Sensor"));
  37. ssHandle.all.data[0].info.addr = 1;
  38. ssHandle.all.data[0].info.type = SENSOR_TYPE_TEMP_HUMI;
  39. if(p_d->sensor[0].th_max_1 != 0)
  40. {
  41. ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor[0].th_max_1 /100.0);
  42. ssHandle.all.data[0].val[0].thr.en = 1;
  43. }
  44. if(p_d->sensor[0].th_min_1 != 0)
  45. {
  46. ssHandle.all.data[0].val[0].thr.min = ((float)p_d->sensor[0].th_min_1 /100.0);
  47. ssHandle.all.data[0].val[0].thr.en = 1;
  48. }
  49. if(p_d->sensor[0].th_max_2 != 0)
  50. {
  51. ssHandle.all.data[0].val[1].thr.max = ((float)p_d->sensor[0].th_max_2 /100.0);
  52. ssHandle.all.data[0].val[1].thr.en = 1;
  53. }
  54. if(p_d->sensor[0].th_min_2 != 0)
  55. {
  56. ssHandle.all.data[0].val[1].thr.min = ((float)p_d->sensor[0].th_min_2 /100.0);
  57. ssHandle.all.data[0].val[1].thr.en = 1;
  58. }
  59. //ssHandle.all.data[0].val[0].value = 0;
  60. //second 烟雾传感器 默认地址2 不允许修改
  61. memcpy(ssHandle.all.data[1].info.name,"Smoke Sensor",strlen("Smoke Sensor"));
  62. ssHandle.all.data[1].info.addr = 2;
  63. ssHandle.all.data[1].info.type = SENSOR_TYPE_SMOKE;
  64. if(p_d->sensor[1].th_max_1 != 0)
  65. {
  66. ssHandle.all.data[1].val[0].thr.max = ((float)p_d->sensor[1].th_max_1 /100.0);
  67. ssHandle.all.data[1].val[0].thr.en = 1;
  68. }
  69. if(p_d->sensor[1].th_min_1 != 0)
  70. {
  71. ssHandle.all.data[1].val[0].thr.min = ((float)p_d->sensor[1].th_min_1 /100.0);
  72. ssHandle.all.data[1].val[0].thr.en = 1;
  73. }
  74. if(p_d->sensor[1].th_max_2 != 0)
  75. {
  76. ssHandle.all.data[1].val[1].thr.max = ((float)p_d->sensor[1].th_max_2 /100.0);
  77. ssHandle.all.data[1].val[1].thr.en = 1;
  78. }
  79. if(p_d->sensor[1].th_min_2 != 0)
  80. {
  81. ssHandle.all.data[1].val[1].thr.min = ((float)p_d->sensor[1].th_min_2 /100.0);
  82. ssHandle.all.data[1].val[1].thr.en = 1;
  83. }
  84. //second 气体传感器 默认地址3 不允许修改
  85. memcpy(ssHandle.all.data[2].info.name,"Gas Sensor",strlen("Gas Sensor"));
  86. ssHandle.all.data[2].info.addr = 3;
  87. ssHandle.all.data[2].info.type = SENSOR_TYPE_GAS;
  88. if(p_d->sensor[2].th_max_1 != 0)
  89. {
  90. ssHandle.all.data[2].val[0].thr.max = ((float)p_d->sensor[2].th_max_1 /100.0);
  91. ssHandle.all.data[2].val[0].thr.en = 1;
  92. }
  93. if(p_d->sensor[2].th_min_1 != 0)
  94. {
  95. ssHandle.all.data[2].val[0].thr.min = ((float)p_d->sensor[2].th_min_1 /100.0);
  96. ssHandle.all.data[2].val[0].thr.en = 1;
  97. }
  98. if(p_d->sensor[2].th_max_2 != 0)
  99. {
  100. ssHandle.all.data[2].val[1].thr.max = ((float)p_d->sensor[2].th_max_2 /100.0);
  101. ssHandle.all.data[2].val[1].thr.en = 1;
  102. }
  103. if(p_d->sensor[2].th_min_2 != 0)
  104. {
  105. ssHandle.all.data[2].val[1].thr.min = ((float)p_d->sensor[2].th_min_2 /100.0);
  106. ssHandle.all.data[2].val[1].thr.en = 1;
  107. }
  108. }
  109. return 0;
  110. }
  111. int sensor_deinit(void)
  112. {
  113. sensor_handle_t *h=&ssHandle;
  114. sensor_handle_t data={0};
  115. if(h->all.data)
  116. {
  117. free(h->all.data);
  118. }
  119. lock_deinit(h->lck);
  120. *h = data;
  121. return 0;
  122. }
  123. int sensor_set(sensor_data_t *data)
  124. {
  125. int i,r=-1,cnt;
  126. sensor_data_t *p=NULL;
  127. sensor_handle_t *h=&ssHandle;
  128. if(!data) {
  129. return -1;
  130. }
  131. lock_on(h->lck);
  132. for(i=0; i<h->all.cnt; i++) {
  133. sensor_data_t *p=&h->all.data[i];
  134. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  135. r = 0;
  136. p->info = data->info;
  137. break;
  138. }
  139. }
  140. if(r==-1) {
  141. cnt = h->all.cnt+1;
  142. if(h->all.data) {
  143. p = (sensor_data_t*)realloc(h->all.data, sizeof(sensor_data_t)*cnt);
  144. }
  145. else {
  146. p = (sensor_data_t*)calloc(1, sizeof(sensor_data_t));
  147. }
  148. if(p) {
  149. p[cnt-1].info = data->info;
  150. memset(&p[cnt-1].val, 0, sizeof(p[cnt-1].val));
  151. h->all.cnt = cnt;
  152. h->all.data = p;
  153. r = 0;
  154. }
  155. }
  156. if(r==0) {
  157. //db_update
  158. }
  159. lock_off(h->lck);
  160. return r;
  161. }
  162. int sensor_remove(sensor_data_t *data)
  163. {
  164. int i,r=-1;
  165. sensor_handle_t *h=&ssHandle;
  166. if(!data) {
  167. return -1;
  168. }
  169. lock_on(h->lck);
  170. for(i=0; i<h->all.cnt; i++) {
  171. sensor_data_t *p=&h->all.data[i];
  172. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  173. r = 0;
  174. break;
  175. }
  176. }
  177. if(r==0) { //find and remove it
  178. if(i!=h->all.cnt-1) {
  179. memmove(&h->all.data[i], &h->all.data[i+1], sizeof(sensor_data_t)*(h->all.cnt-i-1));
  180. }
  181. h->all.cnt -= 1;
  182. }
  183. lock_off(h->lck);
  184. return r;
  185. }
  186. static int my_read(sensor_data_t *data)
  187. {
  188. int r=-1;
  189. uint16_t time=0;
  190. uint16_t tmp[10]={0};
  191. uint8_t addr=data->info.addr;
  192. sensor_handle_t *h=&ssHandle;
  193. switch(data->info.type) {
  194. case SENSOR_TYPE_TEMP_HUMI:
  195. {
  196. r = read_reg(addr, 0, tmp, 2);
  197. }
  198. break;
  199. case SENSOR_TYPE_SMOKE:
  200. case SENSOR_TYPE_WATER:
  201. case SENSOR_TYPE_ACCESS:
  202. {
  203. }
  204. break;
  205. case SENSOR_TYPE_GAS:
  206. {
  207. r = read_reg(addr, 19, tmp, 1);
  208. if(r<0) {
  209. return -1 ;
  210. }
  211. data->val[0].value = tmp[0]; //气体浓度值
  212. }
  213. break;
  214. }
  215. return r;
  216. }
  217. int sensor_query(void)
  218. {
  219. int i,r=-1;
  220. sensor_handle_t *h=&ssHandle;
  221. lock_on(h->lck);
  222. for(i=0; i<h->all.cnt; i++) {
  223. r = my_read(&h->all.data[i]);
  224. }
  225. lock_off(h->lck);
  226. return 0;
  227. }
  228. sensor_all_t * sensor_get_data()
  229. {
  230. return &ssHandle.all;
  231. }
  232. int sensor_data_get(sensor_all_t *all)
  233. {
  234. sensor_handle_t *h=&ssHandle;
  235. if(!all) {
  236. return -1;
  237. }
  238. lock_on(h->lck);
  239. *all = h->all;
  240. lock_off(h->lck);
  241. return 0;
  242. }
  243. int sensor_data_free(sensor_all_t *all)
  244. {
  245. if(!all) {
  246. return -1;
  247. }
  248. if(all->data) {
  249. free(all->data);
  250. all->data = NULL;
  251. }
  252. all->cnt = 0;
  253. return 0;
  254. }