|
|
@@ -29,6 +29,12 @@ typedef struct {
|
|
|
|
|
|
}mb_handle_t;
|
|
|
|
|
|
+typedef struct {
|
|
|
+ union {
|
|
|
+ md_ac_dc_t ac_dc;
|
|
|
+ md_3_ac_t ac_3;
|
|
|
+ }data;
|
|
|
+}north_data_t;
|
|
|
|
|
|
typedef struct cascade_info{
|
|
|
uint8_t saddr;
|
|
|
@@ -36,7 +42,7 @@ typedef struct cascade_info{
|
|
|
uint8_t md_type;
|
|
|
uint32_t bund;
|
|
|
uint8_t quit;
|
|
|
- slave_info_t info;
|
|
|
+ slave_info_t *info;
|
|
|
lock_t lock;
|
|
|
mb_handle_t* mb;
|
|
|
slave_t slaves[CASCADE_MAX+1];
|
|
|
@@ -45,6 +51,7 @@ typedef struct cascade_info{
|
|
|
// md_ac_dc_t ac_dc;
|
|
|
// md_3_ac_t ac_3;
|
|
|
// }data; //modbus to user
|
|
|
+ north_data_t *north;
|
|
|
}cascade_handle_t;
|
|
|
|
|
|
|
|
|
@@ -131,7 +138,7 @@ static uint8_t master_scan(cascade_handle_t *cas)
|
|
|
|
|
|
static int slave_get_info(cascade_handle_t *cas)
|
|
|
{
|
|
|
- slave_info_t *info=&cas->info;
|
|
|
+ slave_info_t *info=cas->info;
|
|
|
power_data_t power = power_data_get();
|
|
|
|
|
|
info->channels = power.chs-1 > 0 ? power.chs-1 : power.chs;
|
|
|
@@ -178,6 +185,7 @@ static 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;
|
|
|
+ power_data_t power = power_data_get();
|
|
|
switch (reg)
|
|
|
{
|
|
|
case CASCADE_REG_SCAN:
|
|
|
@@ -239,15 +247,21 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
|
|
|
{
|
|
|
case CASCADE_CMD_GET_INFO:
|
|
|
{
|
|
|
- //LOGD("____read_____ %d\n",lenth);
|
|
|
- my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
+ LOGD("____read_____ %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
|
|
|
+ //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
+ uint8_t * base_addr = (uint8_t *)&power.pch[1];
|
|
|
+ my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
|
|
|
memswap(r_w_data,lenth*2);
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
case CASCADE_CMD_QUERY_CH:
|
|
|
{
|
|
|
- my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
+ //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
|
|
|
+ //power_data_t power = power_data_get();
|
|
|
+ uint8_t * base_addr = (uint8_t *)&power.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);
|
|
|
}
|
|
|
break;
|
|
|
@@ -455,24 +469,48 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
|
|
|
wdata.dlen = sizeof(cmd_data_t);
|
|
|
wdata.data = (uint8_t*)cmd;
|
|
|
|
|
|
- rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
|
|
|
- rdata.data = (uint8_t*)&cas->info;
|
|
|
-
|
|
|
- r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
- if(r==0) {
|
|
|
- rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
|
|
|
- rdata.data = (uint8_t*)&cas->info;
|
|
|
- r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
- if(r==0) {
|
|
|
+// rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
|
|
|
+// rdata.data = (uint8_t*)cas->info;
|
|
|
+ uint16_t value = 0;
|
|
|
+ r = mb_read(cas->mb,cur_dev_addr,4000,&value,1,100);//获取通道数
|
|
|
+ //r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
+ LOGD("r = %d value=%d\n",r,value);
|
|
|
+ if(r == 1)
|
|
|
+ {
|
|
|
+ uint8_t chanels = value & 0xff;
|
|
|
+ if(chanels == 0)
|
|
|
+ {
|
|
|
+ cas->info->channels = 0;
|
|
|
+ LOGD("can not get cannes!!!\n");
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ cas->info->channels = chanels;
|
|
|
+ //rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
|
|
|
+ rdata.dlen = sizeof(power_ch_t)*cas->info->channels;
|
|
|
+ rdata.data = (uint8_t*)&(cas->info->ch);
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
+ if(r==0) {
|
|
|
|
|
|
}else
|
|
|
{
|
|
|
LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
|
|
|
}
|
|
|
- }
|
|
|
- else {
|
|
|
- LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
|
|
|
- }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// if(r==0) {
|
|
|
+// rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
|
|
|
+// rdata.data = (uint8_t*)&cas->info;
|
|
|
+// r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
+// if(r==0) {
|
|
|
+
|
|
|
+// }else
|
|
|
+// {
|
|
|
+// LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
|
|
|
+// }
|
|
|
}
|
|
|
break;
|
|
|
case CASCADE_CMD_BREAKER_GET_INFO:
|
|
|
@@ -530,10 +568,27 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
|
|
|
mb_set_cb_table(slave_info.mb->hinst,&mb_table);
|
|
|
func.slave_func = slave_func;
|
|
|
mb_set_cb_cascade(slave_info.mb->hinst,&func);
|
|
|
+ slave_info.north = (north_data_t *)malloc(sizeof(north_data_t));
|
|
|
+ if(slave_info.north == NULL)
|
|
|
+ {
|
|
|
+ LOGE("can't malloc to large memery!!!\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ memset(slave_info.north,0,sizeof(north_data_t));
|
|
|
+ }else if(para.mode == MB_MODE_MASTER)
|
|
|
+ {
|
|
|
+ slave_info.info = (slave_info_t *) malloc(sizeof(slave_info_t));
|
|
|
+ if(slave_info.info == NULL)
|
|
|
+ {
|
|
|
+ LOGE("can't malloc to large slave_info.info memery!!!\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ memset(slave_info.info,0,sizeof(slave_info_t));
|
|
|
}
|
|
|
|
|
|
slave_info.quit = 0;
|
|
|
- slave_info.read_addr = 1;
|
|
|
+ if(para.mode == MB_MODE_MASTER)
|
|
|
+ slave_info.read_addr = 1;
|
|
|
|
|
|
LOGD("uart: %s mode: %d addr: %d bound: %d\n",uart,slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
|
|
|
LOGD("scan thread!!!\n");
|
|
|
@@ -566,82 +621,83 @@ void cascade_scan_thread(void *arg)
|
|
|
sleep(1);
|
|
|
}else //做从机//拷贝数据到北向
|
|
|
{
|
|
|
-// paras_data_t* p_data = paras_get();
|
|
|
-// power_data_t power = power_data_get();
|
|
|
-//
|
|
|
-// if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
|
|
|
-// {
|
|
|
-// 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++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_dc.power[i].voltage = power.pch[i].power[0].voltage *1000;
|
|
|
-// slave_info.data.ac_dc.power[i].current = power.pch[i].power[0].current *1000;
|
|
|
-// slave_info.data.ac_dc.power[i].power = power.pch[i].power[0].power *1000;
|
|
|
-// slave_info.data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
|
|
|
-// slave_info.data.ac_dc.power[i].factor = power.pch[i].power[0].factor *1000;
|
|
|
-// slave_info.data.ac_dc.power[i].freq = power.pch[i].power[0].freq *1000;
|
|
|
-// }
|
|
|
-// //总信息
|
|
|
-// //slave_info.data.ac_dc.power_all. = power.ttl.total;
|
|
|
-// slave_info.data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
|
|
|
-// slave_info.data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
|
|
|
-// slave_info.data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
|
|
|
-// slave_info.data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
|
|
|
-// //温湿度
|
|
|
-// slave_info.data.ac_dc.temp = 0; //后续加上传感器数据
|
|
|
-// slave_info.data.ac_dc.humity = 0;
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// slave_info.data.ac_dc.switch_stu[i] = 0;
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
|
|
|
-// }
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
|
|
|
-// }
|
|
|
-// }else
|
|
|
-// {
|
|
|
-// 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;
|
|
|
-// slave_info.data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
|
|
|
-// 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 : channels;
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-
|
|
|
-// //总体信息
|
|
|
-// }
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-// for(int j = A_P; j <= C_P;j++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
|
|
|
-// slave_info.data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
|
|
|
-// slave_info.data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
|
|
|
-// slave_info.data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
|
|
|
-// slave_info.data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
|
|
|
-// }
|
|
|
-// for(int i = 0; i < cnt;i++)
|
|
|
-// {
|
|
|
-// slave_info.data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
|
|
|
-// }
|
|
|
-//
|
|
|
-// }
|
|
|
- slave_get_info(&slave_info);
|
|
|
+ paras_data_t* p_data = paras_get();
|
|
|
+ power_data_t power = power_data_get();
|
|
|
+
|
|
|
+ if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
|
|
|
+ {
|
|
|
+ int channels = power.chs > 0 ? power.chs - 1: 0;
|
|
|
+ slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
|
|
|
+ int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
|
|
|
+ //电量信息
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_dc.power[i].voltage = power.pch[i].power[0].voltage *1000;
|
|
|
+ slave_info.north->data.ac_dc.power[i].current = power.pch[i].power[0].current *1000;
|
|
|
+ slave_info.north->data.ac_dc.power[i].power = power.pch[i].power[0].power *1000;
|
|
|
+ slave_info.north->data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
|
|
|
+ slave_info.north->data.ac_dc.power[i].factor = power.pch[i].power[0].factor *1000;
|
|
|
+ slave_info.north->data.ac_dc.power[i].freq = power.pch[i].power[0].freq *1000;
|
|
|
+ }
|
|
|
+ //总信息
|
|
|
+ //slave_info.north->data.ac_dc.power_all. = power.ttl.total;
|
|
|
+ slave_info.north->data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
|
|
|
+ slave_info.north->data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
|
|
|
+ slave_info.north->data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
|
|
|
+ slave_info.north->data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
|
|
|
+ //温湿度
|
|
|
+ slave_info.north->data.ac_dc.temp = 0; //后续加上传感器数据
|
|
|
+ slave_info.north->data.ac_dc.humity = 0;
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ slave_info.north->data.ac_dc.switch_stu[i] = 0;
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
|
|
|
+ }
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
|
|
|
+ }
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ int channels = power.chs > 0 ? power.chs - 1: 0;
|
|
|
+ slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
|
|
|
+ for(int i = A_P; i <= C_P;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
|
|
|
+ }
|
|
|
+ int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+
|
|
|
+ //总体信息
|
|
|
+ }
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ for(int j = A_P; j <= C_P;j++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
|
|
|
+ slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
|
|
|
+ }
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.north->data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ LOGD("cpy data to north user\n");
|
|
|
+ //slave_get_info(&slave_info);
|
|
|
}
|
|
|
sleep(1);
|
|
|
|
|
|
@@ -706,43 +762,43 @@ int mb_port_read_input(u16 addr, u16 *preg)//读输入寄存器, 返回 : 0-成
|
|
|
int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成功, -2-地址错误
|
|
|
{
|
|
|
MB_ASSERT(preg != NULL);
|
|
|
-// uint16_t *data = NULL;
|
|
|
-// if( AC_DC_DEV_CHN_REG <= addr && addr <= AC_DC_DRY_REG)
|
|
|
-// {
|
|
|
-// data = (uint16_t*)(&slave_info.data.ac_dc);
|
|
|
-// uint32_t offset = addr - AC_DC_DEV_CHN_REG;
|
|
|
-// *preg = *(data+offset);
|
|
|
-// return 0;
|
|
|
-// }
|
|
|
-// if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
|
|
|
-// {
|
|
|
-// data = (uint16_t*)(&slave_info.data.ac_3);
|
|
|
-// uint32_t offset = addr - AC_3_DEV_CHN_REG;
|
|
|
-// *preg = *(data+offset);
|
|
|
-// return 0;
|
|
|
-// }
|
|
|
+ uint16_t *data = NULL;
|
|
|
+ if( AC_DC_DEV_CHN_REG <= addr && addr <= AC_DC_DRY_REG)
|
|
|
+ {
|
|
|
+ data = (uint16_t*)(&slave_info.north->data.ac_dc);
|
|
|
+ uint32_t offset = addr - AC_DC_DEV_CHN_REG;
|
|
|
+ *preg = *(data+offset);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
|
|
|
+ {
|
|
|
+ data = (uint16_t*)(&slave_info.north->data.ac_3);
|
|
|
+ uint32_t offset = addr - AC_3_DEV_CHN_REG;
|
|
|
+ *preg = *(data+offset);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
return(-2);
|
|
|
}
|
|
|
|
|
|
int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
|
|
|
{
|
|
|
-// power_data_t power = power_data_get();
|
|
|
-//
|
|
|
-// if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
|
|
|
-// {
|
|
|
-// switch(addr)
|
|
|
-// {
|
|
|
-// case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
|
|
|
-// {
|
|
|
-// uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
|
|
|
-// //获取通道控制接口 写入数据
|
|
|
-//
|
|
|
-//
|
|
|
-// }
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// return 0;
|
|
|
-// }
|
|
|
+ power_data_t power = power_data_get();
|
|
|
+
|
|
|
+ if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
|
|
|
+ {
|
|
|
+ switch(addr)
|
|
|
+ {
|
|
|
+ case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
|
|
|
+ {
|
|
|
+ uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
|
|
|
+ //获取通道控制接口 写入数据
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
return(-2);
|
|
|
}
|
|
|
|
|
|
@@ -787,8 +843,8 @@ void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
|
|
|
cascade_data_t cascade_power_get(void)
|
|
|
{
|
|
|
cascade_data_t cas_d = {0};
|
|
|
- cas_d.chs = slave_info.info.channels;
|
|
|
- cas_d.pch = &slave_info.info.ch[0];
|
|
|
+ cas_d.chs = slave_info.info->channels;
|
|
|
+ cas_d.pch = &slave_info.info->ch[0];
|
|
|
return cas_d;
|
|
|
}
|
|
|
int cascade_get_dlist(dev_list_t *dl)
|