|
|
@@ -52,6 +52,20 @@ static void mem_swap(void *buf, int len)
|
|
|
pbuf[i+1] = tmp;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+static int mb_get_timeout(Modbus_Manger *mm)
|
|
|
+{
|
|
|
+ int r,timeout=0;;
|
|
|
+ r = g_modbus_get_timeout(mm, &timeout);
|
|
|
+ if(r) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return timeout;
|
|
|
+}
|
|
|
+static int mb_set_timeout(Modbus_Manger *mm, int timeout)
|
|
|
+{
|
|
|
+ return g_modbus_set_timeout(mm, timeout);
|
|
|
+}
|
|
|
static int mb_read(Modbus_Manger *mm, uint16_t addr, uint16_t reg, void *data, int len)
|
|
|
{
|
|
|
int r,cnt=(len+len%2)/2;
|
|
|
@@ -66,6 +80,98 @@ static int mb_write(Modbus_Manger *mm, uint16_t addr, uint16_t reg, void *data,
|
|
|
int r,cnt=(len+len%2)/2;
|
|
|
return g_modbus_write_x_reg(mm, addr, reg, cnt, data);
|
|
|
}
|
|
|
+///////////////////////////////////////////////////////////////////////
|
|
|
+enum {
|
|
|
+ ONLINE=0,
|
|
|
+ OFFLINE,
|
|
|
+ UPGRADING,
|
|
|
+ UPGRADE_OK,
|
|
|
+ UPGRADE_FAIL,
|
|
|
+};
|
|
|
+typedef struct {
|
|
|
+ char path[200]; int flag;
|
|
|
+}upgrade_arg_t;
|
|
|
+static upgrade_arg_t upg_arg;
|
|
|
+static board_list_t brd_list={0},upg_list={0};
|
|
|
+board_list_t *board_upgrade_list_get(void)
|
|
|
+{
|
|
|
+ return &upg_list;
|
|
|
+}
|
|
|
+int board_upgrade_list_set(char *s)
|
|
|
+{
|
|
|
+ int i=0,n=0,max=0;
|
|
|
+ char tmp[10],*p=s;
|
|
|
+ char *tok="productId=";
|
|
|
+ board_list_t *l=&upg_list;
|
|
|
+
|
|
|
+ if(!s) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ memset(l, 0, sizeof(board_list_t));
|
|
|
+
|
|
|
+ max = sizeof(l->info)/sizeof(l->info[0]);
|
|
|
+ p = strstr(p, tok);
|
|
|
+ if(!p) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ while(1) {
|
|
|
+ if((*p)==',' || (*p)=='&') {
|
|
|
+ tmp[i] = 0;
|
|
|
+ l->info[n].addr = atoi(tmp);
|
|
|
+ i = 0; n++;
|
|
|
+
|
|
|
+ if((*p)=='&' || n>=max) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ tmp[i++] = *p;
|
|
|
+ }
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+ l->cnt = n;
|
|
|
+
|
|
|
+ return (n>0)?0:-1;
|
|
|
+}
|
|
|
+int board_upgrade_status_set(int addr, int status)
|
|
|
+{
|
|
|
+ int r=-1;
|
|
|
+ board_list_t *l=&upg_list;
|
|
|
+ for(int i=0; i<l->cnt; i++) {
|
|
|
+ if(addr>0) {
|
|
|
+ if(l->info[i].addr==addr) {
|
|
|
+ l->info[i].status = status;
|
|
|
+ r = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ l->info[i].status = status;
|
|
|
+ r = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return r;
|
|
|
+}
|
|
|
+int board_list_get(board_list_t *list)
|
|
|
+{
|
|
|
+ int max=0;
|
|
|
+ board_list_t *l=&brd_list;
|
|
|
+ GlobalDeviceManager *dm=&__globalDeviceManage;
|
|
|
+ GlobalPowerManger *tmp,*hd=&dm->_globalPowerManger;
|
|
|
+
|
|
|
+ memset(l, 0, sizeof(board_list_t));
|
|
|
+ max = sizeof(l->info)/sizeof(l->info[0]);
|
|
|
+ list_for_each_entry(tmp,&hd->list,list) {
|
|
|
+ if(tmp->product_saddr>0) {
|
|
|
+ l->info[l->cnt++].addr=tmp->product_saddr;
|
|
|
+ if(l->cnt>=max) break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(list) *list = *l;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int upgrade_send(Modbus_Manger *mm, uint16_t addr, char *data, int dlen)
|
|
|
{
|
|
|
int r,pid=0;
|
|
|
@@ -87,7 +193,7 @@ static int upgrade_send(Modbus_Manger *mm, uint16_t addr, char *data, int dlen)
|
|
|
pkt->dlen = onelen;
|
|
|
r = mb_write(mm, addr, REG_UPG_WRITE, pkt, onelen+sizeof(upg_pkt_t));
|
|
|
slen += onelen;
|
|
|
- usleep(10000);
|
|
|
+ if(pid) usleep(100000);
|
|
|
|
|
|
if(pid<0) break;
|
|
|
pid++;
|
|
|
@@ -108,10 +214,9 @@ static int upgrade_check(Modbus_Manger *mm, uint16_t addr)
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
-
|
|
|
static int upgrade_proc(char *path, Modbus_Manger *mm)
|
|
|
{
|
|
|
- int i,j,r;
|
|
|
+ int i,j,r,timeout;
|
|
|
buf_t fbuf;
|
|
|
GlobalDeviceManager *dm=&__globalDeviceManage;
|
|
|
|
|
|
@@ -122,6 +227,10 @@ static int upgrade_proc(char *path, Modbus_Manger *mm)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ timeout = mb_get_timeout(mm);
|
|
|
+ mb_set_timeout(mm, 10);
|
|
|
+
|
|
|
+ board_upgrade_status_set(-1, UPGRADING);
|
|
|
//broadcase upgrade file
|
|
|
upgrade_send(mm, 0, fbuf.buf, fbuf.dlen);
|
|
|
for(i=1; i<=dm->brdMax; i++) {
|
|
|
@@ -134,17 +243,19 @@ static int upgrade_proc(char *path, Modbus_Manger *mm)
|
|
|
if(r==0) break;
|
|
|
upgrade_send(mm, i, fbuf.buf, fbuf.dlen);
|
|
|
}
|
|
|
+
|
|
|
+ if(r) {
|
|
|
+ board_upgrade_status_set(i, UPGRADE_FAIL);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ board_upgrade_status_set(i, UPGRADE_OK);
|
|
|
+ }
|
|
|
}
|
|
|
free(fbuf.buf);
|
|
|
+ mb_set_timeout(mm, timeout);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
-typedef struct {
|
|
|
- char path[200];
|
|
|
- int flag;
|
|
|
-}upgrade_arg_t;
|
|
|
-static upgrade_arg_t upgrade_arg;
|
|
|
static void* upgrade_thread(void *arg)
|
|
|
{
|
|
|
int r;
|
|
|
@@ -160,20 +271,20 @@ static void* upgrade_thread(void *arg)
|
|
|
thread_restart(THREAD_ID_SNMP);
|
|
|
thread_restart(THREAD_ID_POWER);
|
|
|
|
|
|
- //file_remove(path);
|
|
|
+ file_remove(parg->path);
|
|
|
parg->flag = 0;
|
|
|
|
|
|
pthread_exit(NULL);
|
|
|
}
|
|
|
int board_upgrade(char *path)
|
|
|
{
|
|
|
- if(upgrade_arg.flag==1) {
|
|
|
+ if(upg_arg.flag==1) {
|
|
|
return -1;
|
|
|
}
|
|
|
- strcpy(upgrade_arg.path,path);
|
|
|
- upgrade_arg.flag = 1;
|
|
|
+ strcpy(upg_arg.path,path);
|
|
|
+ upg_arg.flag = 1;
|
|
|
|
|
|
- thread_start_simp(upgrade_thread, &upgrade_arg, 4*MB);
|
|
|
+ thread_start_simp(upgrade_thread, &upg_arg, 4*MB);
|
|
|
return 0;
|
|
|
}
|
|
|
|