Переглянути джерело

将F407的基本数据结构由256字节,减小到92字节。

liyi 1 рік тому
батько
коміт
a5182480bd

+ 7 - 6
f407/applications/cascade.c

@@ -257,11 +257,12 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 			{
 				case CASCADE_CMD_GET_INFO:
 				{
-					LOGD("____read_____ readlen = %d,sendlen = %d power_ch_t size=%d\n",lenth,sendlen,sizeof(power_ch_t));
+					
 					uint8_t * base_addr = (uint8_t *)&all.pch[1];
-					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
+					//my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
+					memcpy(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
-					
+					LOGD("____read_____ readlen = %d,sendlen = %d power_ch_t size=%d\n",lenth,sendlen,sizeof(power_ch_t));
 				}
 					break;
 				case CASCADE_CMD_QUERY_CH:
@@ -319,7 +320,7 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
 			memswap(buff,xlen%2+xlen);
 			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);
+				LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d   errno = %d \n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i+1,wl);
 				if(addr >0 && addr < POWER_SLAVE_CH_MAX)
 				{
 					slave_info.slaves[addr].err ++;
@@ -446,7 +447,7 @@ static int mb_write_read_n(cascade_handle_t *cas, int addr, data_t *wd, data_t *
 			if(rl<=0) {
 				if(addr >0 && addr < POWER_SLAVE_CH_MAX) {
 					cas->slaves[addr].err ++;
-					LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, cas->slaves[addr].err);
+					LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d  ernno=%d\n", "read error", rlen, cas->slaves[addr].err,rl);
 					if(cas->slaves[addr].err > 5) {
 						slave_rm(addr);
 						lock_off(cas->lock);
@@ -757,7 +758,7 @@ void cascade_scan_thread(void *arg)
 						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_current  = all.pch[i+1].power[j].current * 1000;
 						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_power    = all.pch[i+1].power[j].power * 1000;
 						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_voltage  = all.pch[i+1].power[j].voltage * 1000;
-						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_status   = all.pch[i+1].power[j].status;		
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_status   = all.pch[i+1].status;		
 					}
 				}	
 				for(int i = 0; i < cnt;i++)

+ 127 - 30
f407/applications/datadef.h

@@ -246,43 +246,138 @@ typedef struct {
 }paras_data_t;
 
 typedef struct {
-    float               voltage;                //电压
-    float               current;                //电流
-    float               power;                  //功率(视在)
-    float               freq;                   //频率
-    float               factor;                 //功率因数
-    float               consump;                //耗电量consumption
-
-    float               active;                 //有功功率
-    float               reactive;               //无功功率
-    uint8_t             ph_out;                 //三相输出时,用于判断该相是否有输出
-    
-    uint8_t             status;                 //开关状态     
-    uint8_t             nwire;                  //零线状态    
+//    float               voltage;                //电压
+//    float               current;                //电流
+//    float               power;                  //功率(视在)
+//    float               freq;                   //频率
+//    float               factor;                 //功率因数
+//    float               consump;                //耗电量consumption
+
+//    float               active;                 //有功功率
+//    float               reactive;               //无功功率
+//    uint8_t             ph_out;                 //三相输出时,用于判断该相是否有输出
+//    
+//    uint8_t             status;                 //开关状态     
+//    uint8_t             nwire;                  //零线状态   
+			uint16_t 							freq;															// 频率			保留1位小数,单位Hz
+			uint8_t 						factor;															// 因素			保留2位小数,单位fa
+			uint16_t 					 voltage;															// 电压			保留1位小数,单位V
+			uint16_t           current;															// 电流			保留1位小数,单位A
+			uint32_t             power;																// 功率			保留3位小数,单位W,最大值65535W
+			uint32_t           consump;														// 耗电量   保留3位小数,单位kWh	
 }power_t;
 
+
+//designed by liyi
+typedef struct
+{
+	uint16_t freq;																	// 频率			保留1位小数,单位Hz
+	uint8_t factor;																// 因素			保留1位小数,单位fa
+	uint16_t voltage;															// 电压			保留1位小数,单位V
+	uint16_t current;															// 电流			保留1位小数,单位A
+	uint32_t power;																// 功率			保留0位小数,单位W,最大值65535W
+	uint32_t consumer;														// 耗电量   保留2位小数,单位kWh
+}n_power_t;																		  // 16字节   相比于power_t 节约内存,20字节
+
+typedef struct{
+	uint16_t v_upper;
+	uint16_t v_lower;
+	uint16_t c_upper;
+	uint32_t p_upper;
+	uint32_t w_upper;
+}n_thr_t;																	//相对于thr_t节约内存 17字节
+
+typedef struct{
+	uint8_t           en;
+	n_thr_t 					thr[3];
+	uint8_t        		para[14];
+}total_thr_t;															//总阈值		
+
+
+typedef struct{
+	uint16_t v_upper				 :			1;						//电压超上限
+	uint16_t v_lower    		 :      1;						//电压超下限
+	uint16_t c_upper    		 :      1;						//电流超上限
+	uint16_t p_upper    		 :      1;						//功率超上限
+	uint16_t w_upper    		 :      1;						//耗电量超上限
+	uint16_t 								 :			3;						//预留 
+	uint16_t ph_1_lose    	 :      1;						//缺相L1用于输入端
+	uint16_t ph_2_lose       :    	1;						//缺相L2用于输入端
+	uint16_t ph_3_lose       :    	1;						//缺相L3用于输入端
+	uint16_t                 :      5;            //预留
+}n_alarm_t;																			//告警节约5字节
+
+typedef struct{
+	char 								 name[16];									//通道信息数据;
+	uint8_t             		type;
+  uint8_t             		addr;
+  uint8_t             			ch;										//表头id
+	uint8_t             		 sch;								  	//在控制板上的通道;
+	uint8_t                 ph_id;							    //相信息
+	uint8_t                status;
+	uint8_t                ph_val;
+  uint8_t            open_delay;									//开延时 单位s
+  uint8_t           close_delay;									//关延时 单位s
+}n_info_t;																				//节约20字节
+
+
+
+
+
+
+//designed over by liyi
+
+
+
+
 typedef struct {
     uint8_t             en;
     float               val;                    //threashold value
     uint8_t             act;
     uint8_t             para[14];               //14*8=128 channels
 }thr_val_t;
+
+typedef struct {
+	uint16_t       v_upper_en:1;
+	uint16_t       v_lower_en:1;
+	uint16_t       c_upper_en:1;
+	uint16_t       p_upper_en:1;
+	uint16_t       w_upper_en:1;	
+}thr_en;
+
+
 typedef struct {
-    thr_val_t           v_upper;
-    thr_val_t           v_lower;
-    thr_val_t           c_upper;                //current
-    thr_val_t           p_upper;
-    thr_val_t           w_upper;                //power consumption
+//    thr_val_t           v_upper;
+//    thr_val_t           v_lower;
+//    thr_val_t           c_upper;                //current
+//    thr_val_t           p_upper;
+//    thr_val_t           w_upper;                //power consumption
+			thr_en 									 en;
+			uint16_t 						v_upper;
+			uint16_t 						v_lower;
+			uint16_t 						c_upper;
+			uint32_t 						p_upper;
+			uint32_t 						w_upper;
 }thr_t;
 
 typedef struct {
-    uint8_t             v_upper;                //电压超上限
-    uint8_t             v_lower;                //电压超下限
-    uint8_t             c_upper;                //电流超上限
-    uint8_t             p_upper;                //功率超上限
-    uint8_t             w_upper;                //耗电量超上限
-    
-    uint8_t             ph_loss;                //缺相,0,1,2位分别代表L1,L2,L3相,相应位为1则代表缺相,为0则不缺
+//    uint8_t             v_upper;                //电压超上限
+//    uint8_t             v_lower;                //电压超下限
+//    uint8_t             c_upper;                //电流超上限
+//    uint8_t             p_upper;                //功率超上限
+//    uint8_t             w_upper;                //耗电量超上限
+//    
+//    uint8_t             ph_loss;                //缺相,0,1,2位分别代表L1,L2,L3相,相应位为1则代表缺相,为0则不缺
+	uint16_t v_upper				 :			1;						//电压超上限
+	uint16_t v_lower    		 :      1;						//电压超下限
+	uint16_t c_upper    		 :      1;						//电流超上限
+	uint16_t p_upper    		 :      1;						//功率超上限
+	uint16_t w_upper    		 :      1;						//耗电量超上限
+	uint16_t 								 :			3;						//预留 
+	uint16_t ph_1_lose    	 :      1;						//缺相L1用于输入端
+	uint16_t ph_2_lose       :    	1;						//缺相L2用于输入端
+	uint16_t ph_3_lose       :    	1;						//缺相L3用于输入端
+	uint16_t                 :      5;            //预留
 }alarm_t;
 typedef struct {
     uint8_t             ch;
@@ -291,7 +386,7 @@ typedef struct {
 }alarm_data_t;
 
 typedef struct {
-    char                name[32];
+    char                name[16];
     uint8_t             type;
     uint8_t             addr;
     uint8_t             ch;                      //该通道在全部板上的所排序号,程序始于0,用户始于1
@@ -299,20 +394,22 @@ typedef struct {
     uint8_t             ph_id;                   //phase id, 0:L1相 1:L2相 2:L3相
     
     uint8_t             ph_val;                  //三相输出设置,0:单相  1:三相
-    uint32_t            open_delay;
-    uint32_t            close_delay;
+    uint8_t            open_delay;
+    uint8_t            close_delay;
 }info_t;
 typedef struct {
     info_t              info;
     power_t             power[3];                 //电力信息
     thr_t               thr;                      //阈值
     alarm_t             alarm;
-    uint32_t            time;
+		uint8_t             status;
+		uint8_t             nwire;
+    //uint32_t            time;
     void                *pbrd;
 }power_ch_t;
 
 typedef struct {
-    char                name[32];
+    char                name[16];
     uint8_t             addr;
 }breaker_info_t;
 typedef struct {

+ 10 - 5
f407/applications/db.c

@@ -704,7 +704,7 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                     sqlite3_bind_int(stmt,    i++, pch->info.ph_val);
                     sqlite3_bind_int(stmt,    i++, pch->info.open_delay);
                     sqlite3_bind_int(stmt,    i++, pch->info.close_delay);
-                                              
+#if 0                                            
                     sqlite3_bind_int(stmt,    i++, pch->thr.v_upper.en);
                     sqlite3_bind_double(stmt, i++, pch->thr.v_upper.val);
                     sqlite3_bind_int(stmt,    i++, pch->thr.v_upper.act);
@@ -734,6 +734,7 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                     sqlite3_bind_int(stmt,    i++, pch->thr.w_upper.act);
                     array_to_str(pch->thr.w_upper.para,sizeof(pch->thr.w_upper.para),para);
                     sqlite3_bind_text(stmt,   i++, para, -1, NULL);
+#endif
                     
                     rc = sqlite3_step(stmt);
                     if (rc != SQLITE_ROW) {
@@ -773,7 +774,7 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                     pch->info.ph_val      = sqlite3_column_int(stmt, i++);
                     pch->info.open_delay  = sqlite3_column_int(stmt, i++);
                     pch->info.close_delay = sqlite3_column_int(stmt, i++);
-                    
+#if 0                 
                     pch->thr.v_upper.en   = sqlite3_column_int(stmt, i++);
                     pch->thr.v_upper.val  = sqlite3_column_double(stmt, i++);
                     pch->thr.v_upper.act  = sqlite3_column_int(stmt, i++);
@@ -803,7 +804,7 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                     pch->thr.w_upper.act  = sqlite3_column_int(stmt, i++);
                     p = (char*)sqlite3_column_text(stmt, i++);
                     str_to_array(p,pch->thr.w_upper.para, sizeof(pch->thr.w_upper.para));
-                    
+#endif                    
                     cnt++;
                     if(cnt>max) {
                         break;
@@ -865,11 +866,13 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                         sqlite3_bind_double(stmt, i++, p->power[j].freq);
                         sqlite3_bind_double(stmt, i++, p->power[j].factor);
                         sqlite3_bind_double(stmt, i++, p->power[j].consump);
+#if 0
                         sqlite3_bind_double(stmt, i++, p->power[j].active);
                         sqlite3_bind_double(stmt, i++, p->power[j].reactive);
                         sqlite3_bind_int(stmt,    i++, p->power[j].ph_out);
                         sqlite3_bind_int(stmt,    i++, p->power[j].status);
-                        sqlite3_bind_int(stmt,    i++, p->power[j].nwire);
+#endif
+                        sqlite3_bind_int(stmt,    i++, p->nwire);
                         
                         rc = sqlite3_step(stmt);
                         if (rc != SQLITE_DONE) {
@@ -895,11 +898,13 @@ static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list,
                     p->power[j].freq     = sqlite3_column_double(stmt, i++);
                     p->power[j].factor   = sqlite3_column_double(stmt, i++);
                     p->power[j].consump  = sqlite3_column_double(stmt, i++);
+#if 0
                     p->power[j].active   = sqlite3_column_double(stmt, i++);
                     p->power[j].reactive = sqlite3_column_double(stmt, i++);
                     p->power[j].ph_out   = sqlite3_column_int(stmt, i++);
                     p->power[j].status   = sqlite3_column_int(stmt, i++);
-                    p->power[j].nwire    = sqlite3_column_int(stmt, i++);
+#endif
+                    p->nwire    = sqlite3_column_int(stmt, i++);
                 }
             }
         }

+ 2 - 2
f407/applications/main.c

@@ -100,7 +100,7 @@ static int user_init(void)
     
     power_init();
     cascade_init();
-    //web_init();
+    web_init();
     
     return 0;
 }
@@ -112,6 +112,6 @@ int main(void)
     sys_init();
     user_init();
     while (1) {
-        sleep(10);
+			sleep(10);
     }
 }

+ 162 - 149
f407/applications/power.c

@@ -17,7 +17,7 @@ typedef struct {
     uint8_t         cur_addr;
     
     uint8_t         chs;                    //所有控制板的总通道数
-    power_ch_t      **pch;                  //动态指针
+    power_ch_t      *pch[32];                  //动态指针
     power_ch_t      ch0;
     
     uint8_t         cnt;                    //实际扫到的板子个数,不可大于POWER_
@@ -47,7 +47,7 @@ static int get_alarm(power_ch_t *pch)
 }
 static int set_ch(power_ch_t *pch)
 {
-    return power_set_ch_sw(pch->info.ch, pch->power[0].status);
+    return power_set_ch_sw(pch->info.ch, pch->status);
 }
 static int set_open_delay(power_ch_t *pch)
 {
@@ -129,7 +129,7 @@ static int alarm_evt_handle(power_handle_t *h, power_ch_t *pch)
     
     ad.ch = pch->info.ch;
     ad.alarm = pch->alarm;
-    ad.time = pch->time;
+   // ad.time = pch->time;
     web_post(PKT_TYPE_ALARM, &ad, sizeof(ad));
     
     return 0;
@@ -316,14 +316,14 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
         }
         
         for(j=0; j<times; j++) {
-            if(pch->thr.v_upper.en) {
-                if(pch->power[j].voltage>pch->thr.v_upper.val) {
+            if(pch->thr.en.v_upper_en) {
+                if(pch->power[j].voltage>pch->thr.v_upper) {
                     if(pch->alarm.v_upper && get_flag(h, pch->info.ch, ALARM_V_UPPER)==0) {
                         set_flag(h, pch->info.ch, ALARM_V_UPPER, 1);
                         alarm_evt_handle(h, pch);
                     }
                 }
-                else if(pch->power[j].voltage<pch->thr.v_lower.val) {
+                else if(pch->power[j].voltage<pch->thr.v_lower) {
                     if(pch->alarm.v_lower && get_flag(h, pch->info.ch, ALARM_V_LOWER)==0) {
                         set_flag(h, pch->info.ch, ALARM_V_LOWER, 1);
                         alarm_evt_handle(h, pch);
@@ -335,8 +335,8 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
                 }
             }
             
-            if(pch->thr.c_upper.en) {
-                if(pch->power[j].current>pch->thr.c_upper.val) {
+            if(pch->thr.en.c_upper_en) {
+                if(pch->power[j].current>pch->thr.c_upper) {
                     if(pch->alarm.c_upper && get_flag(h, pch->info.ch, ALARM_C_UPPER)==0) {
                         set_flag(h, pch->info.ch, ALARM_C_UPPER, 1);
                         alarm_evt_handle(h, pch);
@@ -347,8 +347,8 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
                 }
             }
             
-            if(pch->thr.p_upper.en) {
-                if(pch->power[j].power>pch->thr.p_upper.val) {
+            if(pch->thr.en.p_upper_en) {
+                if(pch->power[j].power>pch->thr.p_upper) {
                     if(pch->alarm.p_upper && get_flag(h, pch->info.ch, ALARM_P_UPPER)==0) {
                         set_flag(h, pch->info.ch, ALARM_P_UPPER, 0);
                         alarm_evt_handle(h, pch);
@@ -359,8 +359,8 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
                 }
             }
             
-            if(pch->thr.w_upper.en) {
-                if(pch->power[j].current>pch->thr.w_upper.val) {
+            if(pch->thr.en.w_upper_en) {
+                if(pch->power[j].current>pch->thr.w_upper) {
                     if(pch->alarm.w_upper==1 && get_flag(h, pch->info.ch, ALARM_W_UPPER)==0) {
                         set_flag(h, pch->info.ch, ALARM_W_UPPER, 1);
                         alarm_evt_handle(h, pch);
@@ -389,13 +389,15 @@ static int total_proc(power_handle_t *h)
             for (j=0; i<h->pbrd[i]->chs; i++) {
                 pch = &h->pbrd[i]->pch[j];
                 for(k=0; k<times; k++) {
-                    tmp[k].voltage = pch->power[j].voltage;
-                    tmp[k].current += pch->power[j].current;
-                    tmp[k].power   += pch->power[j].power;
-                    tmp[k].freq    = pch->power[j].freq;
-                    tmp[k].consump += pch->power[j].consump;
+                    tmp[k].voltage = pch->power[j].voltage/10.0;
+                    tmp[k].current += (pch->power[j].current/10.0);
+                    tmp[k].power   += (pch->power[j].power/1000.0);
+                    tmp[k].freq    = (pch->power[j].freq/10.0);
+                    tmp[k].consump += (pch->power[j].consump/1000.0);
+#if 0
                     tmp[k].active  = pch->power[j].active;
                     tmp[k].reactive = pch->power[j].reactive;
+#endif
                 }
             }
         }
@@ -425,7 +427,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
     
     lock_on(h->lck);
     if(pbrd) {
-        time_t tm = mktime(localtime(NULL));
+       // time_t tm = mktime(localtime(NULL));
         switch(pbrd->type) {
             case AC_SINGLE_S_TYPE:
             case AC_SINGLE_B_TYPE:
@@ -445,24 +447,24 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     pwr = &pbrd->pch[i].power[0];
                     
                     val = (tmp[1 + idx] << 16) | tmp[0 + idx];
-                    pwr->voltage = val / 1000.0;
+                    pwr->voltage = val / 100;
                     
                     val = (tmp[3 + idx] << 16) | tmp[2 + idx];
-                    pwr->current = val / 1000.0;
+                    pwr->current = val / 100;
                     
                     val = (tmp[5 + idx] << 16) | tmp[4 + idx];
-                    pwr->power = val / 1000.0;
+                    pwr->power = val;
                     
                     val = (tmp[7 + idx] << 16) | tmp[6 + idx];
-                    pwr->freq = val / 1000.0;
+                    pwr->freq = val / 10;
                     
                     val = (tmp[9 + idx] << 16) | tmp[8 + idx];
-                    pwr->consump = val / 1000.0;
+                    pwr->consump = val ;
                     
                     val = (tmp[11 + idx] << 16) | tmp[10 + idx];
-                    pwr->factor = val / 1000.0;
+                    pwr->factor = val / 10;
                     
-                    pbrd->pch[i].time = tm;
+                  //  pbrd->pch[i].time = tm;
                 }
 
                 offset = POWER_AC_STAT_INFO_L;
@@ -475,13 +477,14 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
  
                 for (i=0; i<pbrd->chs; i++) {
                     pch = &pbrd->pch[i];
-                    pch->power[0].status = tmp[i] & (0x01);
+                    //pch->power[0].status = tmp[i] & (0x01);
+										pch->status = tmp[i] & (0x01);
                     pch->alarm.v_upper   = (tmp[i] & BIT(2))?1:0;
                     pch->alarm.v_lower   = (tmp[i] & BIT(4))?1:0;
                     pch->alarm.c_upper   = (tmp[i] & BIT(6))?1:0;
                     pch->alarm.p_upper   = (tmp[i] & BIT(8))?1:0;
                     pch->alarm.w_upper   = (tmp[i] & BIT(10))?1:0;
-                    pch->alarm.ph_loss   = 0;
+                    //pch->alarm.ph_loss   = 0;
                 }
                 
                 offset = POWER_AC_BREAKER_INFO;
@@ -491,9 +494,9 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     break;
                 }
                 pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
-                pbrd->brk[0].samp.time = tm;
+               // pbrd->brk[0].samp.time = tm;
                 pbrd->brk[1].samp.sw = (tmp[0]&BIT(1))?1:0;
-                pbrd->brk[1].samp.time = tm;
+               // pbrd->brk[1].samp.time = tm;
 
 								uint16_t buffer[16] = {0};
 
@@ -503,11 +506,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 									r = read_reg(h, pch->info.addr, offset, buffer, 16);
 									if(r) break;
             
-									pch->thr.v_upper.val = ((buffer[1]<<16)|buffer[0])/1000;
-									pch->thr.v_lower.val = ((buffer[3]<<16)|buffer[2])/1000;
-									pch->thr.c_upper.val = ((buffer[5]<<16)|buffer[4])/1000;
-									pch->thr.p_upper.val = ((buffer[9]<<16)|buffer[8])/1000;
-									pch->thr.w_upper.val = ((buffer[13]<<16)|buffer[12])/1000;
+									pch->thr.v_upper = ((buffer[1]<<16)|buffer[0])/100;
+									pch->thr.v_lower = ((buffer[3]<<16)|buffer[2])/100;
+									pch->thr.c_upper = ((buffer[5]<<16)|buffer[4])/100;
+									pch->thr.p_upper = ((buffer[9]<<16)|buffer[8]);
+									pch->thr.w_upper = ((buffer[13]<<16)|buffer[12]);
 								}
             }
             break;
@@ -536,20 +539,20 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     pwr = &pbrd->pch[i].power[0];
                     
                     float value = (tmp[1 + Index] << 16) + tmp[0 + Index];
-                    pwr->voltage = value / 1000.0;
+                    pwr->voltage = value / 100;
                     
                     value = (tmp[3 + Index] << 16) + tmp[2 + Index];
-                    pwr->current = value / 1000.0;
+                    pwr->current = value / 100;
                     
                     value = (tmp[5 + Index] << 16) + tmp[4 + Index];
-                    pwr->power = value / 1000.0;
+                    pwr->power = value;
 
                     value = (tmp[7 + Index] << 16) + tmp[6 + Index];
-                    pwr->consump = value / 1000.0;
+                    pwr->consump = value;
 
                     pwr->freq = 0;
                     pwr->factor = 1;
-                    pbrd->pch[i].time = tm;
+                    //pbrd->pch[i].time = tm;
                 }
 
                 offset = POWER_DC_STAT_INFO;
@@ -561,7 +564,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 
                 for (i = 0; i < pbrd->chs; i++) {
                     flag = (tmp[1] << 16) + tmp[0];
-                    pbrd->pch[i].power[0].status = (flag >> i) & 0x1;
+                    pbrd->pch[i].status = (flag >> i) & 0x1;
                 }
                 
                 // 获取报警状态
@@ -587,7 +590,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
                     pch = &pbrd->pch[i];
-									pch->thr.v_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+									pch->thr.v_upper = ((tmp[1+Index] << 16)+tmp[0+Index])/100;
                 }			
 								
 								offset = POWER_DC_THRESHOLD_VOL_MIN;
@@ -595,7 +598,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
                     pch = &pbrd->pch[i];
-									pch->thr.v_lower.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+									pch->thr.v_lower = ((tmp[1+Index] << 16)+tmp[0+Index])/100;
                 }
 								
 								offset = POWER_DC_THRESHOLD_CUR_MAX;
@@ -603,7 +606,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
                     pch = &pbrd->pch[i];
-									pch->thr.c_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+									pch->thr.c_upper = ((tmp[1+Index] << 16)+tmp[0+Index])/100;
                 }											
 								
 								offset = POWER_DC_THRESHOLD_POWER_MAX;
@@ -611,7 +614,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
                     pch = &pbrd->pch[i];
-									pch->thr.p_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+									pch->thr.p_upper = ((tmp[1+Index] << 16)+tmp[0+Index]);
                 }		
 
 								offset = POWER_DC_THRESHOLD_POWERCON_MAX;
@@ -619,7 +622,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
                     pch = &pbrd->pch[i];
-									pch->thr.w_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+									pch->thr.w_upper = ((tmp[1+Index] << 16)+tmp[0+Index]);
                 }		
 								
             }
@@ -651,40 +654,40 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 										 {
 											 pwr = &pbrd->pch[i].power[j];
 											 index_2 = (j*16) + (48*i);
-											 pwr->voltage = ((tmp[1+index_2] << 16) + tmp[0+index_2])/1000.0f;
-											 pwr->current = ((tmp[3+index_2] << 16) + tmp[2+index_2])/1000.0f;
-											 pwr->power 	= ((tmp[5+index_2] << 16) + tmp[4+index_2])/1000.0f;
-											 pwr->freq 		= ((tmp[11+index_2] << 16) + tmp[10+index_2])/1000.0f;
-											 pwr->consump = ((tmp[13+index_2] << 16) + tmp[12+index_2])/1000.0f;
-											 pwr->factor 	= ((tmp[15+index_2] << 16) + tmp[14+index_2])/1000.0f;
+											 pwr->voltage = ((tmp[1+index_2] << 16) + tmp[0+index_2])/100;
+											 pwr->current = ((tmp[3+index_2] << 16) + tmp[2+index_2])/100;
+											 pwr->power 	= ((tmp[5+index_2] << 16) + tmp[4+index_2]);
+											 pwr->freq 		= ((tmp[11+index_2] << 16) + tmp[10+index_2])/100;
+											 pwr->consump = ((tmp[13+index_2] << 16) + tmp[12+index_2]);
+											 pwr->factor 	= ((tmp[15+index_2] << 16) + tmp[14+index_2])/10;
 										 }
 									 }else{
 										int Index = i * 16;
                     pwr = &pbrd->pch[i].power[0];
                     float value = (tmp[1+Index] << 16) + tmp[0+Index];
 
-                    pwr->voltage = value / 1000.0f;
+                    pwr->voltage = value / 100;
                     
                     value = (tmp[3+Index] << 16) + tmp[2+Index];
-                    pwr->current = value / 1000.0f;
+                    pwr->current = value / 100;
                     
                     value = (tmp[5+Index] << 16) + tmp[4+Index];
-                    pwr->power = value / 1000.0f;
+                    pwr->power = value;
                     
                     value = (tmp[7+Index] << 16) + tmp[6+Index];
                     
                     value = (tmp[9+Index] << 16) + tmp[8+Index];
                     
                     value = (tmp[11+Index] << 16) + tmp[10+Index];
-                    pwr->freq = value / 1000.0f;
+                    pwr->freq = value / 100;
                     
                     value = (tmp[13+Index] << 16) + tmp[12+Index];
-                    pwr->consump = value / 1000.0f;
+                    pwr->consump = value ;
                     
                     value = (tmp[15+Index] << 16) + tmp[14+Index];
-                    pwr->factor = value / 1023.0f;
+                    pwr->factor = value / 10;
                     
-                    pbrd->pch[i].time = tm;										
+                    //pbrd->pch[i].time = tm;										
 									}
                 }
                 
@@ -698,12 +701,12 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 for (i=0; i<pbrd->chs; i++) {
 									if(h->prod->type==PDU_AC_I3O3) {
 									for(int j = 0; j < 3;j++)
-										pbrd->pch[i].power[j].status = tmp[0+(j*2)+ (i*6)] & 0x01;
-									pbrd->pch[i].power[0].nwire  = tmp[18] & 0x01;
+										pbrd->pch[i].status = tmp[0+(j*2)+ (i*6)] & 0x01;
+									pbrd->pch[i].nwire  = tmp[18] & 0x01;
 									}else {
                     int Index = i * 2;
-                    pbrd->pch[i].power[0].status = tmp[0+Index] & 0x01;
-                    pbrd->pch[i].power[0].nwire  = tmp[18] & 0x01;
+                    pbrd->pch[i].status = tmp[0+Index] & 0x01;
+                    pbrd->pch[i].nwire  = tmp[18] & 0x01;
 									}
                 }
                 
@@ -746,7 +749,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     break;
                 }
                 pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
-                pbrd->brk[0].samp.time = tm;
+                //pbrd->brk[0].samp.time = tm;
 								
 								// read v max
 								offset = POWER_AC3_THRESHOLD_VOL_MAX;
@@ -759,11 +762,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 											int Index = i * 3;
                       int ch_idx = pbrd->ch0-1+i/3;
                       pch = &pbrd->pch[ch_idx];
-											pch->thr.v_upper.val = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 1000;
+											pch->thr.v_upper = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 100;
                     }
                     else {
 											pch = &pbrd->pch[i];
-											pch->thr.v_upper.val = ((tmp[i+1] << 16) + (tmp[i+0])) / 1000;               
+											pch->thr.v_upper = ((tmp[i+1] << 16) + (tmp[i+0])) / 100;               
                     }
 								}
 								offset = POWER_AC3_THRESHOLD_VOL_MIN;
@@ -775,11 +778,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 											int Index = i * 3;
                       int ch_idx = pbrd->ch0-1+i/3;
                       pch = &pbrd->pch[ch_idx];
-											pch->thr.v_lower.val = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 1000;
+											pch->thr.v_lower = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 100;
                     }
                     else {
 											pch = &pbrd->pch[i];
-											pch->thr.v_lower.val = ((tmp[i+1] << 16) + (tmp[i+0])) / 1000;               
+											pch->thr.v_lower = ((tmp[i+1] << 16) + (tmp[i+0])) / 100;               
                     }
 								}								
 								offset = POWER_AC3_THRESHOLD_CUR_MAX;
@@ -791,11 +794,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 											int Index = i * 3;
                       int ch_idx = pbrd->ch0-1+i/3;
                       pch = &pbrd->pch[ch_idx];
-											pch->thr.c_upper.val = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 1000;
+											pch->thr.c_upper = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 100;
                     }
                     else {
 											pch = &pbrd->pch[i];
-											pch->thr.c_upper.val = ((tmp[i+1] << 16) + (tmp[i+0])) / 1000;               
+											pch->thr.c_upper = ((tmp[i+1] << 16) + (tmp[i+0])) / 100;               
                     }
 								}		
 								offset = POWER_AC3_THRESHOLD_PWR_MAX;
