sensor.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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. #include "snmp.h"
  8. #include "beep.h"
  9. #include "wanning.h"
  10. #include "thread.h"
  11. #define RETRY_TIMES 3
  12. #define TIMEOUT 50
  13. #define CHKECK_COUNT 3
  14. int sensor_query(void);
  15. typedef struct {
  16. lock_t lck;
  17. sensor_all_t all;
  18. }sensor_handle_t;
  19. static sensor_handle_t ssHandle={0};
  20. sensor_all_t * get_sensor(void)
  21. {
  22. return &ssHandle.all;
  23. }
  24. static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  25. {
  26. int i,r=0;
  27. for(i=0; i<RETRY_TIMES; i++) {
  28. r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
  29. if(r==cnt) {
  30. break;
  31. }
  32. }
  33. return (r==cnt)?0:-1;
  34. }
  35. static void sensor_thread(void *arg)
  36. {
  37. //pthread_setname_np();
  38. while(1)
  39. {
  40. sensor_query();
  41. sleep(1);
  42. }
  43. }
  44. int sensor_init(void)
  45. {
  46. paras_data_t* p_d = paras_get();
  47. sensor_handle_t *h=&ssHandle;
  48. ssHandle.all.data = (sensor_data_t *)malloc(sizeof(sensor_data_t) *MAX_SENSOR);
  49. if(ssHandle.all.data)
  50. {
  51. h->lck = lock_init();
  52. memset(ssHandle.all.data,0,sizeof(sensor_data_t)*MAX_SENSOR);
  53. ssHandle.all.max = MAX_SENSOR;
  54. ssHandle.all.cnt = MAX_SENSOR;
  55. //first 温湿度传感器 默认地址1 不允许修改
  56. memcpy(ssHandle.all.data[0].info.name,"Temp-Humi Sensor",strlen("Temp-Humi Sensor"));
  57. ssHandle.all.data[0].info.addr = 1;
  58. ssHandle.all.data[0].info.type = SENSOR_TYPE_TEMP_HUMI;
  59. ssHandle.all.data[0].info.status = 0;
  60. ssHandle.all.data[0].info.num_val = 2;
  61. // p_d->sensor[0].th_max_1 = 10000;
  62. // p_d->sensor[0].th_min_1 = 7000;
  63. // p_d->sensor[0].th_max_2 = 1500;
  64. // p_d->sensor[0].th_min_2 = 1000;
  65. if(p_d->sensor[0].th_max_1 != 0)
  66. {
  67. ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor[0].th_max_1 /100.0);
  68. ssHandle.all.data[0].val[0].thr.en.th_sen_max_en = 1;
  69. }
  70. if(p_d->sensor[0].th_min_1 != 0)
  71. {
  72. ssHandle.all.data[0].val[0].thr.min = ((float)p_d->sensor[0].th_min_1 /100.0);
  73. ssHandle.all.data[0].val[0].thr.en.th_sen_min_en = 1;
  74. }
  75. if(p_d->sensor[0].th_max_2 != 0)
  76. {
  77. ssHandle.all.data[0].val[1].thr.max = ((float)p_d->sensor[0].th_max_2 /100.0);
  78. ssHandle.all.data[0].val[1].thr.en.th_sen_max_en = 1;
  79. }
  80. if(p_d->sensor[0].th_min_2 != 0)
  81. {
  82. ssHandle.all.data[0].val[1].thr.min = ((float)p_d->sensor[0].th_min_2 /100.0);
  83. ssHandle.all.data[0].val[1].thr.en.th_sen_min_en = 1;
  84. }
  85. //ssHandle.all.data[0].val[0].value = 0;
  86. //second 烟雾传感器 默认地址2 不允许修改
  87. memcpy(ssHandle.all.data[1].info.name,"Smoke Sensor",strlen("Smoke Sensor"));
  88. ssHandle.all.data[1].info.addr = 2;
  89. ssHandle.all.data[1].info.type = SENSOR_TYPE_SMOKE;
  90. ssHandle.all.data[1].info.status = 0;
  91. ssHandle.all.data[1].info.num_val = 1;
  92. if(p_d->sensor[1].th_max_1 != 0)
  93. {
  94. ssHandle.all.data[1].val[0].thr.max = ((float)p_d->sensor[1].th_max_1 /100.0);
  95. ssHandle.all.data[1].val[0].thr.en.th_sen_max_en = 1;
  96. }
  97. if(p_d->sensor[1].th_min_1 != 0)
  98. {
  99. ssHandle.all.data[1].val[0].thr.min = ((float)p_d->sensor[1].th_min_1 /100.0);
  100. ssHandle.all.data[1].val[0].thr.en.th_sen_min_en = 1;
  101. }
  102. if(p_d->sensor[1].th_max_2 != 0)
  103. {
  104. ssHandle.all.data[1].val[1].thr.max = ((float)p_d->sensor[1].th_max_2 /100.0);
  105. ssHandle.all.data[1].val[1].thr.en.th_sen_max_en = 1;
  106. }
  107. if(p_d->sensor[1].th_min_2 != 0)
  108. {
  109. ssHandle.all.data[1].val[1].thr.min = ((float)p_d->sensor[1].th_min_2 /100.0);
  110. ssHandle.all.data[1].val[1].thr.en.th_sen_min_en = 1;
  111. }
  112. //second 气体传感器 默认地址3 不允许修改
  113. memcpy(ssHandle.all.data[2].info.name,"Gas Sensor",strlen("Gas Sensor"));
  114. ssHandle.all.data[2].info.addr = 3;
  115. ssHandle.all.data[2].info.type = SENSOR_TYPE_GAS;
  116. ssHandle.all.data[2].info.status = 0;
  117. ssHandle.all.data[2].info.num_val = 1;
  118. if(p_d->sensor[2].th_max_1 != 0)
  119. {
  120. ssHandle.all.data[2].val[0].thr.max = ((float)p_d->sensor[2].th_max_1 /100.0);
  121. ssHandle.all.data[2].val[0].thr.en.th_sen_max_en = 1;
  122. }
  123. if(p_d->sensor[2].th_min_1 != 0)
  124. {
  125. ssHandle.all.data[2].val[0].thr.min = ((float)p_d->sensor[2].th_min_1 /100.0);
  126. ssHandle.all.data[2].val[0].thr.en.th_sen_min_en = 1;
  127. }
  128. if(p_d->sensor[2].th_max_2 != 0)
  129. {
  130. ssHandle.all.data[2].val[1].thr.max = ((float)p_d->sensor[2].th_max_2 /100.0);
  131. ssHandle.all.data[2].val[1].thr.en.th_sen_max_en = 1;
  132. }
  133. if(p_d->sensor[2].th_min_2 != 0)
  134. {
  135. ssHandle.all.data[2].val[1].thr.min = ((float)p_d->sensor[2].th_min_2 /100.0);
  136. ssHandle.all.data[2].val[1].thr.en.th_sen_min_en = 1;
  137. }
  138. thread_start(THREAD_ID_SENSOR, sensor_thread, NULL);
  139. }
  140. return 0;
  141. }
  142. int sensor_deinit(void)
  143. {
  144. sensor_handle_t *h=&ssHandle;
  145. sensor_handle_t data={0};
  146. if(h->all.data)
  147. {
  148. free(h->all.data);
  149. }
  150. lock_deinit(h->lck);
  151. *h = data;
  152. return 0;
  153. }
  154. int sensor_set(sensor_data_t *data)
  155. {
  156. int i,r=-1,cnt;
  157. sensor_data_t *p=NULL;
  158. sensor_handle_t *h=&ssHandle;
  159. if(!data) {
  160. return -1;
  161. }
  162. lock_on(h->lck);
  163. for(i=0; i<h->all.cnt; i++) {
  164. sensor_data_t *p=&h->all.data[i];
  165. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  166. r = 0;
  167. p->info = data->info;
  168. break;
  169. }
  170. }
  171. if(r==-1) {
  172. cnt = h->all.cnt+1;
  173. if(h->all.data) {
  174. p = (sensor_data_t*)realloc(h->all.data, sizeof(sensor_data_t)*cnt);
  175. }
  176. else {
  177. p = (sensor_data_t*)calloc(1, sizeof(sensor_data_t));
  178. }
  179. if(p) {
  180. p[cnt-1].info = data->info;
  181. memset(&p[cnt-1].val, 0, sizeof(p[cnt-1].val));
  182. h->all.cnt = cnt;
  183. h->all.data = p;
  184. r = 0;
  185. }
  186. }
  187. if(r==0) {
  188. //db_update
  189. }
  190. lock_off(h->lck);
  191. return r;
  192. }
  193. int sensor_remove(sensor_data_t *data)
  194. {
  195. int i,r=-1;
  196. sensor_handle_t *h=&ssHandle;
  197. if(!data) {
  198. return -1;
  199. }
  200. lock_on(h->lck);
  201. for(i=0; i<h->all.cnt; i++) {
  202. sensor_data_t *p=&h->all.data[i];
  203. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  204. r = 0;
  205. break;
  206. }
  207. }
  208. if(r==0) { //find and remove it
  209. if(i!=h->all.cnt-1) {
  210. memmove(&h->all.data[i], &h->all.data[i+1], sizeof(sensor_data_t)*(h->all.cnt-i-1));
  211. }
  212. h->all.cnt -= 1;
  213. }
  214. lock_off(h->lck);
  215. return r;
  216. }
  217. static int my_read(sensor_data_t *data)
  218. {
  219. int r=-1;
  220. uint16_t time=0;
  221. uint16_t tmp[10]={0};
  222. uint8_t addr=data->info.addr;
  223. sensor_handle_t *h=&ssHandle;
  224. switch(data->info.type) {
  225. case SENSOR_TYPE_TEMP_HUMI:
  226. {
  227. r = read_reg(addr, 0, tmp, 2);
  228. if(r < 0)
  229. {
  230. return -1;
  231. }
  232. data->val[0].value = tmp[0] / 10.0;
  233. data->val[1].value = tmp[1] / 10.0;
  234. }
  235. break;
  236. case SENSOR_TYPE_SMOKE:
  237. case SENSOR_TYPE_WATER:
  238. case SENSOR_TYPE_ACCESS:
  239. {
  240. }
  241. break;
  242. case SENSOR_TYPE_GAS:
  243. {
  244. r = read_reg(addr, 19, tmp, 1);
  245. if(r<0) {
  246. return -1 ;
  247. }
  248. data->val[0].value = tmp[0]; //气体浓度值
  249. }
  250. break;
  251. }
  252. return r;
  253. }
  254. extern AlarmTrapinfo data;
  255. int sensor_query(void)
  256. {
  257. int i,r=-1;
  258. sensor_handle_t *h=&ssHandle;
  259. waning_info_t info= {0};
  260. info.type = ALARM_TYPE_SENSOR;
  261. lock_on(h->lck);
  262. for(i=0; i<h->all.cnt; i++) {
  263. r = my_read(&h->all.data[i]);
  264. if(r == 0)
  265. {
  266. ssHandle.all.data[i].info.status = 1;
  267. ssHandle.all.data[i].info.check_count = 0;
  268. if(ssHandle.all.data[i].val[0].thr.en.th_sen_max_en)
  269. {
  270. uint8_t back_waning_up = ssHandle.all.data[i].val[0].s_alarm.max_up;
  271. if(ssHandle.all.data[i].val[0].value > ssHandle.all.data[i].val[0].thr.max)
  272. {
  273. ssHandle.all.data[i].val[0].s_alarm.max_up = 1;
  274. if(back_waning_up != ssHandle.all.data[i].val[0].s_alarm.max_up)
  275. {
  276. time_t t=time(NULL);
  277. struct tm *tm=localtime(&t);
  278. memset(&info.waning_context,0,sizeof(64));
  279. sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  280. sprintf(info.waning_context,"%s value 1 over max threshold!!",ssHandle.all.data[i].info.name);
  281. wanning_insert(info);
  282. if(paras_get()->snmp.trapmode == 1)
  283. {
  284. //AlarmTrapinfo t_info={0};
  285. data.ID = i;
  286. data.Alarmid = ALARM_TYPE_SENSOR;
  287. memcpy(data.AlarmDate,info.date,32);
  288. memcpy(data.AlarmContext,info.waning_context,64);
  289. snmp_sensor_alarm_trap(&data);
  290. }
  291. beep_set(1);
  292. }
  293. }else
  294. {
  295. ssHandle.all.data[i].val[0].s_alarm.max_up = 0;
  296. }
  297. }
  298. if(ssHandle.all.data[i].val[0].thr.en.th_sen_min_en)
  299. {
  300. uint8_t back_waning_down = ssHandle.all.data[i].val[0].s_alarm.min_down;
  301. if(ssHandle.all.data[i].val[0].value < ssHandle.all.data[i].val[0].thr.min)
  302. {
  303. ssHandle.all.data[i].val[0].s_alarm.min_down = 1;
  304. if(back_waning_down != ssHandle.all.data[i].val[0].s_alarm.min_down)
  305. {
  306. time_t t=time(NULL);
  307. struct tm *tm=localtime(&t);
  308. memset(&info.waning_context,0,sizeof(64));
  309. sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  310. sprintf(info.waning_context,"%s value 1 over min threshold!!",ssHandle.all.data[i].info.name);
  311. wanning_insert(info);
  312. if(paras_get()->snmp.trapmode == 1)
  313. {
  314. //AlarmTrapinfo t_info={0};
  315. data.ID = i;
  316. data.Alarmid = ALARM_TYPE_SENSOR;
  317. memcpy(data.AlarmDate,info.date,32);
  318. memcpy(data.AlarmContext,info.waning_context,64);
  319. snmp_sensor_alarm_trap(&data);
  320. }
  321. beep_set(1);
  322. }
  323. }else
  324. {
  325. ssHandle.all.data[i].val[0].s_alarm.min_down = 0;
  326. }
  327. }
  328. if(ssHandle.all.data[i].info.num_val == 2)
  329. {
  330. if(ssHandle.all.data[i].val[0].thr.en.th_sen_max_en)
  331. {
  332. uint8_t back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up;
  333. if(ssHandle.all.data[i].val[1].value > ssHandle.all.data[i].val[1].thr.max)
  334. {
  335. ssHandle.all.data[i].val[1].s_alarm.max_up = 1;
  336. if(back_waning_up != ssHandle.all.data[i].val[1].s_alarm.max_up)
  337. {
  338. memset(&info.waning_context,0,sizeof(64));
  339. time_t t=time(NULL);
  340. struct tm *tm=localtime(&t);
  341. sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  342. sprintf(info.waning_context,"%s value 2 over max threshold!!",ssHandle.all.data[i].info.name);
  343. wanning_insert(info);
  344. if(paras_get()->snmp.trapmode == 1)
  345. {
  346. //AlarmTrapinfo t_info={0};
  347. data.ID = i;
  348. data.Alarmid = ALARM_TYPE_SENSOR;
  349. memcpy(data.AlarmDate,info.date,32);
  350. memcpy(data.AlarmContext,info.waning_context,64);
  351. snmp_sensor_alarm_trap(&data);
  352. }
  353. beep_set(1);
  354. }
  355. }else
  356. {
  357. ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
  358. }
  359. }
  360. if(ssHandle.all.data[i].val[1].thr.en.th_sen_min_en)
  361. {
  362. uint8_t back_waning_down = ssHandle.all.data[i].val[1].s_alarm.min_down;
  363. if(ssHandle.all.data[i].val[1].value < ssHandle.all.data[i].val[1].thr.min)
  364. {
  365. ssHandle.all.data[i].val[1].s_alarm.min_down = 1;
  366. if(back_waning_down != ssHandle.all.data[i].val[1].s_alarm.min_down)
  367. {
  368. memset(&info.waning_context,0,sizeof(64));
  369. time_t t=time(NULL);
  370. struct tm *tm=localtime(&t);
  371. sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  372. sprintf(info.waning_context,"%s value 2 over min threshold!!",ssHandle.all.data[i].info.name);
  373. wanning_insert(info);
  374. if(paras_get()->snmp.trapmode == 1)
  375. {
  376. //AlarmTrapinfo t_info={0};
  377. data.ID = i;
  378. data.Alarmid = ALARM_TYPE_SENSOR;
  379. memcpy(data.AlarmDate,info.date,32);
  380. memcpy(data.AlarmContext,info.waning_context,64);
  381. snmp_sensor_alarm_trap(&data);
  382. }
  383. beep_set(1);
  384. }
  385. }else
  386. {
  387. ssHandle.all.data[i].val[1].s_alarm.min_down = 0;
  388. }
  389. }
  390. }
  391. }else
  392. {
  393. ssHandle.all.data[i].info.check_count++;
  394. if(ssHandle.all.data[i].info.check_count >= CHKECK_COUNT)
  395. {
  396. ssHandle.all.data[i].info.status = 0;
  397. ssHandle.all.data[i].val[0].value = 0.0;
  398. if(ssHandle.all.data[i].info.num_val == 2)
  399. {
  400. ssHandle.all.data[i].val[1].value = 0.0;
  401. }
  402. ssHandle.all.data[i].info.check_count = CHKECK_COUNT;
  403. }
  404. }
  405. }
  406. lock_off(h->lck);
  407. return 0;
  408. }
  409. sensor_all_t * sensor_get_data()
  410. {
  411. return &ssHandle.all;
  412. }
  413. int sensor_data_get(sensor_all_t *all)
  414. {
  415. sensor_handle_t *h=&ssHandle;
  416. if(!all) {
  417. return -1;
  418. }
  419. lock_on(h->lck);
  420. *all = h->all;
  421. lock_off(h->lck);
  422. return 0;
  423. }
  424. int sensor_data_free(sensor_all_t *all)
  425. {
  426. if(!all) {
  427. return -1;
  428. }
  429. if(all->data) {
  430. free(all->data);
  431. all->data = NULL;
  432. }
  433. all->cnt = 0;
  434. return 0;
  435. }