sensor.c 14 KB

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