|
|
@@ -11,23 +11,17 @@
|
|
|
#if 0
|
|
|
#define LOGD log_d
|
|
|
#define LOGE log_e
|
|
|
+#define LOGW log_w
|
|
|
#else
|
|
|
#define LOGD printf
|
|
|
#define LOGE printf
|
|
|
+#define LOGW printf
|
|
|
#endif
|
|
|
|
|
|
-#define ERR_MAX 5
|
|
|
-#define CASCADE_MAX 10
|
|
|
-//#define CASCADE_MAX 100
|
|
|
-
|
|
|
+#define CASCADE_MAX 32
|
|
|
#define MB_MAX_LEN 250
|
|
|
|
|
|
|
|
|
-typedef struct {
|
|
|
- uint8_t addr;
|
|
|
- int err; //err times
|
|
|
-}slave_t;
|
|
|
-
|
|
|
typedef struct {
|
|
|
|
|
|
handle_t l;
|
|
|
@@ -38,14 +32,12 @@ typedef struct {
|
|
|
modbus_mapping_t *map;
|
|
|
uint8_t query[MODBUS_RTU_MAX_ADU_LENGTH];
|
|
|
|
|
|
- int addr; //self addr
|
|
|
- int saddr; //current slave addr
|
|
|
+ slave_t slaves[CASCADE_MAX+1];
|
|
|
+ int scanAddr;
|
|
|
}cascade_handle_t;
|
|
|
|
|
|
int cur_dev_addr=0;
|
|
|
static cascade_handle_t casHandle={.inited=0};
|
|
|
-static int add_slave(cascade_handle_t *cas, int addr);
|
|
|
-
|
|
|
|
|
|
|
|
|
static inline GlobalDeviceManager* get_dm(void)
|
|
|
@@ -56,10 +48,47 @@ static inline GlobalDeviceManager* get_dm2(void)
|
|
|
{
|
|
|
return &__globalDeviceManage2;
|
|
|
}
|
|
|
-static inline GlobalDeviceInfo *get_dev(void)
|
|
|
+static inline ModbusInfo_t *get_mb(void)
|
|
|
+{
|
|
|
+ return &get_dm()->_global_device_info->_gmodbus_info;
|
|
|
+}
|
|
|
+static int slave_init(cascade_handle_t *cas)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ for(i=0; i<=CASCADE_MAX; i++) {
|
|
|
+ cas->slaves[i].addr = -1;
|
|
|
+ cas->slaves[i].err = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+static int slave_add(cascade_handle_t *cas, int addr)
|
|
|
+{
|
|
|
+ cas->slaves[addr].addr = addr;
|
|
|
+ cas->slaves[addr].err = 0;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+static int slave_cnt(cascade_handle_t *cas)
|
|
|
{
|
|
|
- return ¶s_get()->dev;
|
|
|
+ int i,cnt=0;
|
|
|
+ for(i=1; i<=CASCADE_MAX; i++) {
|
|
|
+ if(cas->slaves[i].addr>=0) {
|
|
|
+ cnt++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return cnt;
|
|
|
}
|
|
|
+static slave_t* slave_get(cascade_handle_t *cas, int addr)
|
|
|
+{
|
|
|
+ return &cas->slaves[addr];
|
|
|
+}
|
|
|
+static int slave_find(cascade_handle_t *cas, int addr)
|
|
|
+{
|
|
|
+ if(cas->slaves[addr].addr>=0) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int mbus_init(cascade_handle_t *cas, char *path, int mode, int addr, uint32_t baud)
|
|
|
{
|
|
|
int r;
|
|
|
@@ -143,50 +172,26 @@ static int mbus_receive(cascade_handle_t *cas)
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
-static int find_addr_fn(handle_t l, node_t *node, node_t *xd, void *arg, int *act)
|
|
|
-{
|
|
|
- slave_t *s1 = (slave_t*)node->buf;
|
|
|
- slave_t *s2 = (slave_t*)xd->buf;
|
|
|
-
|
|
|
- if(s1->addr==s2->addr) {
|
|
|
- *act = LIST_ACT_STOP;
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-static int find_addr(cascade_handle_t *cas, int addr)
|
|
|
-{
|
|
|
- int r=0;
|
|
|
- slave_t sl={addr,0};
|
|
|
- node_t nod={0,&sl,sizeof(sl),sizeof(sl)};
|
|
|
-
|
|
|
- r = xlist_iterator(cas->l, &nod, find_addr_fn, NULL);
|
|
|
- if(r<0) r=0;
|
|
|
-
|
|
|
- return r;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
static int cascade_scan(cascade_handle_t *cas)
|
|
|
{
|
|
|
- int i,r=0 ;
|
|
|
- uint16_t tmp[100];
|
|
|
-
|
|
|
- for(i=1; i<CASCADE_MAX; i++) {
|
|
|
- if(find_addr(cas, i)) {
|
|
|
- //LOGD("___slave 0x%02x is in the list\n", i);
|
|
|
- continue;
|
|
|
- }
|
|
|
+ int r=0 ;
|
|
|
+ uint16_t tmp[10];
|
|
|
|
|
|
- r = mbus_read(cas, i, 6000, tmp, 1);
|
|
|
+ if(!slave_find(cas, cas->scanAddr)) {
|
|
|
+ r = mbus_read(cas, cas->scanAddr, 6000, tmp, 1);
|
|
|
if(r>0) {
|
|
|
- LOGD("____ find slave %d\n", i);
|
|
|
- add_slave(cas, i);
|
|
|
+ LOGD("____ find slave %d\n", cas->scanAddr);
|
|
|
+ slave_add(cas, cas->scanAddr);
|
|
|
}
|
|
|
else {
|
|
|
- //LOGD("____ scan slave %d fail, %s\n", i, modbus_strerror(errno));
|
|
|
+ LOGD("____ scan slave %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ cas->scanAddr++;
|
|
|
+ if(cas->scanAddr>CASCADE_MAX) {
|
|
|
+ cas->scanAddr = 1;
|
|
|
+ }
|
|
|
//print_slave(cas);
|
|
|
|
|
|
return 0;
|
|
|
@@ -239,11 +244,11 @@ static void print_sensor(char *s, sensor_data_t *ss)
|
|
|
LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
|
|
|
LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
|
|
|
LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
|
|
|
+ LOGD("__%s__ ss.status: %f\n", s, ss->pwr.status);
|
|
|
|
|
|
LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
|
|
|
LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
|
|
|
LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
|
|
|
- LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
|
|
|
LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
|
|
|
LOGD("\n");
|
|
|
|
|
|
@@ -259,7 +264,6 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
|
|
|
if(addr<=0) {
|
|
|
return -1;
|
|
|
}
|
|
|
-
|
|
|
|
|
|
r = mbus_read(cas, addr, offset, temp, cnt);
|
|
|
if(r!=cnt) {
|
|
|
@@ -276,11 +280,11 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
|
|
|
ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
|
|
|
ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
|
|
|
ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
|
|
|
+ ss->pwr.status = temp[20];
|
|
|
|
|
|
ss->temprature = VALUE_OF(temp,15,14)/1000.0;
|
|
|
ss->humidity = VALUE_OF(temp,17,16)/1000.0;
|
|
|
ss->warning = VALUE_OF(temp,19,18)/1000.0;
|
|
|
- ss->power_status = temp[20];
|
|
|
ss->sensor_status = temp[21];
|
|
|
|
|
|
//print_sensor("11", ss);
|
|
|
@@ -302,14 +306,17 @@ static int master_request(cascade_handle_t *cas)
|
|
|
|
|
|
if(tmp) {
|
|
|
sensor_data_t sdat;
|
|
|
+ slave_t *sl=slave_get(cas, cur_dev_addr);
|
|
|
|
|
|
//LOGD("___ master request slave %d\n", cur_dev_addr);
|
|
|
r = power_get(cas, cur_dev_addr, &sdat);
|
|
|
if(r==0) {
|
|
|
tmp->_PowerInfo = sdat.pwr;
|
|
|
+ sl->err = 0;
|
|
|
}
|
|
|
else {
|
|
|
- //err++
|
|
|
+ sl->err++;
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -319,7 +326,7 @@ 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_dev()->_gmodbus_info;
|
|
|
+ ModbusInfo_t *info=get_mb();
|
|
|
|
|
|
//rc = mbus_receive(cas, &h);
|
|
|
if (rc>0) {
|
|
|
@@ -335,7 +342,7 @@ static void* cascade_thread(void *arg)
|
|
|
int r;
|
|
|
thread_handle_t *h=(thread_handle_t*)arg;
|
|
|
cascade_handle_t *cas=(cascade_handle_t*)h->arg;
|
|
|
- ModbusInfo_t *info=&get_dev()->_gmodbus_info;
|
|
|
+ ModbusInfo_t *info=get_mb();
|
|
|
|
|
|
LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
|
|
|
while(h->quit==0) {
|
|
|
@@ -356,10 +363,9 @@ static void* scan_thread(void *arg)
|
|
|
int r;
|
|
|
thread_handle_t *h=(thread_handle_t*)arg;
|
|
|
cascade_handle_t *cas=(cascade_handle_t*)h->arg;
|
|
|
- ModbusInfo_t *info=&get_dev()->_gmodbus_info;
|
|
|
|
|
|
while(h->quit==0) {
|
|
|
- if(info->product_modbus_type==0) { //master
|
|
|
+ if(get_mb()->product_modbus_type==0) { //master
|
|
|
r = cascade_scan(cas);
|
|
|
}
|
|
|
sleep(1);
|
|
|
@@ -386,39 +392,15 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-static int add_slave(cascade_handle_t *cas, int addr)
|
|
|
-{
|
|
|
- int r,tmp=addr;
|
|
|
- r = xlist_append(cas->l, 0, &tmp, sizeof(tmp));
|
|
|
- if(r) {
|
|
|
- LOGE("___ add slave %d failed\n", addr);
|
|
|
- }
|
|
|
- return r;
|
|
|
-}
|
|
|
-static int add_slaves(cascade_handle_t *cas, int s, int e)
|
|
|
-{
|
|
|
- int i,r;
|
|
|
- for(i=s; i<=e; i++) {
|
|
|
- r = add_slave(cas, i);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
int cascade_init(void)
|
|
|
{
|
|
|
int r=0;
|
|
|
list_cfg_t lc;
|
|
|
cascade_handle_t *cas=&casHandle;
|
|
|
- ModbusInfo_t *info=&get_dm()->_global_device_info->_gmodbus_info;
|
|
|
|
|
|
- paras_load();
|
|
|
power_init();
|
|
|
-
|
|
|
- lc.log = 0;
|
|
|
- lc.max = CASCADE_MAX;
|
|
|
- lc.mode = LIST_FULL_FIFO;
|
|
|
- cas->l = xlist_init(&lc);
|
|
|
+ slave_init(cas);
|
|
|
|
|
|
cas->map = modbus_mapping_new(
|
|
|
MODBUS_MAX_READ_BITS,
|
|
|
@@ -426,9 +408,10 @@ int cascade_init(void)
|
|
|
MAX_READ_REGS,
|
|
|
MAX_WRITE_REGS
|
|
|
);
|
|
|
- set_modbus(cas, info);
|
|
|
+ cas->scanAddr = 1;
|
|
|
|
|
|
- add_slave(cas, 0);
|
|
|
+ set_modbus(cas, get_mb());
|
|
|
+ slave_add(cas, 0);
|
|
|
|
|
|
sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
|
|
|
sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
|
|
|
@@ -449,32 +432,28 @@ int cascade_set_modbus(ModbusInfo_t *info)
|
|
|
}
|
|
|
|
|
|
|
|
|
- static int dlist_fn(handle_t l, node_t *node, node_t *xd, void *arg, int *act)
|
|
|
-{
|
|
|
- slave_t *s=(slave_t*)xd->buf;
|
|
|
- dev_list_t *dl=(dev_list_t*)arg;
|
|
|
-
|
|
|
- dl->addr[dl->cnt++] = s->addr;
|
|
|
- return 0;
|
|
|
-}
|
|
|
int cascade_get_dlist(dev_list_t *dl)
|
|
|
{
|
|
|
- int *p=NULL;
|
|
|
+ int i,cnt=0;
|
|
|
+ slave_t *sl=NULL;
|
|
|
cascade_handle_t *cas=&casHandle;
|
|
|
- int sz=xlist_size(cas->l);
|
|
|
|
|
|
if(!dl) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- p = (int*)malloc(sizeof(int)*(sz+1));
|
|
|
- if(!p) {
|
|
|
+ sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
|
|
|
+ if(!sl) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- dl->addr = p;
|
|
|
- dl->cnt = 0;
|
|
|
- xlist_iterator(cas->l, NULL, dlist_fn, dl);
|
|
|
+ for(i=0; i<=CASCADE_MAX; i++) {
|
|
|
+ if(cas->slaves[i].addr>=0) {
|
|
|
+ sl[cnt++] = cas->slaves[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dl->slave = sl;
|
|
|
+ dl->cnt = cnt;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -484,7 +463,7 @@ int cascade_free_dlist(dev_list_t *dl)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- free(dl->addr);
|
|
|
+ free(dl->slave);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -499,13 +478,17 @@ int cascade_request(int addr)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- cas->saddr = addr;
|
|
|
r = master_request(cas);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
|
|
|
+int cascade_is_offline(int addr)
|
|
|
+{
|
|
|
+ slave_t *sl=slave_get(&casHandle, addr);
|
|
|
|
|
|
+ return (sl->addr>=ERR_MAX)?1:0;
|
|
|
+}
|
|
|
|
|
|
|