| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- #include <stdlib.h>
- #include <string.h>
- #include "mb.h"
- #include "lock.h"
- #include "sensor.h"
- #include "paras.h"
- #include "snmp.h"
- #include "beep.h"
- #include "wanning.h"
- #include "thread.h"
- #include "led.h"
- #define RETRY_TIMES 3
- #define TIMEOUT 50
- #define CHKECK_COUNT 3
- enum
- {
- STR_SENSOR_ID_OVER,
- STR_SENSOR_ID_LOW,
- STR_SENSOR_ID_MAXS,
- STR_SENSOR_ID_MIN,
- STR_SENSOR_PARA,
- STR_SENSOR_ID_VALUE,
- STR_SENSOR_ID_MAX
- };
- const char *lang_sensor_str[2][STR_SENSOR_ID_MAX]={
- {
- "超过",
- "低于",
- "最大",
- "最小",
- "参数",
- "值",
- },
- {
- "over",
- "below",
- "max",
- "min",
- "parameter"
- "value",
- },
- };
- typedef struct
- {
- uint8_t id;
- uint8_t wanning_type;
- uint8_t over_low;
- uint8_t para;
- uint8_t max_min;
- }op_sensor_w_info;
- AlarmTrapinfo sensor_data={0};
- static void sensor_wanning_operation(op_sensor_w_info *info,char *name)
- {
-
-
- waning_info_t w_info= {0};
- uint8_t lang = paras_get()->sys.lang;
-
- time_t t=time(NULL);
- struct tm *tm=localtime(&t);
-
- w_info.type = info->wanning_type;
- 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);
- if(lang == 0)
- sprintf(&w_info.waning_context[0],"%s%s%d%s%s%s!",name,lang_sensor_str[lang][STR_SENSOR_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]);
- else
- sprintf(&w_info.waning_context[0],"%s %s %d %s %s %s!",name,lang_sensor_str[lang][STR_SENSOR_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]);
- wanning_insert(w_info);
-
-
- if(paras_get()->snmp.trapmode == 1)
- {
- sensor_data.ID = info->id;
- sensor_data.Alarmid = ALARM_TYPE_SENSOR;
- memcpy(sensor_data.AlarmDate,w_info.date,32);
- memcpy(sensor_data.AlarmContext,w_info.waning_context,64);
- snmp_alarm_trap(&sensor_data,1);
- }
- beep_set(BEEP_MODE_WARN1);
- led_set(LED_MODE_WARN1);
- }
- int sensor_query(void);
- typedef struct {
- lock_t lck;
-
- sensor_all_t all;
- }sensor_handle_t;
- static sensor_handle_t ssHandle={0};
- sensor_all_t * get_sensor(void)
- {
- return &ssHandle.all;
- }
- static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
- {
- int i,r=0;
-
- for(i=0; i<RETRY_TIMES; i++) {
- r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
- if(r==cnt) {
- break;
- }
- }
- return (r==cnt)?0:-1;
- }
- static void sensor_thread(void *arg)
- {
- //pthread_setname_np();
- while(1)
- {
- sensor_query();
- sleep(1);
- }
- }
- int sensor_init(void)
- {
- paras_data_t* p_d = paras_get();
- sensor_handle_t *h=&ssHandle;
- ssHandle.all.data = (sensor_data_t *)malloc(sizeof(sensor_data_t) *MAX_SENSOR);
- if(ssHandle.all.data)
- {
- h->lck = lock_init();
- memset(ssHandle.all.data,0,sizeof(sensor_data_t)*MAX_SENSOR);
- ssHandle.all.max = MAX_SENSOR;
- ssHandle.all.cnt = MAX_SENSOR;
- //first 温湿度传感器 默认地址1 不允许修改
- memcpy(ssHandle.all.data[0].info.name,"Temp-Humi Sensor",strlen("Temp-Humi Sensor"));
- ssHandle.all.data[0].info.addr = 1;
- ssHandle.all.data[0].info.type = SENSOR_TYPE_TEMP_HUMI;
- ssHandle.all.data[0].info.status = 0;
- ssHandle.all.data[0].info.num_val = 2;
- // p_d->sensor[0].th_max_1 = 10000;
- // p_d->sensor[0].th_min_1 = 7000;
- // p_d->sensor[0].th_max_2 = 1500;
- // p_d->sensor[0].th_min_2 = 1000;
- if(p_d->sensor.sens[0].th_max_1 != 0)
- {
- ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor.sens[0].th_max_1 /100.0);
- ssHandle.all.data[0].val[0].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[0].th_min_1 != 0)
- {
- ssHandle.all.data[0].val[0].thr.min = ((float)p_d->sensor.sens[0].th_min_1 /100.0);
- ssHandle.all.data[0].val[0].thr.en.th_sen_min_en = 1;
- }
- if(p_d->sensor.sens[0].th_max_2 != 0)
- {
- ssHandle.all.data[0].val[1].thr.max = ((float)p_d->sensor.sens[0].th_max_2 /100.0);
- ssHandle.all.data[0].val[1].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[0].th_min_2 != 0)
- {
- ssHandle.all.data[0].val[1].thr.min = ((float)p_d->sensor.sens[0].th_min_2 /100.0);
- ssHandle.all.data[0].val[1].thr.en.th_sen_min_en = 1;
- }
-
- //ssHandle.all.data[0].val[0].value = 0;
- //second 烟雾传感器 默认地址2 不允许修改
- memcpy(ssHandle.all.data[1].info.name,"Smoke Sensor",strlen("Smoke Sensor"));
- ssHandle.all.data[1].info.addr = 2;
- ssHandle.all.data[1].info.type = SENSOR_TYPE_SMOKE;
- ssHandle.all.data[1].info.status = 0;
- ssHandle.all.data[1].info.num_val = 1;
- if(p_d->sensor.sens[1].th_max_1 != 0)
- {
- ssHandle.all.data[1].val[0].thr.max = ((float)p_d->sensor.sens[1].th_max_1 /100.0);
- ssHandle.all.data[1].val[0].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[1].th_min_1 != 0)
- {
- ssHandle.all.data[1].val[0].thr.min = ((float)p_d->sensor.sens[1].th_min_1 /100.0);
- ssHandle.all.data[1].val[0].thr.en.th_sen_min_en = 1;
- }
- if(p_d->sensor.sens[1].th_max_2 != 0)
- {
- ssHandle.all.data[1].val[1].thr.max = ((float)p_d->sensor.sens[1].th_max_2 /100.0);
- ssHandle.all.data[1].val[1].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[1].th_min_2 != 0)
- {
- ssHandle.all.data[1].val[1].thr.min = ((float)p_d->sensor.sens[1].th_min_2 /100.0);
- ssHandle.all.data[1].val[1].thr.en.th_sen_min_en = 1;
- }
-
-
-
- //second 气体传感器 默认地址3 不允许修改
- memcpy(ssHandle.all.data[2].info.name,"Gas Sensor",strlen("Gas Sensor"));
- ssHandle.all.data[2].info.addr = 3;
- ssHandle.all.data[2].info.type = SENSOR_TYPE_GAS;
- ssHandle.all.data[2].info.status = 0;
- ssHandle.all.data[2].info.num_val = 1;
- if(p_d->sensor.sens[2].th_max_1 != 0)
- {
- ssHandle.all.data[2].val[0].thr.max = ((float)p_d->sensor.sens[2].th_max_1 /100.0);
- ssHandle.all.data[2].val[0].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[2].th_min_1 != 0)
- {
- ssHandle.all.data[2].val[0].thr.min = ((float)p_d->sensor.sens[2].th_min_1 /100.0);
- ssHandle.all.data[2].val[0].thr.en.th_sen_min_en = 1;
- }
- if(p_d->sensor.sens[2].th_max_2 != 0)
- {
- ssHandle.all.data[2].val[1].thr.max = ((float)p_d->sensor.sens[2].th_max_2 /100.0);
- ssHandle.all.data[2].val[1].thr.en.th_sen_max_en = 1;
- }
- if(p_d->sensor.sens[2].th_min_2 != 0)
- {
- ssHandle.all.data[2].val[1].thr.min = ((float)p_d->sensor.sens[2].th_min_2 /100.0);
- ssHandle.all.data[2].val[1].thr.en.th_sen_min_en = 1;
- }
- thread_start(THREAD_ID_SENSOR, sensor_thread, NULL);
- }
- return 0;
- }
- int sensor_deinit(void)
- {
- sensor_handle_t *h=&ssHandle;
- sensor_handle_t data={0};
- if(h->all.data)
- {
- free(h->all.data);
- }
- lock_deinit(h->lck);
- *h = data;
-
- return 0;
- }
- int sensor_set(sensor_data_t *data)
- {
- int i,r=-1,cnt;
- sensor_data_t *p=NULL;
- sensor_handle_t *h=&ssHandle;
-
- if(!data) {
- return -1;
- }
- lock_on(h->lck);
- for(i=0; i<h->all.cnt; i++) {
- sensor_data_t *p=&h->all.data[i];
- if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
- r = 0;
- p->info = data->info;
- break;
- }
- }
-
- if(r==-1) {
- cnt = h->all.cnt+1;
- if(h->all.data) {
- p = (sensor_data_t*)realloc(h->all.data, sizeof(sensor_data_t)*cnt);
- }
- else {
- p = (sensor_data_t*)calloc(1, sizeof(sensor_data_t));
- }
- if(p) {
- p[cnt-1].info = data->info;
- memset(&p[cnt-1].val, 0, sizeof(p[cnt-1].val));
-
- h->all.cnt = cnt;
- h->all.data = p;
- r = 0;
- }
- }
-
- if(r==0) {
- //db_update
- }
- lock_off(h->lck);
-
- return r;
- }
- int sensor_remove(sensor_data_t *data)
- {
- int i,r=-1;
- sensor_handle_t *h=&ssHandle;
-
- if(!data) {
- return -1;
- }
- lock_on(h->lck);
- for(i=0; i<h->all.cnt; i++) {
- sensor_data_t *p=&h->all.data[i];
- if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
- r = 0;
- break;
- }
- }
- if(r==0) { //find and remove it
- if(i!=h->all.cnt-1) {
- memmove(&h->all.data[i], &h->all.data[i+1], sizeof(sensor_data_t)*(h->all.cnt-i-1));
- }
- h->all.cnt -= 1;
- }
- lock_off(h->lck);
-
- return r;
- }
- static int my_read(sensor_data_t *data)
- {
- int r=-1;
- uint16_t time=0;
- uint16_t tmp[10]={0};
- uint8_t addr=data->info.addr;
- sensor_handle_t *h=&ssHandle;
- switch(data->info.type) {
- case SENSOR_TYPE_TEMP_HUMI:
- {
- r = read_reg(addr, 0, tmp, 2);
- if(r < 0)
- {
- return -1;
- }
- data->val[0].value = tmp[0] / 10.0;
- data->val[1].value = (int16_t)tmp[1] / 10.0;
- }
- break;
- case SENSOR_TYPE_SMOKE:
- case SENSOR_TYPE_WATER:
- case SENSOR_TYPE_ACCESS:
- {
- }
- break;
- case SENSOR_TYPE_GAS:
- {
- r = read_reg(addr, 19, tmp, 1);
- if(r<0) {
- return -1 ;
- }
- data->val[0].value = tmp[0]; //气体浓度值
- }
- break;
- }
- return r;
- }
- extern AlarmTrapinfo data;
- int sensor_query(void)
- {
- int i,r=-1;
- sensor_handle_t *h=&ssHandle;
- waning_info_t info= {0};
- info.type = ALARM_TYPE_SENSOR;
- lock_on(h->lck);
- for(i=0; i<h->all.cnt; i++) {
- r = my_read(&h->all.data[i]);
- if(r == 0)
- {
- ssHandle.all.data[i].info.status = 1;
- ssHandle.all.data[i].info.check_count = 0;
- op_sensor_w_info info={0};
- if(ssHandle.all.data[i].val[0].thr.en.th_sen_max_en)
- {
- uint8_t back_waning_up = ssHandle.all.data[i].val[0].s_alarm.max_up;
- if(ssHandle.all.data[i].val[0].value > ssHandle.all.data[i].val[0].thr.max)
- {
- ssHandle.all.data[i].val[0].s_alarm.max_up = 1;
- if(!back_waning_up && ssHandle.all.data[i].val[0].s_alarm.max_up)
- {
- info.id = i;
- info.max_min = STR_SENSOR_ID_MAXS;
- info.over_low = STR_SENSOR_ID_OVER;
- info.para = 1;
- info.wanning_type = ALARM_TYPE_SENSOR;
- sensor_wanning_operation(&info,ssHandle.all.data[i].info.name);
- }
- }else
- {
- ssHandle.all.data[i].val[0].s_alarm.max_up = 0;
- }
- }else
- {
- ssHandle.all.data[i].val[0].s_alarm.max_up = 0;
- }
- if(ssHandle.all.data[i].val[0].thr.en.th_sen_min_en)
- {
- uint8_t back_waning_down = ssHandle.all.data[i].val[0].s_alarm.min_down;
- if(ssHandle.all.data[i].val[0].value < ssHandle.all.data[i].val[0].thr.min)
- {
- ssHandle.all.data[i].val[0].s_alarm.min_down = 1;
- if(!back_waning_down && ssHandle.all.data[i].val[0].s_alarm.min_down)
- {
- info.id = i;
- info.max_min = STR_SENSOR_ID_MIN;
- info.over_low = STR_SENSOR_ID_LOW;
- info.para = 1;
- info.wanning_type = ALARM_TYPE_SENSOR;
- sensor_wanning_operation(&info,ssHandle.all.data[i].info.name);
- }
- }else
- {
- ssHandle.all.data[i].val[0].s_alarm.min_down = 0;
- }
- }else
- {
- ssHandle.all.data[i].val[0].s_alarm.min_down = 0;
- }
- if(ssHandle.all.data[i].info.num_val == 2)
- {
- if(ssHandle.all.data[i].val[1].thr.en.th_sen_max_en)
- {
- uint8_t back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up;
- //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);
- if(ssHandle.all.data[i].val[1].value > ssHandle.all.data[i].val[1].thr.max)
- {
- ssHandle.all.data[i].val[1].s_alarm.max_up = 1;
-
- if(!back_waning_up && ssHandle.all.data[i].val[1].s_alarm.max_up)
- {
- info.id = i;
- info.max_min = STR_SENSOR_ID_MAXS;
- info.over_low = STR_SENSOR_ID_OVER;
- info.para = 2;
- info.wanning_type = ALARM_TYPE_SENSOR;
- sensor_wanning_operation(&info,ssHandle.all.data[i].info.name);
- }
- }else
- {
- ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
- }
- }else
- {
- ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
- }
- if(ssHandle.all.data[i].val[1].thr.en.th_sen_min_en)
- {
- uint8_t back_waning_down = ssHandle.all.data[i].val[1].s_alarm.min_down;
- //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);
- if(ssHandle.all.data[i].val[1].value < ssHandle.all.data[i].val[1].thr.min)
- {
- ssHandle.all.data[i].val[1].s_alarm.min_down = 1;
- if(!back_waning_down && ssHandle.all.data[i].val[1].s_alarm.min_down)
- {
- info.id = i;
- info.max_min = STR_SENSOR_ID_MIN;
- info.over_low = STR_SENSOR_ID_LOW;
- info.para = 2;
- info.wanning_type = ALARM_TYPE_SENSOR;
- sensor_wanning_operation(&info,ssHandle.all.data[i].info.name);
- }
- }else
- {
- ssHandle.all.data[i].val[1].s_alarm.min_down = 0;
- }
- }else
- {
- ssHandle.all.data[i].val[1].s_alarm.min_down = 0;
- }
- }
- }else
- {
- ssHandle.all.data[i].info.check_count++;
- if(ssHandle.all.data[i].info.check_count >= CHKECK_COUNT)
- {
- ssHandle.all.data[i].info.status = 0;
- ssHandle.all.data[i].val[0].value = 0.0;
- if(ssHandle.all.data[i].info.num_val == 2)
- {
- ssHandle.all.data[i].val[1].value = 0.0;
- }
- ssHandle.all.data[i].info.check_count = CHKECK_COUNT;
- }
- }
- }
- lock_off(h->lck);
-
-
-
- return 0;
- }
- sensor_all_t * sensor_get_data()
- {
- return &ssHandle.all;
- }
-
- int sensor_data_get(sensor_all_t *all)
- {
- sensor_handle_t *h=&ssHandle;
-
- if(!all) {
- return -1;
- }
-
- lock_on(h->lck);
- *all = h->all;
- lock_off(h->lck);
-
- return 0;
- }
- int sensor_data_free(sensor_all_t *all)
- {
- if(!all) {
- return -1;
- }
-
- if(all->data) {
- free(all->data);
- all->data = NULL;
- }
- all->cnt = 0;
- return 0;
- }
|