|
|
@@ -31,6 +31,7 @@ typedef struct {
|
|
|
|
|
|
board_key_t key[BRD_MAX+1];
|
|
|
power_total_t ttl;
|
|
|
+ uint8_t flag[CH_MAX];
|
|
|
|
|
|
product_data_t *prod;
|
|
|
power_data_t pdat;
|
|
|
@@ -52,9 +53,21 @@ static board_fn_t board_fn={
|
|
|
};
|
|
|
static power_handle_t pwrHandle={0};
|
|
|
|
|
|
+static int get_flag(power_handle_t *h, uint8_t ch, uint8_t thr)
|
|
|
+{
|
|
|
+ return (h->flag[ch]&(1<<thr))?1:0;
|
|
|
+}
|
|
|
+static void set_flag(power_handle_t *h, uint8_t ch, uint8_t thr, int flag)
|
|
|
+{
|
|
|
+ if(flag) {
|
|
|
+ h->flag[ch] |= 1<<thr;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ h->flag[ch] &= ~(1<<thr);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
-
|
|
|
-static int alarm_evt_handle(power_handle_t *h, power_ch_t *pch, uint32_t flag)
|
|
|
+static int alarm_evt_handle(power_handle_t *h, power_ch_t *pch)
|
|
|
{
|
|
|
alarm_data_t ad;
|
|
|
|
|
|
@@ -261,64 +274,68 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
|
|
|
times = 3;
|
|
|
|
|
|
//设置为输出三相且三相有缺失则报警
|
|
|
- if(pch->info.ph_val && pbrd->ph_loss) {
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_V_UPPER);
|
|
|
+ if(pch->info.ph_val && pbrd->ph_loss && get_flag(h, pch->info.ch, ALARM_PH_LOSS)==0) {
|
|
|
+ set_flag(h, pch->info.ch, ALARM_PH_LOSS, 1);
|
|
|
+ alarm_evt_handle(h, pch);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ set_flag(h, pch->info.ch, ALARM_PH_LOSS, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for(j=0; j<times; j++) {
|
|
|
if(pch->thr.v_upper.en) {
|
|
|
if(pch->power[j].voltage>pch->thr.v_upper.val) {
|
|
|
- if(pch->alarm.v_upper==0) {
|
|
|
- pch->alarm.v_upper = 1;
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_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) {
|
|
|
- if(pch->alarm.v_lower==0) {
|
|
|
- pch->alarm.v_lower = 1;
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_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);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- pch->alarm.v_upper = 0;
|
|
|
- pch->alarm.v_lower = 0;
|
|
|
+ set_flag(h, pch->info.ch, ALARM_V_UPPER, 0);
|
|
|
+ set_flag(h, pch->info.ch, ALARM_V_LOWER, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(pch->thr.c_upper.en) {
|
|
|
if(pch->power[j].current>pch->thr.c_upper.val) {
|
|
|
- if(pch->alarm.c_upper==0) {
|
|
|
- pch->alarm.c_upper = 1;
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_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);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ set_flag(h, pch->info.ch, ALARM_C_UPPER, 0);
|
|
|
}
|
|
|
- }
|
|
|
- else {
|
|
|
- pch->alarm.c_upper = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(pch->thr.p_upper.en) {
|
|
|
if(pch->power[j].power>pch->thr.p_upper.val) {
|
|
|
- if(pch->alarm.p_upper==0) {
|
|
|
- pch->alarm.p_upper = 1;
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_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);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- pch->alarm.p_upper = 0;
|
|
|
+ set_flag(h, pch->info.ch, ALARM_P_UPPER, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(pch->thr.w_upper.en) {
|
|
|
if(pch->power[j].current>pch->thr.w_upper.val) {
|
|
|
- if(pch->alarm.w_upper==0) {
|
|
|
- pch->alarm.w_upper = 1;
|
|
|
- alarm_evt_handle(h, pch, THRESHOLD_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);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- pch->alarm.w_upper = 0;
|
|
|
+ set_flag(h, pch->info.ch, ALARM_C_UPPER, 0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -426,11 +443,11 @@ 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->alarm.v_upper = tmp[i] & ALARM_V_UPPER;
|
|
|
- pch->alarm.v_lower = tmp[i] & ALARM_V_LOWER;
|
|
|
- pch->alarm.c_upper = tmp[i] & ALARM_C_UPPER;
|
|
|
- pch->alarm.p_upper = tmp[i] & ALARM_P_UPPER;
|
|
|
- pch->alarm.w_upper = tmp[i] & ALARM_W_UPPER;
|
|
|
+ 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;
|
|
|
}
|
|
|
}
|
|
|
@@ -492,11 +509,11 @@ 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->alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
- pch->alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
- pch->alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
- pch->alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
- pch->alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
+ pch->alarm.v_upper = (tmp[0+Index] & BIT(0))?1:0;
|
|
|
+ pch->alarm.v_lower = (tmp[0+Index] & BIT(1))?1:0;
|
|
|
+ pch->alarm.c_upper = (tmp[0+Index] & BIT(2))?1:0;
|
|
|
+ pch->alarm.p_upper = (tmp[0+Index] & BIT(3))?1:0;
|
|
|
+ pch->alarm.w_upper = (tmp[0+Index] & BIT(4))?1:0;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
@@ -579,11 +596,11 @@ 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->alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
- pch->alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
- pch->alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
- pch->alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
- pch->alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
+ pch->alarm.v_upper = (tmp[0+Index] & BIT(0))?1:0;
|
|
|
+ pch->alarm.v_lower = (tmp[0+Index] & BIT(1))?1:0;
|
|
|
+ pch->alarm.c_upper = (tmp[0+Index] & BIT(2))?1:0;
|
|
|
+ pch->alarm.p_upper = (tmp[0+Index] & BIT(3))?1:0;
|
|
|
+ pch->alarm.w_upper = (tmp[0+Index] & BIT(4))?1:0;
|
|
|
}
|
|
|
|
|
|
offset = POWER_AC3_ALARM_MISSING_PH;
|
|
|
@@ -715,21 +732,25 @@ int power_deinit(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int get_ch(power_handle_t *h, uint8_t ch, power_ch_t *pch)
|
|
|
+static power_ch_t* get_ch(power_handle_t *h, uint8_t ch)
|
|
|
{
|
|
|
- if(!pch || !h->pch || !h->chs || !h->pch[ch]) {
|
|
|
- return -1;
|
|
|
+ if(!h->pch || !h->chs || !h->pch[ch]) {
|
|
|
+ return NULL;
|
|
|
}
|
|
|
- *pch = *h->pch[ch];
|
|
|
- return 0;
|
|
|
+ return h->pch[ch];
|
|
|
}
|
|
|
int power_get_ch(uint8_t ch, power_ch_t *pch)
|
|
|
{
|
|
|
- int r;
|
|
|
+ int r=-1;
|
|
|
+ power_ch_t *p=NULL;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_on(h->lck);
|
|
|
- r = get_ch(h, ch, pch);
|
|
|
+ p = get_ch(h, ch);
|
|
|
+ if(p && pch) {
|
|
|
+ *pch = *p;
|
|
|
+ r = 0;
|
|
|
+ }
|
|
|
lock_off(h->lck);
|
|
|
|
|
|
return r;
|
|
|
@@ -868,13 +889,10 @@ int power_scan(void)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- times = (ch_idx%nGroups)?ch_idx:nGroups;
|
|
|
for(j=0; j<pkey->chs; j++) {
|
|
|
pch[j].info.addr = i;
|
|
|
pch[j].info.sch = j; //序号从0开始
|
|
|
pch[j].info.type = pkey->type;
|
|
|
- pch[j].info.start_delay = 1000*times;
|
|
|
- pch[j].info.stop_delay = 1000*times;
|
|
|
|
|
|
if(h->prod->pwr_type==PDU_AC_I3O3) {
|
|
|
pch[j].info.ch = ch_idx+j/3; //序号从1开始, 发给控制板需从0开始
|
|
|
@@ -884,6 +902,10 @@ int power_scan(void)
|
|
|
pch[j].info.ch = ch_idx+j; //序号从1开始, 发给控制板需从0开始
|
|
|
pch[j].info.ph_id = 0;
|
|
|
}
|
|
|
+
|
|
|
+ times = (pch[j].info.ch%nGroups)?pch[j].info.ch:nGroups;
|
|
|
+ pch[j].info.start_delay = 1000*times;
|
|
|
+ pch[j].info.stop_delay = 1000*times;
|
|
|
}
|
|
|
|
|
|
if(h->prod->pwr_type==PDU_AC_I3O3) {
|
|
|
@@ -997,17 +1019,16 @@ int power_reset(void)
|
|
|
int power_set_ch_sw(uint8_t ch, uint8_t on)
|
|
|
{
|
|
|
int r;
|
|
|
- power_ch_t pc,*pch;
|
|
|
+ power_ch_t *pch;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
uint16_t offset,tmp[2]={0},st=on;
|
|
|
|
|
|
lock_on(h->lck);
|
|
|
- r = get_ch(h, ch, &pc);
|
|
|
- if(r) {
|
|
|
+ pch = get_ch(h, ch);
|
|
|
+ if(!pch) {
|
|
|
lock_off(h->lck);
|
|
|
return -1;
|
|
|
}
|
|
|
- pch = &pc;
|
|
|
|
|
|
if (pch->thr.v_upper.en == 1)
|
|
|
st |= ENABLE_AC3_V_UP;
|
|
|
@@ -1026,7 +1047,7 @@ int power_set_ch_sw(uint8_t ch, uint8_t on)
|
|
|
{
|
|
|
offset = POWER_AC_CH_STAT_L + pch->info.ch-1;
|
|
|
tmp[0] = st; tmp[1] = 0;
|
|
|
- r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
+ r = write_reg(h, pch->info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -1038,7 +1059,7 @@ int power_set_ch_sw(uint8_t ch, uint8_t on)
|
|
|
mask = ~(1 << (pch->info.ch-1));
|
|
|
tmp[0] &= mask;
|
|
|
tmp[0] |= (st << (pch->info.ch-1));
|
|
|
- r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
+ r = write_reg(h, pch->info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -1055,7 +1076,7 @@ int power_set_ch_sw(uint8_t ch, uint8_t on)
|
|
|
|
|
|
tmp[0] = st;
|
|
|
offset = reg + +pch->info.ch-1;
|
|
|
- r = write_reg(h, pc.info.addr, offset, tmp, 2);
|
|
|
+ r = write_reg(h, pch->info.addr, offset, tmp, 2);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -1068,18 +1089,15 @@ int power_set_ch_sw(uint8_t ch, uint8_t on)
|
|
|
static int set_board_sw(board_data_t *pbrd, uint8_t on)
|
|
|
{
|
|
|
int i,r;
|
|
|
- power_ch_t pc;
|
|
|
+ power_ch_t *pch;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
if(!pbrd) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- for(i=1; i<=pbrd->chs; i++) {
|
|
|
- r = get_ch(h, i, &pc);
|
|
|
- if(r==0) {
|
|
|
- power_set_ch_sw(pc.info.ch, on);
|
|
|
- }
|
|
|
+ for(i=0; i<pbrd->chs; i++) {
|
|
|
+ power_set_ch_sw(pbrd->pch[i].info.ch, on);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
@@ -1089,7 +1107,6 @@ static int set_board_sw(board_data_t *pbrd, uint8_t on)
|
|
|
int power_set_all_sw(uint8_t on)
|
|
|
{
|
|
|
int i,r;
|
|
|
-
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
for(i=1; i<=h->chs; i++) {
|
|
|
@@ -1150,11 +1167,11 @@ int power_set_alarm(power_ch_t *pch)
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
+ 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);
|
|
|
@@ -1167,9 +1184,12 @@ int power_set_threshold(power_ch_t *pch)
|
|
|
{
|
|
|
int r=0;
|
|
|
uint16_t offset;
|
|
|
+ power_ch_t *pch2=NULL;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_on(h->lck);
|
|
|
+ pch2 = get_ch(h, pch->info.ch);
|
|
|
+ pch2->thr = pch->thr;
|
|
|
switch(pch->info.type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -1221,7 +1241,9 @@ int power_set_threshold(power_ch_t *pch)
|
|
|
}
|
|
|
|
|
|
r = write_reg(h, pch->info.addr, offset, data_buf, 16);
|
|
|
- //power_set_alarm();
|
|
|
+ if(r==0) {
|
|
|
+ r = power_set_alarm(pch);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -1230,37 +1252,38 @@ int power_set_threshold(power_ch_t *pch)
|
|
|
uint16_t data_temp[4];
|
|
|
uint32_t value;
|
|
|
|
|
|
- offset = (pch->info.ch<0)?POWER_DC_THRESHOLD_TOTAL_VOL_MAX:POWER_DC_THRESHOLD_VOL_MAX;
|
|
|
+ offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MAX:POWER_DC_THRESHOLD_VOL_MAX;
|
|
|
value = pch->thr.v_upper.val * 1000;
|
|
|
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;
|
|
|
+ offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MIN:POWER_DC_THRESHOLD_VOL_MIN;
|
|
|
value = pch->thr.v_lower.val * 1000;
|
|
|
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;
|
|
|
+ offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_CUR_MAX:POWER_DC_THRESHOLD_CUR_MAX;
|
|
|
value = pch->thr.c_upper.val * 1000;
|
|
|
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;
|
|
|
+ offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWR_MAX:POWER_DC_THRESHOLD_POWER_MAX;
|
|
|
value = pch->thr.p_upper.val * 1000;
|
|
|
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;
|
|
|
+ offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWRCON_MAX:POWER_DC_THRESHOLD_POWERCON_MAX;
|
|
|
value = pch->thr.w_upper.val * 1000;
|
|
|
data_temp[0] = value & 0XFFFF;
|
|
|
data_temp[1] = (value >> 16) & 0xFFFF;
|
|
|
r = write_reg(h, pch->info.addr, offset, data_temp, 2);
|
|
|
-
|
|
|
- //power_set_alarm();
|
|
|
+ if(r==0) {
|
|
|
+ r = power_set_alarm(pch);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -1326,6 +1349,9 @@ int power_set_threshold(power_ch_t *pch)
|
|
|
data_temp[0] = value & 0XFFFF;
|
|
|
data_temp[1] = (value >> 16) & 0xFFFF;
|
|
|
r = write_reg(h, pch->info.addr, offset, data_temp, 2);
|
|
|
+ if(r==0) {
|
|
|
+ r = power_set_alarm(pch);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|