diff --git a/app/include/ca_csg.h b/app/include/ca_csg.h index ec097f2..15a4f84 100755 --- a/app/include/ca_csg.h +++ b/app/include/ca_csg.h @@ -102,7 +102,7 @@ typedef struct int32_t data_fifo_id; // 数据处理线程发向后台发送线程的 fifo. char buf_send[CSG_PKT_LEN]; //char buf_reply[CSG_PKT_LEN]; - char buf_recv[CSG_PKT_LEN]; + //char buf_recv[CSG_PKT_LEN]; char buf[CSG_PKT_LEN]; struct sockaddr_in server; int32_t server_ip; // server ip. @@ -119,6 +119,18 @@ typedef struct unsigned int resverd[8]; } csg_utc_t; +typedef struct +{ + unsigned int len; + unsigned char data[1020]; +} csg_upgrade_t; + +typedef struct +{ + unsigned int status; + unsigned int resverd[8]; +} csg_upgrade_response_t; + /* Exported macro ------------------------------------------------------------*/ /* Extern global variables ---------------------------------------------------*/ diff --git a/app/lib/a_process/ca_csg.c b/app/lib/a_process/ca_csg.c index 018d4b5..49953b3 100755 --- a/app/lib/a_process/ca_csg.c +++ b/app/lib/a_process/ca_csg.c @@ -147,12 +147,13 @@ int32_t _csg_pkt_check(char *pkt, int32_t len) void _csg_head_init(char *pkt, uint16_t cmd, uint16_t len) { LandPkHead *head = (LandPkHead *)pkt; + memcpy(head, csg.buf_send, sizeof(LandPkHead)); head->Head = START_FLAG; head->Len = len + LandPackHeadTailLen; head->Type = cmd; - head->LifeCnt = 1; head->ID = sysctrl.dev_hex_id; + //head->LifeCnt = 1; head->gNum = 1; head->gNumIndex = 0; } @@ -546,6 +547,75 @@ int _csg_set_cau_cfg(char *databuf, int datalen) return _csg_send_packet(Res_SetCauCfg, (char *)&result, sizeof(result)); } +int _csg_upgrade_arm(char *databuf, int datalen, LandPkHead *head) +{ + csg_upgrade_response_t ack = {0}; + static FILE *upgradefp = NULL; + static int file_len = 0; + char upgrade_file[128] = {0}; + + if (datalen != sizeof(csg_upgrade_t)) + { + DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:%d\n", datalen, sizeof(csg_upgrade_t)); + ack.status = 1; + return _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); + } + + csg_upgrade_t *pmsg = (csg_upgrade_t *)databuf; + LOG("len=%d gNum=%d gNumIndex=%d\n", pmsg->len, head->gNum, head->gNumIndex); + + if (head->gNumIndex == 0) + { + if (upgradefp) + { + fclose(upgradefp); + upgradefp = NULL; + } + + if (upgradefp == NULL) + { + sprintf(upgrade_file, "%s/%s", UPDATE_FILE_PATH, UPDATE_TMP_FILE_NAME); + upgradefp = fopen(upgrade_file, "wb"); + if (upgradefp == NULL) + { + printh("open file error[%d]:%s", errno, strerror(errno)); + return -1; + } + } + } + + int size = pmsg->len; + int wrlen = fwrite(pmsg->data, 1, size, upgradefp); + if (wrlen != size) + { + size = size - wrlen; + wrlen = fwrite(pmsg->data+wrlen, 1, size, upgradefp); + printh("write again:size=%d, wrlen=%d\n", size, wrlen); + file_len += wrlen; + } + file_len += wrlen; + + if (head->gNum == head->gNumIndex + 1) + { + fclose(upgradefp); + upgradefp = NULL; + ack.status = 0; + _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); + LOG("update success!!!"); + char cmd[128] = {0}; + snprintf(cmd, 127, "mv %s/%s %s/%s", UPDATE_FILE_PATH, UPDATE_TMP_FILE_NAME, + UPDATE_FILE_PATH, UPDATE_FILE_NAME); + system(cmd); + system("sync"); + printh("ls -l | grep update*\n"); + system("ls -l | grep update*"); + reboot_system(LOG_DEBUG, BOOT_LOCAL_ARM_UPGRADE); + } + ack.status = 0; + _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); + return 0; +} + #if 0 int _csg_upload_realtime_data() { @@ -636,6 +706,9 @@ int _csg_recv_process(char *buf) case Cmd_SetCauCfg: _csg_set_cau_cfg(pdata, dataLen); break; + case Cmd_AppUpdate: + _csg_upgrade_arm(pdata, dataLen, head); + break; default: break; } diff --git a/app/lib/a_process/ca_dbg.c b/app/lib/a_process/ca_dbg.c index 37d0ab0..54cb9e7 100755 --- a/app/lib/a_process/ca_dbg.c +++ b/app/lib/a_process/ca_dbg.c @@ -511,7 +511,7 @@ int _dbg_pkt_upgrade_arm(debug_msg_info_t *msg) UPDATE_FILE_PATH, UPDATE_FILE_NAME); system(cmd); system("sync"); - //sleep(1); + printh("ls -l | grep update*\n"); system("ls -l | grep update*"); reboot_system(LOG_DEBUG, BOOT_LOCAL_ARM_UPGRADE); }