sensor.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  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. #define CHKECK_COUNT 3
  10. typedef struct {
  11. lock_t lck;
  12. sensor_all_t all;
  13. }sensor_handle_t;
  14. static sensor_handle_t ssHandle={0};
  15. sensor_all_t * get_sensor(void)
  16. {
  17. return &ssHandle.all;
  18. }
  19. static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  20. {
  21. int i,r=0;
  22. for(i=0; i<RETRY_TIMES; i++) {
  23. r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
  24. if(r==cnt) {
  25. break;
  26. }
  27. }
  28. return (r==cnt)?0:-1;
  29. }
  30. int sensor_init(void)
  31. {
  32. paras_data_t* p_d = paras_get();
  33. sensor_handle_t *h=&ssHandle;
  34. ssHandle.all.data = (sensor_data_t *)malloc(sizeof(sensor_data_t) *MAX_SENSOR);
  35. if(ssHandle.all.data)
  36. {
  37. h->lck = lock_init();
  38. memset(ssHandle.all.data,0,sizeof(sensor_data_t)*MAX_SENSOR);
  39. ssHandle.all.max = MAX_SENSOR;
  40. ssHandle.all.cnt = MAX_SENSOR;
  41. //first 温湿度传感器 默认地址1 不允许修改
  42. memcpy(ssHandle.all.data[0].info.name,"Temp-Humi Sensor",strlen("Temp-Humi Sensor"));
  43. ssHandle.all.data[0].info.addr = 1;
  44. ssHandle.all.data[0].info.type = SENSOR_TYPE_TEMP_HUMI;
  45. ssHandle.all.data[0].info.status = 0;
  46. ssHandle.all.data[0].info.num_val = 2;
  47. if(p_d->sensor[0].th_max_1 != 0)
  48. {
  49. ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor[0].th_max_1 /100.0);
  50. ssHandle.all.data[0].val[0].thr.en.th_sen_max_en = 1;
  51. }
  52. if(p_d->sensor[0].th_min_1 != 0)
  53. {
  54. ssHandle.all.data[0].val[0].thr.min = ((float)p_d->sensor[0].th_min_1 /100.0);
  55. ssHandle.all.data[0].val[0].thr.en.th_sen_min_en = 1;
  56. }
  57. if(p_d->sensor[0].th_max_2 != 0)
  58. {
  59. ssHandle.all.data[0].val[1].thr.max = ((float)p_d->sensor[0].th_max_2 /100.0);
  60. ssHandle.all.data[0].val[1].thr.en.th_sen_max_en = 1;
  61. }
  62. if(p_d->sensor[0].th_min_2 != 0)
  63. {
  64. ssHandle.all.data[0].val[1].thr.min = ((float)p_d->sensor[0].th_min_2 /100.0);
  65. ssHandle.all.data[0].val[1].thr.en.th_sen_min_en = 1;
  66. }
  67. //ssHandle.all.data[0].val[0].value = 0;
  68. //second 烟雾传感器 默认地址2 不允许修改
  69. memcpy(ssHandle.all.data[1].info.name,"Smoke Sensor",strlen("Smoke Sensor"));
  70. ssHandle.all.data[1].info.addr = 2;
  71. ssHandle.all.data[1].info.type = SENSOR_TYPE_SMOKE;
  72. ssHandle.all.data[1].info.status = 0;
  73. ssHandle.all.data[1].info.num_val = 1;
  74. if(p_d->sensor[1].th_max_1 != 0)
  75. {
  76. ssHandle.all.data[1].val[0].thr.max = ((float)p_d->sensor[1].th_max_1 /100.0);
  77. ssHandle.all.data[1].val[0].thr.en.th_sen_max_en = 1;
  78. }
  79. if(p_d->sensor[1].th_min_1 != 0)
  80. {
  81. ssHandle.all.data[1].val[0].thr.min = ((float)p_d->sensor[1].th_min_1 /100.0);
  82. ssHandle.all.data[1].val[0].thr.en.th_sen_min_en = 1;
  83. }
  84. if(p_d->sensor[1].th_max_2 != 0)
  85. {
  86. ssHandle.all.data[1].val[1].thr.max = ((float)p_d->sensor[1].th_max_2 /100.0);
  87. ssHandle.all.data[1].val[1].thr.en.th_sen_max_en = 1;
  88. }
  89. if(p_d->sensor[1].th_min_2 != 0)
  90. {
  91. ssHandle.all.data[1].val[1].thr.min = ((float)p_d->sensor[1].th_min_2 /100.0);
  92. ssHandle.all.data[1].val[1].thr.en.th_sen_min_en = 1;
  93. }
  94. //second 气体传感器 默认地址3 不允许修改
  95. memcpy(ssHandle.all.data[2].info.name,"Gas Sensor",strlen("Gas Sensor"));
  96. ssHandle.all.data[2].info.addr = 3;
  97. ssHandle.all.data[2].info.type = SENSOR_TYPE_GAS;
  98. ssHandle.all.data[2].info.status = 0;
  99. ssHandle.all.data[2].info.num_val = 1;
  100. if(p_d->sensor[2].th_max_1 != 0)
  101. {
  102. ssHandle.all.data[2].val[0].thr.max = ((float)p_d->sensor[2].th_max_1 /100.0);
  103. ssHandle.all.data[2].val[0].thr.en.th_sen_max_en = 1;
  104. }
  105. if(p_d->sensor[2].th_min_1 != 0)
  106. {
  107. ssHandle.all.data[2].val[0].thr.min = ((float)p_d->sensor[2].th_min_1 /100.0);
  108. ssHandle.all.data[2].val[0].thr.en.th_sen_min_en = 1;
  109. }
  110. if(p_d->sensor[2].th_max_2 != 0)
  111. {
  112. ssHandle.all.data[2].val[1].thr.max = ((float)p_d->sensor[2].th_max_2 /100.0);
  113. ssHandle.all.data[2].val[1].thr.en.th_sen_max_en = 1;
  114. }
  115. if(p_d->sensor[2].th_min_2 != 0)
  116. {
  117. ssHandle.all.data[2].val[1].thr.min = ((float)p_d->sensor[2].th_min_2 /100.0);
  118. ssHandle.all.data[2].val[1].thr.en.th_sen_min_en = 1;
  119. }
  120. }
  121. return 0;
  122. }
  123. int sensor_deinit(void)
  124. {
  125. sensor_handle_t *h=&ssHandle;
  126. sensor_handle_t data={0};
  127. if(h->all.data)
  128. {
  129. free(h->all.data);
  130. }
  131. lock_deinit(h->lck);
  132. *h = data;
  133. return 0;
  134. }
  135. int sensor_set(sensor_data_t *data)
  136. {
  137. int i,r=-1,cnt;
  138. sensor_data_t *p=NULL;
  139. sensor_handle_t *h=&ssHandle;
  140. if(!data) {
  141. return -1;
  142. }
  143. lock_on(h->lck);
  144. for(i=0; i<h->all.cnt; i++) {
  145. sensor_data_t *p=&h->all.data[i];
  146. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  147. r = 0;
  148. p->info = data->info;
  149. break;
  150. }
  151. }
  152. if(r==-1) {
  153. cnt = h->all.cnt+1;
  154. if(h->all.data) {
  155. p = (sensor_data_t*)realloc(h->all.data, sizeof(sensor_data_t)*cnt);
  156. }
  157. else {
  158. p = (sensor_data_t*)calloc(1, sizeof(sensor_data_t));
  159. }
  160. if(p) {
  161. p[cnt-1].info = data->info;
  162. memset(&p[cnt-1].val, 0, sizeof(p[cnt-1].val));
  163. h->all.cnt = cnt;
  164. h->all.data = p;
  165. r = 0;
  166. }
  167. }
  168. if(r==0) {
  169. //db_update
  170. }
  171. lock_off(h->lck);
  172. return r;
  173. }
  174. int sensor_remove(sensor_data_t *data)
  175. {
  176. int i,r=-1;
  177. sensor_handle_t *h=&ssHandle;
  178. if(!data) {
  179. return -1;
  180. }
  181. lock_on(h->lck);
  182. for(i=0; i<h->all.cnt; i++) {
  183. sensor_data_t *p=&h->all.data[i];
  184. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  185. r = 0;
  186. break;
  187. }
  188. }
  189. if(r==0) { //find and remove it
  190. if(i!=h->all.cnt-1) {
  191. memmove(&h->all.data[i], &h->all.data[i+1], sizeof(sensor_data_t)*(h->all.cnt-i-1));
  192. }
  193. h->all.cnt -= 1;
  194. }
  195. lock_off(h->lck);
  196. return r;
  197. }
  198. static int my_read(sensor_data_t *data)
  199. {
  200. int r=-1;
  201. uint16_t time=0;
  202. uint16_t tmp[10]={0};
  203. uint8_t addr=data->info.addr;
  204. sensor_handle_t *h=&ssHandle;
  205. switch(data->info.type) {
  206. case SENSOR_TYPE_TEMP_HUMI:
  207. {
  208. r = read_reg(addr, 0, tmp, 2);
  209. if(r < 0)
  210. {
  211. return -1;
  212. }
  213. data->val[0].value = tmp[0] / 10.0;
  214. data->val[1].value = tmp[1] / 10.0;
  215. }
  216. break;
  217. case SENSOR_TYPE_SMOKE:
  218. case SENSOR_TYPE_WATER:
  219. case SENSOR_TYPE_ACCESS:
  220. {
  221. }
  222. break;
  223. case SENSOR_TYPE_GAS:
  224. {
  225. r = read_reg(addr, 19, tmp, 1);
  226. if(r<0) {
  227. return -1 ;
  228. }
  229. data->val[0].value = tmp[0]; //气体浓度值
  230. }
  231. break;
  232. }
  233. return r;
  234. }
  235. int sensor_query(void)
  236. {
  237. int i,r=-1;
  238. sensor_handle_t *h=&ssHandle;
  239. lock_on(h->lck);
  240. for(i=0; i<h->all.cnt; i++) {
  241. r = my_read(&h->all.data[i]);
  242. if(r == 0)
  243. {
  244. ssHandle.all.data[i].info.status = 1;
  245. ssHandle.all.data[i].info.check_count = 0;
  246. if(ssHandle.all.data[i].val[0].thr.en.th_sen_max_en)
  247. {
  248. uint8_t back_waning_up = ssHandle.all.data[i].val[0].s_alarm.max_up;
  249. if(ssHandle.all.data[i].val[0].value > ssHandle.all.data[i].val[0].thr.max)
  250. {
  251. ssHandle.all.data[i].val[0].s_alarm.max_up = 1;
  252. if(back_waning_up != ssHandle.all.data[i].val[0].s_alarm.max_up)
  253. {
  254. //todo beep 报警
  255. //todo send mail
  256. }
  257. }else
  258. {
  259. ssHandle.all.data[i].val[0].s_alarm.max_up = 0;
  260. }
  261. }
  262. if(ssHandle.all.data[i].val[0].thr.en.th_sen_min_en)
  263. {
  264. uint8_t back_waning_down = ssHandle.all.data[i].val[0].s_alarm.min_down;
  265. if(ssHandle.all.data[i].val[0].value < ssHandle.all.data[i].val[0].thr.min)
  266. {
  267. ssHandle.all.data[i].val[0].s_alarm.min_down = 1;
  268. if(back_waning_down != ssHandle.all.data[i].val[0].s_alarm.min_down)
  269. {
  270. //todo beep 报警
  271. //todo send mail
  272. }
  273. }else
  274. {
  275. ssHandle.all.data[i].val[0].s_alarm.min_down = 0;
  276. }
  277. }
  278. if(ssHandle.all.data[i].info.num_val == 2)
  279. {
  280. uint8_t back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up;
  281. if(ssHandle.all.data[i].val[1].value > ssHandle.all.data[i].val[1].thr.max)
  282. {
  283. ssHandle.all.data[i].val[1].s_alarm.max_up = 1;
  284. if(back_waning_up != ssHandle.all.data[i].val[1].s_alarm.max_up)
  285. {
  286. //todo beep 报警
  287. //todo send mail
  288. }
  289. }else
  290. {
  291. ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
  292. }
  293. if(ssHandle.all.data[i].val[1].thr.en.th_sen_min_en)
  294. {
  295. uint8_t back_waning_down = ssHandle.all.data[i].val[1].s_alarm.min_down;
  296. if(ssHandle.all.data[i].val[1].value < ssHandle.all.data[i].val[1].thr.min)
  297. {
  298. ssHandle.all.data[i].val[1].s_alarm.min_down = 1;
  299. if(back_waning_down != ssHandle.all.data[i].val[1].s_alarm.min_down)
  300. {
  301. //todo beep 报警
  302. //todo send mail
  303. }
  304. }else
  305. {
  306. ssHandle.all.data[i].val[1].s_alarm.min_down = 0;
  307. }
  308. }
  309. }
  310. }else
  311. {
  312. ssHandle.all.data[i].info.check_count++;
  313. if(ssHandle.all.data[i].info.check_count >= CHKECK_COUNT)
  314. {
  315. ssHandle.all.data[i].info.status = 0;
  316. ssHandle.all.data[i].val[0].value = 0.0;
  317. if(ssHandle.all.data[i].info.num_val == 2)
  318. {
  319. ssHandle.all.data[i].val[1].value = 0.0;
  320. }
  321. ssHandle.all.data[i].info.check_count = CHKECK_COUNT;
  322. }
  323. }
  324. }
  325. lock_off(h->lck);
  326. return 0;
  327. }
  328. sensor_all_t * sensor_get_data()
  329. {
  330. return &ssHandle.all;
  331. }
  332. int sensor_data_get(sensor_all_t *all)
  333. {
  334. sensor_handle_t *h=&ssHandle;
  335. if(!all) {
  336. return -1;
  337. }
  338. lock_on(h->lck);
  339. *all = h->all;
  340. lock_off(h->lck);
  341. return 0;
  342. }
  343. int sensor_data_free(sensor_all_t *all)
  344. {
  345. if(!all) {
  346. return -1;
  347. }
  348. if(all->data) {
  349. free(all->data);
  350. all->data = NULL;
  351. }
  352. all->cnt = 0;
  353. return 0;
  354. }