Files
kunlun/app/iot_cus_at_app/common/app_upg.h
2024-09-28 14:24:04 +08:00

230 lines
7.0 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.
****************************************************************************/
#ifndef APP_UPG_H
#define APP_UPG_H
#include "iot_utils_api.h"
#include "app_types.h"
//#include "iot_upgrade_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* max data lenth in one upgrade frame */
#define PROTO_UPGRADE_BLOCK_SIZE (400)
/* max STA count for upgrade */
#define PROTO_UPGRADE_MAX_STA (200)
/* max query sta upgrade progress count */
#define PROTO_UPGD_RESP_MAX_CNT (20)
/* for resp upgrade data response */
#define UPGRADE_DATA_HEAD_LEN (9)
/* 启动文件传输 */
#define UPGRADE_START_TRANS_FILE 1
/* 文件传输内容 */
#define UPGRADE_TRANS_FILE_DATA 2
/* 查询升级状态 */
#define UPGRADE_STATE_QUERY 3
/* 配置升级列表 */
#define UPGRADE_SET_MAC_LIST 4
/* 查询升级节点进度 */
#define UPGRADE_STA_PROGRESS_QUERY 5
#define PROTO_RET_CODE_SUCCESS 0x00
#define PROTO_RET_CODE_FAILED 0x01
/* Abnormal status code */
#define PROTO_REASON_NORMAL 0x00 /* The status is normal. */
#define PROTO_REASON_TIMEOUT 0x01 /* communication timeout */
#define PROTO_REASON_FORMAT 0x02 /* format error */
#define PROTO_REASON_BUSY 0x03 /* node busy */
#define PROTO_REASON_OTHER 0xFF /* Other errors */
/* file attribution */
typedef enum {
/* Clear the download. */
UPGRADE_FILE_ATTR_CLEAR = 0x00,
/* local upgrade file */
UPGRADE_FILE_ATTR_LOCAL = 0x01,
/* network-wide upgrade file */
UPGRADE_FILE_ATTR_REMOTE = 0x02,
/* upgrade the assigned STA */
UPGRADE_FILE_ATTR_LIST = 0x03,
/* invalid attribution */
UPGRADE_FILE_ATTR_INVALID
} proto_upgrd_file_attr_e;
/* progress of upgrade */
typedef enum {
/* all done */
UPGRADE_TRANS_FILE_DONE = 0x00,
/* on the go */
UPGRADE_TRANS_FILE_INPROGRESS = 0x01,
/* partly failed */
UPGRADE_TRANS_FILE_UNCOMPLETE = 0x02,
/* unknown state */
UPGRADE_TRANS_FILE_INVALID = 0x03,
} proto_upgrd_file_state_e;
/** sta remote network upgrade info */
typedef struct _sta_upgrd_info {
uint8_t mac[IOT_MAC_ADDR_LEN];
uint8_t status;
uint8_t progress;
} sta_upgrd_info_t;
/* upgrade context */
typedef struct {
/* File attribute */
uint8_t file_attr;
/* current upgrade stage */
uint8_t stage;
/* current upgrade state */
uint8_t upgrd_state;
/* report count at one time */
uint8_t rpt_num;
/* Total segments of the file */
uint16_t seg_total;
/* current segment index */
uint16_t cur_seg_indx;
/* typical segment size */
uint16_t seg_size;
/* File length. */
uint32_t file_len;
/* File CRC check */
uint32_t file_crc;
/* upgrade id */
uint32_t upgrade_id;
/* upgrade monitor timer */
timer_id_t mon_timer;
/* total sta count in upgrade */
uint16_t total_sta_cnt;
/* total failed sta count */
uint16_t fail_sta_cnt;
/* upgrade list current indx */
uint16_t upgrd_list_indx;
/* file data */
uint8_t *file_data;
/* Timeout interval for file transfer, in minutes. */
uint32_t trans_timeout;
/* cco upgrade status in remote mode */
uint8_t cco_upd_state;
/* temporary sta upgrade data */
uint8_t * temp_data;
/* calculate crc32 value of all data received */
uint32_t calc_crc32;
/* upgrade info for every STA */
sta_upgrd_info_t sta_info[PROTO_UPGRADE_MAX_STA];
} proto_upgrd_contxt_t;
typedef struct _data_trans_head_t {
uint16_t cmd;
uint16_t length;
uint8_t data[0];
} data_trans_head_t;
/* pack for the structures in the whole file */
#pragma pack(push) // save the pack status
#pragma pack(1)
typedef struct {
/* file attribution, see PROTO_FILE_ATTR_xxx */
uint8_t file_attr;
/* Total segments of the file */
uint16_t seg_total;
/* File length. */
uint32_t file_len;
/* File content CRC32 checksum */
uint32_t file_crc;
/* Timeout interval for file transfer, in minutes. */
uint32_t trans_timeout;
} proto_start_trans_file_req;
/* Data transfer request structure */
typedef struct {
/* resrve */
uint8_t rsv;
/* File transfer segment number. */
uint16_t seg_num;
/* File transfer segment size. */
uint16_t seg_size;
/* File transfer segment CRC16-XMODEM(0x1021) checksum. */
uint16_t seg_crc;
/* File transfer segment data. */
uint8_t seg_data[0];
} proto_trans_file_data_req;
/* setting upgrade list */
typedef struct _set_upgrd_list_t {
/* Number of nodes */
uint8_t count;
/* sta mac which will be upgraded */
uint8_t mac[0];
} set_upgrd_list_t;
/* Structure of the response for setting upgrade list */
typedef struct _upgrd_resp_t {
/* Error code. 0: success; 1: failure */
uint8_t state;
/* fail reason */
uint8_t reason;
/* reserved for the future */
uint8_t rsv;
} upgrd_resp_t;
typedef struct query_progress_req {
/* read start index */
uint16_t start_index;
/* read num */
uint8_t count;
} query_progress_req;
typedef struct query_progress_ind {
/* total count */
uint16_t upgrade_total_count;
/* start index */
uint16_t start_index;
/* real repet count */
uint8_t resp_count;
/* data struct*/
sta_upgrd_info_t info[0];
} query_progress_ind;
/* response for the processing progress */
typedef struct upgrade_state_resp_t {
/* progress of upgrade */
uint8_t state;
/* counte fo failed STA */
uint16_t fail_sta;
/* reserve */
uint8_t rsv;
} upgrade_state_resp_t;
#pragma pack(pop)
uint32_t app_proto_start_trans_file(const proto_start_trans_file_req *frame, uint8_t *out_buffer, uint16_t *length);
uint32_t app_proto_trans_file_data(proto_trans_file_data_req *frame, uint8_t *out_buffer, uint16_t *length);
uint32_t app_proto_trans_file_query(uint8_t *out_buffer, uint16_t *length);
uint32_t app_proto_set_upgrd_list(set_upgrd_list_t *frame, uint8_t *out_buffer,
uint16_t *length,uint8_t renew);
uint32_t app_proto_trans_file_query_progress(query_progress_req *frame, uint8_t *out_buffer, uint16_t *length);
uint16_t app_proto_upgrd_contxt_init(void);
#ifdef __cplusplus
}
#endif
#endif /* end APP_UPG_H */