|
|
@@ -13,14 +13,7 @@
|
|
|
#include "thread.h"
|
|
|
|
|
|
|
|
|
-typedef struct {
|
|
|
- uint8_t cmd;
|
|
|
- uint8_t obj;
|
|
|
- uint8_t chId;
|
|
|
- // char time_s[24]; //start time
|
|
|
- // char time_e[24]; //end time
|
|
|
- uint8_t data[200];
|
|
|
-}cmd_data_t;
|
|
|
+
|
|
|
|
|
|
|
|
|
typedef void * handle_t;
|
|
|
@@ -161,6 +154,7 @@ static uint8_t master_scan(cascade_handle_t *cas)
|
|
|
lock_off(cas->lock);
|
|
|
if(r > 0)
|
|
|
{
|
|
|
+ LOGD("get slave addr %d\n",slave_addr);
|
|
|
cas->slaves[slave_addr].addr = slave_addr;
|
|
|
cas->slaves[slave_addr].err = 0;
|
|
|
//获取当前
|
|
|
@@ -188,8 +182,9 @@ void cascade_scan_thread(void *arg)
|
|
|
power_data_t power = power_data_get();
|
|
|
if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
|
|
|
{
|
|
|
- slave_info.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | power.chs);
|
|
|
- int cnt = power.chs > 64 ? 64 : power.chs;
|
|
|
+ int channels = power.chs > 0 ? power.chs - 1: 0;
|
|
|
+ slave_info.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
|
|
|
+ int cnt = power.chs > 64 ? 64 : channels;
|
|
|
//电量信息
|
|
|
for(int i = 0; i < cnt;i++)
|
|
|
{
|
|
|
@@ -221,7 +216,8 @@ void cascade_scan_thread(void *arg)
|
|
|
}
|
|
|
}else
|
|
|
{
|
|
|
- slave_info.data.ac_3.dev_cnt = (p_data->prod.type << 8 | power.chs);
|
|
|
+ int channels = power.chs > 0 ? power.chs - 1: 0;
|
|
|
+ slave_info.data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
|
|
|
for(int i = A_P; i <= C_P;i++)
|
|
|
{
|
|
|
slave_info.data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
|
|
|
@@ -229,7 +225,7 @@ void cascade_scan_thread(void *arg)
|
|
|
slave_info.data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
|
|
|
slave_info.data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
|
|
|
}
|
|
|
- int cnt = power.chs > 64 ? 64 : power.chs;
|
|
|
+ int cnt = power.chs > 64 ? 64 : channels;
|
|
|
for(int i = 0; i < cnt;i++)
|
|
|
{
|
|
|
|
|
|
@@ -272,9 +268,14 @@ void cascade_thread(void *arg)
|
|
|
//ModbusInfo_t *info=&cas->mInfo;
|
|
|
mb_handle_t *handle=(mb_handle_t *)(cas->mb);
|
|
|
LOGD("__ cascade %s\n", (cas->md_type==MODBUS_MASTER)?"master":"slave");
|
|
|
- while(handle->quit==0) {
|
|
|
+ slave_info.saddr = 1;
|
|
|
+ while(handle->quit==0) {
|
|
|
if(cas->md_type==MODBUS_MASTER) { //主模
|
|
|
- r = master_query(cas);
|
|
|
+// cmd_data_t cmd;
|
|
|
+// cmd.cmd = CASCADE_CMD_GET_INFO;
|
|
|
+// cmd.obj = OBJ_OVERALL;
|
|
|
+// cas->cmd = cmd;
|
|
|
+// r = master_query(cas);
|
|
|
sleep(1);
|
|
|
}
|
|
|
else { //从模式,等待主设备发起数据请求
|
|
|
@@ -345,6 +346,7 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
cmd_data_t *cmd=NULL;
|
|
|
mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
|
|
|
pthread_t id = 0;
|
|
|
+ LOGD("____XXXXXXXXXX____ reg = %d\n",reg);
|
|
|
switch (reg)
|
|
|
{
|
|
|
case CASCADE_REG_SCAN:
|
|
|
@@ -352,11 +354,20 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
break;
|
|
|
case CASCADE_REG_WRITE:
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
cmd = (cmd_data_t*)(r_w_data);
|
|
|
if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
|
|
|
slave_info.cmd = *cmd;
|
|
|
}
|
|
|
+ LOGD("____XXXXXXX__WRITE_XXXXXXXXXXXXXX____cmd->cmd=%d,lenth=%d\n",cmd->cmd,lenth);
|
|
|
+ if(lenth > 10)
|
|
|
+ {
|
|
|
+ for(int i = 0; i < 10;i++)
|
|
|
+ {
|
|
|
+ LOGD("%X ",*((rt_uint8_t*)r_w_data+i));
|
|
|
+ }
|
|
|
+ LOGD("\n");
|
|
|
+ }
|
|
|
sendlen = 0;
|
|
|
|
|
|
switch(cmd->cmd)
|
|
|
@@ -402,6 +413,7 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
case CASCADE_REG_READ:
|
|
|
{
|
|
|
cmd = &slave_info.cmd;
|
|
|
+ LOGD("____XXXXXXX__READ_XXXXXXXXXXXXXX____cmd->cmd=%d\n",cmd->cmd);
|
|
|
switch(cmd->cmd)
|
|
|
{
|
|
|
case CASCADE_CMD_GET_INFO:
|
|
|
@@ -441,11 +453,23 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
#define REGS(x) (((x)+(x)%2)/2)
|
|
|
|
|
|
|
|
|
+static void memswap(uint8_t *buf, int len)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ uint8_t tmp;
|
|
|
+
|
|
|
+ for(i=0; i<len; i+=2) {
|
|
|
+ tmp = buf[i];
|
|
|
+ buf[i] = buf[i+1];
|
|
|
+ buf[i+1] = tmp;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
{
|
|
|
int i = 0,r=0,timeout=0;
|
|
|
int wl,xlen,wlen=0,oncelen=250;
|
|
|
- uint16_t buff[MB_BUF_SIZE];
|
|
|
+ uint8_t buff[MB_BUF_SIZE+100];
|
|
|
if(d->dlen<=0) {
|
|
|
return -1;
|
|
|
}
|
|
|
@@ -460,7 +484,11 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
}
|
|
|
xlen += xlen%2;
|
|
|
memcpy(buff, d->data+wlen, xlen);
|
|
|
- wl = mb_write(cas->mb, addr, CASCADE_REG_WRITE, buff, xlen/2);
|
|
|
+ LOGD("%X %X %X\n",buff[0],buff[1],buff[2]);
|
|
|
+ memswap(buff,xlen%2+xlen);
|
|
|
+ //交换数据
|
|
|
+
|
|
|
+ wl = mb_write(cas->mb, 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);
|
|
|
r = -1;
|
|
|
@@ -474,6 +502,7 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
wlen += xlen;
|
|
|
}
|
|
|
lock_off(cas->lock);
|
|
|
+ return r;
|
|
|
}
|
|
|
static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
{
|
|
|
@@ -510,16 +539,16 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
|
|
|
{
|
|
|
int r=0;
|
|
|
|
|
|
- r = _mb_write(cas->mb, addr,wd);
|
|
|
+ r = _mb_write(cas, addr,wd);
|
|
|
if(r==0) {
|
|
|
- r = _mb_read(cas->mb, addr,rd);
|
|
|
+ r = _mb_read(cas, addr,rd);
|
|
|
}
|
|
|
return r;
|
|
|
}
|
|
|
@@ -608,6 +637,12 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+int cascade_request(cmd_data_t *cmd)
|
|
|
+{
|
|
|
+ master_cmd(&slave_info,1,cmd);
|
|
|
+ LOGD("cnmdmsadasdasd\n");
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
static int master_query(cascade_handle_t *cas)
|
|
|
{
|