@@ -807,11 +810,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 											int Index = i * 3;
                       int ch_idx = pbrd->ch0-1+i/3;
                       pch = &pbrd->pch[ch_idx];
-											pch->thr.p_upper.val = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 1000;
+											pch->thr.p_upper = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 100;
                     }
                     else {
 											pch = &pbrd->pch[i];
-											pch->thr.p_upper.val = ((tmp[i+1] << 16) + (tmp[i+0])) / 1000;               
+											pch->thr.p_upper = ((tmp[i+1] << 16) + (tmp[i+0])) / 100;               
                     }
 								}
 								offset = POWER_AC3_THRESHOLD_PWRCON_MAX;
@@ -823,11 +826,11 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 											int Index = i * 3;
                       int ch_idx = pbrd->ch0-1+i/3;
                       pch = &pbrd->pch[ch_idx];
-											pch->thr.w_upper.val = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 1000;
+											pch->thr.w_upper = ((tmp[Index+1] << 16) + (tmp[Index+0])) / 100;
                     }
                     else {
 											pch = &pbrd->pch[i];
-											pch->thr.w_upper.val = ((tmp[i+1] << 16) + (tmp[i+0])) / 1000;               
+											pch->thr.w_upper = ((tmp[i+1] << 16) + (tmp[i+0])) / 100;               
                     }
 								}									
             }
