|
|
@@ -204,10 +204,12 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
|
|
|
cmd = (cmd_data_t*)(r_w_data);
|
|
|
if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
|
|
|
- slave_info.cmd = *cmd;
|
|
|
+ //slave_info.cmd = *cmd;
|
|
|
+ memcpy(&slave_info.cmd,r_w_data,sizeof(cmd_data_t));
|
|
|
+ sendlen = slave_info.cmd.c_m.sendlen_offset;
|
|
|
}
|
|
|
//LOGD("____write_____ %d\n",lenth);
|
|
|
- sendlen = 0;
|
|
|
+ // sendlen = 0;
|
|
|
|
|
|
switch(cmd->cmd)
|
|
|
{
|
|
|
@@ -256,7 +258,6 @@ 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));
|
|
|
- //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
uint8_t * base_addr = (uint8_t *)&all.pch[1];
|
|
|
my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
|
|
|
memswap(r_w_data,lenth*2);
|
|
|
@@ -265,10 +266,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
break;
|
|
|
case CASCADE_CMD_QUERY_CH:
|
|
|
{
|
|
|
- //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
- //power_all_t power = power_data_get();
|
|
|
uint8_t * base_addr = (uint8_t *)&all.pch[1];
|
|
|
- //my_memcpy_byte(r_w_data,&power->pch[1]+sendlen,lenth*2);
|
|
|
my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
|
|
|
memswap(r_w_data,lenth*2);
|
|
|
}
|
|
|
@@ -284,7 +282,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
case CASCADE_CMD_QUERY_TOTAL_PWR:break;
|
|
|
case CASCADE_CMD_BREAKER_GET_INFO:break;
|
|
|
}
|
|
|
- sendlen += lenth*2;
|
|
|
+ //sendlen += lenth*2;
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
@@ -409,8 +407,8 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
|
|
|
static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
|
|
|
{
|
|
|
- int r=0;
|
|
|
-
|
|
|
+
|
|
|
+ int r =0;
|
|
|
r = _mb_write(cas, addr,wd);
|
|
|
if(r==0) {
|
|
|
r = _mb_read(cas, addr,rd);
|
|
|
@@ -419,6 +417,70 @@ static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int mb_write_read_n(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
|
|
|
+{
|
|
|
+ int i=0,r=0,finish=0,timeout=0;
|
|
|
+ int rl,xlen,rlen=0,oncelen=250;
|
|
|
+ uint16_t buff[MB_BUF_SIZE];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ while(1) {
|
|
|
+ //set sendlen = rlen;
|
|
|
+ cas->cmd.c_m.sendlen_offset = rlen;
|
|
|
+ wd->dlen = sizeof(cmd_data_t);
|
|
|
+ wd->data = (uint8_t*)&(cas->cmd);
|
|
|
+ r = _mb_write(cas, addr,wd);
|
|
|
+ //set need transport len
|
|
|
+ if(rlen+oncelen>rd->dlen) {
|
|
|
+ xlen = rd->dlen-rlen;
|
|
|
+ }else{
|
|
|
+ xlen = oncelen;
|
|
|
+ }
|
|
|
+
|
|
|
+ xlen += xlen%2;
|
|
|
+ lock_on(cas->lock);
|
|
|
+ while(1)
|
|
|
+ {
|
|
|
+ rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,200);
|
|
|
+ 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);
|
|
|
+ if(cas->slaves[addr].err > 5) {
|
|
|
+ slave_rm(addr);
|
|
|
+ lock_off(cas->lock);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ lock_off(cas->lock);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ cas->slaves[addr].err =0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lock_off(cas->lock);
|
|
|
+ if(rlen+rl*2>=rd->dlen) {
|
|
|
+ xlen = rd->dlen-rlen;
|
|
|
+ finish = 1;
|
|
|
+ }else {
|
|
|
+ xlen = rl*2;
|
|
|
+ }
|
|
|
+ memcpy((char*)rd->data+rlen, buff, xlen);
|
|
|
+ rlen += xlen;
|
|
|
+ if(finish) {
|
|
|
+ r = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+fail:
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
static void* off_on_thread(void *arg)
|
|
|
{
|
|
|
cascade_handle_t *cas=&slave_info;
|
|
|
@@ -498,7 +560,7 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
|
|
|
//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
|
|
|
rdata.dlen = sizeof(power_ch_t)*cas->chache->info.channels;
|
|
|
rdata.data = (uint8_t*)&(cas->chache->info.ch);
|
|
|
- r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
+ r = mb_write_read_n(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
if(r==0) {
|
|
|
|
|
|
}else
|