#ifndef _MENU_PACK_LOAD_H_ #define _MENU_PACK_LOAD_H_ #include #include #include typedef enum EMenuItemInfoType { MENU_ITEM_NORMAL, MENU_ITEM_ALIAS, MENU_ITEM_SUB_MENU, } EMenuItemInfoType; struct TMenuDescriptionItem { uint16_t menu_index : 8; uint16_t next_menu_index : 8; uint16_t prev_menu_index : 8; uint16_t display_page : 8; uint16_t max_menu_item : 8; uint16_t action_index : 8; uint16_t menu_name_str_offset; uint16_t description_str_off; uint16_t display_menu_index : 8; uint16_t rsv : 8; }; struct TMenuDescriptionInfo { uint32_t item_count; struct TMenuDescriptionItem items[1]; }; typedef struct TMenuItemInfoTypeCommon { uint16_t type : 2; uint16_t rsv : 14; uint16_t : 8; uint16_t action_index : 8; } TMenuItemInfoTypeCommon; typedef struct TMenuItemInfoTypeAlias { uint16_t type : 2; uint16_t rsv : 14; uint16_t alias_index : 8; uint16_t action_index : 8; } TMenuItemInfoTypeAlias; typedef struct TMenuItemInfoTypeNormal { uint32_t type : 2; uint32_t scale_format_index : 8; uint32_t limit_index : 8; uint32_t unit_index : 6; uint32_t action_index : 8; } TMenuItemInfoTypeNormal; typedef struct TMenuItemInfoTypeSubMenu { uint16_t type : 2; uint16_t rsv : 14; uint16_t sub_menu_index : 8; uint16_t action_index : 8; } TMenuItemInfoTypeSubMenu; typedef enum EMenuProperty { MENU_PROP_READ_ONLY = 0, MENU_PROP_USER, MENU_PROP_ENGINEER, } EMenuProperty; //每个菜单项12字节 struct TMenuItemInfo { uint16_t comm_str_offset; uint16_t name_offset; uint16_t comm_group_index : 8; uint16_t menu_property : 8; //EMenuProperty uint16_t remap_addr; union { TMenuItemInfoTypeCommon common; TMenuItemInfoTypeAlias alias; TMenuItemInfoTypeNormal normal; TMenuItemInfoTypeSubMenu sub_menu; } info; }; struct TMenuPack2 { uint32_t item_count; struct TMenuItemInfo items[1]; }; struct TMenuPackItem { uint16_t menu_start_index; uint16_t menu_items; }; struct TMenuPack { uint16_t item_count; uint16_t top_menu_index; struct TMenuPackItem items[1]; }; struct TCommItem { uint32_t reg_start; uint16_t reg_count; uint16_t cycle_time; uint16_t mqtt_menu_index; uint16_t rsv[1]; }; struct TCommPack { uint32_t item_count; struct TCommItem items[1]; }; struct TValueLimitItem { uint16_t min_string_off; uint16_t max_string_off; }; struct TValueLimitTable { uint32_t limit_count; struct TValueLimitItem items[1]; }; struct TAliasTable2Item { int16_t value; uint16_t alias_string_off; }; struct TAliasPack2 { uint32_t table_count; struct TAliasTable2Item items[1]; }; struct TAliasTableItem { int16_t start_index; uint16_t alias_item_nums; }; struct TAliasPack { uint32_t table_count; struct TAliasTableItem items[1]; }; struct TUnitPack { uint32_t unit_count; uint16_t uint_string_off[1]; }; struct TActionPack { uint32_t action_count; uint16_t action_string_off[1]; }; struct TScaleFormatItem { uint16_t scale_string_off; uint16_t format_string_off; }; struct TScaleFormatPack { uint32_t scale_format_count; struct TScaleFormatItem items[1]; }; struct TStringPack { uint32_t table_string_size; uint8_t table_string[1]; }; typedef struct { char file_version[8]; uint32_t header_size; uint32_t menu_pack_offset; uint32_t menu_pack2_offset; uint32_t menu_description_offset; uint32_t alias_pack_offset; uint32_t alias_pack2_offset; uint32_t scale_format_table_offset; uint32_t unit_table_offset; uint32_t limit_table_offset; uint32_t comm_table_offset; uint32_t action_table_offset; uint32_t string_table_offset; uint32_t rsv[3]; uint32_t data_size; uint32_t data_crc; uint32_t header_crc; } TMenuPackFileHead; typedef struct { const TMenuPackFileHead *pstcPackHeader; struct TMenuPack *pastcMenuPack; struct TMenuPack2 *pastMenuPack2; struct TMenuDescriptionInfo *pastcMenuDescriptionInfo; struct TAliasPack *pastcAliasPack; struct TAliasPack2 *pastcAliasPack2; struct TUnitPack *pastcUnitPack; struct TScaleFormatPack *pastcFormatPack; struct TValueLimitTable *pastcLimitPack; struct TCommPack *pastcCommPack; struct TActionPack *pastcActionPack; struct TStringPack *pastcStringPack; } TMenuPackFileInfo; extern TMenuPackFileInfo g_stcMenuPack; uint32_t file_crc32(const uint8_t *data, size_t len); bool App_LoadMenuPackInfoBuf(const uint8_t *pbuf, int buf_size); bool App_LoadMenuPackInfo(const char *file_name); void App_UpdateMenuPackPtr(const TMenuPackFileHead *pstcPackHeader); #endif /* _MAIN_H_ */