@@ -943,7 +946,7 @@ int power_deinit(void)
 
 static power_ch_t* get_ch(power_handle_t *h, uint8_t ch)
 {
-    if(!h->pch || !h->chs || !h->pch[ch]) {
+    if(!h->chs || !h->pch[ch]) {
         return NULL;
     }
     return h->pch[ch];
@@ -971,7 +974,7 @@ int power_get_board(board_data_t *pbrd)
     power_handle_t *h=&pwrHandle;
     
     lock_on(h->lck);
-    if(!pbrd || !h->pch || !h->cnt || !h->pbrd[pbrd->addr]) {
+    if(!pbrd || !h->cnt || !h->pbrd[pbrd->addr]) {
         lock_off(h->lck);
         return -1;
     }
@@ -987,7 +990,7 @@ int power_set(int ch, power_ch_t *pch)
     power_handle_t *h=&pwrHandle;
     
     lock_on(h->lck);
-    if(!pch || !h->pch || !h->chs || !h->pch[pch->info.ch]) {
+    if(!pch || !h->chs || !h->pch[pch->info.ch]) {
         lock_off(h->lck);
         return -1;
     }
@@ -1005,8 +1008,8 @@ static int power_map(power_handle_t *h, int chs)
     
     if(chs>0) {
         h->chs = 0;
-        h->pch = (power_ch_t**)calloc(1, sizeof(power_ch_t*)*chs);
-        if(h->pch) {
+        //h->pch = (power_ch_t**)calloc(1, sizeof(power_ch_t*)*chs);
+      //  if(h->pch) {
             h->chs = chs;
             h->pch[0] = &h->ch0;
             strcpy(h->pch[0]->info.name, "ALL");
@@ -1022,7 +1025,7 @@ static int power_map(power_handle_t *h, int chs)
                     }
                 }
             } 
-        }
+      //  }
     }
     
     return 0;
@@ -1061,6 +1064,7 @@ int power_scan(void)
     board_data_t *pbrd=NULL;
     power_handle_t *h=&pwrHandle;
     uint16_t times,nGroups=h->prod->ch_delay;
+		uint16_t flag_full = 0;
     
     lock_on(h->lck);
     power_clear(h);
@@ -1068,7 +1072,7 @@ int power_scan(void)
     pch = &h->ch0;
     pch->info.addr = 0;
     pch->info.ch = 0;
-    
+    int ch_count = 0;		
     for(i=1; i<=h->brd_max; i++) {
         r = get_key(h, i, &h->key[i]);
         if(r==0) {
@@ -1079,7 +1083,7 @@ int power_scan(void)
             LOGE("___ power_scan addr %d failed\n", i);
         }
     }
-    
+		
     for(i=1; i<h->brd_max; i++) {
         pkey = &h->key[i];
         if(pkey->chs>0) {
@@ -1094,12 +1098,18 @@ int power_scan(void)
             pbrd->chs  = pkey->chs;
             pbrd->addr = i;
             pbrd->ch0 = ch_idx;
+						if((ch_count+ pkey->chs) >= 32)
+						{
+							pkey->chs = 31 - ch_count;
+							flag_full = 1; 
+						}
             pch = (power_ch_t*)calloc(1, sizeof(power_ch_t)*pkey->chs);
+						ch_count += (pkey->chs);
             if(!pch) {
                 LOGE("___ power_scan, calloc pch failed\n");
                 return -1;
             }
-            LOGD("__ power init board %d, b_mem=%d ch_mem=%d\n",i,sizeof(board_data_t),sizeof(power_ch_t)*pkey->chs);
+            LOGD("__ power init board %d, b_mem=%d ch_mem=%d sizeof(power_ch_t)=%d\n",i,sizeof(board_data_t),sizeof(power_ch_t)*pkey->chs,sizeof(power_ch_t));
             for(j=0; j<pkey->chs; j++) {
                 pch[j].info.addr = i;
                 pch[j].info.sch  = j;                    //序号从0开始
@@ -1115,8 +1125,8 @@ int power_scan(void)
                 }
                 
                 times = (pch[j].info.ch%nGroups)?pch[j].info.ch:nGroups;
-                pch[j].info.open_delay = 1000*times;
-                pch[j].info.close_delay  = 1000*times;
+                pch[j].info.open_delay =  times;
+                pch[j].info.close_delay  = times;
             }
             
             if(pbrd->type==AC_SINGLE_S_TYPE || pbrd->type==AC_SINGLE_B_TYPE) {
@@ -1132,11 +1142,14 @@ int power_scan(void)
             else {
                 ch_idx += pkey->chs;
             }
+						
             brd_idx++;
             
             pbrd->pch = pch;
             h->pbrd[i] = pbrd;
             total_chs += pkey->chs;
+						if(flag_full)
+							break;
         }
     }
     power_map(h, total_chs);
@@ -1164,7 +1177,7 @@ int power_reset(void)
                     uint16_t tmp[8];
                     offset = POWER_AC_CH_STAT_L;
                     for(i=1; i<=pbrd->chs; i++) {
-                        tmp[i] = pbrd->pch[i].power[0].status;
+                        tmp[i] = pbrd->pch[i].status;
                     }
                     r = write_reg(h, pbrd->addr, offset, tmp+1, pbrd->chs-1);
                 }
