|
|
@@ -7,17 +7,21 @@
|
|
|
#include "thread.h"
|
|
|
#include "datadef.h"
|
|
|
|
|
|
-typedef struct {
|
|
|
- int8_t type;
|
|
|
- uint8_t chs;
|
|
|
-}ch_info_t;
|
|
|
typedef struct {
|
|
|
void* mb;
|
|
|
+ lock_t lck;
|
|
|
+ uint8_t cur_addr;
|
|
|
+
|
|
|
+ uint8_t chs; //所有控制板的总通道数
|
|
|
+ power_ch_t **pch; //动态指针
|
|
|
|
|
|
+ uint8_t cnt; //实际扫到的板子个数,不可大于BRD_MAX
|
|
|
+ uint8_t brd_max;
|
|
|
+ board_data_t *pbrd[BRD_MAX+1]; //通过modbus地址索引
|
|
|
+
|
|
|
+ board_key_t key[BRD_MAX+1];
|
|
|
power_total_t ttl;
|
|
|
- board_all_t all;
|
|
|
|
|
|
- lock_t lck;
|
|
|
}power_handle_t;
|
|
|
power_handle_t pwrHandle={0};
|
|
|
|
|
|
@@ -40,40 +44,28 @@ static int write_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *da
|
|
|
return mb_write(h->mb, addr, reg, data, cnt);
|
|
|
}
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-static int get_info(power_handle_t *h, uint8_t addr, board_key_t *info)
|
|
|
+static int get_key(power_handle_t *h, uint8_t addr, board_key_t *key)
|
|
|
{
|
|
|
int i,r=-1;
|
|
|
uint16_t tmp=0;
|
|
|
|
|
|
r = read_reg(h, addr, POWER_DC_INFO, &tmp, 1);
|
|
|
if(r==0) {
|
|
|
- info->type = (tmp>>8)&0xFF;
|
|
|
- info->chs = tmp&0xFF;
|
|
|
+ key->type = (tmp>>8)&0xFF;
|
|
|
+ key->chs = tmp&0xFF;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
r = read_reg(h, addr, POWER_AC_GET_INFO, &tmp, 1);
|
|
|
if(r==0) {
|
|
|
- info->type = (tmp>>8)&0xFF;
|
|
|
- info->chs = tmp&0xFF;
|
|
|
+ key->type = (tmp>>8)&0xFF;
|
|
|
+ key->chs = tmp&0xFF;
|
|
|
}
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
-static int get_ch(power_handle_t *h, int ch, power_ch_t *pch)
|
|
|
-{
|
|
|
- if(!pch || !h->all.pch || !h->all.chs || !h->all.pch[ch]) {
|
|
|
- lock_d_release(h->lck);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- *pch = *h->all.pch[ch];
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-
|
|
|
-
|
|
|
static int set_kb_value(power_handle_t *h, int type, int addr, kb_val_t *kv)
|
|
|
{
|
|
|
switch(type) {
|
|
|
@@ -155,7 +147,6 @@ static int set_kb_value(power_handle_t *h, int type, int addr, kb_val_t *kv)
|
|
|
}
|
|
|
static int reset_consump(power_handle_t *h, int type, int addr)
|
|
|
{
|
|
|
-
|
|
|
switch(type) {
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
@@ -187,20 +178,69 @@ static int reset_consump(power_handle_t *h, int type, int addr)
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
-static int get_board(power_handle_t *h, uint8_t addr, board_data_t *pbrd)
|
|
|
+static board_data_t* board_next(power_handle_t *h)
|
|
|
+{
|
|
|
+ uint8_t addr=h->cur_addr;
|
|
|
+ while(1) {
|
|
|
+ h->cur_addr++;
|
|
|
+ if(h->cur_addr>h->brd_max) {
|
|
|
+ h->cur_addr = 1;
|
|
|
+ }
|
|
|
+ else if(h->cur_addr==addr) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(h->pbrd[h->cur_addr]) {
|
|
|
+ return h->pbrd[h->cur_addr];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+static uint8_t get_ch_idx(board_data_t *pbrd, uint8_t sch)
|
|
|
{
|
|
|
- int r,i,j;
|
|
|
- alarm_t alarm;
|
|
|
+ uint8_t ch=0;
|
|
|
+ uint8_t pwr_type=paras_get()->prod.pwr_type;
|
|
|
+ if(pbrd->type==TREE_AC_TYPE) {
|
|
|
+ if(pwr_type == PDU_AC_I3O3) {
|
|
|
+ ch = pbrd->ch0 + sch/3;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ch = pbrd->ch0 + sch;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ch = pbrd->ch0 + sch;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ch;
|
|
|
+}
|
|
|
+static int threshold_proc(board_data_t *pbrd)
|
|
|
+{
|
|
|
+ int i,j,r=-1;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+static int board_query(power_handle_t *h)
|
|
|
+{
|
|
|
+ int i,j,r=-1;
|
|
|
uint16_t offset,tmp[144];
|
|
|
+ board_data_t *pbrd=NULL;
|
|
|
|
|
|
- switch(pbrd->type) {
|
|
|
- case AC_SINGLE_S_TYPE:
|
|
|
- case AC_SINGLE_B_TYPE:
|
|
|
- {
|
|
|
- uint32_t val;
|
|
|
-
|
|
|
- r = read_reg(h, pbrd->addr, POWER_AC_CUR_INFO_L, tmp, pbrd->chs);
|
|
|
- if(r==0 && pbrd->pch) {
|
|
|
+ lock_d_hold(h->lck);
|
|
|
+ pbrd = board_next(h);
|
|
|
+ if(pbrd) {
|
|
|
+ switch(pbrd->type) {
|
|
|
+ case AC_SINGLE_S_TYPE:
|
|
|
+ case AC_SINGLE_B_TYPE:
|
|
|
+ {
|
|
|
+ uint32_t val;
|
|
|
+ r = read_reg(h, pbrd->addr, POWER_AC_CUR_INFO_L, tmp, pbrd->chs);
|
|
|
+ if (r<0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
for (i=0; i<pbrd->chs; i++) {
|
|
|
int idx = i * 12;
|
|
|
// 解电压数据
|
|
|
@@ -222,15 +262,13 @@ static int get_board(power_handle_t *h, uint8_t addr, board_data_t *pbrd)
|
|
|
val = (tmp[11 + idx] << 16) | tmp[10 + idx];
|
|
|
pbrd->pch[i].power[0].factor = val / 1000.0;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- r = read_reg(h, pbrd->addr, POWER_AC_STAT_INFO_L, tmp, pbrd->chs);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- if(pbrd->pch) {
|
|
|
+
|
|
|
+ r = read_reg(h, pbrd->addr, POWER_AC_STAT_INFO_L, tmp, pbrd->chs);
|
|
|
+ if (r<0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
for (i=0; i<pbrd->chs; i++) {
|
|
|
pbrd->pch[i].power[0].status = tmp[i] & (0x01);
|
|
|
pbrd->pch[i].alarm.v_upper = tmp[i] & ALARM_V_UPPER;
|
|
|
@@ -241,188 +279,188 @@ static int get_board(power_handle_t *h, uint8_t addr, board_data_t *pbrd)
|
|
|
pbrd->pch[i].alarm.ph_loss = 0;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- break;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case DCPDU_TYPE:
|
|
|
+ {
|
|
|
+ uint32_t flag;
|
|
|
+ offset = POWER_DC_OUT_INFO + 16;
|
|
|
+ uint16_t *ptmp = tmp + 32;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, ptmp, 32);
|
|
|
+ if (r<0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < pbrd->chs; i++) {
|
|
|
+ int Index = i * 8;
|
|
|
+ // 解电压数据
|
|
|
+ float value = (tmp[1 + Index] << 16) + tmp[0 + Index];
|
|
|
+ pbrd->pch[i].power[0].voltage = value / 1000.0;
|
|
|
+ // 解电流数据
|
|
|
+ value = (tmp[3 + Index] << 16) + tmp[2 + Index];
|
|
|
+ pbrd->pch[i].power[0].current = value / 1000.0;
|
|
|
+ // 解功率数据
|
|
|
+ value = (tmp[5 + Index] << 16) + tmp[4 + Index];
|
|
|
+ pbrd->pch[i].power[0].power = value / 1000.0;
|
|
|
|
|
|
- case DCPDU_TYPE:
|
|
|
- {
|
|
|
- uint32_t flag;
|
|
|
- offset = POWER_DC_OUT_INFO + 16;
|
|
|
- uint16_t *ptmp = tmp + 32;
|
|
|
- r = read_reg(h, pbrd->addr, offset, ptmp, 32);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
+ value = (tmp[7 + Index] << 16) + tmp[6 + Index];
|
|
|
+ pbrd->pch[i].power[0].consump = value / 1000.0;
|
|
|
|
|
|
- for (i = 0; i < pbrd->chs; i++) {
|
|
|
- int Index = i * 8;
|
|
|
- // 解电压数据
|
|
|
- float value = (tmp[1 + Index] << 16) + tmp[0 + Index];
|
|
|
- pbrd->pch[i].power[0].voltage = value / 1000.0;
|
|
|
- // 解电流数据
|
|
|
- value = (tmp[3 + Index] << 16) + tmp[2 + Index];
|
|
|
- pbrd->pch[i].power[0].current = value / 1000.0;
|
|
|
- // 解功率数据
|
|
|
- value = (tmp[5 + Index] << 16) + tmp[4 + Index];
|
|
|
- pbrd->pch[i].power[0].power = value / 1000.0;
|
|
|
-
|
|
|
- value = (tmp[7 + Index] << 16) + tmp[6 + Index];
|
|
|
- pbrd->pch[i].power[0].consump = value / 1000.0;
|
|
|
-
|
|
|
- pbrd->pch[i].power[0].freq = 0;
|
|
|
- pbrd->pch[i].power[0].factor = 1;
|
|
|
- }
|
|
|
+ pbrd->pch[i].power[0].freq = 0;
|
|
|
+ pbrd->pch[i].power[0].factor = 1;
|
|
|
+ }
|
|
|
|
|
|
- offset = POWER_DC_STAT_INFO;
|
|
|
-
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, 2);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
+ offset = POWER_DC_STAT_INFO;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, 2);
|
|
|
+ if (r<0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < pbrd->chs; i++) {
|
|
|
+ flag = (tmp[1] << 16) + tmp[0];
|
|
|
+ pbrd->pch[i].power[0].status = (flag >> i) & 0x1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 获取报警状态
|
|
|
+ offset = POWER_DC_WARNING;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, 16);
|
|
|
+ if (r<0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < pbrd->chs; i++) {
|
|
|
+ int Index = i * 2;
|
|
|
+ pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
+ pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
+ pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
+ pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
+ pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
+ }
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
- for (i = 0; i < pbrd->chs; i++) {
|
|
|
- flag = (tmp[1] << 16) + tmp[0];
|
|
|
- pbrd->pch[i].power[0].status = (flag >> i) & 0x1;
|
|
|
- }
|
|
|
- // 获取报警状态
|
|
|
- offset = POWER_DC_WARNING;
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, 16);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
+ case TREE_AC_TYPE:
|
|
|
+ {
|
|
|
+ uint8_t v=0;
|
|
|
+
|
|
|
+ offset = POWER_AC3_OUT_INFO;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, 80);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ offset = POWER_AC3_OUT_INFO+40;
|
|
|
+ uint16_t* ptmp=tmp+80;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, ptmp, 64);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ int Index = i * 16;
|
|
|
+ // 解电压数据
|
|
|
+ float value = (tmp[1+Index] << 16) + tmp[0+Index];
|
|
|
+ pbrd->pch[i].power[0].voltage = value / 1000.0f;
|
|
|
+ // 解电流数据
|
|
|
+ value = (tmp[3+Index] << 16) + tmp[2+Index];
|
|
|
+ pbrd->pch[i].power[0].current = value / 1000.0f;
|
|
|
+ // 解功率数据
|
|
|
+ value = (tmp[5+Index] << 16) + tmp[4+Index];
|
|
|
+ pbrd->pch[i].power[0].power = value / 1000.0f;
|
|
|
+ // 无功
|
|
|
+ value = (tmp[7+Index] << 16) + tmp[6+Index];
|
|
|
+ // 视在功率
|
|
|
+ value = (tmp[9+Index] << 16) + tmp[8+Index];
|
|
|
+ // 解频率数据
|
|
|
+ value = (tmp[11+Index] << 16) + tmp[10+Index];
|
|
|
+ pbrd->pch[i].power[0].freq = value / 1000.0f;
|
|
|
+ // 解耗电量数据
|
|
|
+ value = (tmp[13+Index] << 16) + tmp[12+Index];
|
|
|
+ pbrd->pch[i].power[0].consump = value / 1000.0f;
|
|
|
+ // 解功率因素数据
|
|
|
+ value = (tmp[15+Index] << 16) + tmp[14+Index];
|
|
|
+ pbrd->pch[i].power[0].factor = value / 1023.0f;
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取通道开关状态及零线状态
|
|
|
+ offset = POWER_AC3_OUT_ENABLE;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, 20);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ int Index = i * 2;
|
|
|
+ pbrd->pch[i].power[0].status = tmp[0+Index] & 0x01;
|
|
|
+ pbrd->pch[i].power[0].nwire = tmp[18] & 0x01;
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取故障状态
|
|
|
+ offset = POWER_AC3_OUT_ERROR;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, 18);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ int Index = i * 2;
|
|
|
+ pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
+ pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
+ pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
+ pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
+ pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
+ }
|
|
|
+
|
|
|
+ offset = POWER_AC3_ALARM_MISSING_PH;
|
|
|
+ r = read_reg(h, pbrd->addr, offset, tmp, pbrd->chs);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ v = 0;
|
|
|
+ for(i = 0; i < 3; i++) {
|
|
|
+ if(tmp[i * 2]>0) {
|
|
|
+ v |= 1<<i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pbrd->ph_loss = v;
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
- for (i = 0; i < pbrd->chs; i++) {
|
|
|
- int Index = i * 2;
|
|
|
- pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
- pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
- pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
- pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
- pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
- }
|
|
|
+ case AC_MULTI_S_TYPE:
|
|
|
+ case AC_MULTI_B_TYPE:
|
|
|
+ case DC_OUT_TYPE:
|
|
|
+ case DC_IN_TYPE:
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
|
|
|
- case TREE_AC_TYPE:
|
|
|
- {
|
|
|
- uint8_t v=0;
|
|
|
-
|
|
|
- offset = POWER_AC3_OUT_INFO;
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, 80);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- offset = POWER_AC3_OUT_INFO+40;
|
|
|
- uint16_t* ptmp=tmp+80;
|
|
|
- r = read_reg(h, pbrd->addr, offset, ptmp, 64);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- for (i=0; i<pbrd->chs; i++) {
|
|
|
- int Index = i * 16;
|
|
|
- // 解电压数据
|
|
|
- float value = (tmp[1+Index] << 16) + tmp[0+Index];
|
|
|
- pbrd->pch[i].power[0].voltage = value / 1000.0f;
|
|
|
- // 解电流数据
|
|
|
- value = (tmp[3+Index] << 16) + tmp[2+Index];
|
|
|
- pbrd->pch[i].power[0].current = value / 1000.0f;
|
|
|
- // 解功率数据
|
|
|
- value = (tmp[5+Index] << 16) + tmp[4+Index];
|
|
|
- pbrd->pch[i].power[0].power = value / 1000.0f;
|
|
|
- // 无功
|
|
|
- value = (tmp[7+Index] << 16) + tmp[6+Index];
|
|
|
- // 视在功率
|
|
|
- value = (tmp[9+Index] << 16) + tmp[8+Index];
|
|
|
- // 解频率数据
|
|
|
- value = (tmp[11+Index] << 16) + tmp[10+Index];
|
|
|
- pbrd->pch[i].power[0].freq = value / 1000.0f;
|
|
|
- // 解耗电量数据
|
|
|
- value = (tmp[13+Index] << 16) + tmp[12+Index];
|
|
|
- pbrd->pch[i].power[0].consump = value / 1000.0f;
|
|
|
- // 解功率因素数据
|
|
|
- value = (tmp[15+Index] << 16) + tmp[14+Index];
|
|
|
- pbrd->pch[i].power[0].factor = value / 1023.0f;
|
|
|
- }
|
|
|
-
|
|
|
- //获取通道开关状态及零线状态
|
|
|
- offset = POWER_AC3_OUT_ENABLE;
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, 20);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
- for (i=0; i<pbrd->chs; i++) {
|
|
|
- int Index = i * 2;
|
|
|
- pbrd->pch[i].power[0].status = tmp[0+Index] & 0x01;
|
|
|
- pbrd->pch[i].power[0].nwire = tmp[18] & 0x01;
|
|
|
- }
|
|
|
-
|
|
|
- //获取故障状态
|
|
|
- offset = POWER_AC3_OUT_ERROR;
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, 18);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
- for (i=0; i<pbrd->chs; i++) {
|
|
|
- int Index = i * 2;
|
|
|
- pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
|
|
|
- pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
|
|
|
- pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
|
|
|
- pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
|
|
|
- pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
|
|
|
- }
|
|
|
-
|
|
|
- offset = POWER_AC3_ALARM_MISSING_PH;
|
|
|
- r = read_reg(h, pbrd->addr, offset, tmp, pbrd->chs);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("get_board, addr:%d offset:%d r=%d\n", pbrd->addr, offset, r);
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
- v = 0;
|
|
|
- for(i = 0; i < 3; i++) {
|
|
|
- if(tmp[i * 2]>0) {
|
|
|
- v |= 1<<i;
|
|
|
- }
|
|
|
- }
|
|
|
- pbrd->ph_loss = v;
|
|
|
+ if(r==0) {
|
|
|
+ threshold_proc(pbrd);
|
|
|
}
|
|
|
- break;
|
|
|
-
|
|
|
- case AC_MULTI_S_TYPE:
|
|
|
- case AC_MULTI_B_TYPE:
|
|
|
- case DC_OUT_TYPE:
|
|
|
- case DC_IN_TYPE:
|
|
|
- default:
|
|
|
- return -1;
|
|
|
}
|
|
|
+ lock_d_release(h->lck);
|
|
|
|
|
|
- return 0;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
|
|
|
static void *power_thread(void *arg)
|
|
|
{
|
|
|
int r;
|
|
|
- uint16_t tmp[2]={0};
|
|
|
-
|
|
|
thread_handle_t *th=(thread_handle_t*)arg;
|
|
|
power_handle_t *h=(power_handle_t*)th->arg;;
|
|
|
|
|
|
- power_scan(BRD_MAX);
|
|
|
+ power_scan();
|
|
|
while(th->quit==0) {
|
|
|
-
|
|
|
- //r = read_reg(h, 1, POWER_DC_INFO, tmp, 2);
|
|
|
- //LOGD("____ read reg %d, %d\n", POWER_DC_INFO, r);
|
|
|
- //power_get();
|
|
|
- //
|
|
|
+ board_query(h);
|
|
|
sleep(1);
|
|
|
}
|
|
|
pthread_exit(NULL);
|
|
|
@@ -455,6 +493,8 @@ int power_init(void)
|
|
|
if(!h->mb) {
|
|
|
return -1;
|
|
|
}
|
|
|
+ h->cur_addr = 0;
|
|
|
+ h->brd_max = BRD_MAX;
|
|
|
thread_start(THREAD_ID_POWER, power_thread, h);
|
|
|
|
|
|
return 0;
|
|
|
@@ -477,11 +517,11 @@ int power_get_ch(int ch, power_ch_t *pch)
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_d_hold(h->lck);
|
|
|
- if(!pch || !h->all.pch || !h->all.chs || !h->all.pch[ch]) {
|
|
|
+ if(!pch || !h->pch || !h->chs || !h->pch[ch]) {
|
|
|
lock_d_release(h->lck);
|
|
|
return -1;
|
|
|
}
|
|
|
- *pch = *h->all.pch[ch];
|
|
|
+ *pch = *h->pch[ch];
|
|
|
lock_d_release(h->lck);
|
|
|
|
|
|
return 0;
|
|
|
@@ -493,11 +533,11 @@ int power_get_board(board_data_t *pb)
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_d_hold(h->lck);
|
|
|
- if(!pb || !h->all.pch || !h->all.cnt || !h->all.pbrd[pb->addr]) {
|
|
|
+ if(!pb || !h->pch || !h->cnt || !h->pbrd[pb->addr]) {
|
|
|
lock_d_release(h->lck);
|
|
|
return -1;
|
|
|
}
|
|
|
- *pb = *h->all.pbrd[pb->addr];
|
|
|
+ *pb = *h->pbrd[pb->addr];
|
|
|
lock_d_release(h->lck);
|
|
|
|
|
|
return 0;
|
|
|
@@ -509,65 +549,83 @@ int power_set(int ch, power_ch_t *pch)
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_d_hold(h->lck);
|
|
|
- if(!pch || !h->all.pch || !h->all.chs || !h->all.pch[pch->info.ch]) {
|
|
|
+ if(!pch || !h->pch || !h->chs || !h->pch[pch->info.ch]) {
|
|
|
lock_d_release(h->lck);
|
|
|
return -1;
|
|
|
}
|
|
|
- *h->all.pch[pch->info.ch] = *pch;
|
|
|
+ *h->pch[pch->info.ch] = *pch;
|
|
|
lock_d_release(h->lck);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-int power_scan(int max_addr)
|
|
|
+static int pch_map(power_handle_t *h, int chs)
|
|
|
{
|
|
|
- int r,i,j,idx=0,chs=0;
|
|
|
- ch_info_t info;
|
|
|
+ int i,j,r,idx=1;
|
|
|
+ board_data_t *pbrd=NULL;
|
|
|
+ uint8_t pwr_type=paras_get()->prod.pwr_type;
|
|
|
+
|
|
|
+ if(chs>0) {
|
|
|
+ h->chs = 0;
|
|
|
+ h->pch = (power_ch_t**)calloc(1, sizeof(power_ch_t*)*chs);
|
|
|
+ if(h->pch) {
|
|
|
+ h->chs = chs;
|
|
|
+ for(i=1; i<=h->brd_max; i++) {
|
|
|
+ pbrd = h->pbrd[i];
|
|
|
+ if(pbrd) {
|
|
|
+ for(j=0; j<pbrd->chs; j++) {
|
|
|
+ h->pch[idx++] = &h->pbrd[i]->pch[j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+int power_scan(void)
|
|
|
+{
|
|
|
+ int r,i,j,chs=0;
|
|
|
+ int ch_idx=0,brd_idx=0;
|
|
|
+ board_key_t info;
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
+ uint8_t pwr_type=paras_get()->prod.pwr_type;
|
|
|
+
|
|
|
+ power_clear();
|
|
|
|
|
|
lock_d_hold(h->lck);
|
|
|
- for(i=1; i<=max_addr; i++) {
|
|
|
- r = get_info(h, i, &info);
|
|
|
+ h->cur_addr = 0;
|
|
|
+ for(i=1; i<=h->brd_max; i++) {
|
|
|
+ r = get_key(h, i, &h->key[i]);
|
|
|
LOGD("___ power_scan, addr: %d, result: %d\n", i, r);
|
|
|
- if(r==0) {
|
|
|
- h->all.pbrd[i] = (board_data_t*)calloc(1, sizeof(board_data_t));
|
|
|
- if(h->all.pbrd[i]) {
|
|
|
- h->all.pbrd[i]->type = info.type;
|
|
|
- h->all.pbrd[i]->chs = info.chs;
|
|
|
- h->all.pbrd[i]->addr = i;
|
|
|
- h->all.pbrd[i]->pch = (power_ch_t*)calloc(1, sizeof(power_ch_t)*info.chs);
|
|
|
- if(h->all.pbrd[i]->pch) {
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0; i<h->brd_max; i++) {
|
|
|
+ if(h->key[i].chs>0) {
|
|
|
+ h->pbrd[i] = (board_data_t*)calloc(1, sizeof(board_data_t));
|
|
|
+ if(h->pbrd[i]) {
|
|
|
+ h->pbrd[i]->type = info.type;
|
|
|
+ h->pbrd[i]->chs = info.chs;
|
|
|
+ h->pbrd[i]->addr = i;
|
|
|
+ h->pbrd[i]->ch0 = ch_idx;
|
|
|
+ h->pbrd[i]->pch = (power_ch_t*)calloc(1, sizeof(power_ch_t)*info.chs);
|
|
|
+ if(h->pbrd[i]->pch) {
|
|
|
for(j=0; j<info.chs; j++) {
|
|
|
- h->all.pbrd[i]->pch[j].info.addr = i;
|
|
|
- h->all.pbrd[i]->pch[j].info.ch = idx; //序号程序从0开始
|
|
|
- h->all.pbrd[i]->pch[j].info.sch = j; //序号从0开始
|
|
|
- h->all.pbrd[i]->pch[j].info.pid = i;
|
|
|
- h->all.pbrd[i]->pch[j].info.addr = i;
|
|
|
+ h->pbrd[i]->pch[j].info.addr = i;
|
|
|
+ h->pbrd[i]->pch[j].info.ch = ch_idx; //序号程序从0开始
|
|
|
+ h->pbrd[i]->pch[j].info.sch = j; //序号从0开始
|
|
|
|
|
|
- idx++;
|
|
|
+ if(info.type==TREE_AC_TYPE) {
|
|
|
+ h->pbrd[i]->pch[j].info.pid = i;
|
|
|
+
|
|
|
+ }
|
|
|
+ h->pbrd[i]->pch[j].info.addr = i;
|
|
|
+ ch_idx++;
|
|
|
}
|
|
|
}
|
|
|
+ brd_idx++;
|
|
|
}
|
|
|
chs += info.chs;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if(chs>0) {
|
|
|
- idx = 0;
|
|
|
- h->all.chs = 0;
|
|
|
- h->all.pch = (power_ch_t**)calloc(1, sizeof(power_ch_t*)*chs);
|
|
|
- if(h->all.pch) {
|
|
|
- h->all.chs = chs;
|
|
|
- for(i=1; i<=max_addr; i++) {
|
|
|
- board_data_t *pbrd=h->all.pbrd[i];
|
|
|
- for(j=0; j<pbrd->chs; j++) {
|
|
|
- h->all.pch[idx++] = &h->all.pbrd[i]->pch[j];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
lock_d_release(h->lck);
|
|
|
|
|
|
return 0;
|
|
|
@@ -580,20 +638,21 @@ int power_clear(void)
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
|
|
|
lock_d_hold(h->lck);
|
|
|
- for(i=0; i<BRD_MAX; i++) {
|
|
|
- if(h->all.pbrd[i]) {
|
|
|
- for(j=0; j<h->all.pbrd[i]->chs; j++) {
|
|
|
- if(h->all.pbrd[i]->pch) {
|
|
|
- free(h->all.pbrd[i]->pch);
|
|
|
- h->all.pbrd[i]->pch = NULL;
|
|
|
+ for(i=0; i<=h->brd_max; i++) {
|
|
|
+ if(h->pbrd[i]) {
|
|
|
+ for(j=0; j<h->pbrd[i]->chs; j++) {
|
|
|
+ if(h->pbrd[i]->pch) {
|
|
|
+ free(h->pbrd[i]->pch);
|
|
|
+ h->pbrd[i]->pch = NULL;
|
|
|
}
|
|
|
- h->all.pbrd[i]->chs = 0;
|
|
|
+ h->pbrd[i]->chs = 0;
|
|
|
}
|
|
|
- free(h->all.pbrd[i]);
|
|
|
- h->all.pbrd[i] = NULL;
|
|
|
+ free(h->pbrd[i]);
|
|
|
+ h->pbrd[i] = NULL;
|
|
|
}
|
|
|
- h->all.cnt = 0;
|
|
|
}
|
|
|
+ memset(h->key, 0, sizeof(h->key));
|
|
|
+ h->cnt = 0;
|
|
|
lock_d_release(h->lck);
|
|
|
|
|
|
return 0;
|
|
|
@@ -607,10 +666,10 @@ int power_reset(int addr)
|
|
|
power_handle_t *h=&pwrHandle;
|
|
|
board_data_t *pb=NULL;
|
|
|
|
|
|
- if(addr>BRD_MAX) {
|
|
|
+ if(addr>h->brd_max) {
|
|
|
return -1;
|
|
|
}
|
|
|
- pb = h->all.pbrd[addr];
|
|
|
+ pb = h->pbrd[addr];
|
|
|
if(!pb) {
|
|
|
return -1;
|
|
|
}
|