|
|
@@ -68,6 +68,117 @@ static void db_ow_test(sqlite3 *db, int *index, int *index3)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#include "file.h"
|
|
|
+typedef struct {
|
|
|
+ uint16_t pid;
|
|
|
+ uint8_t dlen;
|
|
|
+ uint8_t data[0];
|
|
|
+}upg_pkt_t;
|
|
|
+
|
|
|
+#define REG_UPGRADE 0xff
|
|
|
+#define REG_CHECK 0xfe
|
|
|
+
|
|
|
+static void mem_swap(void *buf, int len)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ uint8_t tmp,*pbuf=(uint8_t*)buf;
|
|
|
+ for(i=0; i<len; i+=2) {
|
|
|
+ tmp = pbuf[i];
|
|
|
+ pbuf[i] = pbuf[i+1];
|
|
|
+ pbuf[i+1] = tmp;
|
|
|
+ }
|
|
|
+}
|
|
|
+static int mb_read(uint16_t addr, uint16_t reg, void *data, int len)
|
|
|
+{
|
|
|
+ int r,cnt=len+len%2;
|
|
|
+ GlobalDeviceManager *dm=&__globalDeviceManage;
|
|
|
+ Modbus_Manger *mm=&dm->_globalRelaySampManger;
|
|
|
+
|
|
|
+ r = g_modbus_read_x_reg(mm, addr, reg, len+len%2, data);
|
|
|
+ if(r>0) mem_swap(data, r*2);
|
|
|
+ return r;
|
|
|
+
|
|
|
+}
|
|
|
+static int mb_write(uint16_t addr, uint16_t reg, void *data, int len)
|
|
|
+{
|
|
|
+ GlobalDeviceManager *dm=&__globalDeviceManage;
|
|
|
+ Modbus_Manger *mm=&dm->_globalRelaySampManger;
|
|
|
+ return g_modbus_write_x_reg(mm, addr, reg, len+len%2, data);
|
|
|
+}
|
|
|
+static int upgrade_send(uint16_t addr, char *data, int dlen)
|
|
|
+{
|
|
|
+ int r,pid=0;
|
|
|
+ int slen=0,onelen=0,onemax=200;
|
|
|
+ char temp[400];
|
|
|
+
|
|
|
+ upg_pkt_t *pkt=(upg_pkt_t*)temp;
|
|
|
+ while(1) {
|
|
|
+ onelen = ((slen+onemax)>dlen)?(dlen-(slen+onemax)):onemax;
|
|
|
+ memcpy(pkt->data, data+slen, onelen);
|
|
|
+ pkt->pid = pid++;
|
|
|
+ pkt->dlen = onelen;
|
|
|
+ mb_write(addr, REG_UPGRADE, data+slen, onelen+sizeof(upg_pkt_t));
|
|
|
+ slen += onelen;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+static int upgrade_check(uint16_t addr)
|
|
|
+{
|
|
|
+ char temp[300];
|
|
|
+
|
|
|
+ upg_pkt_t *pkt=(upg_pkt_t*)temp;
|
|
|
+ while(1) {
|
|
|
+ mb_read(addr, REG_CHECK, pkt, sizeof(upg_pkt_t));
|
|
|
+ if(pkt->dlen>0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int power_upgrade(char *path)
|
|
|
+{
|
|
|
+ int i,j,r;
|
|
|
+ buf_t fbuf;
|
|
|
+ int slen=0,onelen=0,onemax=200;
|
|
|
+ GlobalDeviceManager *dm=&__globalDeviceManage;
|
|
|
+ GlobalPowerCtrlBoard *pboard=dm->_all_ctrl_board;
|
|
|
+
|
|
|
+ #define RETRY_MAX 3
|
|
|
+
|
|
|
+ thread_stop(THREAD_ID_SNMP);
|
|
|
+ thread_stop(THREAD_ID_POWER);
|
|
|
+
|
|
|
+ r = file_load(path, &fbuf);
|
|
|
+ if(r) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //broad upgrade file
|
|
|
+ upgrade_send(0, fbuf.buf, fbuf.dlen);
|
|
|
+ for(i=0; i<MAX_CHN_COUNT; i++) {
|
|
|
+ if(pboard[i].product_saddr==0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(j=0; j<RETRY_MAX; j++) {
|
|
|
+ r = upgrade_check(i);
|
|
|
+ if(r==0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ upgrade_send(i, fbuf.buf, fbuf.dlen);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ free(fbuf.buf);
|
|
|
+ thread_start(THREAD_ID_SNMP, dm);
|
|
|
+ thread_start(THREAD_ID_POWER, dm);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
|
|
|
void* power_thread(void* arg)
|
|
|
{
|