@@ -1220,7 +1233,7 @@ int power_reset(void)
                     for (i=1; i<=pbrd->chs; i++) {
                         memset(data_temp, 0, sizeof(data_temp));
                         offset = POWER_AC3_OUT_ENABLE + i;
-                        data_temp[0] = pbrd->pch[i].power[0].status;
+                        data_temp[0] = pbrd->pch[i].status;
                         r = write_reg(h, pbrd->addr, offset, data_temp, 2);
                     }
                 }
@@ -1236,18 +1249,18 @@ int power_reset(void)
 int power_set_ch_sw_n(power_ch_t *pch)
 {
 		int r;
-		uint16_t	st= pch->power[0].status,offset,tmp[2]={0};
+		uint16_t	st= pch->status,offset,tmp[2]={0};
 		power_handle_t *h=&pwrHandle;
     lock_on(h->lck);		
-    if (pch->thr.v_upper.en == 1)
+    if (pch->thr.en.v_upper_en == 1)
         st |= ENABLE_AC3_V_UP;
-    if (pch->thr.v_lower.en == 1)
+    if (pch->thr.en.v_lower_en == 1)
         st |= ENABLE_AC3_V_DOWN;
-    if (pch->thr.c_upper.en == 1)
+    if (pch->thr.en.c_upper_en == 1)
         st |= ENABLE_AC3_C_UP;
-    if (pch->thr.p_upper.en == 1)
+    if (pch->thr.en.p_upper_en == 1)
         st |= ENABLE_AC3_P_UP;
-    if (pch->thr.w_upper.en == 1)
+    if (pch->thr.en.w_upper_en == 1)
         st |= ENABLE_AC3_W_UP;
 		switch(pch->info.type) {
 
@@ -1307,15 +1320,15 @@ int power_set_ch_sw(uint8_t ch, uint8_t on)
         return -1;
     }
     
-    if (pch->thr.v_upper.en == 1)
+    if (pch->thr.en.v_upper_en == 1)
         st |= ENABLE_AC3_V_UP;
-    if (pch->thr.v_lower.en == 1)
+    if (pch->thr.en.v_lower_en == 1)
         st |= ENABLE_AC3_V_DOWN;
-    if (pch->thr.c_upper.en == 1)
+    if (pch->thr.en.c_upper_en == 1)
         st |= ENABLE_AC3_C_UP;
-    if (pch->thr.p_upper.en == 1)
+    if (pch->thr.en.p_upper_en == 1)
         st |= ENABLE_AC3_P_UP;
-    if (pch->thr.w_upper.en == 1)
+    if (pch->thr.en.w_upper_en == 1)
         st |= ENABLE_AC3_W_UP;
     
     switch(pch->info.type) {
@@ -1443,14 +1456,14 @@ int power_set_alarm(power_ch_t *pch)
         r = -1;
     }
     
-    if(r==0) {
-        if(pch->thr.v_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(1);
-        if(pch->thr.v_lower.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(2);
-        if(pch->thr.c_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(0);
-        if(pch->thr.p_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(3);
-        if(pch->thr.w_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(4);
-        r = write_reg(h, pch->info.addr, offset, &nStatus, 1);
-    }
+//    if(r==0) {
+//        if(pch->thr.v_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(1);
+//        if(pch->thr.v_lower.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(2);
+//        if(pch->thr.c_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(0);
+//        if(pch->thr.p_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(3);
+//        if(pch->thr.w_upper.act==ALARM_ACT_CLOSE_CH) nStatus |= BIT(4);
+//        r = write_reg(h, pch->info.addr, offset, &nStatus, 1);
+//    }
     lock_off(h->lck);
     
     return r;
@@ -1484,11 +1497,11 @@ int power_get_threshold(power_ch_t *pch)
             r = read_reg(h, pch->info.addr, offset, buffer, 16);
             if(r) break;
             
-            pch->thr.v_upper.val = ((buffer[1]<<16)|buffer[0])/1000;
-            pch->thr.v_lower.val = ((buffer[3]<<16)|buffer[2])/1000;
-            pch->thr.c_upper.val = ((buffer[5]<<16)|buffer[4])/1000;
-            pch->thr.p_upper.val = ((buffer[9]<<16)|buffer[8])/1000;
-            pch->thr.w_upper.val = ((buffer[13]<<16)|buffer[12])/1000;
+            pch->thr.v_upper = ((buffer[1]<<16)|buffer[0])/100;
+            pch->thr.v_lower = ((buffer[3]<<16)|buffer[2])/100;
+            pch->thr.c_upper = ((buffer[5]<<16)|buffer[4])/100;
+            pch->thr.p_upper = ((buffer[9]<<16)|buffer[8])/100;
+            pch->thr.w_upper = ((buffer[13]<<16)|buffer[12])/100;
             
         }
         break;
@@ -1501,27 +1514,27 @@ int power_get_threshold(power_ch_t *pch)
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MAX:POWER_DC_THRESHOLD_VOL_MAX;
             r = read_reg(h, pch->info.addr, offset, temp, 2);
             if(r) break;
-            pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            pch->thr.v_upper = ((temp[1]<<16)|temp[0])/100;
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MIN:POWER_DC_THRESHOLD_VOL_MIN;
             r = read_reg(h, pch->info.addr, offset, temp, 2);
             if(r) break;
-            pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+            pch->thr.v_lower = ((temp[1]<<16)|temp[0])/100;
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_CUR_MAX:POWER_DC_THRESHOLD_CUR_MAX;
             r = read_reg(h, pch->info.addr, offset, temp, 2);
             if(r) break;
-            pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            pch->thr.c_upper = ((temp[1]<<16)|temp[0])/100;
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWR_MAX:POWER_DC_THRESHOLD_POWER_MAX;
             r = read_reg(h, pch->info.addr, offset, temp, 2);
             if(r) break;
-            pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            pch->thr.p_upper = ((temp[1]<<16)|temp[0])/100;
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWRCON_MAX:POWER_DC_THRESHOLD_POWERCON_MAX;
             r = read_reg(h, pch->info.addr, offset, temp, 2);
             if(r) break;
-            pch->thr.w_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            pch->thr.w_upper = ((temp[1]<<16)|temp[0])/100;
         }
         break;
         
@@ -1535,48 +1548,48 @@ int power_get_threshold(power_ch_t *pch)
                 
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.v_upper = ((temp[1]<<16)|temp[0])/100;
                 
                 r = read_reg(h, pch->info.addr, offset+1, temp, 2);
                 if(r) break;
-                pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.v_lower = ((temp[1]<<16)|temp[0])/100;
                 
                 r = read_reg(h, pch->info.addr, offset+2, temp, 2);
                 if(r) break;
-                pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.c_upper = ((temp[1]<<16)|temp[0])/100;
                 
                 r = read_reg(h, pch->info.addr, offset+3, temp, 2);
                 if(r) break;
-                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.p_upper = ((temp[1]<<16)|temp[0])/100;
                 
                 r = read_reg(h, pch->info.addr, offset+4, temp, 2);
-                pch->thr.w_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.w_upper = ((temp[1]<<16)|temp[0])/100;
             }
             else {
                 offset = POWER_AC3_THRESHOLD_VOL_MAX;
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.v_upper = ((temp[1]<<16)|temp[0])/100;
                 
                 offset = POWER_AC3_THRESHOLD_VOL_MIN;
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.v_lower = ((temp[1]<<16)|temp[0])/100;
                 
                 offset = POWER_AC3_THRESHOLD_CUR_MAX;
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.c_upper = ((temp[1]<<16)|temp[0])/100;
                 
                 offset = POWER_AC3_THRESHOLD_PWR_MAX;
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.p_upper = ((temp[1]<<16)|temp[0]);
                 
                 offset = POWER_AC3_THRESHOLD_VOL_MAX;
                 r = read_reg(h, pch->info.addr, offset, temp, 2);
                 if(r) break;
-                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                pch->thr.p_upper = ((temp[1]<<16)|temp[0]);
             }
         }
         break;
@@ -1610,15 +1623,15 @@ int power_set_threshold(power_ch_t *pch)
             uint16_t data_buf[16] = {0};
 
             //电压上限
-            data_temp =  (pch->thr.v_upper.val*1000);
+            data_temp =  (pch->thr.v_upper*100);
             data_buf[0] = data_temp;
             data_buf[1] = data_temp>>16;
             //电压下限
-            data_temp =  (pch->thr.v_lower.val*1000);
+            data_temp =  (pch->thr.v_lower*100);
             data_buf[2] = data_temp;
             data_buf[3] = data_temp>>16;
             //电流上限
-            data_temp =  (pch->thr.c_upper.val*1000);
+            data_temp =  (pch->thr.c_upper*100);
             data_buf[4] = data_temp;
             data_buf[5] = data_temp>>16;
             //电流下限
@@ -1627,7 +1640,7 @@ int power_set_threshold(power_ch_t *pch)
             data_buf[7] = data_temp>>16;
 
             //功率上限
-            data_temp =  (pch->thr.p_upper.val*1000);
+            data_temp =  (pch->thr.p_upper);
             data_buf[8] = data_temp;
             data_buf[9] = data_temp>>16;
             //功率下限
@@ -1636,7 +1649,7 @@ int power_set_threshold(power_ch_t *pch)
             data_buf[11] = data_temp>>16;
 
             //电能上限
-            data_temp =  (pch->thr.w_upper.val*1000);
+            data_temp =  (pch->thr.w_upper);
             data_buf[12] = data_temp;
             data_buf[13] = data_temp>>16;
             //电能下限
@@ -1664,31 +1677,31 @@ int power_set_threshold(power_ch_t *pch)
             uint32_t value;
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MAX:POWER_DC_THRESHOLD_VOL_MAX;
-            value = pch->thr.v_upper.val * 1000;
+            value = pch->thr.v_upper * 100;
             data_temp[0] = value & 0XFFFF;
             data_temp[1] = (value >> 16) & 0xFFFF;
             r = write_reg(h, pch->info.addr, offset, data_temp, 2);
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MIN:POWER_DC_THRESHOLD_VOL_MIN;
-            value = pch->thr.v_lower.val * 1000;
+            value = pch->thr.v_lower * 100;
             data_temp[0] = value & 0XFFFF;
             data_temp[1] = (value >> 16) & 0xFFFF;
             r = write_reg(h, pch->info.addr, offset, data_temp, 2);
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_CUR_MAX:POWER_DC_THRESHOLD_CUR_MAX;
-            value = pch->thr.c_upper.val * 1000;
+            value = pch->thr.c_upper * 100;
             data_temp[0] = value & 0XFFFF;
             data_temp[1] = (value >> 16) & 0xFFFF;
             r = write_reg(h, pch->info.addr, offset, data_temp, 2);
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWR_MAX:POWER_DC_THRESHOLD_POWER_MAX;
-            value = pch->thr.p_upper.val * 1000;
+            value = pch->thr.p_upper;
             data_temp[0] = value & 0XFFFF;
             data_temp[1] = (value >> 16) & 0xFFFF;
             r = write_reg(h, pch->info.addr, offset, data_temp, 2);
             
             offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWRCON_MAX:POWER_DC_THRESHOLD_POWERCON_MAX;
-            value = pch->thr.w_upper.val * 1000;
+            value = pch->thr.w_upper;
             data_temp[0] = value & 0XFFFF;
             data_temp[1] = (value >> 16) & 0xFFFF;
             r = write_reg(h, pch->info.addr, offset, data_temp, 2);
@@ -1705,27 +1718,27 @@ int power_set_threshold(power_ch_t *pch)
             
             if(pch->info.ch<0) {
                 offset = POWER_AC3_THRESHOLD_IN;
-                value = pch->thr.v_upper.val * 1000;
+                value = pch->thr.v_upper * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);
                 
-                value = pch->thr.v_upper.val * 1000;
+                value = pch->thr.v_upper * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset+1, data_temp, 2);
                 
-                value = pch->thr.c_upper.val * 1000;
+                value = pch->thr.c_upper * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset+2, data_temp, 2);
                 
-                value = pch->thr.p_upper.val * 1000;
+                value = pch->thr.p_upper;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset+3, data_temp, 2);
                 
-                value = pch->thr.w_upper.val * 1000;
+                value = pch->thr.w_upper;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset+4, data_temp, 2);
@@ -1734,7 +1747,7 @@ int power_set_threshold(power_ch_t *pch)
 						{
 
                 offset = POWER_AC3_THRESHOLD_VOL_MAX;
-                value = pch->thr.v_upper.val * 1000;
+                value = pch->thr.v_upper * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);
@@ -1745,7 +1758,7 @@ int power_set_threshold(power_ch_t *pch)
 									r = write_reg(h, pch->info.addr, offset, data_temp, 2);
 								}
                 offset = POWER_AC3_THRESHOLD_VOL_MIN;
-                value = pch->thr.v_lower.val * 1000;
+                value = pch->thr.v_lower * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);
@@ -1756,7 +1769,7 @@ int power_set_threshold(power_ch_t *pch)
 									r = write_reg(h, pch->info.addr, offset, data_temp, 2);
 								}                
                 offset = POWER_AC3_THRESHOLD_CUR_MAX;
-                value = pch->thr.c_upper.val * 1000;
+                value = pch->thr.c_upper * 100;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);
@@ -1767,7 +1780,7 @@ int power_set_threshold(power_ch_t *pch)
 									r = write_reg(h, pch->info.addr, offset, data_temp, 2);
 								}                   
                 offset = POWER_AC3_THRESHOLD_PWR_MAX;
