sensor.c 13 KB

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