#include #include #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; ilck = 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; iall.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; iall.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; iall.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; }