#include #include #include "mb.h" #include "lock.h" #include "sensor.h" #include "paras.h" #define RETRY_TIMES 3 #define TIMEOUT 200 #define CHKECK_COUNT 3 typedef struct { lock_t lck; sensor_all_t all; }sensor_handle_t; static sensor_handle_t ssHandle={0}; 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; if(p_d->sensor[0].th_max_1 != 0) { ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor[0].th_max_1 /100.0); ssHandle.all.data[0].val[0].thr.en.th_sen_max_en = 1; } if(p_d->sensor[0].th_min_1 != 0) { ssHandle.all.data[0].val[0].thr.min = ((float)p_d->sensor[0].th_min_1 /100.0); ssHandle.all.data[0].val[0].thr.en.th_sen_min_en = 1; } if(p_d->sensor[0].th_max_2 != 0) { ssHandle.all.data[0].val[1].thr.max = ((float)p_d->sensor[0].th_max_2 /100.0); ssHandle.all.data[0].val[1].thr.en.th_sen_max_en = 1; } if(p_d->sensor[0].th_min_2 != 0) { ssHandle.all.data[0].val[1].thr.min = ((float)p_d->sensor[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[1].th_max_1 != 0) { ssHandle.all.data[1].val[0].thr.max = ((float)p_d->sensor[1].th_max_1 /100.0); ssHandle.all.data[1].val[0].thr.en.th_sen_max_en = 1; } if(p_d->sensor[1].th_min_1 != 0) { ssHandle.all.data[1].val[0].thr.min = ((float)p_d->sensor[1].th_min_1 /100.0); ssHandle.all.data[1].val[0].thr.en.th_sen_min_en = 1; } if(p_d->sensor[1].th_max_2 != 0) { ssHandle.all.data[1].val[1].thr.max = ((float)p_d->sensor[1].th_max_2 /100.0); ssHandle.all.data[1].val[1].thr.en.th_sen_max_en = 1; } if(p_d->sensor[1].th_min_2 != 0) { ssHandle.all.data[1].val[1].thr.min = ((float)p_d->sensor[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[2].th_max_1 != 0) { ssHandle.all.data[2].val[0].thr.max = ((float)p_d->sensor[2].th_max_1 /100.0); ssHandle.all.data[2].val[0].thr.en.th_sen_max_en = 1; } if(p_d->sensor[2].th_min_1 != 0) { ssHandle.all.data[2].val[0].thr.min = ((float)p_d->sensor[2].th_min_1 /100.0); ssHandle.all.data[2].val[0].thr.en.th_sen_min_en = 1; } if(p_d->sensor[2].th_max_2 != 0) { ssHandle.all.data[2].val[1].thr.max = ((float)p_d->sensor[2].th_max_2 /100.0); ssHandle.all.data[2].val[1].thr.en.th_sen_max_en = 1; } if(p_d->sensor[2].th_min_2 != 0) { ssHandle.all.data[2].val[1].thr.min = ((float)p_d->sensor[2].th_min_2 /100.0); ssHandle.all.data[2].val[1].thr.en.th_sen_min_en = 1; } } 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 = 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; } int sensor_query(void) { int i,r=-1; sensor_handle_t *h=&ssHandle; 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; 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) { //todo beep 报警 //todo send mail } }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) { //todo beep 报警 //todo send mail } }else { ssHandle.all.data[i].val[0].s_alarm.min_down = 0; } } if(ssHandle.all.data[i].info.num_val == 2) { uint8_t back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up; 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) { //todo beep 报警 //todo send mail } }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; 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) { //todo beep 报警 //todo send mail } }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; }