Parcourir la source

完善sensor/breaker处理逻辑

guohui il y a 1 an
Parent
commit
40f1767bd9

+ 140 - 14
f407/applications/breaker.c

@@ -1,25 +1,63 @@
+#include <stdlib.h>
+#include <time.h>
 #include "mb.h"
 #include "lock.h"
+#include "list.h"
+#include "power.h"
+#include "cascade.h"
 #include "breaker.h"
 
+#define RETRY_TIMES         3
+#define TIMEOUT             200
+
+#define BREAKER_INFO_REG    2200
+
+
+typedef struct {
+    int8_t        data;
+    uint32_t      time;
+}breaker_ori_t;
 
 typedef struct {
     lock_t        lck;
-    modbus_data_t *mb;
     
-    breaker_all_t all;
+    uint8_t       cur_idx;
+    breaker_ori_t ori[BREAKER_BOARD_MAX];
 }breaker_handle_t;
 static breaker_handle_t brHandle={0};
 
+
+static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
+{
+    int i,r=0;
+    
+    cascade_lock(1);
+    for(i=0; i<RETRY_TIMES; i++) {
+        r = mb_read(MB_ID_CASCADE, addr, reg, data, cnt, TIMEOUT);
+        if(r==cnt) {
+            break;
+        }
+    }
+    cascade_lock(0);
+    
+    return (r==cnt)?0:-1;
+}
+
+
 int breaker_init(void)
 {
+    int i;
     breaker_handle_t *h=&brHandle;
     
     h->lck = lock_init();
+    for(i=0; i<BREAKER_BOARD_MAX; i++) {
+        h->ori[i].data = -1;
+    }
     
     return 0;
 }
 
+
 int breaker_deinit(void)
 {
     breaker_handle_t *h=&brHandle;
@@ -29,29 +67,85 @@ int breaker_deinit(void)
     return 0;
 }
 
