|
|
@@ -10,24 +10,23 @@
|
|
|
#include "paras.h"
|
|
|
|
|
|
#if 1
|
|
|
-#define LOGD log_d
|
|
|
-#define LOGE log_e
|
|
|
-#define LOGW log_w
|
|
|
+ #define LOGD log_d
|
|
|
+ #define LOGE log_e
|
|
|
+ #define LOGW log_w
|
|
|
#else
|
|
|
-#define LOGD printf
|
|
|
-#define LOGE printf
|
|
|
-#define LOGW printf
|
|
|
+ #define LOGD printf
|
|
|
+ #define LOGE printf
|
|
|
+ #define LOGW printf
|
|
|
#endif
|
|
|
|
|
|
-#define MB_MAX_LEN 250
|
|
|
-
|
|
|
-
|
|
|
+#define MB_MAX_LEN 250
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
|
int inited;
|
|
|
pthread_mutex_t mutex; //used for list lock
|
|
|
- pthread_mutex_t lock;
|
|
|
+ pthread_mutex_t mutex2; //used for extern call
|
|
|
+ pthread_mutex_t mutex3; //used for mb_write and mb_read_write
|
|
|
|
|
|
Modbus_Manger m;
|
|
|
int addr;
|
|
|
@@ -435,7 +434,8 @@ static int slave_save(cascade_handle_t *cas)
|
|
|
|
|
|
static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32_t baud)
|
|
|
{
|
|
|
- int r;
|
|
|
+ int r=0;
|
|
|
+
|
|
|
r = g_modbus_init(&cas->m, path, baud, type, addr, (type>0)?"master":"slave", 1);
|
|
|
if(r==0) {
|
|
|
if(type>0) {
|
|
|
@@ -458,6 +458,7 @@ static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32
|
|
|
static int mb_deinit(cascade_handle_t *cas)
|
|
|
{
|
|
|
g_modbus_deinit(&cas->m);
|
|
|
+ cas->inited = 0;
|
|
|
return 0;
|
|
|
}
|
|
|
static int _mb_scan(cascade_handle_t *cas, int addr)
|
|
|
@@ -588,43 +589,44 @@ static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
int xlen,rlen=0,oncelen=MB_MAX_LEN;
|
|
|
uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
|
- if(d->dlen<=0) {
|
|
|
- //LOGE("___ mb_read dlen %d is wrong!\n", d->dlen);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- //LOGD("___ mb_read dlen: %d\n", d->dlen);
|
|
|
-
|
|
|
- while(1) {
|
|
|
- if(rlen+oncelen>d->dlen) {
|
|
|
- xlen = d->dlen-rlen;
|
|
|
- }
|
|
|
- else {
|
|
|
- xlen = oncelen;
|
|
|
- }
|
|
|
- xlen += xlen%2;
|
|
|
+ pthread_mutex_lock(&cas->mutex3);
|
|
|
+ if(d->dlen>0) {
|
|
|
+ while(1) {
|
|
|
+ if(rlen+oncelen>d->dlen) {
|
|
|
+ xlen = d->dlen-rlen;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ xlen = oncelen;
|
|
|
+ }
|
|
|
+ xlen += xlen%2;
|
|
|
|
|
|
- r = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
|
|
|
- if(r<0) {
|
|
|
- LOGE("___ _mb_read failed, %s, rlen: %d\n", modbus_strerror(errno), rlen);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if(rlen+r*2>=d->dlen) {
|
|
|
- xlen = d->dlen-rlen;
|
|
|
- finish = 1;
|
|
|
- }
|
|
|
- else {
|
|
|
- xlen = r*2;
|
|
|
- }
|
|
|
+ r = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
|
|
|
+ if(r<0) {
|
|
|
+ LOGE("___ _mb_read failed, %s, rlen: %d\n", modbus_strerror(errno), rlen);
|
|
|
+ r = -1; break;
|
|
|
+ }
|
|
|
+ if(rlen+r*2>=d->dlen) {
|
|
|
+ xlen = d->dlen-rlen;
|
|
|
+ finish = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ xlen = r*2;
|
|
|
+ }
|
|
|
|
|
|
- memcpy((char*)d->data+rlen, buff, xlen);
|
|
|
- rlen += xlen;
|
|
|
+ memcpy((char*)d->data+rlen, buff, xlen);
|
|
|
+ rlen += xlen;
|
|
|
|
|
|
- if(finish) {
|
|
|
- break;
|
|
|
+ if(finish) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ else {
|
|
|
+ r = -1;
|
|
|
+ }
|
|
|
+ pthread_mutex_lock(&cas->mutex3);
|
|
|
|
|
|
- return 0;
|
|
|
+ return r;
|
|
|
}
|
|
|
static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
{
|
|
|
@@ -632,37 +634,38 @@ static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
|
|
|
int xlen,wlen=0,oncelen=MB_MAX_LEN;
|
|
|
uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
|
- if(d->dlen<=0) {
|
|
|
- //LOGE("___ mb_write dlen %d is wrong!\n", d->dlen);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- //LOGD("___ mb_write dlen: %d\n", d->dlen);
|
|
|
-
|
|
|
- while(1) {
|
|
|
- if(wlen+oncelen>d->dlen) {
|
|
|
- xlen = d->dlen-wlen;
|
|
|
- }
|
|
|
- else {
|
|
|
- xlen = oncelen;
|
|
|
- }
|
|
|
- xlen += xlen%2;
|
|
|
+ pthread_mutex_lock(&cas->mutex3);
|
|
|
+ if(d->dlen>0) {
|
|
|
+ while(1) {
|
|
|
+ if(wlen+oncelen>d->dlen) {
|
|
|
+ xlen = d->dlen-wlen;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ xlen = oncelen;
|
|
|
+ }
|
|
|
+ xlen += xlen%2;
|
|
|
|
|
|
- memcpy(buff, d->data+wlen, xlen);
|
|
|
- r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
|
|
|
- if(r<0) {
|
|
|
- LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d, %s\n", addr, CASCADE_REG_WRITE, xlen/2, modbus_strerror(errno));
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if(wlen+r*2>=d->dlen) {
|
|
|
- break;
|
|
|
- }
|
|
|
- else {
|
|
|
- xlen = r*2;
|
|
|
+ memcpy(buff, d->data+wlen, xlen);
|
|
|
+ r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
|
|
|
+ if(r<0) {
|
|
|
+ LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d, %s\n", addr, CASCADE_REG_WRITE, xlen/2, modbus_strerror(errno));
|
|
|
+ r = -1; break;
|
|
|
+ }
|
|
|
+ if(wlen+r*2>=d->dlen) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ xlen = r*2;
|
|
|
+ }
|
|
|
+ wlen += xlen;
|
|
|
}
|
|
|
- wlen += xlen;
|
|
|
}
|
|
|
+ else {
|
|
|
+ r = -1;
|
|
|
+ }
|
|
|
+ pthread_mutex_unlock(&cas->mutex3);
|
|
|
|
|
|
- return 0;
|
|
|
+ return r;
|
|
|
}
|
|
|
static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
|
|
|
{
|
|
|
@@ -730,7 +733,7 @@ static int mb_receive(cascade_handle_t *cas)
|
|
|
break;
|
|
|
|
|
|
|
|
|
- case CASCADE_CMD_OPEN_NF:
|
|
|
+ case CASCADE_CMD_OPEN_NF:
|
|
|
case CASCADE_CMD_CLOSE_NF:
|
|
|
{
|
|
|
cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
|
|
|
@@ -811,7 +814,7 @@ static int mb_receive(cascade_handle_t *cas)
|
|
|
case CASCADE_CMD_QUERY_HIS:break;
|
|
|
case CASCADE_CMD_QUERY_TOTAL:break;
|
|
|
case CASCADE_CMD_QUERY_TOTAL_PWR:break;
|
|
|
- case CASCADE_CMD_GET_BREAKER_INFO:
|
|
|
+ case CASCADE_CMD_BREAKER_GET_INFO:
|
|
|
{
|
|
|
LOGD("_____ slave breaker CASCADE_CMD_GET_INFO\n");
|
|
|
slave_breaker_info(cas);
|
|
|
@@ -1316,13 +1319,13 @@ static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
- case CASCADE_CMD_GET_BREAKER_INFO:
|
|
|
+ case CASCADE_CMD_BREAKER_GET_INFO:
|
|
|
{
|
|
|
wdata.dlen = sizeof(cmd_data_t);
|
|
|
wdata.data = (uint8_t*)cmd;
|
|
|
rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*CH_MAX;
|
|
|
rdata.data = (uint8_t*)&cas->sBreaker;
|
|
|
- LOGD("_____ master send CASCADE_CMD_GET_BREAKER_INFO\n");
|
|
|
+ LOGD("_____ master send CASCADE_CMD_BREAKER_GET_INFO\n");
|
|
|
r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
if(r==0) {
|
|
|
LOGD("______cas->info.cnt: %d\n", cas->sBreaker.cnt);
|
|
|
@@ -1689,7 +1692,6 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
|
|
|
if(cas->inited) {
|
|
|
mb_deinit(cas);
|
|
|
}
|
|
|
- cas->inited = 0;
|
|
|
cas->mInfo = *info;
|
|
|
//LOGD("master init modbus: port: %s, type: %d, baud: %d\n", CASCADE_MODBUS_PORT, info->mode, info->baudrate);
|
|
|
|
|
|
@@ -1699,7 +1701,7 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
|
|
|
LOGE("cascade modbus init error.\n");
|
|
|
return -1;
|
|
|
}
|
|
|
- cas->inited = 1;
|
|
|
+
|
|
|
if (cas->mInfo.mode==MODBUS_SLAVE)
|
|
|
{
|
|
|
for (size_t i = 1; i < CASCADE_MAX; i++)
|
|
|
@@ -1725,9 +1727,13 @@ int cascade_init(void)
|
|
|
if(r) {
|
|
|
LOGE("___ cascade mutex init failed\n");
|
|
|
}
|
|
|
- r = pthread_mutex_init(&cas->lock, NULL);
|
|
|
+ r = pthread_mutex_init(&cas->mutex2, NULL);
|
|
|
+ if(r) {
|
|
|
+ LOGE("___ cascade mutex2 init failed\n");
|
|
|
+ }
|
|
|
+ r = pthread_mutex_init(&cas->mutex3, NULL);
|
|
|
if(r) {
|
|
|
- LOGE("___ cascade lock init failed\n");
|
|
|
+ LOGE("___ cascade mutex3 init failed\n");
|
|
|
}
|
|
|
|
|
|
cas->scanAddr = 1;
|
|
|
@@ -1753,7 +1759,8 @@ int cascade_deinit(void)
|
|
|
thread_stop(THREAD_ID_CASCADE_SCAN);
|
|
|
|
|
|
pthread_mutex_destroy(&cas->mutex);
|
|
|
- pthread_mutex_destroy(&cas->lock);
|
|
|
+ pthread_mutex_destroy(&cas->mutex2);
|
|
|
+ pthread_mutex_destroy(&cas->mutex3);
|
|
|
modbus_mapping_free(cas->map);
|
|
|
|
|
|
mb_deinit(cas);
|
|
|
@@ -1836,9 +1843,9 @@ int cascade_request(cmd_data_t *cmd)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- pthread_mutex_lock(&cas->lock);
|
|
|
+ pthread_mutex_lock(&cas->mutex2);
|
|
|
r = master_cmd(cas, cmd);
|
|
|
- pthread_mutex_unlock(&cas->lock);
|
|
|
+ pthread_mutex_unlock(&cas->mutex2);
|
|
|
|
|
|
return r;
|
|
|
}
|