sensor.c 14 KB

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