|
@@ -7,7 +7,7 @@
|
|
|
#include "switch_ctrl.h"
|
|
#include "switch_ctrl.h"
|
|
|
#include "paras.h"
|
|
#include "paras.h"
|
|
|
|
|
|
|
|
-#if 1
|
|
|
|
|
|
|
+#if 0
|
|
|
#define LOGD log_d
|
|
#define LOGD log_d
|
|
|
#define LOGE log_e
|
|
#define LOGE log_e
|
|
|
#define LOGW log_w
|
|
#define LOGW log_w
|
|
@@ -21,26 +21,29 @@
|
|
|
#define MB_MAX_LEN 250
|
|
#define MB_MAX_LEN 250
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+#define MB_MASTER 0
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
typedef struct {
|
|
typedef struct {
|
|
|
|
|
|
|
|
int inited;
|
|
int inited;
|
|
|
pthread_mutex_t mutex;
|
|
pthread_mutex_t mutex;
|
|
|
|
|
|
|
|
Modbus_Manger m;
|
|
Modbus_Manger m;
|
|
|
- modbus_mapping_t *map;
|
|
|
|
|
- uint8_t query[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
-
|
|
|
|
|
slave_t slaves[CASCADE_MAX+1];
|
|
slave_t slaves[CASCADE_MAX+1];
|
|
|
|
|
|
|
|
- req_t req;
|
|
|
|
|
|
|
+ modbus_mapping_t *map;
|
|
|
|
|
+
|
|
|
|
|
+ mb_req_t req;
|
|
|
int scanAddr;
|
|
int scanAddr;
|
|
|
uint16_t scanReg;
|
|
uint16_t scanReg;
|
|
|
}cascade_handle_t;
|
|
}cascade_handle_t;
|
|
|
|
|
|
|
|
-int cur_dev_addr=0;
|
|
|
|
|
|
|
+int cur_dev_addr=1;
|
|
|
static cascade_handle_t casHandle={.inited=0};
|
|
static cascade_handle_t casHandle={.inited=0};
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+//////////////////////////////////////////////////
|
|
|
static inline GlobalDeviceManager* get_dm(void)
|
|
static inline GlobalDeviceManager* get_dm(void)
|
|
|
{
|
|
{
|
|
|
return &__globalDeviceManage;
|
|
return &__globalDeviceManage;
|
|
@@ -51,7 +54,18 @@ static inline GlobalDeviceManager* get_dm2(void)
|
|
|
}
|
|
}
|
|
|
static inline ModbusInfo_t *get_mb(void)
|
|
static inline ModbusInfo_t *get_mb(void)
|
|
|
{
|
|
{
|
|
|
- return &get_dm()->_global_device_info->_gmodbus_info;
|
|
|
|
|
|
|
+ static ModbusInfo_t mbinfo={
|
|
|
|
|
+#if (MB_MASTER==1)
|
|
|
|
|
+ .product_modbus_type=0,
|
|
|
|
|
+#else
|
|
|
|
|
+ .product_modbus_type=1,
|
|
|
|
|
+#endif
|
|
|
|
|
+ .product_modbus_addr=1,
|
|
|
|
|
+ .product_modbus_baud=115200,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ return &mbinfo;
|
|
|
|
|
+ //return &get_dm()->_global_device_info->_gmodbus_info;
|
|
|
}
|
|
}
|
|
|
static int slave_init(cascade_handle_t *cas)
|
|
static int slave_init(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
@@ -90,16 +104,17 @@ static int slave_find(cascade_handle_t *cas, int addr)
|
|
|
}
|
|
}
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32_t baud)
|
|
static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32_t baud)
|
|
|
{
|
|
{
|
|
|
int r;
|
|
int r;
|
|
|
- r = g_modbus_init(&cas->m, path, baud, type, addr, "", 0);
|
|
|
|
|
- if(r==0 && type==0 && addr>0) {
|
|
|
|
|
|
|
+ r = g_modbus_init(&cas->m, path, baud, type, addr, type?"master":"slave", 0);
|
|
|
|
|
+ if(r==0 && addr>0) {
|
|
|
g_modbus_set_slave(&cas->m, addr);
|
|
g_modbus_set_slave(&cas->m, addr);
|
|
|
cas->inited = 1;
|
|
cas->inited = 1;
|
|
|
}
|
|
}
|
|
|
|
|
+ else {
|
|
|
|
|
+ LOGE("___ mb init failed, %s\n", modbus_strerror(errno));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -108,153 +123,192 @@ static int mb_deinit(cascade_handle_t *cas)
|
|
|
g_modbus_deinit(&cas->m);
|
|
g_modbus_deinit(&cas->m);
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-static int mb_read_regs(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
|
|
|
|
|
|
|
+static int _mb_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
|
|
|
{
|
|
{
|
|
|
return g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
|
|
return g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
|
|
|
}
|
|
}
|
|
|
-static int mb_write_regs(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
|
|
|
|
|
|
|
+static int _mb_write(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
|
|
|
{
|
|
{
|
|
|
return g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
|
|
return g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
|
|
|
}
|
|
}
|
|
|
-////////////////////////////////////////////
|
|
|
|
|
|
|
+static int _mb_recv(cascade_handle_t *cas, uint8_t *buf)
|
|
|
|
|
+{
|
|
|
|
|
+ return g_modbus_receive(&cas->m, buf);
|
|
|
|
|
+}
|
|
|
|
|
+static int _mb_reply(cascade_handle_t *cas, uint8_t *buff, int reqlen, modbus_mapping_t *map)
|
|
|
|
|
+{
|
|
|
|
|
+ return g_modbus_reply(&cas->m, buff, reqlen, map);
|
|
|
|
|
+}
|
|
|
|
|
+////////////////////////////////////////////////////////////
|
|
|
|
|
+static void print_data(uint8_t *data, int len)
|
|
|
|
|
+{
|
|
|
|
|
+ int i;
|
|
|
|
|
+ for(i=0; i<len; i++) {
|
|
|
|
|
+ LOGD("0x%02x, ", data[i]);
|
|
|
|
|
+ }
|
|
|
|
|
+ LOGD("\n");
|
|
|
|
|
+}
|
|
|
|
|
+static void print_req(char *s, mb_req_t *req)
|
|
|
|
|
+{
|
|
|
|
|
+ LOGD("__%s__ req.obj: %d\n", s, req->obj);
|
|
|
|
|
+ LOGD("__%s__ req.reg: %d\n", s, req->reg);
|
|
|
|
|
+ LOGD("__%s__ req.chcnt: %d\n", s, req->chcnt);
|
|
|
|
|
+ LOGD("__%s__ req.chId: %d\n", s, req->chId);
|
|
|
|
|
+ LOGD("__%s__ req.time_s: %s\n", s, req->time_s);
|
|
|
|
|
+ LOGD("__%s__ req.time_e: %s\n", s, req->time_e);
|
|
|
|
|
+ LOGD("__%s__ req.offset: %d\n", s, req->offset);
|
|
|
|
|
+ LOGD("__%s__ req.reqlen: %d\n", s, req->reqlen);
|
|
|
|
|
+
|
|
|
|
|
+ LOGD("\n");
|
|
|
|
|
+}
|
|
|
|
|
+#define BYTE(t,a) (t[a])
|
|
|
|
|
+#define BYTE2(t,a) (t[a]<<8 | t[a+1])
|
|
|
|
|
+#define BYTE4(t,a) (BYTE2(t,a+2)<<16 | BYTE2(t,a))
|
|
|
|
|
+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 void memcpy_swap(uint8_t *dst, uint8_t *src, int len)
|
|
|
|
|
+{
|
|
|
|
|
+ int i;
|
|
|
|
|
+
|
|
|
|
|
+ for(i=0; i<len; i+=2) {
|
|
|
|
|
+ dst[i] = src[i+1];
|
|
|
|
|
+ dst[i+1] = src[i];
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
static int mb_hdr(uint8_t *data, mb_hdr_t *h)
|
|
static int mb_hdr(uint8_t *data, mb_hdr_t *h)
|
|
|
{
|
|
{
|
|
|
h->addr = data[0];
|
|
h->addr = data[0];
|
|
|
h->func = data[1];
|
|
h->func = data[1];
|
|
|
- h->reg = (data[2]<<8) | data[3];
|
|
|
|
|
- h->regcnt = (data[4]<<8) | data[5];
|
|
|
|
|
- //h->dlen = data[6];
|
|
|
|
|
- h->pkt = &data[7];
|
|
|
|
|
|
|
+ h->reg = BYTE2(data,2);
|
|
|
|
|
+ h->regcnt = BYTE2(data,4);
|
|
|
|
|
+
|
|
|
|
|
+ h->dlen = 0;
|
|
|
|
|
+ h->data = NULL;
|
|
|
|
|
+ if(h->reg==CASCADE_REG_WRITE) {
|
|
|
|
|
+ h->dlen = data[6];
|
|
|
|
|
+ h->data = data+7;
|
|
|
|
|
+
|
|
|
|
|
+ memswap(h->data, h->dlen+h->dlen%2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
-static int my_read(cascade_handle_t *cas, int addr, mb_pkt_t *pkt)
|
|
|
|
|
|
|
+static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
{
|
|
{
|
|
|
- int r=0,finish=0;
|
|
|
|
|
|
|
+ int r=0;
|
|
|
int xlen,rlen=0,oncelen=MB_MAX_LEN;
|
|
int xlen,rlen=0,oncelen=MB_MAX_LEN;
|
|
|
|
|
+ uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
|
|
|
|
|
+ LOGD("___ mb_read dlen: %d\n", d->dlen);
|
|
|
while(1) {
|
|
while(1) {
|
|
|
- if(rlen+oncelen>pkt->dlen) {
|
|
|
|
|
- xlen = pkt->dlen-rlen;
|
|
|
|
|
|
|
+ if(rlen+oncelen>d->dlen) {
|
|
|
|
|
+ xlen = d->dlen-rlen;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
xlen = oncelen;
|
|
xlen = oncelen;
|
|
|
}
|
|
}
|
|
|
xlen += xlen%2;
|
|
xlen += xlen%2;
|
|
|
|
|
|
|
|
- r = mb_read_regs(&cas->m, addr, CASCADE_REG_READ, cas->query, xlen/2);
|
|
|
|
|
|
|
+ r = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
|
|
|
if(r<0) {
|
|
if(r<0) {
|
|
|
|
|
+ LOGE("___ _mb_read failed, %s\n", modbus_strerror(errno));
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
- if(rlen+r*2>pkt->dlen) {
|
|
|
|
|
- xlen = pkt->dlen-rlen;
|
|
|
|
|
- finish = 1;
|
|
|
|
|
|
|
+ if(rlen+r*2>=d->dlen) {
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
xlen = r*2;
|
|
xlen = r*2;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- memcpy((char*)pkt->data+rlen, cas->query, xlen);
|
|
|
|
|
|
|
+ memcpy((char*)d->data+rlen, buff, xlen);
|
|
|
rlen += xlen;
|
|
rlen += xlen;
|
|
|
-
|
|
|
|
|
- if(finish) {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-static int my_write(cascade_handle_t *cas, int addr, mb_pkt_t *pkt)
|
|
|
|
|
|
|
+static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
{
|
|
{
|
|
|
- int r=0,finish=0;
|
|
|
|
|
|
|
+ int r=0;
|
|
|
int xlen,wlen=0,oncelen=MB_MAX_LEN;
|
|
int xlen,wlen=0,oncelen=MB_MAX_LEN;
|
|
|
|
|
+ uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
|
|
|
|
|
+ LOGD("___ mb_write dlen: %d\n", d->dlen);
|
|
|
while(1) {
|
|
while(1) {
|
|
|
- if(wlen+oncelen>pkt->dlen) {
|
|
|
|
|
- xlen = pkt->dlen-wlen;
|
|
|
|
|
|
|
+ if(wlen+oncelen>d->dlen) {
|
|
|
|
|
+ xlen = d->dlen-wlen;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
xlen = oncelen;
|
|
xlen = oncelen;
|
|
|
}
|
|
}
|
|
|
xlen += xlen%2;
|
|
xlen += xlen%2;
|
|
|
|
|
|
|
|
- memcpy(cas->query, pkt->data+wlen, xlen);
|
|
|
|
|
- r = mb_write_regs(&cas->m, addr, CASCADE_REG_WRITE, cas->query, xlen/2);
|
|
|
|
|
|
|
+ memcpy(buff, d->data+wlen, xlen);
|
|
|
|
|
+ r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
|
|
|
if(r<0) {
|
|
if(r<0) {
|
|
|
|
|
+ LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d\n", addr, CASCADE_REG_WRITE, xlen/2);
|
|
|
|
|
+ LOGE("___ _mb_write failed, errno: %d, %s\n", errno, modbus_strerror(errno));
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
- if(wlen+r*2>pkt->dlen) {
|
|
|
|
|
- xlen = pkt->dlen-wlen;
|
|
|
|
|
- finish = 1;
|
|
|
|
|
|
|
+ if(wlen+r*2>=d->dlen) {
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
xlen = r*2;
|
|
xlen = r*2;
|
|
|
}
|
|
}
|
|
|
wlen += xlen;
|
|
wlen += xlen;
|
|
|
-
|
|
|
|
|
- if(finish) {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-static int my_recv(cascade_handle_t *cas, mb_pkt_t *pkt)
|
|
|
|
|
-{
|
|
|
|
|
- int r=0;
|
|
|
|
|
-
|
|
|
|
|
- //r = mb_receive(h->mb, req);
|
|
|
|
|
- return r ;
|
|
|
|
|
-}
|
|
|
|
|
-static int my_reply(cascade_handle_t *cas, mb_pkt_t *pkt)
|
|
|
|
|
|
|
+static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
|
|
|
{
|
|
{
|
|
|
int r=0;
|
|
int r=0;
|
|
|
-
|
|
|
|
|
- //r = modbus_reply(h->mb, req, reqlen, map);
|
|
|
|
|
- return r ;
|
|
|
|
|
-}
|
|
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
|
|
-static int mb_read(cascade_handle_t *cas, int addr, mb_pkt_t *pkt)
|
|
|
|
|
-{
|
|
|
|
|
- int r=0;
|
|
|
|
|
-
|
|
|
|
|
- //_write(h, );
|
|
|
|
|
|
|
+
|
|
|
|
|
+ r = mb_write(cas, addr, wd);
|
|
|
|
|
+ if(r==0) {
|
|
|
|
|
+ r = mb_read(cas, addr, rd);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return r;
|
|
return r;
|
|
|
}
|
|
}
|
|
|
-static int mb_write(cascade_handle_t *cas, int addr, mb_pkt_t *pkt)
|
|
|
|
|
|
|
+static int mb_receive(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
- int r=0;
|
|
|
|
|
|
|
+ int r=0,rlen=0;
|
|
|
|
|
+ int16_t precmd=-1;
|
|
|
|
|
+ mb_hdr_t h;
|
|
|
|
|
+ mb_req_t *req;
|
|
|
|
|
+ modbus_mapping_t *map=NULL;
|
|
|
|
|
+ uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
+
|
|
|
|
|
+ r = _mb_recv(cas, buff);
|
|
|
|
|
+ if(r<0) {
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+ mb_hdr(buff, &h);
|
|
|
|
|
|
|
|
|
|
+ //如果是非自定义寄存器则跳出
|
|
|
|
|
+ if(h.data==NULL) {
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ req = (mb_req_t*)h.data;
|
|
|
|
|
+ print_req("slave", req);
|
|
|
|
|
+ cas->req = *req;
|
|
|
|
|
|
|
|
- return r ;
|
|
|
|
|
-}
|
|
|
|
|
-static int mb_recv(cascade_handle_t *cas, mb_hdr_t *h)
|
|
|
|
|
-{
|
|
|
|
|
- int r=0;
|
|
|
|
|
|
|
+ r = _mb_reply(cas, buff, r, cas->map);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
return r ;
|
|
return r ;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-static int mb_receive(cascade_handle_t *cas)
|
|
|
|
|
-{
|
|
|
|
|
- return g_modbus_receive(&cas->m, cas->query);
|
|
|
|
|
-}
|
|
|
|
|
-static int mb_reply(cascade_handle_t *cas, int reqlen)
|
|
|
|
|
-{
|
|
|
|
|
- return g_modbus_reply(&cas->m, cas->query, reqlen, cas->map);
|
|
|
|
|
-}
|
|
|
|
|
-static void print_data(uint8_t *data, int len)
|
|
|
|
|
-{
|
|
|
|
|
- int i;
|
|
|
|
|
- for(i=0; i<len; i++) {
|
|
|
|
|
- LOGD("0x%02x, ", data[i]);
|
|
|
|
|
- }
|
|
|
|
|
- LOGD("\n");
|
|
|
|
|
-}
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
static int cascade_scan(cascade_handle_t *cas)
|
|
static int cascade_scan(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
@@ -266,7 +320,7 @@ static int cascade_scan(cascade_handle_t *cas)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(!slave_find(cas, cas->scanAddr)) {
|
|
if(!slave_find(cas, cas->scanAddr)) {
|
|
|
- r = mb_read_regs(cas, cas->scanAddr, cas->scanReg, tmp, 1);
|
|
|
|
|
|
|
+ r = _mb_read(cas, cas->scanAddr, cas->scanReg, tmp, 1);
|
|
|
if(r>0) {
|
|
if(r>0) {
|
|
|
LOGD("____ find slave %d\n", cas->scanAddr);
|
|
LOGD("____ find slave %d\n", cas->scanAddr);
|
|
|
slave_add(cas, cas->scanAddr);
|
|
slave_add(cas, cas->scanAddr);
|
|
@@ -387,7 +441,7 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
|
|
|
uint16_t temp[100];
|
|
uint16_t temp[100];
|
|
|
int r,cnt = sizeof(sensor_ori_t)/2;
|
|
int r,cnt = sizeof(sensor_ori_t)/2;
|
|
|
|
|
|
|
|
- r = mb_read_regs(cas, addr, offset, temp, cnt);
|
|
|
|
|
|
|
+ r = _mb_read(cas, addr, offset, temp, cnt);
|
|
|
if(r!=cnt) {
|
|
if(r!=cnt) {
|
|
|
LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
|
|
LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
|
|
|
return -1;
|
|
return -1;
|
|
@@ -414,14 +468,14 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#define REGS_OF(x) (((x)+(x)%2)/2)
|
|
|
|
|
|
|
+#define REGS(x) (((x)+(x)%2)/2)
|
|
|
static int master_request(cascade_handle_t *cas)
|
|
static int master_request(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
int i,r;
|
|
int i,r;
|
|
|
GlobalPowerManger *tmp=NULL;
|
|
GlobalPowerManger *tmp=NULL;
|
|
|
GlobalDeviceManager *dm2=get_dm2();
|
|
GlobalDeviceManager *dm2=get_dm2();
|
|
|
GlobalDeviceInfo *dev=&dm2->_global_device_info;
|
|
GlobalDeviceInfo *dev=&dm2->_global_device_info;
|
|
|
- req_t *req=&cas->req;
|
|
|
|
|
|
|
+ mb_req_t *req=&cas->req;
|
|
|
|
|
|
|
|
if(cur_dev_addr==0) {
|
|
if(cur_dev_addr==0) {
|
|
|
return -1;
|
|
return -1;
|
|
@@ -431,9 +485,10 @@ static int master_request(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_OPEN:
|
|
case CASCADE_REG_OPEN:
|
|
|
case CASCADE_REG_CLOSE:
|
|
case CASCADE_REG_CLOSE:
|
|
|
{
|
|
{
|
|
|
- for(i=0; i<req->cnt; i++) {
|
|
|
|
|
- ch_data_t *ch=&req->ch[i];
|
|
|
|
|
- g_switch_set_all_ctrl(&cas->m, ch->ch_type, ch->addr, (req->reg==CASCADE_REG_OPEN)?1:0);
|
|
|
|
|
|
|
+ for(i=0; i<MAX_CHN_COUNT; i++) {
|
|
|
|
|
+ if(req->ch[i].addr>0) {
|
|
|
|
|
+ g_switch_set_all_ctrl(&cas->m, req->ch[i].ch_type, req->ch[i].addr, (req->reg==CASCADE_REG_OPEN)?1:0);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -459,23 +514,44 @@ static int master_query(cascade_handle_t *cas)
|
|
|
GlobalDeviceInfo *dev=&dm2->_global_device_info;
|
|
GlobalDeviceInfo *dev=&dm2->_global_device_info;
|
|
|
_OverChnPwrAckInfo chInfo;
|
|
_OverChnPwrAckInfo chInfo;
|
|
|
_OverAllPwrAckInfo allInfo;
|
|
_OverAllPwrAckInfo allInfo;
|
|
|
- req_t *req=&cas->req;
|
|
|
|
|
|
|
+ mb_req_t *req=&cas->req;
|
|
|
|
|
+ data_t rdata,wdata;
|
|
|
|
|
|
|
|
if(cur_dev_addr==0) {
|
|
if(cur_dev_addr==0) {
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ //add for test
|
|
|
|
|
+ req->obj = OBJ_OVERALL;
|
|
|
|
|
+ req->reg = CASCADE_REG_QUERY_CH;
|
|
|
|
|
+ req->chcnt = 33;
|
|
|
|
|
+ req->chId = 44;
|
|
|
|
|
+ strcpy(req->time_s, "123456789 ABCDEFGH");
|
|
|
|
|
+ strcpy(req->time_e, "2222/22/22 11:11:11");
|
|
|
|
|
+ req->offset = 112;
|
|
|
|
|
+ req->reqlen = 789;
|
|
|
|
|
+
|
|
|
|
|
+ print_req("master", req);
|
|
|
switch(req->reg) {
|
|
switch(req->reg) {
|
|
|
case CASCADE_REG_QUERY_CH:
|
|
case CASCADE_REG_QUERY_CH:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, cur_dev_addr, req->reg, &chInfo, REGS_OF(sizeof(chInfo)));
|
|
|
|
|
|
|
+ //mb_read(cas, cur_dev_addr, req->reg, &chInfo, REGS_OF(sizeof(chInfo)));
|
|
|
//chInfo.product_name = dev->product_name;
|
|
//chInfo.product_name = dev->product_name;
|
|
|
//chInfo.product_number = dev->product_name;
|
|
//chInfo.product_number = dev->product_name;
|
|
|
//chInfo.product_id = dev->product_id;
|
|
//chInfo.product_id = dev->product_id;
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, cur_dev_addr, req->reg, &allInfo, REGS_OF(sizeof(allInfo)));
|
|
|
|
|
|
|
+
|
|
|
|
|
+ //mb_read(cas, cur_dev_addr, req->reg, &allInfo, REGS_OF(sizeof(allInfo)));
|
|
|
|
|
+ wdata.dlen = sizeof(*req);
|
|
|
|
|
+ wdata.data = (uint8_t*)req;
|
|
|
|
|
+
|
|
|
|
|
+ rdata.dlen = sizeof(allInfo);
|
|
|
|
|
+ rdata.data = (uint8_t*)&allInfo;
|
|
|
|
|
+
|
|
|
|
|
+ //LOGD("____ mb_write_read %d\n", cur_dev_addr);
|
|
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -483,10 +559,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_VOL:
|
|
case CASCADE_REG_QUERY_VOL:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -494,10 +570,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_CUR:
|
|
case CASCADE_REG_QUERY_CUR:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -505,10 +581,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_PWR:
|
|
case CASCADE_REG_QUERY_PWR:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -516,10 +592,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_PWRQ:
|
|
case CASCADE_REG_QUERY_PWRQ:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -527,10 +603,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_HIS:
|
|
case CASCADE_REG_QUERY_HIS:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -538,10 +614,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_TOTAL:
|
|
case CASCADE_REG_QUERY_TOTAL:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -549,10 +625,10 @@ static int master_query(cascade_handle_t *cas)
|
|
|
case CASCADE_REG_QUERY_TOTAL_PWR:
|
|
case CASCADE_REG_QUERY_TOTAL_PWR:
|
|
|
{
|
|
{
|
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
if(req->obj==OBJ_CHANNEL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
else if(req->obj==OBJ_OVERALL) {
|
|
|
- //mb_read(&cas->m, );
|
|
|
|
|
|
|
+ //mb_read(cas, );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -561,25 +637,13 @@ static int master_query(cascade_handle_t *cas)
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
static int slave_receive(cascade_handle_t *cas)
|
|
static int slave_receive(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
- int i,r=0,rc;
|
|
|
|
|
- uint8_t *query=cas->query;
|
|
|
|
|
- modbus_mapping_t *map=cas->map;
|
|
|
|
|
- ModbusInfo_t *info=get_mb();
|
|
|
|
|
-
|
|
|
|
|
- //rc = mb_receive(cas, &h);
|
|
|
|
|
- if (rc>0) {
|
|
|
|
|
- //mb_reply();
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return r;
|
|
|
|
|
|
|
+ return mb_receive(cas);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void* cascade_thread(void *arg)
|
|
static void* cascade_thread(void *arg)
|
|
@@ -592,14 +656,13 @@ static void* cascade_thread(void *arg)
|
|
|
LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
|
|
LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
|
|
|
while(h->quit==0) {
|
|
while(h->quit==0) {
|
|
|
if(info->product_modbus_type==0) { //主模
|
|
if(info->product_modbus_type==0) { //主模
|
|
|
- r = master_request(cas);
|
|
|
|
|
- sleep(1);
|
|
|
|
|
|
|
+ r = master_query(cas);
|
|
|
|
|
+ sleep(5);
|
|
|
}
|
|
}
|
|
|
else { //从模式,等待主设备发起数据请�?
|
|
else { //从模式,等待主设备发起数据请�?
|
|
|
- //r = slave_rceive(cas);
|
|
|
|
|
|
|
+ r = slave_receive(cas);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- modbus_mapping_free(cas->map);
|
|
|
|
|
|
|
|
|
|
pthread_exit(NULL);
|
|
pthread_exit(NULL);
|
|
|
}
|
|
}
|
|
@@ -649,18 +712,13 @@ int cascade_init(void)
|
|
|
|
|
|
|
|
cas->scanAddr = 1;
|
|
cas->scanAddr = 1;
|
|
|
cas->scanReg = CASCADE_REG_SCAN;
|
|
cas->scanReg = CASCADE_REG_SCAN;
|
|
|
- cas->map = modbus_mapping_new(
|
|
|
|
|
- MODBUS_MAX_READ_BITS,
|
|
|
|
|
- MODBUS_MAX_WRITE_BITS,
|
|
|
|
|
- MAX_READ_REGS,
|
|
|
|
|
- MAX_WRITE_REGS
|
|
|
|
|
- );
|
|
|
|
|
- set_modbus(cas, get_mb());
|
|
|
|
|
|
|
+ cas->map = modbus_mapping_new(0,0,MAX_READ_REGS,MAX_WRITE_REGS);
|
|
|
|
|
|
|
|
|
|
+ set_modbus(cas, get_mb());
|
|
|
slave_add(cas, 0);
|
|
slave_add(cas, 0);
|
|
|
|
|
|
|
|
sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
|
|
sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
|
|
|
- sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
|
|
|
|
|
|
|
+ //sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -712,7 +770,7 @@ int cascade_free_dlist(dev_list_t *dl)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int cascade_request(req_t *req)
|
|
|
|
|
|
|
+int cascade_request(mb_req_t *req)
|
|
|
{
|
|
{
|
|
|
int r=-1;
|
|
int r=-1;
|
|
|
cascade_handle_t *cas=&casHandle;
|
|
cascade_handle_t *cas=&casHandle;
|