666 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			666 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | ||
|  | be copied by any method or incorporated into another program without | ||
|  | the express written consent of Aerospace C.Power. This Information or any portion | ||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | ||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | ||
|  | liability for its use in any way and conveys no license or title under | ||
|  | any patent or copyright and makes no representation or warranty that this | ||
|  | Information is free from patent or copyright infringement. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | #include "os_mem_api.h"
 | ||
|  | #include "os_utils_api.h"
 | ||
|  | #include "iot_utils_api.h"
 | ||
|  | 
 | ||
|  | #include "iot_io_api.h"
 | ||
|  | #include "iot_crc_api.h"
 | ||
|  | #include "iot_pkt_api.h"
 | ||
|  | #include "iot_module_api.h"
 | ||
|  | #include "iot_cli_upgrade_api.h"
 | ||
|  | #include "os_timer_api.h"
 | ||
|  | #include "iot_upgrade_api.h"
 | ||
|  | #include "iot_cli_upgrade_status_type_def.h"
 | ||
|  | 
 | ||
|  | #include "app_upg.h"
 | ||
|  | #include "app_common.h"
 | ||
|  | 
 | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  | 
 | ||
|  | proto_upgrd_contxt_t *upgrd_contxt; | ||
|  | 
 | ||
|  | void app_proto_upgrd_timer_callback(void) | ||
|  | { | ||
|  |     APP_PRINTF("[upd]Upgrade procedure Done !!\n"); | ||
|  |     upgrd_contxt->stage = UPGRADE_TRANS_FILE_DONE; | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_upgrd_timer_init(void) | ||
|  | { | ||
|  |     upgrd_contxt->mon_timer = os_create_timer(IOT_APP_DEMO_MID, false, | ||
|  |         (os_timer_func_t)app_proto_upgrd_timer_callback, NULL); | ||
|  |     if (0 == upgrd_contxt->mon_timer) { | ||
|  |         APP_PRINTF("[ERR]Create monitor Timer Failed !!"); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | void app_proto_upgrd_update_progress(void) | ||
|  | { | ||
|  |     uint16_t start_indx = 0; | ||
|  |     uint16_t q_cnt = 0; | ||
|  |     uint16_t i; | ||
|  |     iot_plc_upgrade_dst_status_query status; | ||
|  |     iot_plc_upgrade_dst_status_list *status_list; | ||
|  |     sta_upgrd_info_t *sta_info; | ||
|  | 
 | ||
|  |     iot_cli_upgrade_qr_dst_status(&status); | ||
|  |     upgrd_contxt->total_sta_cnt = status.dst_total_num; | ||
|  |     upgrd_contxt->cco_upd_state = status.upgrade_state; | ||
|  |     upgrd_contxt->rpt_num = status.dst_num; | ||
|  |     upgrd_contxt->fail_sta_cnt = 0; | ||
|  | 
 | ||
|  |     APP_PRINTF("Upgrade progress, total sta[%d], cco state[%d], fail sta[%d]", | ||
|  |         upgrd_contxt->total_sta_cnt, upgrd_contxt->cco_upd_state, upgrd_contxt->fail_sta_cnt); | ||
|  | 
 | ||
|  |     if (upgrd_contxt->file_attr == UPGRADE_FILE_ATTR_LOCAL) { | ||
|  |         APP_PRINTF("Upgrade local device, skip querry progress info"); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (upgrd_contxt->cco_upd_state == IOT_PLC_UPGRADE_INIT) { | ||
|  |         upgrd_contxt->stage = UPGRADE_TRANS_FILE_DONE; | ||
|  |         APP_PRINTF("not start upgrade, skip querry progress info"); | ||
|  |         return; | ||
|  |     } else if (upgrd_contxt->cco_upd_state < IOT_PLC_UPGRADE_TRANSFERRED) { | ||
|  |         upgrd_contxt->stage = UPGRADE_TRANS_FILE_INPROGRESS; | ||
|  |         APP_PRINTF("Sending remote data, skip querry progress info"); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     status_list = (iot_plc_upgrade_dst_status_list *)upgrd_contxt->temp_data; | ||
|  | 
 | ||
|  |     do { | ||
|  |         q_cnt = upgrd_contxt->rpt_num; | ||
|  |         if (start_indx + q_cnt > upgrd_contxt->total_sta_cnt) { | ||
|  |             q_cnt = upgrd_contxt->total_sta_cnt - start_indx; | ||
|  |         } | ||
|  |         os_mem_set((uint8_t *)status_list, 0, sizeof(iot_plc_upgrade_dst_status_list)); | ||
|  | 
 | ||
|  |         APP_PRINTF("iot_cli_upgrade_qr_dst_status_list %d %d", start_indx, q_cnt); | ||
|  |         iot_cli_upgrade_qr_dst_status_list(start_indx, q_cnt, status_list); | ||
|  | 
 | ||
|  |         APP_PRINTF("Upgrade status list,indx[%d],end[%d],dst_num[%d]", | ||
|  |             status_list->dst_status_list_idx, status_list->end, status_list->dst_num); | ||
|  | 
 | ||
|  |         for(i = 0; i < status_list->dst_num; i++) { | ||
|  |             if (iot_mac_addr_valid(status_list->dst_status_list[i].dst)) { | ||
|  |                 sta_info = &upgrd_contxt->sta_info[status_list->dst_status_list_idx + i]; | ||
|  |                 iot_mac_addr_cpy(sta_info->mac, status_list->dst_status_list[i].dst); | ||
|  |                 sta_info->status = status_list->dst_status_list[i].status; | ||
|  |                 sta_info->progress = status_list->dst_status_list[i].percentage; | ||
|  |                 if (status_list->dst_status_list[i].error_code != UPGRADE_DATA_SUCCESS) { | ||
|  |                     upgrd_contxt->fail_sta_cnt++; | ||
|  |                 } | ||
|  |                 APP_PRINTF("Upgrade sta[%02x:%02x:%02x:%02x:%02x:%02x], status[%d], progress[%d], " | ||
|  |                     "errno[%d]", sta_info->mac[0], sta_info->mac[1], sta_info->mac[2], | ||
|  |                     sta_info->mac[3], sta_info->mac[4], sta_info->mac[5], sta_info->status, | ||
|  |                 sta_info->progress, status_list->dst_status_list[i].error_code); | ||
|  |             } | ||
|  |         } | ||
|  |         if (status_list->end == 1) { | ||
|  |             if (q_cnt >= upgrd_contxt->total_sta_cnt) { | ||
|  |                 start_indx = upgrd_contxt->total_sta_cnt; | ||
|  |             } | ||
|  |         } | ||
|  |         start_indx += status_list->dst_num; | ||
|  |     } while (start_indx < upgrd_contxt->total_sta_cnt); | ||
|  | 
 | ||
|  |     if(upgrd_contxt->fail_sta_cnt == 0) { | ||
|  |         if (upgrd_contxt->stage != UPGRADE_TRANS_FILE_DONE) { | ||
|  |             upgrd_contxt->stage = UPGRADE_TRANS_FILE_DONE; | ||
|  |         } | ||
|  |     } else { | ||
|  |         upgrd_contxt->stage = UPGRADE_TRANS_FILE_UNCOMPLETE; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | /* start_index should start form 0 */ | ||
|  | void app_proto_upgrd_update_query_progress(query_progress_ind *outbuf, | ||
|  |     uint16_t start_index, uint16_t count, uint16_t *buflen) | ||
|  | { | ||
|  |     uint16_t q_cnt = 0; | ||
|  |     uint16_t i, buf_index = 0; | ||
|  |     iot_plc_upgrade_dst_status_query status; | ||
|  |     iot_plc_upgrade_dst_status_list *status_list; | ||
|  |     sta_upgrd_info_t *sta_info; | ||
|  |     /* 这个变量保存数据读取的最高位置的编号 */ | ||
|  |     uint16_t max_check_pos = 0; | ||
|  |     uint16_t count_max; | ||
|  | 
 | ||
|  |     iot_cli_upgrade_qr_dst_status(&status); | ||
|  |     upgrd_contxt->total_sta_cnt = status.dst_total_num; | ||
|  |     upgrd_contxt->cco_upd_state = status.upgrade_state; | ||
|  |     upgrd_contxt->rpt_num = status.dst_num; | ||
|  |     upgrd_contxt->fail_sta_cnt = 0; | ||
|  | 
 | ||
|  |     APP_PRINTF("start_index = %d, count = %d\n", start_index, count); | ||
|  | 
 | ||
|  |     APP_PRINTF("Upgrade progress query, total sta[%d], cco state[%d], rpt_num[%d]\n", | ||
|  |         upgrd_contxt->total_sta_cnt, upgrd_contxt->cco_upd_state, upgrd_contxt->rpt_num); | ||
|  | 
 | ||
|  |     outbuf->start_index = start_index; | ||
|  |     if (start_index > status.dst_total_num) { | ||
|  |         APP_PRINTF("start_index is too large"); | ||
|  |         outbuf->upgrade_total_count = 0; | ||
|  |         outbuf->resp_count = 0; | ||
|  |         *buflen = sizeof(query_progress_ind); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (start_index + count > status.dst_total_num) { | ||
|  |         count = status.dst_total_num - start_index ; | ||
|  |     } | ||
|  | 
 | ||
|  |     count_max = (MAX_RSP_DATA_LEN - sizeof(query_progress_ind)) / sizeof (sta_upgrd_info_t); | ||
|  |     if(count > count_max) { | ||
|  |         count = count_max; | ||
|  |         iot_cus_printf("count is too large , only %d progress can return\n", count); | ||
|  |     } | ||
|  | 
 | ||
|  |     outbuf->upgrade_total_count = status.dst_total_num; | ||
|  |     max_check_pos = start_index + count; | ||
|  | 
 | ||
|  |     outbuf->resp_count = count; | ||
|  |     *buflen = sizeof(query_progress_ind) + sizeof(sta_upgrd_info_t) * outbuf->resp_count; | ||
|  |     status_list = (iot_plc_upgrade_dst_status_list *)upgrd_contxt->temp_data; | ||
|  |     do { | ||
|  |         q_cnt = upgrd_contxt->rpt_num; | ||
|  |         if (start_index + q_cnt > max_check_pos) { | ||
|  |             q_cnt = max_check_pos - start_index; | ||
|  |         } | ||
|  |         os_mem_set((uint8_t *)status_list, 0, sizeof(iot_plc_upgrade_dst_status_list)); | ||
|  | 
 | ||
|  |         APP_PRINTF("iot_cli_upgrade_qr_dst_status_list %d %d", start_index, q_cnt); | ||
|  |         iot_cli_upgrade_qr_dst_status_list(start_index, q_cnt, status_list); | ||
|  | 
 | ||
|  |         APP_PRINTF("Upgrade status list, indx[%d], end[%d],dst_num[%d]", | ||
|  |             status_list->dst_status_list_idx, status_list->end, q_cnt); | ||
|  | 
 | ||
|  |         for (i = 0; i < q_cnt ; i++) { | ||
|  |             if (iot_mac_addr_valid(status_list->dst_status_list[i].dst)) { | ||
|  |                 sta_info =  &outbuf->info[i + buf_index]; | ||
|  |                 iot_mac_addr_cpy(sta_info->mac, status_list->dst_status_list[i].dst); | ||
|  |                 sta_info->status = status_list->dst_status_list[i].status; | ||
|  |                 sta_info->progress = status_list->dst_status_list[i].percentage; | ||
|  | 
 | ||
|  |                 // APP_PRINTF("Upgrade sta["MAC_FMT"], status[%d], progress[%d]",
 | ||
|  |                 //     MAC_ARG(outbuf->info[i + buf_index].mac), outbuf->info[i + buf_index].status,
 | ||
|  |                 //     outbuf->info[i + buf_index].progress);
 | ||
|  |                 APP_PRINTF("Upgrade sta["MAC_FMT"], status[%d], progress[%d]", | ||
|  |                     MAC_ARG(status_list->dst_status_list[i].dst), status_list->dst_status_list[i].status, | ||
|  |                     status_list->dst_status_list[i].percentage); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         start_index += q_cnt; | ||
|  |         buf_index += q_cnt; | ||
|  |     } while (start_index < max_check_pos); | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t app_proto_upgrd_contxt_init(void) | ||
|  | { | ||
|  |     uint16_t ret = ERR_FAIL; | ||
|  |     uint8_t reason = 0; | ||
|  |     iot_pkt_t *tmp_pkt; | ||
|  |     iot_pkt_t *tmp_data_pkt; | ||
|  | 
 | ||
|  |     tmp_pkt = iot_pkt_alloc(sizeof(proto_upgrd_contxt_t), IOT_APP_DEMO_MID); | ||
|  |     if (tmp_pkt == NULL) { | ||
|  |         reason = 1; | ||
|  |         goto out; | ||
|  |     } | ||
|  |     upgrd_contxt = (proto_upgrd_contxt_t *)iot_pkt_data(tmp_pkt); | ||
|  |     os_mem_set(upgrd_contxt, 0, sizeof(proto_upgrd_contxt_t)); | ||
|  | 
 | ||
|  |     tmp_data_pkt = iot_pkt_alloc(sizeof(iot_plc_upgrade_dst_status_list), | ||
|  |         IOT_APP_DEMO_MID); | ||
|  |     if (tmp_data_pkt == NULL) { | ||
|  |         reason = 2; | ||
|  |         goto errno_2; | ||
|  |     } | ||
|  |     upgrd_contxt->temp_data = iot_pkt_data(tmp_data_pkt); | ||
|  | 
 | ||
|  |     if (ERR_OK != app_proto_upgrd_timer_init()) { | ||
|  |         reason = 3; | ||
|  |         goto errno_3; | ||
|  |     } | ||
|  |     upgrd_contxt->stage = UPGRADE_TRANS_FILE_INVALID; | ||
|  |     /* get a new upgrade id if it's 0. */ | ||
|  |     if (upgrd_contxt->upgrade_id == 0) { | ||
|  |         upgrd_contxt->upgrade_id = os_rand(); | ||
|  |     } | ||
|  | 
 | ||
|  |     upgrd_contxt->upgrade_id++; | ||
|  |     if (upgrd_contxt->upgrade_id == 0) { | ||
|  |         upgrd_contxt->upgrade_id++; | ||
|  |     } | ||
|  |     ret = ERR_OK; | ||
|  |     APP_PRINTF("[INFO]initialize upgrade context success"); | ||
|  |     goto out; | ||
|  | 
 | ||
|  | errno_3: | ||
|  |     iot_pkt_free(tmp_data_pkt); | ||
|  | errno_2: | ||
|  |     iot_pkt_free(tmp_pkt); | ||
|  | out: | ||
|  |     if (reason != 0) { | ||
|  |         APP_PRINTF("[ERR]initialize upgrade context faild for reason[%d]", reason); | ||
|  |     } | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | void app_proto_upgrd_compelet_handle(void) | ||
|  | { | ||
|  |     upgrd_contxt->stage = UPGRADE_TRANS_FILE_DONE; | ||
|  |     APP_PRINTF("[upd]Upgrading commpleted!!!!\n"); | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | static void app_proto_upgrd_clear_old_file(void) | ||
|  | { | ||
|  |     if ((upgrd_contxt->file_len != 0) && (upgrd_contxt->file_data != NULL)) { | ||
|  |         os_mem_set(upgrd_contxt->file_data, 0, upgrd_contxt->file_len); | ||
|  |     } | ||
|  |     upgrd_contxt->cur_seg_indx = 0; | ||
|  |     upgrd_contxt->stage = UPGRADE_TRANS_FILE_INVALID; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_upgrd_update_data(proto_trans_file_data_req *req) | ||
|  | { | ||
|  |     uint32_t ret = ERR_FAIL; | ||
|  |     uint16_t crc = 0; | ||
|  |     uint8_t reason = 0; | ||
|  | 
 | ||
|  |     if (req == NULL) { | ||
|  |         reason = 1; | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     APP_PRINTF("[upd]data RX,type[%d],progress[%d]/[%d],size[%d] cur_seg_indx:%d", | ||
|  |         upgrd_contxt->file_attr, req->seg_num + 1, upgrd_contxt->seg_total, | ||
|  |         req->seg_size, upgrd_contxt->cur_seg_indx); | ||
|  | 
 | ||
|  |     if ((req->seg_num >= upgrd_contxt->seg_total) || | ||
|  |         (req->seg_num != upgrd_contxt->cur_seg_indx) || | ||
|  |         (req->seg_size == 0)) { | ||
|  |         reason = 2; | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (req->seg_num == 0) { | ||
|  |         if (upgrd_contxt->file_attr == IOT_PLC_UPGRADE_LOCAL) { | ||
|  |             /* start rset */ | ||
|  |             iot_start_rst_t rst; | ||
|  |             ret = iot_pkg_upgrade_start(&rst, upgrd_contxt->upgrade_id, | ||
|  |                 req->seg_size, 0, 0, 0, 0, req->seg_data); | ||
|  |             if (ret != ERR_OK) { | ||
|  |                 APP_PRINTF("upgrade: start failed. result=%d", ret); | ||
|  |                 reason = 3; | ||
|  |                 goto out; | ||
|  |             } | ||
|  |         } else { | ||
|  |             iot_cli_upgrade_prepare(app_proto_upgrd_compelet_handle, | ||
|  |                 upgrd_contxt->file_len, &upgrd_contxt->file_data, req->seg_data, | ||
|  |                 req->seg_size, upgrd_contxt->file_attr); | ||
|  |         } | ||
|  |         /* mark the segment size, 100, 200, 300 or 400bytes */ | ||
|  |         upgrd_contxt->seg_size = req->seg_size; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (req->seg_num + 1 != upgrd_contxt->seg_total) { | ||
|  |         if (req->seg_size != upgrd_contxt->seg_size) { | ||
|  |             reason = 4; | ||
|  |             goto out; | ||
|  |         } | ||
|  |     } else { | ||
|  |         if (req->seg_size != (upgrd_contxt->file_len - | ||
|  |             upgrd_contxt->seg_size * upgrd_contxt->cur_seg_indx)) { | ||
|  |             reason = 5; | ||
|  |             goto out; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     crc = iot_getcrc16(req->seg_data, req->seg_size, IOT_CRC16_TYPE_XMODEM); | ||
|  |     crc = APP_SWAP16(crc); | ||
|  |     if (crc != req->seg_crc) { | ||
|  |         APP_PRINTF("[upd]crc=%x %x", crc, req->seg_crc); | ||
|  |         reason = 6; | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     upgrd_contxt->calc_crc32 = iot_getcrc32_update(upgrd_contxt->calc_crc32, | ||
|  |         req->seg_data, req->seg_size); | ||
|  |     if ((upgrd_contxt->file_attr == IOT_PLC_UPGRADE_ALL) || | ||
|  |         (upgrd_contxt->file_attr == IOT_PLC_UPGRADE_STA_LIST)) { | ||
|  |         ret = iot_cli_upgrade_write( | ||
|  |             upgrd_contxt->cur_seg_indx * upgrd_contxt->seg_size, | ||
|  |             req->seg_data, req->seg_size); | ||
|  |         if (ret != ERR_OK) { | ||
|  |             reason = 7; | ||
|  |             goto out; | ||
|  |         } | ||
|  |     } else { | ||
|  |         iot_trans_cmd_t trans; | ||
|  |         iot_pkt_t *trans_pkt = NULL; | ||
|  |         trans.id = upgrd_contxt->upgrade_id; | ||
|  |         trans.crc_flag = 0; | ||
|  |         trans_pkt = (iot_pkt_t *)iot_pkt_alloc(upgrd_contxt->seg_size, | ||
|  |             IOT_APP_DEMO_MID); | ||
|  |         if (trans_pkt == NULL) { | ||
|  |             reason = 8; | ||
|  |             goto out; | ||
|  |         } | ||
|  |         iot_pkt_put(trans_pkt, req->seg_size); | ||
|  |         os_mem_cpy(iot_pkt_data(trans_pkt), req->seg_data, req->seg_size); | ||
|  |         trans.data = trans_pkt; | ||
|  |         trans.block_num = req->seg_num; | ||
|  |         trans.data_type = UPGRADE_DATA_TYPE_PKG; | ||
|  |         trans.id = upgrd_contxt->upgrade_id; | ||
|  |         trans.crc_flag = 0; | ||
|  |         if (ERR_OK != (ret = iot_pkg_upgrade_trans(&trans))) { | ||
|  |             reason = 9; | ||
|  |             APP_PRINTF("[upd]update data failed. result=%d", ret); | ||
|  |             goto out; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     upgrd_contxt->cur_seg_indx++; | ||
|  |     APP_PRINTF("[upd]write data index=%d", upgrd_contxt->cur_seg_indx); | ||
|  | 
 | ||
|  |     if (upgrd_contxt->cur_seg_indx == upgrd_contxt->seg_total) { | ||
|  |         upgrd_contxt->calc_crc32 ^= 0xFFFFFFFF; | ||
|  |         if (upgrd_contxt->calc_crc32 != upgrd_contxt->file_crc) { | ||
|  |             APP_PRINTF("[upd]file crc verif failed, calc crc:%08X file crc:%08X", | ||
|  |                 upgrd_contxt->calc_crc32, upgrd_contxt->file_crc); | ||
|  |             reason = 10; | ||
|  |             goto out; | ||
|  |         } | ||
|  |         if ((upgrd_contxt->file_attr == IOT_PLC_UPGRADE_ALL) || | ||
|  |             (upgrd_contxt->file_attr == IOT_PLC_UPGRADE_STA_LIST)) { | ||
|  |             APP_PRINTF("[upd]all upd data received, type[%d]", | ||
|  |                 upgrd_contxt->file_attr); | ||
|  |             iot_cli_upgrade_start(upgrd_contxt->file_attr, 0); | ||
|  |         } else { | ||
|  |             APP_PRINTF("[upd]start commiting... type[%d]", | ||
|  |                 upgrd_contxt->file_attr); | ||
|  |             iot_pkg_upgrade_commit(upgrd_contxt->upgrade_id); | ||
|  |             iot_pkg_upgrade_reset(); | ||
|  |         } | ||
|  |     } | ||
|  |     ret = ERR_OK; | ||
|  | out: | ||
|  |     if (ret != ERR_OK) { | ||
|  |         APP_PRINTF("[upd]update data failed for reason[%d]", reason); | ||
|  |     } | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_upgrd_trans_file_start(const proto_start_trans_file_req *req) | ||
|  | { | ||
|  |     if (upgrd_contxt == NULL || req == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  |     upgrd_contxt->trans_timeout = req->trans_timeout; | ||
|  |     switch(req->file_attr) { | ||
|  |     case UPGRADE_FILE_ATTR_LOCAL: | ||
|  |     { | ||
|  |         if (upgrd_contxt->trans_timeout == 0) { | ||
|  |             upgrd_contxt->trans_timeout = 10; | ||
|  |         } | ||
|  |         if ((upgrd_contxt->stage == UPGRADE_TRANS_FILE_INPROGRESS) || | ||
|  |             (upgrd_contxt->stage == UPGRADE_TRANS_FILE_INVALID)) { | ||
|  |             iot_pkg_upgrade_cancel_commit(upgrd_contxt->upgrade_id, true); | ||
|  |             upgrd_contxt->upgrade_id++; | ||
|  |         } | ||
|  |         break; | ||
|  |     } | ||
|  |     case UPGRADE_FILE_ATTR_REMOTE: | ||
|  |     { | ||
|  |         if (upgrd_contxt->trans_timeout == 0) { | ||
|  |             upgrd_contxt->trans_timeout = 20; | ||
|  |         } | ||
|  |         break; | ||
|  |     } | ||
|  |     case UPGRADE_FILE_ATTR_LIST: | ||
|  |     { | ||
|  |         if (upgrd_contxt->trans_timeout == 0) { | ||
|  |             upgrd_contxt->trans_timeout = 30; | ||
|  |         } | ||
|  |         break; | ||
|  |     } | ||
|  |     default: | ||
|  |         APP_PRINTF("[ERR]Unsupported file attr[%d]!!", req->file_attr); | ||
|  |         return ERR_INVAL; | ||
|  |     } | ||
|  | 
 | ||
|  |     upgrd_contxt->file_attr = req->file_attr; | ||
|  |     upgrd_contxt->file_len = req->file_len; | ||
|  |     upgrd_contxt->file_crc = req->file_crc; | ||
|  |     upgrd_contxt->seg_total = req->seg_total; | ||
|  |     upgrd_contxt->calc_crc32 = 0xFFFFFFFF; | ||
|  | 
 | ||
|  |     if (os_is_timer_active(upgrd_contxt->mon_timer)) { | ||
|  |         os_stop_timer(upgrd_contxt->mon_timer); | ||
|  |     } | ||
|  |     os_start_timer(upgrd_contxt->mon_timer, | ||
|  |         upgrd_contxt->trans_timeout * ONE_MINUTES); | ||
|  |     upgrd_contxt->stage = UPGRADE_TRANS_FILE_INPROGRESS; | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | uint32_t app_proto_handle_trans_file_attr(const proto_start_trans_file_req *req) | ||
|  | { | ||
|  |     uint32_t ret = ERR_OK; | ||
|  | 
 | ||
|  |     if (req == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     APP_PRINTF("[upd]start trans file, file attr[%d], total seg[%d]" | ||
|  |         " file len[%d], timeout[%d]", req->file_attr, req->seg_total, | ||
|  |         req->file_len, req->trans_timeout); | ||
|  | 
 | ||
|  |     switch (req->file_attr) { | ||
|  |     case UPGRADE_FILE_ATTR_CLEAR: | ||
|  |     { | ||
|  |         app_proto_upgrd_clear_old_file(); | ||
|  |         break; | ||
|  |     } | ||
|  |     case UPGRADE_FILE_ATTR_LOCAL: | ||
|  |     case UPGRADE_FILE_ATTR_REMOTE: | ||
|  |     case UPGRADE_FILE_ATTR_LIST: | ||
|  |     { | ||
|  |         ret = app_proto_upgrd_trans_file_start(req); | ||
|  |         break; | ||
|  |     } | ||
|  |     default: | ||
|  |         ret = ERR_FAIL; | ||
|  |         break; | ||
|  |     } | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_start_trans_file(const proto_start_trans_file_req *req, uint8_t *out_buffer, uint16_t *length) | ||
|  | { | ||
|  |     uint32_t ret = ERR_FAIL; | ||
|  |     upgrd_resp_t *resp = NULL; | ||
|  |     uint16_t payload_length = sizeof(upgrd_resp_t); | ||
|  | 
 | ||
|  |     if (req == NULL || out_buffer == NULL || length == NULL) { | ||
|  |         APP_PRINTF("cmd arg with null"); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     resp = (upgrd_resp_t *)(out_buffer + UPGRADE_DATA_HEAD_LEN); | ||
|  |     resp->state = PROTO_RET_CODE_FAILED; | ||
|  |     resp->reason = PROTO_REASON_FORMAT; | ||
|  | 
 | ||
|  |     ret = app_proto_handle_trans_file_attr(req); | ||
|  |     if (ret == ERR_OK) { | ||
|  |         resp->state = PROTO_RET_CODE_SUCCESS; | ||
|  |         resp->reason = PROTO_REASON_NORMAL; | ||
|  |     } | ||
|  | 
 | ||
|  |     *length = payload_length; | ||
|  | 
 | ||
|  |     APP_PRINTF("[upd]trans_file file_attr=%d.seg_total=%d", | ||
|  |         upgrd_contxt->file_attr, upgrd_contxt->seg_total); | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_trans_file_data(proto_trans_file_data_req *req, | ||
|  |     uint8_t *out_buffer, uint16_t *length) | ||
|  | { | ||
|  |     uint32_t ret; | ||
|  |     upgrd_resp_t *ind = NULL; | ||
|  |     uint16_t payload_length = sizeof(upgrd_resp_t); | ||
|  | 
 | ||
|  |     if (out_buffer == NULL || length == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     APP_PRINTF("[upd]start handle data...."); | ||
|  |     APP_PRINTF("[upd]file_attr=%d.seg_total=%d", | ||
|  |         upgrd_contxt->file_attr, upgrd_contxt->seg_total); | ||
|  | 
 | ||
|  |     ind = (upgrd_resp_t *)(out_buffer + UPGRADE_DATA_HEAD_LEN); | ||
|  |     ind->state = PROTO_RET_CODE_FAILED; | ||
|  |     ind->reason = PROTO_REASON_OTHER; | ||
|  | 
 | ||
|  |     ret = app_proto_upgrd_update_data(req); | ||
|  |     APP_PRINTF("[upd]app_proto_upgrd_update_data ret[%d]", ret); | ||
|  |     if (ret == ERR_OK) { | ||
|  |         ind->state = PROTO_RET_CODE_SUCCESS; | ||
|  |         ind->reason = PROTO_REASON_NORMAL; | ||
|  |     } else { | ||
|  |         ind->reason = PROTO_REASON_FORMAT; | ||
|  |     } | ||
|  | 
 | ||
|  |     *length = payload_length; | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_trans_file_query(uint8_t *out_buffer, uint16_t *length) | ||
|  | { | ||
|  |     upgrade_state_resp_t *ind = NULL; | ||
|  |     uint16_t payload_length = sizeof(upgrade_state_resp_t); | ||
|  | 
 | ||
|  |     if (out_buffer == NULL || length == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     ind = (upgrade_state_resp_t *)(out_buffer + UPGRADE_DATA_HEAD_LEN); | ||
|  | 
 | ||
|  |     app_proto_upgrd_update_progress(); | ||
|  | 
 | ||
|  |     ind->state = upgrd_contxt->stage; | ||
|  |     ind->fail_sta = upgrd_contxt->fail_sta_cnt; | ||
|  | 
 | ||
|  |     *length = payload_length; | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_set_upgrd_list(set_upgrd_list_t *req, uint8_t *out_buffer, | ||
|  |     uint16_t *length, uint8_t renew) | ||
|  | { | ||
|  |     uint32_t ret = ERR_FAIL; | ||
|  |     upgrd_resp_t *ind = NULL; | ||
|  |     iot_plc_upgrade_dst_list_t *list; | ||
|  |     uint8_t i = 0; | ||
|  |     uint16_t payload_length = sizeof(upgrd_resp_t); | ||
|  | 
 | ||
|  |     if (out_buffer == NULL || length == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     list = (iot_plc_upgrade_dst_list_t *)upgrd_contxt->temp_data; | ||
|  | 
 | ||
|  |     ind = (upgrd_resp_t *)(out_buffer + UPGRADE_DATA_HEAD_LEN); | ||
|  |     ind->state = PROTO_RET_CODE_FAILED; | ||
|  |     ind->reason = PROTO_REASON_FORMAT; | ||
|  | 
 | ||
|  |     APP_PRINTF("[upd]set upgrade list count[%d]", req->count); | ||
|  | 
 | ||
|  |     os_mem_set(list, 0, sizeof(*list)); | ||
|  |     list->dst_num = req->count; | ||
|  |     if (renew) { | ||
|  |         upgrd_contxt->upgrd_list_indx = 0; | ||
|  |     } | ||
|  |     list->dst_list_idx = upgrd_contxt->upgrd_list_indx; | ||
|  | 
 | ||
|  |     if (list->dst_list_idx + 1 > UPGRADE_REMOTE_ADDR_NUM) { | ||
|  |         ret = ERR_FAIL; | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     for (i = 0; i < req->count; i++) { | ||
|  |         iot_mac_addr_cpy(&list->dst_list[i * IOT_MAC_ADDR_LEN], | ||
|  |             &req->mac[i * IOT_MAC_ADDR_LEN]); | ||
|  |         APP_PRINTF("[upd]add mac["MAC_FMT"] to list", | ||
|  |             MAC_ARG(req->mac + i * IOT_MAC_ADDR_LEN)); | ||
|  |         upgrd_contxt->upgrd_list_indx++; | ||
|  |     } | ||
|  | 
 | ||
|  |     ret = iot_cli_upgrade_set_dst_list(list, renew); | ||
|  | 
 | ||
|  |     if (ret == ERR_OK) { | ||
|  |         ind->state = PROTO_RET_CODE_SUCCESS; | ||
|  |         ind->reason = PROTO_REASON_NORMAL; | ||
|  |     } else { | ||
|  |         ind->reason = PROTO_REASON_OTHER; | ||
|  |     } | ||
|  | 
 | ||
|  | out: | ||
|  | 
 | ||
|  |     *length = payload_length; | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_proto_trans_file_query_progress(query_progress_req *req, uint8_t *out_buffer, uint16_t *length) | ||
|  | { | ||
|  |     query_progress_ind *ind = NULL; | ||
|  |     uint16_t req_lenth = 0; | ||
|  | 
 | ||
|  |     if (out_buffer == NULL || length == NULL) { | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     ind = (query_progress_ind *)(out_buffer + UPGRADE_DATA_HEAD_LEN); | ||
|  |     app_proto_upgrd_update_query_progress(ind, req->start_index -1, req->count , &req_lenth); | ||
|  | 
 | ||
|  |     *length = req_lenth; | ||
|  |     APP_PRINT_BUF("query progress ", out_buffer, MAX_RSP_DATA_LEN); | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | #elif PLC_SUPPORT_STA_ROLE
 | ||
|  | 
 | ||
|  | uint16_t app_proto_upgrd_contxt_init(void) | ||
|  | { | ||
|  |     return true; | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |