|
|
@@ -11,6 +11,9 @@
|
|
|
#define BRD_NUM 3 //BRD_MAX
|
|
|
#define BRD_TIMEOUT 100
|
|
|
|
|
|
+#define LIMIT_HOF(x) (x*1.1f)
|
|
|
+#define LIMIT_LOF(x) (x*0.9f)
|
|
|
+
|
|
|
typedef struct {
|
|
|
void* mb;
|
|
|
lock_t lck;
|
|
|
@@ -217,14 +220,96 @@ static uint8_t get_ch_idx(board_data_t *pbrd, uint8_t sch)
|
|
|
|
|
|
return ch;
|
|
|
}
|
|
|
-static int threshold_proc(board_data_t *pbrd)
|
|
|
+static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
- int i,j,r=-1;
|
|
|
-
|
|
|
+ int i,j,r=-1,times=1;
|
|
|
+ power_ch_t *pch=NULL;
|
|
|
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ if(h->prod->pwr_type==PDU_AC_I3O3) {
|
|
|
+ times = 3;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(j=0; j<times; j++) {
|
|
|
+ if(pch->thr.v_upper.en) {
|
|
|
+ if(pch->power[i].voltage>pch->thr.v_upper.val) {
|
|
|
+ if(pch->alarm.v_upper==0) {
|
|
|
+ pch->alarm.v_upper = 1;
|
|
|
+ //trigger alarm event here ...
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(pch->power[i].voltage<pch->thr.v_lower.val) {
|
|
|
+ if(pch->alarm.v_lower==0) {
|
|
|
+ pch->alarm.v_lower = 1;
|
|
|
+ //trigger alarm event here ...
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pch->alarm.v_upper = 0;
|
|
|
+ pch->alarm.v_lower = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pch->thr.c_upper.en) {
|
|
|
+ if(pch->power[i].current>pch->thr.c_upper.val) {
|
|
|
+ if(pch->alarm.c_upper==0) {
|
|
|
+ pch->alarm.c_upper = 1;
|
|
|
+ //trigger alarm event here ...
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pch->alarm.c_upper = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pch->thr.p_upper.en) {
|
|
|
+ if(pch->power[i].power>pch->thr.p_upper.val) {
|
|
|
+ if(pch->alarm.p_upper==0) {
|
|
|
+ pch->alarm.p_upper = 1;
|
|
|
+ //trigger alarm event here ...
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pch->alarm.p_upper = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pch->thr.w_upper.en) {
|
|
|
+ if(pch->power[i].current>pch->thr.w_upper.val) {
|
|
|
+ if(pch->alarm.w_upper==0) {
|
|
|
+ pch->alarm.w_upper = 1;
|
|
|
+ //trigger alarm event here ...
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pch->alarm.w_upper = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+static int total_proc(power_handle_t *h, board_data_t *pbrd)
|
|
|
+{
|
|
|
+ int i,j,r=-1,times=1;
|
|
|
+ power_ch_t *pch=NULL;
|
|
|
+
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ if(h->prod->pwr_type==PDU_AC_I3O3) {
|
|
|
+ times = 3;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
int i,j,r=-1;
|
|
|
@@ -451,11 +536,12 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
case DC_OUT_TYPE:
|
|
|
case DC_IN_TYPE:
|
|
|
default:
|
|
|
+ r = -1;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if(r==0) {
|
|
|
- threshold_proc(pbrd);
|
|
|
+ threshold_proc(h, pbrd);
|
|
|
}
|
|
|
}
|
|
|
lock_d_release(h->lck);
|
|
|
@@ -701,98 +787,91 @@ int power_clear(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
-int power_reset_consump(uint8_t addr)
|
|
|
+int power_reset(void)
|
|
|
{
|
|
|
int i,r=-1;
|
|
|
uint16_t offset = 0;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
- board_data_t *pb=NULL;
|
|
|
-
|
|
|
- if(addr>h->brd_max) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- pb = h->pbrd[addr];
|
|
|
- if(!pb) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ board_data_t *pbrd=NULL;
|
|
|
|
|
|
- switch(pb->type) {
|
|
|
- case AC_SINGLE_S_TYPE:
|
|
|
- case AC_SINGLE_B_TYPE:
|
|
|
- {
|
|
|
- uint16_t tmp[8];
|
|
|
- offset = POWER_AC_CH_STAT_L;
|
|
|
- for(i=0; i<pb->chs; i++) {
|
|
|
- tmp[i] = pb->pch[i].power[0].status;
|
|
|
- }
|
|
|
- r = write_reg(h, pb->addr, offset, tmp, pb->chs);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case DCPDU_TYPE:
|
|
|
- {
|
|
|
- offset = POWER_DC_ALARM_CTRL_TOTAL;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case TREE_AC_TYPE:
|
|
|
- {
|
|
|
- uint16_t data_temp[20];
|
|
|
-
|
|
|
- offset = POWER_AC3_RESET_CONSUMP;
|
|
|
- data_temp[0] = data_temp[1] = data_temp[2] = 1;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 3);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- //初始化报警阈值
|
|
|
- uint32_t value = 0;
|
|
|
- memset(data_temp, 0, sizeof(data_temp));
|
|
|
- offset = POWER_AC3_THRESHOLD_VOL_MAX;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 18);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
- offset = POWER_AC3_THRESHOLD_VOL_MIN;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 18);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- offset = POWER_AC3_THRESHOLD_CUR_MAX;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 18);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
- offset = POWER_AC3_THRESHOLD_PWR_MAX;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 18);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
- offset = POWER_AC3_THRESHOLD_PWRCON_MAX;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 18);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- for (i = 0; i < pb->chs; i++) {
|
|
|
- memset(data_temp, 0, sizeof(data_temp));
|
|
|
- offset = POWER_AC3_OUT_ENABLE + i;
|
|
|
- data_temp[0] = pb->pch[i].power[0].status;
|
|
|
- r = write_reg(h, pb->addr, offset, data_temp, 2);
|
|
|
- if (r<0) {
|
|
|
- return r;
|
|
|
+ lock_d_hold(h->lck);
|
|
|
+ for(i=0; i<=h->brd_max; i++) {
|
|
|
+ pbrd = h->pbrd[i];
|
|
|
+ if(pbrd) {
|
|
|
+ switch(pbrd->type) {
|
|
|
+ case AC_SINGLE_S_TYPE:
|
|
|
+ case AC_SINGLE_B_TYPE:
|
|
|
+ {
|
|
|
+ uint16_t tmp[8];
|
|
|
+ offset = POWER_AC_CH_STAT_L;
|
|
|
+ for(i=0; i<pbrd->chs; i++) {
|
|
|
+ tmp[i] = pbrd->pch[i].power[0].status;
|
|
|
+ }
|
|
|
+ r = write_reg(h, pbrd->addr, offset, tmp, pbrd->chs);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case DCPDU_TYPE:
|
|
|
+ {
|
|
|
+ offset = POWER_DC_ALARM_CTRL_TOTAL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TREE_AC_TYPE:
|
|
|
+ {
|
|
|
+ uint16_t data_temp[20];
|
|
|
+
|
|
|
+ offset = POWER_AC3_RESET_CONSUMP;
|
|
|
+ data_temp[0] = data_temp[1] = data_temp[2] = 1;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 3);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ //初始化报警阈值
|
|
|
+ uint32_t value = 0;
|
|
|
+ memset(data_temp, 0, sizeof(data_temp));
|
|
|
+ offset = POWER_AC3_THRESHOLD_VOL_MAX;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 18);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ offset = POWER_AC3_THRESHOLD_VOL_MIN;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 18);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ offset = POWER_AC3_THRESHOLD_CUR_MAX;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 18);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ offset = POWER_AC3_THRESHOLD_PWR_MAX;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 18);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ offset = POWER_AC3_THRESHOLD_PWRCON_MAX;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 18);
|
|
|
+ if (r<0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; 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;
|
|
|
+ r = write_reg(h, pbrd->addr, offset, data_temp, 2);
|
|
|
+ }
|
|
|
}
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- return -1;
|
|
|
}
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
- return 0;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -814,12 +893,14 @@ int power_set_sw(power_ch_t *pch)
|
|
|
if (pch->thr.w_upper.en == 1)
|
|
|
st |= ENABLE_AC3_W_UP;
|
|
|
|
|
|
+ lock_d_hold(h->lck);
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
{
|
|
|
offset = POWER_AC_CH_STAT_L + pch->info.ch;
|
|
|
tmp[0] = pch->power[0].status; tmp[1] = 0;
|
|
|
+ r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -831,6 +912,7 @@ int power_set_sw(power_ch_t *pch)
|
|
|
mask = ~(1 << pch->info.ch);
|
|
|
tmp[0] &= mask;
|
|
|
tmp[0] |= (st << pch->info.ch);
|
|
|
+ r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -847,24 +929,23 @@ int power_set_sw(power_ch_t *pch)
|
|
|
|
|
|
tmp[0] = st;
|
|
|
offset = reg + +pch->info.ch;
|
|
|
+ r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
-
|
|
|
- default:
|
|
|
- return -1;
|
|
|
}
|
|
|
- r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
int power_set_alarm(power_ch_t *pch)
|
|
|
{
|
|
|
- int r=-1;
|
|
|
+ int r=0;
|
|
|
uint16_t offset = 0;
|
|
|
uint16_t nStatus = 0;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
+ lock_d_hold(h->lck);
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -901,15 +982,18 @@ int power_set_alarm(power_ch_t *pch)
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- return -1;
|
|
|
+ r = -1;
|
|
|
}
|
|
|
|
|
|
- if(pch->thr.v_upper.act==1) nStatus |= BIT(1);
|
|
|
- if(pch->thr.v_lower.act==1) nStatus |= BIT(2);
|
|
|
- if(pch->thr.c_upper.act==1) nStatus |= BIT(0);
|
|
|
- if(pch->thr.p_upper.act==1) nStatus |= BIT(3);
|
|
|
- if(pch->thr.w_upper.act==1) nStatus |= BIT(4);
|
|
|
- r = write_reg(h, pch->info.addr, offset, &nStatus, 1);
|
|
|
+ if(r==0) {
|
|
|
+ if(pch->thr.v_upper.act==1) nStatus |= BIT(1);
|
|
|
+ if(pch->thr.v_lower.act==1) nStatus |= BIT(2);
|
|
|
+ if(pch->thr.c_upper.act==1) nStatus |= BIT(0);
|
|
|
+ if(pch->thr.p_upper.act==1) nStatus |= BIT(3);
|
|
|
+ if(pch->thr.w_upper.act==1) nStatus |= BIT(4);
|
|
|
+ r = write_reg(h, pch->info.addr, offset, &nStatus, 1);
|
|
|
+ }
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
@@ -917,10 +1001,11 @@ int power_set_alarm(power_ch_t *pch)
|
|
|
|
|
|
int power_set_threshold(power_ch_t *pch)
|
|
|
{
|
|
|
- int r=-1;
|
|
|
+ int r=0;
|
|
|
uint16_t offset;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
+ lock_d_hold(h->lck);
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -1080,7 +1165,12 @@ int power_set_threshold(power_ch_t *pch)
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ r = -1;
|
|
|
+ break;
|
|
|
}
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
@@ -1092,6 +1182,7 @@ int power_set_start_delay(power_ch_t *pch)
|
|
|
uint16_t tmp[2],reg,offset;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
+ lock_d_hold(h->lck);
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -1138,8 +1229,9 @@ int power_set_start_delay(power_ch_t *pch)
|
|
|
case DC_OUT_TYPE:
|
|
|
case DC_IN_TYPE:
|
|
|
default:
|
|
|
- return -1;
|
|
|
+ r = -1;
|
|
|
}
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
@@ -1149,6 +1241,7 @@ int power_set_stop_delay(power_ch_t *pch)
|
|
|
uint16_t tmp[2],reg,offset;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
+ lock_d_hold(h->lck);
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -1193,8 +1286,10 @@ int power_set_stop_delay(power_ch_t *pch)
|
|
|
case DC_OUT_TYPE:
|
|
|
case DC_IN_TYPE:
|
|
|
default:
|
|
|
- return -1;
|
|
|
+ r = -1;
|
|
|
+ break;
|
|
|
}
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
@@ -1235,18 +1330,3 @@ int power_data_copy(power_data_t *pd, int flag)
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|