-                value = pch->thr.p_upper.val * 1000;
+                value = pch->thr.p_upper;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);
@@ -1778,7 +1791,7 @@ int power_set_threshold(power_ch_t *pch)
 									r = write_reg(h, pch->info.addr, offset, data_temp, 2);
 								}                   
                 offset = POWER_AC3_THRESHOLD_PWRCON_MAX;
-                value = pch->thr.w_upper.val * 1000;
+                value = pch->thr.w_upper;
                 data_temp[0] = value & 0XFFFF;
                 data_temp[1] = (value >> 16) & 0xFFFF;
                 r = write_reg(h, pch->info.addr, offset, data_temp, 2);	
@@ -1824,7 +1837,7 @@ int power_set_open_delay(power_ch_t *pch)
 
         case DCPDU_TYPE:
         {
-            uint32_t time=pch->info.open_delay/1000;
+            uint32_t time=pch->info.open_delay*100;
             tmp[0] = time & 0xffff;
             tmp[1] = (time >> 16) & 0xffff;
             offset = POWER_DC_SET_OPEN_DELAY+pch->info.ch-1;
@@ -1834,7 +1847,7 @@ int power_set_open_delay(power_ch_t *pch)
         
         case TREE_AC_TYPE:
         {
-            uint32_t time=pch->info.open_delay/1000;
+            uint32_t time=pch->info.open_delay*100;
             tmp[0] = time & 0xffff;
             tmp[1] = (time >> 16) & 0xffff;
             if(h->prod->type==PDU_AC_I3O3) {
@@ -1883,7 +1896,7 @@ int power_set_close_delay(power_ch_t *pch)
 
         case DCPDU_TYPE:
         {
-            uint32_t time=pch->info.close_delay/1000;
+            uint32_t time=pch->info.close_delay*100;
             tmp[0] = time & 0xffff;
             tmp[1] = (time >> 16) & 0xffff;
             offset = POWER_DC_SET_CLOSE_DELAY+pch->info.ch-1;
@@ -1893,7 +1906,7 @@ int power_set_close_delay(power_ch_t *pch)
         
         case TREE_AC_TYPE:
         {
-            uint32_t time=pch->info.close_delay/1000;
+            uint32_t time=pch->info.close_delay*100;
             if(h->prod->type==PDU_AC_I3O3) {
                 offset = POWER_AC3_CLOSE_DELAY_TIME+pch->info.sch*3;
                 r = write_reg(h, pch->info.addr, offset+0, tmp, 2);

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

@@ -130,16 +130,16 @@ static int get_input(menu_handle_t *h, int ph, total_t *ttl)
     *ttl = all.ttl.total[ph];
     return 0;
 }
-static int get_output(menu_handle_t *h, int ch, int ph, power_t *pwr)
+static int get_output(menu_handle_t *h, int ch, int ph, power_ch_t *pwr_ch)
 {
     int i=-1,j=0;
     power_all_t all;
 
     power_data_get(&all);
-    if(all.chs==0 || ch>all.chs|| !pwr) {
+    if(all.chs==0 || ch>all.chs|| !pwr_ch) {
         return -1;
     }
-    *pwr = all.pch[ch].power[ph];
+    *pwr_ch = all.pch[ch];
     
     return 0;
 }
@@ -244,7 +244,7 @@ static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h
 {
     int r;
     char tmp[100];
-    power_t *pwr,info={0};
+    power_ch_t *pwr,info={0};
 
     pwr = &info;
     sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_OUTPUT));
@@ -269,13 +269,14 @@ static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h
     sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
     lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #else
-    sprintf(tmp, "%s:%s  %s:%0.2f", lang_get_str(h->lang, STR_ID_SWITCH), pon, lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+    sprintf(tmp, "%s:%s  %s:%0.2f", lang_get_str(h->lang, STR_ID_SWITCH), pon, lang_get_str(h->lang, STR_ID_CURRENT), ((float)pwr->power[0].current/10.0));
     lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
-    sprintf(tmp, "%s:%0.2f %s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power, lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+    sprintf(tmp, "%s:%0.2f %s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), (((float)pwr->power[0].power) / 1000.0), lang_get_str(h->lang, STR_ID_FACTOR), 
+								((float)pwr->power[0].factor)/100.0);
     lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #endif
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consump);
+    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), ((float)pwr->power[0].consump)/1000.0);
     lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
     //lcd_refresh();