|
@@ -46,12 +46,13 @@ typedef struct {
|
|
|
int scanAddr;
|
|
int scanAddr;
|
|
|
|
|
|
|
|
slave_info_t sInfo; //current slave infomation
|
|
slave_info_t sInfo; //current slave infomation
|
|
|
-
|
|
|
|
|
|
|
+ breaker_info_t sBreaker;
|
|
|
handle_t list;
|
|
handle_t list;
|
|
|
}cascade_handle_t;
|
|
}cascade_handle_t;
|
|
|
|
|
|
|
|
int cur_dev_addr=0;
|
|
int cur_dev_addr=0;
|
|
|
static cascade_handle_t casHandle={.inited=0};
|
|
static cascade_handle_t casHandle={.inited=0};
|
|
|
|
|
+static cascade_handle_t casHandle_breaker={.inited=0};
|
|
|
static void* cmd_thread(void *arg);
|
|
static void* cmd_thread(void *arg);
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////
|
|
@@ -198,6 +199,40 @@ static int slave_get_info(cascade_handle_t *cas)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int slave_breaker_info(cascade_handle_t *cas)
|
|
|
|
|
+{
|
|
|
|
|
+ GlobalDeviceManager *dm=get_dm();
|
|
|
|
|
+ GlobalBreakerManager *temp = NULL;
|
|
|
|
|
+ breaker_info_t *breaker=&cas->sBreaker;
|
|
|
|
|
+ int cnt = 0;
|
|
|
|
|
+ //list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ if(!list_empty(&dm->g_new_global_breaker.list)) {
|
|
|
|
|
+ printf("isnot empty!!!!!\n");
|
|
|
|
|
+ list_for_each_entry(temp,&dm->g_new_global_breaker.list, list)
|
|
|
|
|
+ {
|
|
|
|
|
+ // printf("temp addr %ld temp->next = %ld temp->prev = %ld\n",tmp,tmp->list.prev,tmp->list.next);
|
|
|
|
|
+ breaker ->breaker_chn[cnt].product_id = temp->product_id;
|
|
|
|
|
+ breaker->breaker_chn[cnt].breaker_addrs = temp->breaker_gather_addr;
|
|
|
|
|
+ breaker->breaker_chn[cnt].breaker_status = temp->breaker_status;
|
|
|
|
|
+ breaker->breaker_chn[cnt].breaker_chn = temp->breaker_chn;
|
|
|
|
|
+ breaker->breaker_chn[cnt].breaker_id = temp->breaker_id;
|
|
|
|
|
+ strcpy(breaker->breaker_chn[cnt].breaker_gather_type, temp->breaker_gather_type);
|
|
|
|
|
+ strcpy(breaker->breaker_chn[cnt].breaker_com, temp->breaker_com);
|
|
|
|
|
+ strcpy(breaker->breaker_chn[cnt].breaker_switch_name, temp->breaker_switch_name);
|
|
|
|
|
+ strcpy(breaker->breaker_chn[cnt].breaker_chns_name, temp->breaker_chns_name);
|
|
|
|
|
+ cnt++;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ breaker->cnt = cnt;
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+
|
|
|
|
|
+ LOGD("___ slave_breaker_info, breaker_all: saddr=0x%x %d\n",(uint32_t)dm,breaker->cnt);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int get_pwr_info(int chId, GlobalPowerManger *power)
|
|
static int get_pwr_info(int chId, GlobalPowerManger *power)
|
|
|
{
|
|
{
|
|
|
int i;
|
|
int i;
|
|
@@ -221,6 +256,170 @@ static int get_pwr_info(int chId, GlobalPowerManger *power)
|
|
|
|
|
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+static int slave_breaker_update(cascade_breaker_update_t *data)
|
|
|
|
|
+{
|
|
|
|
|
+ int ret = -1;
|
|
|
|
|
+ if(data)
|
|
|
|
|
+ {
|
|
|
|
|
+ GlobalDeviceManager *dm=get_dm();
|
|
|
|
|
+ GlobalBreakerManager *temp= NULL;
|
|
|
|
|
+ GlobalBreakerManager *pos= NULL;
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ if(!list_empty(&dm->g_new_global_breaker.list)) {
|
|
|
|
|
+
|
|
|
|
|
+ list_for_each_entry_safe(temp,pos,&dm->g_new_global_breaker.list,list)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(temp->breaker_id == data->switch_id)
|
|
|
|
|
+ {
|
|
|
|
|
+ strcpy(temp->breaker_switch_name,data->switch_name);
|
|
|
|
|
+ strcpy(temp->breaker_chns_name,data->breaker_chns);
|
|
|
|
|
+ dev_update_breaker_genera_manage(dm->db,
|
|
|
|
|
+ dm->_global_device_info->product_id,data->switch_id,temp);
|
|
|
|
|
+ ret = 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static int slave_breaker_delete(cascade_braeker_delete_t *data)
|
|
|
|
|
+{
|
|
|
|
|
+ int ret = -1;
|
|
|
|
|
+ if(data)
|
|
|
|
|
+ {
|
|
|
|
|
+ GlobalDeviceManager *dm=get_dm();
|
|
|
|
|
+ GlobalBreakerManager *temp= NULL;
|
|
|
|
|
+ GlobalBreakerManager *pos= NULL;
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ if(!list_empty(&dm->g_new_global_breaker.list)) {
|
|
|
|
|
+
|
|
|
|
|
+ list_for_each_entry_safe(temp,pos,&dm->g_new_global_breaker.list,list)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("new data !!!!\n");
|
|
|
|
|
+
|
|
|
|
|
+ if(temp == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(temp->breaker_id == data->switch_id)
|
|
|
|
|
+ {
|
|
|
|
|
+ dev_delete_breaker_manage(dm->db,dm->_global_device_info->product_id,data->switch_id);
|
|
|
|
|
+ list_del(&temp->list);
|
|
|
|
|
+ free(temp);
|
|
|
|
|
+ if(!list_empty(&dm->g_new_global_breaker.list))
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("hellosda\n");
|
|
|
|
|
+ }
|
|
|
|
|
+ ret = 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+static int slave_breaker_add(cascade_breaker_add_t *data)
|
|
|
|
|
+{
|
|
|
|
|
+ int r = -1;
|
|
|
|
|
+ if(!data)
|
|
|
|
|
+ {
|
|
|
|
|
+ goto quit;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ GlobalDeviceManager *dm=get_dm();
|
|
|
|
|
+ char buff[124] = {0};
|
|
|
|
|
+ char id[MAX_BREAKER_ID] = {0};
|
|
|
|
|
+ //bianli shujujiegou
|
|
|
|
|
+ GlobalBreakerManager *temp = NULL;
|
|
|
|
|
+ int i = 1;
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
|
|
|
|
|
+ {
|
|
|
|
|
+ id[temp->breaker_id] = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+ for(;i < MAX_BREAKER_ID;i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(id[i] == 0)
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(i > MAX_BREAKER_ID)
|
|
|
|
|
+ {
|
|
|
|
|
+ goto quit;
|
|
|
|
|
+ }
|
|
|
|
|
+ GlobalBreakerManager *breakerManager = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
|
|
|
|
|
+ memset(breakerManager,0,sizeof(GlobalBreakerManager));
|
|
|
|
|
+ breakerManager->product_id = __globalDeviceManage._global_device_info->product_id;
|
|
|
|
|
+ breakerManager->breaker_gather_addr = data->cjdz;
|
|
|
|
|
+ strcpy(breakerManager->breaker_com,data->com);
|
|
|
|
|
+ strcpy(breakerManager->breaker_gather_type,data->cjfs);
|
|
|
|
|
+ strcpy(breakerManager->breaker_chns_name,data->breaker_chns);
|
|
|
|
|
+
|
|
|
|
|
+ breakerManager->breaker_id = i;
|
|
|
|
|
+ sprintf(buff,"Breaker_%d",breakerManager->breaker_id);
|
|
|
|
|
+ strcpy(breakerManager->breaker_switch_name,buff);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ uint32_t jdh = data->jdh;
|
|
|
|
|
+
|
|
|
|
|
+ if(jdh > MAX_BREAKER_CHN)
|
|
|
|
|
+ {
|
|
|
|
|
+ goto quit2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ char jdh_flag = 0;
|
|
|
|
|
+
|
|
|
|
|
+ char chn[MAX_BREAKER_CHN] = {0};
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
|
|
|
|
|
+ {
|
|
|
|
|
+ chn[temp->breaker_chn-1] = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+
|
|
|
|
|
+ if(chn[jdh-1] != 1)
|
|
|
|
|
+ {
|
|
|
|
|
+ breakerManager->breaker_chn = jdh;
|
|
|
|
|
+ }else
|
|
|
|
|
+ {
|
|
|
|
|
+ jdh_flag = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(jdh_flag == 1)
|
|
|
|
|
+ {
|
|
|
|
|
+ goto quit2;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ dev_insert_breaker_genera_manage(dm->db,breakerManager);
|
|
|
|
|
+ pthread_mutex_lock(&dm->_breaker_mutex);
|
|
|
|
|
+ list_add_tail(&breakerManager->list,&dm->g_new_global_breaker.list);
|
|
|
|
|
+ pthread_mutex_unlock(&dm->_breaker_mutex);
|
|
|
|
|
+ r = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return r;
|
|
|
|
|
+
|
|
|
|
|
+quit2:
|
|
|
|
|
+ free(breakerManager);
|
|
|
|
|
+ breakerManager = NULL;
|
|
|
|
|
+quit:
|
|
|
|
|
+ return r;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
static int slave_save(cascade_handle_t *cas)
|
|
static int slave_save(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
int r;
|
|
int r;
|
|
@@ -543,6 +742,26 @@ static int mb_receive(cascade_handle_t *cas)
|
|
|
slave_save(cas);
|
|
slave_save(cas);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_ADD:
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_ADD\n");
|
|
|
|
|
+ LOGD("%d %d %s %s %s\n",cmd->datas.data.jdh,cmd->datas.data.cjdz,cmd->datas.data.cjfs,cmd->datas.data.com,cmd->datas.data.breaker_chns);
|
|
|
|
|
+ slave_breaker_add(&cmd->datas.data);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_UPDATE:
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_UPDATE\n");
|
|
|
|
|
+ LOGD("%d %s %s\n",cmd->datas.data1.switch_id,cmd->datas.data1.switch_name,cmd->datas.data1.breaker_chns);
|
|
|
|
|
+ slave_breaker_update(&cmd->datas.data1);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_DELETE:
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_DELETE\n");
|
|
|
|
|
+ slave_breaker_delete(&cmd->datas.data2);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
r = _mb_reply(cas, buff, rc, cas->map);
|
|
r = _mb_reply(cas, buff, rc, cas->map);
|
|
@@ -563,6 +782,13 @@ static int mb_receive(cascade_handle_t *cas)
|
|
|
memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->sInfo+sendlen, h.regcnt*2);
|
|
memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->sInfo+sendlen, h.regcnt*2);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_QUERY:
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
|
|
|
|
|
+ slave_breaker_info(cas);
|
|
|
|
|
+ memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->sBreaker)+sendlen, h.regcnt*2);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
|
|
|
case CASCADE_CMD_QUERY_CH:
|
|
case CASCADE_CMD_QUERY_CH:
|
|
|
{
|
|
{
|
|
@@ -580,6 +806,13 @@ static int mb_receive(cascade_handle_t *cas)
|
|
|
case CASCADE_CMD_QUERY_HIS:break;
|
|
case CASCADE_CMD_QUERY_HIS:break;
|
|
|
case CASCADE_CMD_QUERY_TOTAL:break;
|
|
case CASCADE_CMD_QUERY_TOTAL:break;
|
|
|
case CASCADE_CMD_QUERY_TOTAL_PWR:break;
|
|
case CASCADE_CMD_QUERY_TOTAL_PWR:break;
|
|
|
|
|
+ case CASCADE_CMD_GET_BREAKER_INFO:
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGD("_____ slave breaker CASCADE_CMD_GET_INFO\n");
|
|
|
|
|
+ slave_breaker_info(cas);
|
|
|
|
|
+ memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->sBreaker)+sendlen, h.regcnt*2);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
r = _mb_reply(cas, buff, rc, cas->map);
|
|
r = _mb_reply(cas, buff, rc, cas->map);
|
|
@@ -659,6 +892,14 @@ static int power_init(cascade_handle_t *cas)
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
+static int breaker_slave_init(void)
|
|
|
|
|
+{
|
|
|
|
|
+ //GlobalDeviceManager *dm=get_dm();
|
|
|
|
|
+ GlobalDeviceManager *dm2=get_dm2();
|
|
|
|
|
+ INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
|
|
|
|
|
+ pthread_mutex_init(&dm2->_breaker_mutex,NULL);
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
static int power_deinit(cascade_handle_t *cas)
|
|
static int power_deinit(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
GlobalDeviceManager *dm2=get_dm2();
|
|
GlobalDeviceManager *dm2=get_dm2();
|
|
@@ -721,6 +962,33 @@ static int power_clear(cascade_handle_t *cas)
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+static int breaker_clear(cascade_handle_t *cas)
|
|
|
|
|
+{
|
|
|
|
|
+ GlobalDeviceManager *dm2=get_dm2();
|
|
|
|
|
+
|
|
|
|
|
+ GlobalBreakerManager *temp = NULL;
|
|
|
|
|
+ GlobalBreakerManager *pos = NULL;
|
|
|
|
|
+ pthread_mutex_lock(&dm2->_breaker_mutex);
|
|
|
|
|
+ if(!list_empty(&dm2->g_new_global_breaker.list)) {
|
|
|
|
|
+ list_for_each_entry_safe(temp,pos,&dm2->g_new_global_breaker.list,list)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(temp == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ list_del(&temp->list);
|
|
|
|
|
+ free(temp);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
|
|
|
|
|
+ pthread_mutex_unlock(&dm2->_breaker_mutex);
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
static int power_add(cascade_handle_t *cas)
|
|
static int power_add(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
int i,j,nTac_chn=0,r=-1;
|
|
int i,j,nTac_chn=0,r=-1;
|
|
@@ -820,6 +1088,76 @@ static int power_add(cascade_handle_t *cas)
|
|
|
quit:
|
|
quit:
|
|
|
return r;
|
|
return r;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+static int breaker_add(cascade_handle_t *cas)
|
|
|
|
|
+{
|
|
|
|
|
+ int i,j,r=-1;
|
|
|
|
|
+ //GlobalDeviceManager *dm1=get_dm();
|
|
|
|
|
+ GlobalDeviceManager *dm2=get_dm2();
|
|
|
|
|
+ GlobalBreakerManager *tmp=NULL;
|
|
|
|
|
+ breaker_info_t *info=&cas->sBreaker;
|
|
|
|
|
+ //cascade_lock();
|
|
|
|
|
+ breaker_clear(cas);
|
|
|
|
|
+ pthread_mutex_lock(&dm2->_breaker_mutex);
|
|
|
|
|
+ for(i=0; i<info->cnt; i++) {
|
|
|
|
|
+ tmp = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
|
|
|
|
|
+ if(!tmp) {
|
|
|
|
|
+ LOGE("tmp malloc error.\n");
|
|
|
|
|
+ goto quit;
|
|
|
|
|
+ }
|
|
|
|
|
+ memset(tmp, 0, sizeof(GlobalBreakerManager));
|
|
|
|
|
+ tmp->product_id = cur_dev_addr;
|
|
|
|
|
+ tmp->breaker_chn = info->breaker_chn[i].breaker_chn;
|
|
|
|
|
+ tmp->breaker_status = info->breaker_chn[i].breaker_status;
|
|
|
|
|
+ tmp->breaker_gather_addr = info->breaker_chn[i].breaker_addrs;
|
|
|
|
|
+ tmp->breaker_id = info->breaker_chn[i].breaker_id;
|
|
|
|
|
+ strcpy(tmp->breaker_gather_type, info->breaker_chn[i].breaker_gather_type);
|
|
|
|
|
+ strcpy(tmp->breaker_com, info->breaker_chn[i].breaker_com);
|
|
|
|
|
+ strcpy(tmp->breaker_chns_name, info->breaker_chn[i].breaker_chns_name);
|
|
|
|
|
+ strcpy(tmp->breaker_switch_name, info->breaker_chn[i].breaker_switch_name);
|
|
|
|
|
+ list_add_tail(&tmp->list,&dm2->g_new_global_breaker.list);
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm2->_breaker_mutex);
|
|
|
|
|
+ //cascade_unlock();
|
|
|
|
|
+ r = 0;
|
|
|
|
|
+quit:
|
|
|
|
|
+ return r;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static int breaker_update(cascade_handle_t *cas)
|
|
|
|
|
+{
|
|
|
|
|
+ GlobalBreakerManager *tmp=NULL;
|
|
|
|
|
+ GlobalBreakerManager *tmp3=NULL;
|
|
|
|
|
+ GlobalDeviceManager *dm2=get_dm2();
|
|
|
|
|
+ breaker_info_t *info=&cas->sBreaker;
|
|
|
|
|
+ int cnt = 0;
|
|
|
|
|
+ LOGD("______ breaker_update, %d\n", info->cnt);
|
|
|
|
|
+ if(info->cnt==0) {
|
|
|
|
|
+ LOGE("___ sBreaker.cnt is 0\n");
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(!list_empty(&dm2->g_new_global_breaker.list)) {
|
|
|
|
|
+ cnt = 0;
|
|
|
|
|
+ pthread_mutex_lock(&dm2->_breaker_mutex);
|
|
|
|
|
+ list_for_each_entry_safe(tmp,tmp3,&dm2->g_new_global_breaker.list,list)
|
|
|
|
|
+ {
|
|
|
|
|
+ tmp->breaker_id = info->breaker_chn[cnt].breaker_id;
|
|
|
|
|
+ tmp->breaker_status = info->breaker_chn[cnt].breaker_status;
|
|
|
|
|
+ tmp->breaker_gather_addr = info->breaker_chn[cnt].breaker_addrs;
|
|
|
|
|
+ strcpy(tmp->breaker_gather_type, info->breaker_chn[cnt].breaker_gather_type);
|
|
|
|
|
+ strcpy(tmp->breaker_com, info->breaker_chn[cnt].breaker_com);
|
|
|
|
|
+ strcpy(tmp->breaker_chns_name, info->breaker_chn[cnt].breaker_chns_name);
|
|
|
|
|
+ strcpy(tmp->breaker_switch_name, info->breaker_chn[cnt].breaker_switch_name);
|
|
|
|
|
+ cnt++;
|
|
|
|
|
+ }
|
|
|
|
|
+ pthread_mutex_unlock(&dm2->_breaker_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
static int power_update(cascade_handle_t *cas)
|
|
static int power_update(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
int cnt=0;
|
|
int cnt=0;
|
|
@@ -981,7 +1319,35 @@ static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
-
|
|
|
|
|
|
|
+ case CASCADE_CMD_GET_BREAKER_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");
|
|
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
|
|
+ if(r==0) {
|
|
|
|
|
+ LOGD("______cas->info.cnt: %d\n", cas->sBreaker.cnt);
|
|
|
|
|
+ rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
|
|
|
|
|
+ rdata.data = (uint8_t*)&cas->sBreaker;
|
|
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
|
|
+ if(r==0) {
|
|
|
|
|
+ // power_add(cas);
|
|
|
|
|
+ breaker_add(cas);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_UPDATE:
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_DELETE:
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_SAVE_ADD:
|
|
|
|
|
+ {
|
|
|
|
|
+ wdata.dlen = sizeof(cmd_data_t);
|
|
|
|
|
+ wdata.data = (uint8_t*)cmd;
|
|
|
|
|
+ r = mb_write(cas, cur_dev_addr, &wdata);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
default:
|
|
default:
|
|
|
cas->cmd = *cmd;
|
|
cas->cmd = *cmd;
|
|
|
r = 0;
|
|
r = 0;
|
|
@@ -1020,13 +1386,40 @@ static int master_query(cascade_handle_t *cas)
|
|
|
r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
if(r==0) {
|
|
if(r==0) {
|
|
|
power_update(cas);
|
|
power_update(cas);
|
|
|
|
|
+ cmd->cmd = CASCADE_CMD_BREAKER_QUERY;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
|
|
LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
-
|
|
|
|
|
|
|
+ case CASCADE_CMD_BREAKER_QUERY:
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ 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;
|
|
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
|
|
+ LOGD("____ master query CASCADE_CMD_BREAKER_QUERY, cnt: %d\n", cas->sBreaker.cnt);
|
|
|
|
|
+ if(cas->sBreaker.cnt == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ breaker_clear(cas);
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+ rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
|
|
|
|
|
+ rdata.data = (uint8_t*)&cas->sBreaker;
|
|
|
|
|
+ r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
|
|
|
|
|
+ if(r == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ breaker_add(cas);
|
|
|
|
|
+ cmd->cmd = CASCADE_CMD_QUERY_CH;
|
|
|
|
|
+ }else
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGE("____ master query CASCADE_CMD_BREAKER_QUERY failed\n");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
case CASCADE_CMD_QUERY_VOL:
|
|
case CASCADE_CMD_QUERY_VOL:
|
|
|
{
|
|
{
|
|
|
if(cmd->obj==OBJ_CHANNEL) {
|
|
if(cmd->obj==OBJ_CHANNEL) {
|
|
@@ -1163,11 +1556,15 @@ 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) { //主模
|
|
|
|
|
+ cascade_lock();
|
|
|
r = master_query(cas);
|
|
r = master_query(cas);
|
|
|
|
|
+ cascade_unlock();
|
|
|
sleep(1);
|
|
sleep(1);
|
|
|
}
|
|
}
|
|
|
else { //从模式,等待主设备发起数据请�?
|
|
else { //从模式,等待主设备发起数据请�?
|
|
|
|
|
+ cascade_lock();
|
|
|
r = slave_receive(cas);
|
|
r = slave_receive(cas);
|
|
|
|
|
+ cascade_unlock();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1279,10 +1676,13 @@ int cascade_init(void)
|
|
|
int r=0;
|
|
int r=0;
|
|
|
list_cfg_t lc;
|
|
list_cfg_t lc;
|
|
|
cascade_handle_t *cas=&casHandle;
|
|
cascade_handle_t *cas=&casHandle;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
|
|
|
memset(cas, 0, sizeof(casHandle));
|
|
memset(cas, 0, sizeof(casHandle));
|
|
|
|
|
|
|
|
power_init(cas);
|
|
power_init(cas);
|
|
|
|
|
+ breaker_slave_init();
|
|
|
slave_init(cas);
|
|
slave_init(cas);
|
|
|
|
|
|
|
|
r = pthread_mutex_init(&cas->mutex, NULL);
|
|
r = pthread_mutex_init(&cas->mutex, NULL);
|