-int breaker_add(breaker_data_t *data)
+static int read_board(breaker_handle_t *h, uint8_t addr, int8_t *sw)
 {
-    breaker_handle_t *h=&brHandle;
+    int i,r;
+    uint16_t tmp[BREAKER_CH_MAX];
+
+    r = read_reg(addr, BREAKER_INFO_REG+1, tmp, BREAKER_CH_MAX);
+    if(r==0) {
+        for(i=0; i<BREAKER_CH_MAX; i++) {
+            *sw |= BIT(i);
+        }
+    }
+    else {
+        *sw = -1;
+    }
     
-    if(!data) {
-        return -1;
+    return r;
+}
+static breaker_all_t brk_get(breaker_handle_t *h)
+{
+    int i,j,idx=0;
+    breaker_all_t all={0};
+    
+    for(i=0; i<BREAKER_BOARD_MAX; i++) {
+        if(h->ori[i].data>=0) {
+            all.cnt += BREAKER_CH_MAX;
+        }
+    }
+    if(all.cnt>0) {
+        all.data = (breaker_data_t*)malloc(sizeof(breaker_data_t*)*all.cnt);
+        if(all.data) {
+            for(i=0; i<BREAKER_BOARD_MAX; i++) {
+                if(h->ori[i].data>=0) {
+                    for(j=0; j<BREAKER_CH_MAX; j++) {
+                        all.data[idx].info.addr = BREAKER_BOARD_ADDR_START+i;
+                        all.data[idx].samp.sw   = (h->ori[i].data&BIT(j))?1:0;
+                        idx++;
+                    }
+                }
+            }
+        }
+        else {
+            all.cnt = 0;
+        }
     }
+    
+    return all;
+}
+
+
+int breaker_query(void)
+{
+    int i,r;
+    uint8_t addr;
+    breaker_handle_t *h=&brHandle;
+    
     lock_on(h->lck);
+    if(h->cur_idx>=BREAKER_BOARD_MAX) {
+        h->cur_idx = 0;
+    }
     
+    addr = BREAKER_BOARD_ADDR_START+h->cur_idx;
+    r = read_board(h, addr, &h->ori[h->cur_idx].data);
+    if(r) {
+        h->ori[h->cur_idx].data = -1;
+    }
+    h->ori[h->cur_idx].time = mktime(localtime(NULL));
     lock_off(h->lck);
     
-    return 0;
+    return r;
 }
 
 
-int breaker_remove(breaker_data_t *data)
+int breaker_set(breaker_data_t *data)
 {
     breaker_handle_t *h=&brHandle;
     
     if(!data) {
         return -1;
     }
-    
     lock_on(h->lck);
     
     lock_off(h->lck);
@@ -60,22 +154,54 @@ int breaker_remove(breaker_data_t *data)
 }
 
 
-int breaker_query(breaker_data_t *data)
+
+int breaker_data_get(breaker_all_t *all)
 {
+    int i,cnt;
+    char *p=NULL;
+    breaker_all_t brk={0};
     breaker_handle_t *h=&brHandle;
     
+    if(!all) {
+        return -1;
+    }
+    
     lock_on(h->lck);
+    power_breaker_get(all);
+    brk = brk_get(h);
+    if(brk.cnt) {
+        cnt = all->cnt+brk.cnt;
+        p = (char*)realloc(all->data, sizeof(breaker_data_t)*cnt);
+        if(p) {
+            memcpy(p+sizeof(breaker_data_t)*cnt, brk.data, sizeof(breaker_data_t)*brk.cnt);
+            all->data = (breaker_data_t*)p;
+            all->cnt = cnt;
+        }
+    }
+    breaker_data_free(&brk);
     
+    for(i=0; i<all->cnt; i++) {
+        sprintf(all->data[i].info.name, "SW%d", i);
+        all->data[i].samp.bid = i;
+        all->data[i].samp.nid = 0;
+    }
     lock_off(h->lck);
     
     return 0;
 }
 
 
-breaker_all_t* breaker_data_get(void)
+int breaker_data_free(breaker_all_t *all)
 {
-    breaker_handle_t *h=&brHandle;
-    return &h->all;
+    if(!all) {
+        return -1;
+    }
+    
+    if(all->data) {
+        free(all->data);
+        all->data = NULL;
+    }
+    all->cnt = 0;
+    return 0;
 }
 
-

+ 5 - 4
f407/applications/breaker.h

@@ -5,10 +5,11 @@
 
 int breaker_init(void);
 int breaker_deinit(void);
-int breaker_add(breaker_data_t *data);
-int breaker_remove(breaker_data_t *data);
-int breaker_query(breaker_data_t *data);
-breaker_all_t* breaker_data_get(void);
+int breaker_update(void);
+int breaker_set(breaker_data_t *data);
+int breaker_query(void);
+int breaker_data_get(breaker_all_t *all);
+int breaker_data_free(breaker_all_t *all);
 
 #endif
 

+ 62 - 55
f407/applications/cascade.c

@@ -44,7 +44,7 @@ typedef struct cascade_info{
 	uint8_t         quit;
 	slave_info_t			*info;
 	lock_t 					lock;
-	slave_t         slaves[CASCADE_MAX+1];
+	slave_t         slaves[POWER_CASCADE_MAX+1];
 	cmd_data_t    cmd;
     power_all_t   all;
 //	union {
@@ -103,7 +103,7 @@ static void memswap(uint8_t *buf, int len)
 
 static void slave_rm(uint8_t addr)
 {
-	if(addr > 0  && addr < SLAVE_CH_MAX)
+	if(addr > 0  && addr < POWER_SLAVE_CH_MAX)
 	{
 		slave_info.slaves[addr].addr = 0;
 		slave_info.slaves[addr].err = 0;
@@ -113,7 +113,7 @@ static void slave_rm(uint8_t addr)
 static uint8_t master_scan(cascade_handle_t *cas)
 {
 	static uint8_t slave_addr = 1;
-	if(slave_addr > CASCADE_MAX)
+	if(slave_addr > POWER_CASCADE_MAX)
 	{
 		slave_addr = 1;
 	}
@@ -139,17 +139,18 @@ static uint8_t master_scan(cascade_handle_t *cas)
 static int slave_get_info(cascade_handle_t *cas)
 {
 	slave_info_t *info=cas->info;
-	power_all_t *p = power_data_get();
+	power_all_t all;
 
-	info->channels = p->chs-1 > 0 ? p->chs-1 :  p->chs;
+    power_data_get(&all);
+	info->channels = all.chs-1 > 0 ? all.chs-1 :  all.chs;
 
-	if(info->channels  > SLAVE_CH_MAX)
-			info->channels = SLAVE_CH_MAX;
+	if(info->channels  > POWER_SLAVE_CH_MAX)
+			info->channels = POWER_SLAVE_CH_MAX;
 	if(info->channels == 0)
 			return -1;
 	for(int i=0; i < info->channels;i++)
 	{
-		info->ch[i] = p->pch[i+1];
+		info->ch[i] = all.pch[i+1];
 	}
 	LOGD("slave will send %d channels to master!!!!\n",info->channels);
 	return 0;
@@ -184,7 +185,9 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 {
 	cmd_data_t *cmd=NULL;
 	pthread_t id = 0;
-	power_all_t *power = power_data_get();
+	power_all_t all;
+    
+    power_data_get(&all);
 	switch (reg)
 	{
 		case CASCADE_REG_SCAN:
@@ -248,7 +251,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 				{
 					LOGD("____read_____  %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
 					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
-					uint8_t * base_addr = (uint8_t *)&power->pch[1];
+					uint8_t * base_addr = (uint8_t *)&all.pch[1];
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 					
@@ -258,7 +261,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 				{
 					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
 					//power_all_t power = power_data_get();
-					uint8_t * base_addr = (uint8_t *)&power->pch[1];
+					uint8_t * base_addr = (uint8_t *)&all.pch[1];
 					//my_memcpy_byte(r_w_data,&power->pch[1]+sendlen,lenth*2);
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
@@ -313,7 +316,7 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
 			wl = mb_write(MB_ID_CASCADE, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
 			if(wl<=0) {
 				LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i+1);
-				if(addr >0 && addr < SLAVE_CH_MAX)
+				if(addr >0 && addr < POWER_SLAVE_CH_MAX)
 				{
 					slave_info.slaves[addr].err ++;
 					if(slave_info.slaves[addr].err > 5)
@@ -363,7 +366,7 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
 				rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,100);
 				if(rl<=0) {
 					LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, i+1);
-					if(addr >0 && addr < SLAVE_CH_MAX)
+					if(addr >0 && addr < POWER_SLAVE_CH_MAX)
 					{
 						cas->slaves[addr].err ++;
 						if(cas->slaves[addr].err > 5)
@@ -468,7 +471,7 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
             wdata.dlen = sizeof(cmd_data_t);
             wdata.data = (uint8_t*)cmd;
 
-//            rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
+//            rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*POWER_SLAVE_CH_MAX;
 //            rdata.data = (uint8_t*)cas->info;
 						uint16_t value = 0;
 						r = mb_read(MB_ID_CASCADE,cur_dev_addr,4000,&value,1,100);//获取通道数
@@ -483,10 +486,10 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 								LOGD("get slave channels %d!!!\n",chanels);
 							}else
 							{
-								if(chanels >= SLAVE_CH_MAX)
-										chanels = SLAVE_CH_MAX;
+								if(chanels >= POWER_SLAVE_CH_MAX)
+										chanels = POWER_SLAVE_CH_MAX;
 								cas->info->channels = chanels;
-								//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
+								//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
                 rdata.dlen = sizeof(power_ch_t)*cas->info->channels;
 								rdata.data = (uint8_t*)&(cas->info->ch);
 								r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
@@ -499,7 +502,7 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 							}
 						}
 //						if(r==0) {
-//                rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
+//                rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
 //                rdata.data = (uint8_t*)&cas->info;
 //                r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
 //                if(r==0) {
@@ -628,29 +631,30 @@ void cascade_scan_thread(void *arg)
 		}else	//做从机//拷贝数据到北向
 		{
 			paras_data_t* p_data = paras_get();
-			power_all_t *power = power_data_get();
-			
+			power_all_t all;
+
+            power_data_get(&all);
 			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
 			{
-				int channels = power->chs > 0 ? power->chs - 1: 0;
+				int channels = all.chs > 0 ? all.chs - 1: 0;
 				slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
-				int cnt = power->chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				int cnt = all.chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
 				//电量信息
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.power[i].voltage 	= power->pch[i].power[0].voltage *1000;
-					slave_info.north->data.ac_dc.power[i].current 	= power->pch[i].power[0].current *1000;
-					slave_info.north->data.ac_dc.power[i].power 	= power->pch[i].power[0].power *1000;
-					slave_info.north->data.ac_dc.power[i].consumer  = power->pch[i].power[0].consump *1000;
-					slave_info.north->data.ac_dc.power[i].factor 	= power->pch[i].power[0].factor *1000;
-					slave_info.north->data.ac_dc.power[i].freq 		= power->pch[i].power[0].freq *1000;
+					slave_info.north->data.ac_dc.power[i].voltage 	= all.pch[i].power[0].voltage *1000;
+					slave_info.north->data.ac_dc.power[i].current 	= all.pch[i].power[0].current *1000;
+					slave_info.north->data.ac_dc.power[i].power 	= all.pch[i].power[0].power *1000;
+					slave_info.north->data.ac_dc.power[i].consumer  = all.pch[i].power[0].consump *1000;
+					slave_info.north->data.ac_dc.power[i].factor 	= all.pch[i].power[0].factor *1000;
+					slave_info.north->data.ac_dc.power[i].freq 		= all.pch[i].power[0].freq *1000;
 				}
 				//总信息
-				//slave_info.north->data.ac_dc.power_all. = power.ttl.total;
-				slave_info.north->data.ac_dc.power_all.all_consumer = power->ttl.total[0].consump *1000;
-				slave_info.north->data.ac_dc.power_all.all_current  = power->ttl.total[0].current *1000;
-				slave_info.north->data.ac_dc.power_all.all_power    = power->ttl.total[0].power *1000;
-				slave_info.north->data.ac_dc.power_all.all_voltage  = power->ttl.total[0].voltage *1000;
+				//slave_info.north->data.ac_dc.power_all. = all.ttl.total;
+				slave_info.north->data.ac_dc.power_all.all_consumer = all.ttl.total[0].consump *1000;
+				slave_info.north->data.ac_dc.power_all.all_current  = all.ttl.total[0].current *1000;
+				slave_info.north->data.ac_dc.power_all.all_power    = all.ttl.total[0].power *1000;
+				slave_info.north->data.ac_dc.power_all.all_voltage  = all.ttl.total[0].voltage *1000;
 				//温湿度
 				slave_info.north->data.ac_dc.temp = 0;				//后续加上传感器数据
 				slave_info.north->data.ac_dc.humity = 0;
@@ -658,24 +662,24 @@ void cascade_scan_thread(void *arg)
 					slave_info.north->data.ac_dc.switch_stu[i] = 0;
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_open[i] = power->pch[i].info.start_delay;
+					slave_info.north->data.ac_dc.delay_open[i] = all.pch[i].info.start_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_close[i] = power->pch[i].info.stop_delay;
+					slave_info.north->data.ac_dc.delay_close[i] = all.pch[i].info.stop_delay;
 				}
 			}else
 			{
-				int channels = power->chs > 0 ? power->chs - 1: 0;
+				int channels = all.chs > 0 ? all.chs - 1: 0;
 				slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
 				for(int i = A_P; i <= C_P;i++)
 				{
-					slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power->ttl.total[i].consump *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].current  = power->ttl.total[i].current *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].power    = power->ttl.total[i].power *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage  = power->ttl.total[i].voltage *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = all.ttl.total[i].consump *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].current  = all.ttl.total[i].current *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].power    = all.ttl.total[i].power *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage  = all.ttl.total[i].voltage *1000;
 				}
-				int cnt = power->chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				int cnt = all.chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
 				for(int i = 0; i < cnt;i++)
 				{
 
@@ -685,20 +689,20 @@ void cascade_scan_thread(void *arg)
 				{
 					for(int j = A_P; j <= C_P;j++)
 					{
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power->pch[i].power[j].consump * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current  = power->pch[i].power[j].current * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power    = power->pch[i].power[j].power * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage  = power->pch[i].power[j].voltage * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status   = power->pch[i].power[j].status;		
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = all.pch[i].power[j].consump * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current  = all.pch[i].power[j].current * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power    = all.pch[i].power[j].power * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage  = all.pch[i].power[j].voltage * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status   = all.pch[i].power[j].status;		
 					}
 				}	
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_open[i] = power->pch[i].info.start_delay;
+					slave_info.north->data.ac_3.delay_open[i] = all.pch[i].info.start_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_close[i] = power->pch[i].info.stop_delay;
+					slave_info.north->data.ac_3.delay_close[i] = all.pch[i].info.stop_delay;
 				}
 				
 			}
@@ -830,7 +834,7 @@ uint8_t cascade_set_mode(uint8_t mode,uint8_t addr)
 
 void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
 {
-    if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= SLAVE_CH_MAX)
+    if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= POWER_SLAVE_CH_MAX)
     {
         return;
     }
@@ -841,11 +845,14 @@ void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
     cascade_init(mode,addr,baud);
 }
 
-power_all_t* cascade_power_get(void)
+int cascade_power_get(power_all_t *all)
 {
-    slave_info.all.chs = slave_info.info->channels;
-    slave_info.all.pch = &slave_info.info->ch[0];
-    return &slave_info.all;
+    if(!all) {
+        return -1;
+    }
+    all->chs = slave_info.info->channels;
+    all->pch = &slave_info.info->ch[0];
+    return 0;
 }
 int cascade_get_dlist(dev_list_t *dl)
 {
@@ -856,12 +863,12 @@ int cascade_get_dlist(dev_list_t *dl)
         return -1;
     }
 
-    sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
+    sl = (slave_t*)malloc(sizeof(slave_t)*(POWER_CASCADE_MAX+1));
     if(!sl) {
         return -1;
     }
 
-    for(i=0; i<=CASCADE_MAX; i++) {
+    for(i=0; i<=POWER_CASCADE_MAX; i++) {
         if(slave_info.slaves[i].addr>=0) {
             sl[cnt++] = slave_info.slaves[i];
         }

+ 1 - 2
f407/applications/cascade.h

@@ -117,7 +117,6 @@ uint8_t cascade_set_mode(uint8_t mode,uint8_t addr);
 void    cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud);
 int     cascade_get_dlist(dev_list_t *dl);
 int     cascade_free_dlist(dev_list_t *dl);
-power_all_t* cascade_power_get(void);
-int cascade_lock(int flag);
+int     cascade_power_get(power_all_t *all);
 
 #endif

+ 51 - 37
f407/applications/datadef.h

@@ -4,12 +4,16 @@
 #include <stdint.h>
 #include "log.h"
 
+#define POWER_CH_MAX                12
+#define POWER_BOARD_MAX             32
+#define POWER_BOARD_TIMEOUT         200
+#define POWER_RETRY_TIMES           3
+#define POWER_SLAVE_CH_MAX          32
+#define POWER_CASCADE_MAX           32
 
-#define CH_MAX          12
-#define BRD_MAX         32
-#define SLAVE_CH_MAX    32
-#define CASCADE_MAX     32
-#define BRK_MAX         8
+#define BREAKER_BOARD_MAX           8
+#define BREAKER_CH_MAX              6
+#define BREAKER_BOARD_ADDR_START    64
 
 enum {
     RW_READ=0,                                 //读
@@ -244,7 +248,7 @@ typedef struct {
     uint8_t             lang;
 }sys_data_t;
 
-typedef struct power_data{
+typedef struct {
     float               voltage;                //电压
     float               current;                //电流
     float               power;                  //功率(视在)
@@ -310,6 +314,25 @@ typedef struct {
     void                *pbrd;
 }power_ch_t;
 
+typedef struct {
+    char                name[32];
+    uint8_t             addr;
+}breaker_info_t;
+typedef struct {
+    uint8_t             bid;                    //breaker id
+    uint8_t             nid;                    //node id
+    uint8_t             sw;
+    uint32_t            time;
+}breaker_samp_t;
+typedef struct {
+    breaker_info_t      info;
+    breaker_samp_t      samp;
+}breaker_data_t;
+typedef struct {
+    uint8_t             cnt;
+    breaker_data_t      *data;
+}breaker_all_t;
+
 typedef struct {
     int (*get_power)(power_ch_t *pch);
     int (*get_alarm)(power_ch_t *pch);
@@ -327,7 +350,7 @@ typedef struct {
     int (*set_all)(uint8_t on);
 }board_fn_t;
 
-typedef struct board_data {
+typedef struct {
     board_fn_t          fn;
     uint8_t             type;
     uint8_t             addr;
@@ -336,6 +359,7 @@ typedef struct board_data {
     uint8_t             ch0;                    //board ch start
     uint8_t             ph_loss;
     board_info_t        info;
+    breaker_data_t      brk[2];
     power_ch_t          *pch;                   //根据实际通道数申请连续内存
 }board_data_t;
 
@@ -379,26 +403,10 @@ typedef struct {
 }sensor_data_t;
 typedef struct {
     uint8_t             cnt;
-    sensor_data_t       *pss;
+    uint8_t             max;
+    sensor_data_t       *data;
 }sensor_all_t;
 
-typedef struct {
-    char                name[32];
-    uint8_t             addr;
-}breaker_info_t;
-typedef struct {
-    uint8_t             num;                    //
-    uint8_t             nid;                    //node id
-    uint8_t             sw;
-    uint8_t             ch[BRK_MAX];
-    uint32_t            time;
-}breaker_data_t;
-typedef struct {
-    uint8_t             cnt;
-    breaker_data_t      *pbr;
-}breaker_all_t;
-
-
 typedef struct {
     uint8_t             type;
     uint32_t            str_id;
@@ -407,7 +415,7 @@ typedef struct {
 }alarm_msg_t;
 
 typedef struct {
-    uint32_t            brd[BRD_MAX];
+    uint32_t            brd[POWER_BOARD_MAX];
     
     uint8_t             time_mode;              //绝对时间/相对时间
     uint32_t            time_s;                 //起始时间, 单位: 秒
@@ -421,7 +429,7 @@ typedef struct cascade_saddr{
     uint8_t      addr;
     uint16_t     channels;
     //board_fn_t   *fn;
-    power_ch_t   ch[SLAVE_CH_MAX];
+    power_ch_t   ch[POWER_SLAVE_CH_MAX];
 }slave_info_t;
 
 
@@ -515,6 +523,12 @@ typedef struct {
     mqtt_server_t       ser[MQTT_SER_MAX];
 }mqtt_info_t;
 
+typedef struct {
+    uint32_t    id;
+    uint32_t    type;
+    uint32_t    time;
+    char        *content;
+}log_data_t;
 ///////////////////////////////////////////////////////////
 typedef struct ac_dc_out{
 	uint32_t voltage;
@@ -534,13 +548,13 @@ typedef struct ac_dc_in{
 
 typedef struct md_ac_dc{
     uint16_t          dev_cnt;                   //设备类型和通道数
-    ac_dc_out_t       power[SLAVE_CH_MAX];                 //最大64通道
+    ac_dc_out_t       power[POWER_SLAVE_CH_MAX];                 //最大64通道
     ac_dc_in_t        power_all;
     uint16_t          temp;
     uint16_t          humity;
-    uint16_t          switch_stu[SLAVE_CH_MAX];
-    uint16_t          delay_open[SLAVE_CH_MAX];
-    uint16_t          delay_close[SLAVE_CH_MAX];
+    uint16_t          switch_stu[POWER_SLAVE_CH_MAX];
+    uint16_t          delay_open[POWER_SLAVE_CH_MAX];
+    uint16_t          delay_close[POWER_SLAVE_CH_MAX];
     sensor_info_t     md_s[4];
     //uint16_t          dry_node[4]; 
 }md_ac_dc_t;
@@ -571,13 +585,13 @@ typedef struct chn_phase_info{
 typedef struct md_3_ac{
     uint16_t            dev_cnt;                                        //设备类型和通道数
     all_info_t          ac_3_all_pw[3];
-    all_chn_info_t      ac_3_all_chn[SLAVE_CH_MAX];
-    chn_phase_info_t    ac_3_chn_p[SLAVE_CH_MAX][3];
+    all_chn_info_t      ac_3_all_chn[POWER_SLAVE_CH_MAX];
+    chn_phase_info_t    ac_3_chn_p[POWER_SLAVE_CH_MAX][3];
     uint16_t            temp;
     uint16_t            humity;
-    uint16_t            switch_chn[SLAVE_CH_MAX];
-    uint16_t            delay_open[SLAVE_CH_MAX];
-    uint16_t            delay_close[SLAVE_CH_MAX];
+    uint16_t            switch_chn[POWER_SLAVE_CH_MAX];
+    uint16_t            delay_open[POWER_SLAVE_CH_MAX];
+    uint16_t            delay_close[POWER_SLAVE_CH_MAX];
     sensor_info_t       md_s[4];
     //uint16_t            dry_node[4];
 }md_3_ac_t;
@@ -598,7 +612,7 @@ typedef struct {
 
 typedef struct {
     uint8_t             cnt;
-    uint8_t             addr[CASCADE_MAX];
+    uint8_t             addr[POWER_CASCADE_MAX];
 }slave_list_t;
 
 

Fichier diff supprimé car celui-ci est trop grand
+ 572 - 0
f407/applications/db.c


+ 23 - 23
f407/applications/db.h

@@ -2,37 +2,37 @@
 #define __DB_Hx__
 
 enum {
-    TAB_ID_NTP=0,
-    TAB_ID_USER,
-    TAB_ID_ROLE,
-    TAB_ID_GROUP,
-    TAB_ID_SNMP,
-    TAB_ID_MAIL,
-    TAB_ID_MQTT,
-    TAB_ID_TIMER,
-    TAB_ID_POWER,
-    TAB_ID_POWER3,
-    TAB_ID_SENSOR,
-    TAB_ID_SENSOR_INFO,
-    TAB_ID_BREAKER,
+    DB_TAB_CFG_NTP=0,
+    DB_TAB_CFG_USER,
+    DB_TAB_CFG_SHED,
+    DB_TAB_CFG_SNMP,
+    DB_TAB_CFG_SMTP,
+    DB_TAB_CFG_MQTT,
+    DB_TAB_CFG_GROUP,
+    DB_TAB_CFG_POWER,
+    DB_TAB_CFG_SENSOR,
+    DB_TAB_CFG_ALARM,
+    DB_TAB_CFG_LOG,
     
-    TAB_ID_LOG_INFO,
-    TAB_ID_ALARM_INFO,
-    TAB_ID_POWER_INFO,
-    TAB_ID_POWER3_INFO,
+    DB_TAB_REC_POWER,
+    DB_TAB_REC_ALARM,
+    DB_TAB_REC_LOG,
     
-    TAB_ID_MAX
+    DB_TAB_MAX
 };
 
 int db_init(void);
+int db_deinit(void);
 
+int db_import(int tab_id, char *path);
+int db_export(int tab_id, char *path);
 
+int db_clear(int tab_id);
+int db_reset(int tab_id);
+int db_remove(int tab_id, char *condion);
 
-
-
-
-
-
+int db_query(int tab_id, char *condion, void *data, int *cnt);
+int db_update(int tab_id, char *condion, void *data);
 
 #endif
 

+ 1 - 1
f407/applications/paras.c

@@ -467,7 +467,7 @@ static int proc_modbus(dictionary *dic, int op, modbus_data_t *mb)
             r = -1; 
         }
 
-        if(mb->mode==1 && (mb->addr==0 || mb->addr>CASCADE_MAX)) {    //slave
+        if(mb->mode==1 && (mb->addr==0 || mb->addr>POWER_CASCADE_MAX)) {    //slave
             LOGE("___ check modbus, slave addr %d is invalid\n", mb->addr);
             r = -1;
         }

+ 86 - 20
f407/applications/power.c

@@ -9,15 +9,10 @@
 #include "datadef.h"
 
 
-#define BRD_NUM             3 //BRD_MAX
-#define BRD_TIMEOUT         200
-#define RETRY_TIMES         3
-
 #define LIMIT_HOF(x)  (x*1.1f)
 #define LIMIT_LOF(x)  (x*0.9f)
 
 typedef struct {
-    void*           mb;
     lock_t          lck;
     uint8_t         cur_addr;
     
@@ -25,13 +20,13 @@ typedef struct {
     power_ch_t      **pch;                  //动态指针
     power_ch_t      ch0;
     
-    uint8_t         cnt;                    //实际扫到的板子个数,不可大于BRD_MAX
+    uint8_t         cnt;                    //实际扫到的板子个数,不可大于POWER_
     uint8_t         brd_max;
-    board_data_t    *pbrd[BRD_MAX+1];       //通过modbus地址索引
+    board_data_t    *pbrd[POWER_BOARD_MAX+1];       //通过modbus地址索引
     
-    board_key_t     key[BRD_MAX+1];
+    board_key_t     key[POWER_BOARD_MAX+1];
     power_total_t   ttl;
-    uint8_t         flag[CH_MAX];
+    uint8_t         flag[POWER_CH_MAX];
     
     product_data_t *prod;
     power_all_t    all;
@@ -154,8 +149,8 @@ static void memswap(uint8_t *buf, int len)
 static int read_reg(power_handle_t *h, 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(h->mb, addr, reg, data, cnt, BRD_TIMEOUT);
+    for(i=0; i<POWER_RETRY_TIMES; i++) {
+        r = mb_read(MB_ID_POWER, addr, reg, data, cnt, POWER_BOARD_TIMEOUT);
         if(r==cnt) {
             break;
         }
@@ -165,8 +160,8 @@ static int read_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *dat
 static int write_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
 {
     int i,r=0;
-    for(i=0; i<RETRY_TIMES; i++) {
-        r = mb_write(h->mb, addr, reg, data, cnt);
+    for(i=0; i<POWER_RETRY_TIMES; i++) {
+        r = mb_write(MB_ID_POWER, addr, reg, data, cnt);
         if(r==cnt) break;
     }
     return (r==cnt)?0:-1;
@@ -483,6 +478,17 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     pch->alarm.w_upper   = (tmp[i] & BIT(10))?1:0;
                     pch->alarm.ph_loss   = 0;
                 }
+                
+                offset = POWER_AC_BREAKER_INFO;
+                r = read_reg(h, pch->info.addr, offset, tmp, 1);
+                if (r < 0) {
+                    LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, pbrd->chs);
+                    break;
+                }
+                pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
+                pbrd->brk[0].samp.time = tm;
+                pbrd->brk[1].samp.sw = (tmp[0]&BIT(1))?1:0;
+                pbrd->brk[1].samp.time = tm;
             }
             break;
 
@@ -650,6 +656,15 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     }
                 }
                 pbrd->ph_loss = v;
+                
+                offset = POWER_AC3_BREAKER_INFO;
+                r = read_reg(h, pch->info.addr, offset, tmp, 1);
+                if (r < 0) {
+                    LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, pbrd->chs);
+                    break;
+                }
+                pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
+                pbrd->brk[0].samp.time = tm;
             }
             break;
             
@@ -712,6 +727,7 @@ static void power_thread(void *arg)
     thread_handle_t *th=(thread_handle_t*)arg;
     power_handle_t *h=(power_handle_t*)th->attr->arg;;
     
+    power_scan();
     while(th->quit==0) {
         board_query(h);
         sleep(1);
@@ -722,6 +738,8 @@ static void power_thread(void *arg)
 int power_init(void)
 {
     power_handle_t *h=&pwrHandle;
+    paras_data_t *p=paras_get();
+    
     mb_para_t para={
         .mode = MB_MODE_MASTER,
         .type = MB_TYPE_RTU,
@@ -740,9 +758,8 @@ int power_init(void)
     memset(h, 0, sizeof(power_handle_t));
     h->lck = lock_init();
     h->cur_addr = 0;
-    h->brd_max = BRD_NUM;
-    h->prod = &paras_get()->prod;
-    power_scan();
+    h->brd_max = POWER_BOARD_MAX;
+    h->prod = &p->prod;
     
     thread_start(THREAD_ID_POWER, power_thread, h);
     return 0;
@@ -936,6 +953,13 @@ int power_scan(void)
                 pch[j].info.stop_delay  = 1000*times;
             }
             
+            if(pbrd->type==AC_SINGLE_S_TYPE || pbrd->type==AC_SINGLE_B_TYPE) {
+                pbrd->brk[0].info.addr = pbrd->brk[1].info.addr = pbrd->addr;
+            }
+            else if(pbrd->type==TREE_AC_TYPE) {
+                pbrd->brk[0].info.addr = pbrd->addr;
+            }
+            
             if(h->prod->pwr_type==PDU_AC_I3O3) {
                 ch_idx += pkey->chs/3;
             }
@@ -1147,8 +1171,6 @@ int power_set_all_sw(uint8_t on)
 }
 
 
-
-
 int power_set_alarm(power_ch_t *pch)
 {
     int r=0;
@@ -1649,11 +1671,55 @@ int power_set_stop_delay(power_ch_t *pch)
 }
 
 
-power_all_t* power_data_get(void)
+int power_data_get(power_all_t *all)
+{
+    power_handle_t *h=&pwrHandle;
+    
+    if(!all) {
+        return -1;
+    }
+    
+    *all = h->all;
+    return 0;
+}
+
+
+int power_breaker_get(breaker_all_t *all)
 {
+    int i,j,idx=0;
     power_handle_t *h=&pwrHandle;
     
-    return &h->all;
+    if(!all) {
+        return -1;
+    }
+    
+    lock_on(h->lck);
+    all->cnt = 0;
+    for(i=1; i<=h->cnt; i++) {
+        if(h->pbrd[i]) {
+            all->cnt += h->pbrd[i]->chs;
+        }
+    }
+    if(all->cnt>0) {
+        all->data = (breaker_data_t*)malloc(sizeof(breaker_data_t)*all->cnt);
+        if(all->data) {
+            for(i=1; i<=h->cnt; i++) {
+                if(h->pbrd[i]) {
+                    for(j=0; j<2; j++) {
+                        if(h->pbrd[i]->brk[j].info.addr>0) {
+                            all->data[idx++] = h->pbrd[i]->brk[j];
+                        }
+                    }
+                }
+            }
+        }
+        else {
+            all->cnt = 0;
+        }
+    }
+    lock_off(h->lck);
+    
+    return 0;
 }
 
 

+ 5 - 4
f407/applications/power.h

@@ -7,8 +7,7 @@
 #define POWER_AC_CUR_INFO_L                       0x0FAB          //单相小电流继电器信息,共8路继电器
 #define POWER_AC_STAT_INFO_L                      0x1071          //单相小电流继电器开关状态,共8路继电器
 #define POWER_AC_CUR_INFO_H                       0x1015          //单相大电流继电器信息,共4路继电器
-#define POWER_AC_STAT_INFO_H                      0x1083          //单相大电流继电器开关状态,共4路继电器
-#define POWER_AC_BRK_INFO                         0x10D6          //单相控制板开关检测信息
+#define POWER_AC_STAT_INFO_H                      0x1083          //单相大电流继电器开关状态,共4路继电器         
 #define POWER_AC_TOTAL_ALATRM                     0x10E0          //单相控制板总体报警信息 2024.11.12
 #define POWER_AC_START_DELAY_TIME_L               0x1194          //单相小电流继电器板开启延时
 #define POWER_AC_STOP_DELAY_TIME_L                0x11A6          //单相小电流继电器板关闭延时
@@ -23,7 +22,8 @@
 #define POWER_AC_RESET_CONSUMP                    0x1400          //重置单相耗电量
 #define POWER_AC_ALARM_CTRL                       0x13EC          //超限动作
 #define POWER_AC_TOTAL_THRESHOLD                  0x1450          //设置单相总超限报警阈值 2024.11.12
-#define POWER_AC_ALARM_CTRL_TOTAL                 0x1482          //总体超限动作   2024.11.12       
+#define POWER_AC_ALARM_CTRL_TOTAL                 0x1482          //总体超限动作   2024.11.12   
+#define POWER_AC_BREAKER_INFO                     0x10D6          //单相控制板开关检测信息
 
 #define POWER_DC_SET_STAT                         0x120A          //设置直流继电器开关状态
 #define POWER_DC_SET_THRESHOLD                    0x12E9          //设置直流继电器超限报警X
@@ -166,6 +166,7 @@ int power_set_stop_delay(power_ch_t *pch);
 int power_get_board(board_data_t *pbrd);
 int power_reset(void);
 
-power_all_t* power_data_get(void);
+int power_data_get(power_all_t *all);
+int power_breaker_get(breaker_all_t *all);
 #endif
 

+ 117 - 25
f407/applications/sensor.c

@@ -1,7 +1,13 @@
+#include <stdlib.h>
 #include "mb.h"
 #include "lock.h"
 #include "sensor.h"
 
+
+#define RETRY_TIMES   3
+#define TIMEOUT       200
+
+
 typedef struct {
     lock_t        lck;
     
@@ -9,6 +15,21 @@ typedef struct {
 }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; i<RETRY_TIMES; i++) {
+        r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
+        if(r==cnt) {
+            break;
+        }
+    }
+    return (r==cnt)?0:-1;
+}
+
+
 int sensor_init(void)
 {
     sensor_handle_t *h=&ssHandle;
@@ -33,6 +54,9 @@ int sensor_add(sensor_data_t *data)
 {
     sensor_handle_t *h=&ssHandle;
     
+    if(!data) {
+        return -1;
+    }
     lock_on(h->lck);
     
     lock_off(h->lck);
@@ -45,6 +69,9 @@ int sensor_remove(sensor_data_t *data)
 {
     sensor_handle_t *h=&ssHandle;
     
+    if(!data) {
+        return -1;
+    }
     lock_on(h->lck);
     
     lock_off(h->lck);
@@ -53,16 +80,30 @@ int sensor_remove(sensor_data_t *data)
 }
 
 
-int sensor_query(sensor_data_t *data)
+int sensor_update(sensor_data_t *data)
 {
-    int r=-1;
     sensor_handle_t *h=&ssHandle;
-
+    
     if(!data) {
         return -1;
     }
-
+    
     lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+
+static int my_read(sensor_data_t *data)
+{
+    int r=-1;
+    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:
         {
@@ -97,7 +138,7 @@ int sensor_query(sensor_data_t *data)
         case SENSOR_TYPE_WATER:
         case SENSOR_TYPE_ACCESS:
         {
-            //r = gpio_get(subaddr+GPIO_PD11);
+            r = -1;//read_reg(subaddr+GPIO_PD11);
             if(r<0) {
                 return -1;
             }
@@ -107,12 +148,11 @@ int sensor_query(sensor_data_t *data)
 
         case SENSOR_TYPE_GAS:
         {
-            uint16_t tmp;
-            //r = g_modbus_read_x_reg(mm, addr, 19, 1, &tmp);
-            if(r<=0) {
+            r = read_reg(addr, 19, tmp, 1);
+            if(r<0) {
                 return -1 ;
             }
-            data->samp.val[0] = tmp; //气体浓度值
+            data->samp.val[0] = tmp[0]; //气体浓度值
         }
         break;
 
@@ -130,17 +170,18 @@ int sensor_query(sensor_data_t *data)
 
         case SENSOR_TYPE_TEMP_DOUBLE:
         {
-            uint16_t tmp[2];
             switch(data->info.subtype) {
                 case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
                 {
-                    //r = g_modbus_read_input_reg(mm, addr, 0x0400, 1, &tmp[0]);
-                    if (r <= 0) {
+                    r = read_reg(addr, 0x0400, &tmp[0], 1);
+                    if (r < 0) {
+                        LOGE("___ sensor RSWSN01PVC 1 read failed, addr: %d\n", addr);
                         return -1;
                     }
 
-                    //r = g_modbus_read_input_reg(mm, addr, 0x0401, 1, &tmp[1]);
-                    if (r <= 0) {
+                    r = read_reg(addr, 0x0401, &tmp[1], 1);
+                    if (r < 0) {
+                        LOGE("___ sensor RSWSN01PVC 2 read failed, addr: %d\n", addr);
                         return -1;
                     }
                     data->samp.val[0] = tmp[1]/10.0f;   //解算温度值
@@ -153,16 +194,15 @@ int sensor_query(sensor_data_t *data)
 
         case SENSOR_TYPE_TEMP:
         {
-            uint16_t tmp;
             switch(data->info.subtype) {
                 case SENSOR_TYPE_TEMP_BTG50H8EL3200:
                 {
-                    //r = g_modbus_read_x_reg(mm, addr, 0, 1, &tmp);
-                    if (r <= 0) {
-                        //printf("___ sensor BTG50H8EL3200 read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
+                    r = read_reg(addr, 0, tmp, 1);
+                    if (r < 0) {
+                        LOGE("___ sensor BTG50H8EL3200 read failed, addr: %d\n", addr);
                         return -1;
                     }
-                    data->samp.val[0] = tmp/10.0f - 50;
+                    data->samp.val[0] = tmp[0]/10.0f - 50;
                     //printf("___ BTG50H8EL3200 read: 0x%04x, temp: %0.2f\n", tmp, data->val[0]);
                 }
                 break;
@@ -175,10 +215,9 @@ int sensor_query(sensor_data_t *data)
             switch(data->info.subtype) {
                 case SENSOR_TYPE_LEAK_XWDC01A:
                 {
-                    uint16_t tmp[4]={0};
-                    //r = g_modbus_read_input_reg(mm, addr, 0, 4, tmp);
-                    if (r <= 0) {
-                        //printf("___ sensor XWDC01A read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
+                    r = read_reg(addr, 0, tmp, 4);
+                    if (r < 0) {
+                        LOGE("___ sensor XWDC01A read failed, addr: %d\n", data->info.addr);
                         return -1;
                     }
                     //printf("___ XWDC01A read: 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", tmp[0],tmp[1],tmp[2],tmp[3]);
@@ -193,17 +232,70 @@ int sensor_query(sensor_data_t *data)
         }
         break;
     }
+
+    return r;
+}
+int sensor_read(sensor_data_t *data)
+{
+    int r=-1;
+    uint8_t addr;
+    uint16_t tmp[10]={0};
+    sensor_handle_t *h=&ssHandle;
+
+    if(!data) {
+        return -1;
+    }
+
+    lock_on(h->lck);
+    r = my_read(data);
     lock_off(h->lck);
 
     return r;
 }
 
+int sensor_query(void)
+{
+    int i,r=-1;
+    sensor_handle_t *h=&ssHandle;
     
-sensor_all_t* sensor_data_get(void)
+    lock_on(h->lck);
+    for(i=0; i<h->all.cnt; i++) {
+        r = my_read(&h->all.data[i]);
+    }
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+    
+int sensor_data_get(sensor_all_t *all)
 {
     sensor_handle_t *h=&ssHandle;
     
-    return &h->all;
+    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;
 }
 
 

+ 5 - 2
f407/applications/sensor.h

@@ -7,7 +7,10 @@ int sensor_init(void);
 int sensor_deinit(void);
 int sensor_add(sensor_data_t *data);
 int sensor_remove(sensor_data_t *data);
-int sensor_query(sensor_data_t *data);
-sensor_all_t* sensor_data_get(void);
+int sensor_update(sensor_data_t *data);
+int sensor_read(sensor_data_t *data);
+int sensor_query(void);
+int sensor_data_get(sensor_all_t *all);
+int sensor_data_free(sensor_all_t *all);
 
 #endif

+ 10 - 2
f407/applications/sys.c

@@ -12,6 +12,9 @@
 #include "cfg.h"
 #include "fs.h"
 #include "ui.h"
+#include "mb.h"
+#include "sensor.h"
+#include "breaker.h"
 #include "thread.h"
 
 
@@ -159,13 +162,15 @@ int sys_get_prod(char *path, paras_data_t *info)
 }
 
 
-static void* poll_thread(void *arg)
+static void poll_thread(void *arg)
 {
     thread_handle_t *h=(thread_handle_t*)arg;
 
     //wdog_init();
     //tmp_create();
     while(h->quit==0) {
+        sensor_query();
+        breaker_query();
         sleep(1);
     }
     pthread_exit(NULL);
@@ -178,7 +183,10 @@ int sys_init(void)
     paras_init();
     ui_init();
     
-    //thread_start(THREAD_ID_POLL, poll_thread, NULL);
+    mb_init();
+    sensor_init();
+    breaker_init();
+    thread_start(THREAD_ID_POLL, poll_thread, NULL);
 
     return 0;
 }

+ 11 - 8
f407/applications/ui/menu.c

@@ -119,22 +119,25 @@ static int is_ph3_out(menu_handle_t *h)
 }
 static int get_input(menu_handle_t *h, int ph, total_t *ttl)
 {
-    power_all_t *p=power_data_get();
-    if(p->chs==0 || !ttl) {
+    power_all_t all;
+    
+    power_data_get(&all);
+    if(all.chs==0 || !ttl) {
         return -1;
     }
-    *ttl = p->ttl.total[ph];
+    *ttl = all.ttl.total[ph];
     return 0;
 }
 static int get_output(menu_handle_t *h, int ch, int ph, power_t *pwr)
 {
     int i=-1,j=0;
-    power_all_t *p=power_data_get();
+    power_all_t all;
 
-    if(p->chs==0 || ch>p->chs|| !pwr) {
+    power_data_get(&all);
+    if(all.chs==0 || ch>all.chs|| !pwr) {
         return -1;
     }
-    *pwr = p->pch[ch].power[ph];
+    *pwr = all.pch[ch].power[ph];
     
     return 0;
 }
@@ -448,7 +451,7 @@ static int menu_modbus_key_handle(menu_handle_t *h, key_val_t *kv)
             else if(h->menu.menu_lv==2) {
                 modbus_data_t *pmb=&h->mb;
                 if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {         //addr
-                    if(pmb->addr<CASCADE_MAX) {
+                    if(pmb->addr<POWER_CASCADE_MAX) {
                         pmb->addr++;
                     }
                     else {
@@ -484,7 +487,7 @@ static int menu_modbus_key_handle(menu_handle_t *h, key_val_t *kv)
                         pmb->addr--;
                     }
                     else {
-                        pmb->addr = CASCADE_MAX;
+                        pmb->addr = POWER_CASCADE_MAX;
                     }
                 }
                 else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {    //mode

+ 109 - 18
f407/applications/web.c

@@ -4,6 +4,8 @@
 #include "list.h"
 #include "power.h"
 #include "paras.h"
+#include "sensor.h"
+#include "breaker.h"
 #include "cascade.h"
 #include "cfg.h"
 #include "lcd.h"
@@ -11,8 +13,8 @@
 #include "datadef.h"
 #include "cascade.h"
 
-#define TIMER_INTERVAL     1000
-#define ONCE_SEND_CH_CNT   10
+#define TIMER_INTERVAL      1000
+#define ONCE_SEND_CNT       10
 
 
 //#define USE_MG716
@@ -124,9 +126,16 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
     int i,j,xlen,offset,times,left;
     pkt_hdr_t *hdr=NULL;
-    power_all_t *p=(addr==0)?power_data_get():cascade_power_get();
+    power_all_t all;
     
-    if(p->chs==0 || h->buf==NULL ) {
+    if(addr==0) {
+        power_data_get(&all);
+    }
+    else {
+        cascade_power_get(&all);
+    }
+    
+    if(all.chs==0 || h->buf==NULL ) {
         return;
     }
     hdr = (pkt_hdr_t*)h->buf;
@@ -136,32 +145,115 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
     hdr->type  = PKT_TYPE_POWER_CH;
     hdr->nack  = 0;
     
-    times = p->chs/ONCE_SEND_CH_CNT;
+    times = all.chs/ONCE_SEND_CNT;
     for(i=0; i<times; i++) {
-        for(j=0; j<ONCE_SEND_CH_CNT; j++) {
+        for(j=0; j<ONCE_SEND_CNT; j++) {
             offset = j*sizeof(power_ch_t);
-            memcpy(hdr->data+offset, &p->pch[i*ONCE_SEND_CH_CNT+j], sizeof(power_ch_t));
+            memcpy(hdr->data+offset, &all.pch[i*ONCE_SEND_CNT+j], sizeof(power_ch_t));
         }
-        xlen = ONCE_SEND_CH_CNT*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
+        xlen = ONCE_SEND_CNT*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
         hdr->dlen  = xlen-sizeof(pkt_hdr_t);
         ws_send(c, h->buf, xlen, 1);
     }
     
-    left = p->chs%ONCE_SEND_CH_CNT;
+    left = all.chs%ONCE_SEND_CNT;
     for(i=0; i<left; i++) {
         offset = i*sizeof(power_ch_t);
-        memcpy(hdr->data+offset, &p->pch[p->chs-left+i], sizeof(power_ch_t));
+        memcpy(hdr->data+offset, &all.pch[all.chs-left+i], sizeof(power_ch_t));
     }
-    xlen = (p->chs%ONCE_SEND_CH_CNT)*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
+    xlen = (all.chs%ONCE_SEND_CNT)*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
     hdr->dlen  = xlen-sizeof(pkt_hdr_t);
     ws_send(c, h->buf, xlen, 1);
 }
-
 static void send_powert(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
     int i,r;
-    power_all_t *p=(addr==0)?power_data_get():cascade_power_get();
-    ws_send_pkt(h, c, addr, PKT_TYPE_POWER_TOTAL, &p->ttl, sizeof(power_total_t), 1);
+    power_all_t all;
+    
+    if(addr==0) {
+        power_data_get(&all);
+    }
+    else {
+        cascade_power_get(&all);
+    }
+    ws_send_pkt(h, c, addr, PKT_TYPE_POWER_TOTAL, &all.ttl, sizeof(power_total_t), 1);
+}
+static void send_sensor(web_handle_t *h, mg_conn_t *c, uint8_t addr)
+{
+    int i,j,xlen,offset,times,left;
+    pkt_hdr_t *hdr=NULL;
+    sensor_all_t all;
+    
+    sensor_data_get(&all);
+    if(all.cnt==0 || h->buf==NULL ) {
+        return;
+    }
+    hdr = (pkt_hdr_t*)h->buf;
+    
+    hdr->magic = PKT_MAGIC;
+    hdr->addr  = addr;
+    hdr->type  = PKT_TYPE_SENSOR;
+    hdr->nack  = 0;
+    
+    times = all.cnt/ONCE_SEND_CNT;
+    for(i=0; i<times; i++) {
+        for(j=0; j<ONCE_SEND_CNT; j++) {
+            offset = j*sizeof(sensor_data_t);
+            memcpy(hdr->data+offset, &all.data[i*ONCE_SEND_CNT+j], sizeof(sensor_data_t));
+        }
+        xlen = ONCE_SEND_CNT*sizeof(sensor_data_t)+sizeof(pkt_hdr_t);
+        hdr->dlen  = xlen-sizeof(pkt_hdr_t);
+        ws_send(c, h->buf, xlen, 1);
+    }
+    
+    left = all.cnt%ONCE_SEND_CNT;
+    for(i=0; i<left; i++) {
+        offset = i*sizeof(sensor_data_t);
+        memcpy(hdr->data+offset, &all.data[all.cnt-left+i], sizeof(sensor_data_t));
+    }
+    xlen = (all.cnt%ONCE_SEND_CNT)*sizeof(breaker_data_t)+sizeof(pkt_hdr_t);
+    hdr->dlen  = xlen-sizeof(pkt_hdr_t);
+    ws_send(c, h->buf, xlen, 1);
+    sensor_data_free(&all);
+}
+static void send_breaker(web_handle_t *h, mg_conn_t *c, uint8_t addr)
+{
+    int i,j,xlen,offset,times,left;
+    pkt_hdr_t *hdr=NULL;
+    breaker_all_t all;
+    
+    breaker_data_get(&all);
+    if(all.cnt==0 || h->buf==NULL ) {
+        return;
+    }
+    hdr = (pkt_hdr_t*)h->buf;
+    
+    hdr->magic = PKT_MAGIC;
+    hdr->addr  = addr;
+    hdr->type  = PKT_TYPE_SENSOR;
+    hdr->nack  = 0;
+    
+    times = all.cnt/ONCE_SEND_CNT;
+    for(i=0; i<times; i++) {
+        for(j=0; j<ONCE_SEND_CNT; j++) {
+            offset = j*sizeof(breaker_data_t);
+            memcpy(hdr->data+offset, &all.data[i*ONCE_SEND_CNT+j], sizeof(breaker_data_t));
+        }
+        xlen = ONCE_SEND_CNT*sizeof(breaker_data_t)+sizeof(pkt_hdr_t);
+        hdr->dlen  = xlen-sizeof(pkt_hdr_t);
+        ws_send(c, h->buf, xlen, 1);
+    }
+    
+    left = all.cnt%ONCE_SEND_CNT;
+    for(i=0; i<left; i++) {
+        offset = i*sizeof(breaker_data_t);
+        memcpy(hdr->data+offset, &all.data[all.cnt-left+i], sizeof(breaker_data_t));
+    }
+    xlen = (all.cnt%ONCE_SEND_CNT)*sizeof(breaker_data_t)+sizeof(pkt_hdr_t);
+    hdr->dlen  = xlen-sizeof(pkt_hdr_t);
+    ws_send(c, h->buf, xlen, 1);
+    
+    breaker_data_free(&all);
 }
 static void send_dlist(web_handle_t *h, mg_conn_t *c)
 {
@@ -382,13 +474,13 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
         
         case PKT_TYPE_SENSOR:
         {
-            
+            send_sensor(h, c, hdr->addr);
         }
         break;
         
         case PKT_TYPE_BREAKER:
         {
-            
+            send_breaker(h, c, hdr->addr);
         }
         break;
         
@@ -403,7 +495,6 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
             send_dlist(h, c);
         }
         break;
-        
     }
 }
 
@@ -515,7 +606,7 @@ int web_init(void)
     memset(h, 0, sizeof(web_handle_t));
     h->list = list_init(&lc);
     
-    h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CH_CNT+8;
+    h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
     h->buf = (char*)malloc(h->buflen);
     
     thread_start(THREAD_ID_WEB, web_thread, h);

+ 32 - 4
f407/project/app/app.uvoptx

@@ -117,10 +117,6 @@
         <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGUARM</Key>
-        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>ARMRTXEVENTFLAGS</Key>
@@ -180,6 +176,38 @@
           <ExecCommand></ExecCommand>
           <Expression></Expression>
         </Bp>
+        <Bp>
+          <Number>2</Number>
+          <Type>0</Type>
+          <LineNumber>563</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>0</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>0</BreakIfRCount>
+          <Filename>&lt;1&gt;..\..\applications\cascade.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression></Expression>
+        </Bp>
+        <Bp>
+          <Number>3</Number>
+          <Type>0</Type>
+          <LineNumber>565</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>0</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>0</BreakIfRCount>
+          <Filename>&lt;1&gt;..\..\applications\cascade.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression></Expression>
+        </Bp>
       </Breakpoint>
       <WatchWindow1>
         <Ww>

+ 51 - 0
f407/project/app/app.uvprojx

@@ -478,6 +478,57 @@
               <FileName>db.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\..\applications\db.c</FilePath>
+              <FileOption>
+                <CommonProperty>
+                  <UseCPPCompiler>2</UseCPPCompiler>
+                  <RVCTCodeConst>0</RVCTCodeConst>
+                  <RVCTZI>0</RVCTZI>
+                  <RVCTOtherData>0</RVCTOtherData>
+                  <ModuleSelection>0</ModuleSelection>
+                  <IncludeInBuild>0</IncludeInBuild>
+                  <AlwaysBuild>2</AlwaysBuild>
+                  <GenerateAssemblyFile>2</GenerateAssemblyFile>
+                  <AssembleAssemblyFile>2</AssembleAssemblyFile>
+                  <PublicsOnly>2</PublicsOnly>
+                  <StopOnExitCode>11</StopOnExitCode>
+                  <CustomArgument></CustomArgument>
+                  <IncludeLibraryModules></IncludeLibraryModules>
+                  <ComprImg>1</ComprImg>
+                </CommonProperty>
+                <FileArmAds>
+                  <Cads>
+                    <interw>2</interw>
+                    <Optim>0</Optim>
+                    <oTime>2</oTime>
+                    <SplitLS>2</SplitLS>
+                    <OneElfS>2</OneElfS>
+                    <Strict>2</Strict>
+                    <EnumInt>2</EnumInt>
+                    <PlainCh>2</PlainCh>
+                    <Ropi>2</Ropi>
+                    <Rwpi>2</Rwpi>
+                    <wLevel>0</wLevel>
+                    <uThumb>2</uThumb>
+                    <uSurpInc>2</uSurpInc>
+                    <uC99>2</uC99>
+                    <uGnu>2</uGnu>
+                    <useXO>2</useXO>
+                    <v6Lang>0</v6Lang>
+                    <v6LangP>0</v6LangP>
+                    <vShortEn>2</vShortEn>
+                    <vShortWch>2</vShortWch>
+                    <v6Lto>2</v6Lto>
+                    <v6WtE>2</v6WtE>
+                    <v6Rtti>2</v6Rtti>
+                    <VariousControls>
+                      <MiscControls></MiscControls>
+                      <Define></Define>
+                      <Undefine></Undefine>
+                      <IncludePath></IncludePath>
+                    </VariousControls>
+                  </Cads>
+                </FileArmAds>
+              </FileOption>
             </File>
             <File>
               <FileName>cascade.c</FileName>