原始版本

This commit is contained in:
冯佳
2025-06-19 21:56:46 +08:00
parent fe98e5f010
commit a4841450cf
4152 changed files with 1910684 additions and 0 deletions

0
Menu/Kconfig Normal file
View File

20
Menu/SConscript Normal file
View File

@ -0,0 +1,20 @@
from building import *
import os
cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]
if GetDepend('BOARD_STM32F407VE6T_V2'):
cwd = GetCurrentDir()
src = Glob('src/*.c')
CPPPATH = [cwd, os.path.join(cwd,'include')]
group = DefineGroup('Menu', src, depend = [''], CPPPATH = CPPPATH)
list = os.listdir(cwd)
for item in list:
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
group = group + SConscript(os.path.join(item, 'SConscript'))
Return('group')

125
Menu/include/menu_pack.h Normal file
View File

@ -0,0 +1,125 @@
#ifndef _MENU_PACK_HANDLER_H_
#define _MENU_PACK_HANDLER_H_
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <stdint.h>
#include <stdbool.h>
#include "menu_pack_load.h"
#include "menu_pack_key.h"
#define DEFAULT_EMPTY_STRING " "
#define DEFAULT_ENGINEER_PASSWORD 2008
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
#endif
typedef enum EMenuPackCommand
{
MENU_PACK_KEY_PRESS = 0,
MENU_PACK_BEFORE_ENTER_SUB,
MENU_PACK_AFTER_EXIT_SUB
} EMenuPackCommand;
typedef struct TMenuPackLevel
{
int8_t menu_index;
int8_t item_select;
int8_t item_select_adjust;
int8_t item_display_start;
int8_t select_row;
} TMenuPackLevel;
typedef struct TCommRegisterInfo
{
uint32_t reg_addr;
uint8_t reg_count;
int8_t bit;
bool is_float;
bool is_big_endian;
} TCommRegisterInfo;
int32_t MenuPack_SearchCommIndex(TMenuPackFileInfo *pinfo, TCommRegisterInfo *pstcCommReg);
void MenuPack_ProcessFunc(EMenuPackCommand cmd, const struct TMenuItemInfo *pmenu_info, int key);
void MenuPack_DispMenu(const TMenuPackFileInfo *pinfo);
void MenuPack_ModifyMenu(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info);
void MenuPack_ProcessMenu(const TMenuPackFileInfo *pinfo, int key);
void MenuPack_ToUpperLayer(const TMenuPackFileInfo *pinfo, int key);
void MenuPack_EnterMainMenu(const TMenuPackFileInfo *pinfo);
void MenuPack_QuitToMainMenu(const TMenuPackFileInfo *pinfo);
bool MenuPack_ModifyDefault(int modify_row, int modify_col, char *buf, const char *max_format, const char *min_format);
int MenuPack_GetSelectItemIndex(const TMenuPackFileInfo *pinfo);
const struct TMenuDescriptionItem* MenuPack_SearchMenuDescription(const TMenuPackFileInfo *pinfo);
const struct TMenuDescriptionItem *MenuPack_MenuIndexDescription(const TMenuPackFileInfo *pinfo, int menu_index);
TMenuPackLevel *MenuPack_GetActiveLevel(const TMenuPackFileInfo *pinfo);
const char *MenuPack_GetStringFromOffset(const TMenuPackFileInfo *pinfo, uint16_t offset);
TCommRegisterInfo MenuPack_UpdateCommInfo(const char *preg_addr_key_str);
const struct TMenuItemInfo *MenuPack_GetSelectItem(const TMenuPackFileInfo *pinfo);
const char *MenuPack_GetDisplayAliasString(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
void MenuPack_GetDisplayNormalString(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off, char *pbuf, int buf_size);
int MenuPack_SearchAliasIndex(const TMenuPackFileInfo *pinfo, const char *alias_name);
const char *MenuPack_GetStringAlias(const TMenuPackFileInfo *pinfo, int alias_index, int16_t alias_value);
const char *MenuPack_MenuItemGetStringAlias(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int16_t alias_value);
int MenuPack_SearchMenuIndex(const TMenuPackFileInfo *pinfo, const char *pstr_menu_name);
void MenuPack_EnterSubMenu(int sub_menu_index);
void MenuPack_DisplayItem(int disp_row, int disp_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
int MenuPack_ModifyItem(int modify_row, int modify_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
void MenuPack_DisplayAlias(int disp_row, int disp_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
int MenuPack_ModifyAlias(int modify_row, int modify_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
void MenuPack_DisplayNormal(int disp_row, int disp_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
int MenuPack_ModifyNormal(int modify_row, int modify_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int reg_addr_off);
void MenuPack_SelectItem(const TMenuPackFileInfo *pinfo, int item_select_row);
void MenuPack_ExecuteSelectItem(const TMenuPackFileInfo *pinfo);
//weak function
void MenuPack_ModifyBufCallBack(char *buf);
const char *MenuPack_GetDisplayUnit(const char *punit, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info);
bool MenuPack_CheckVisible(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info);
int MenuPack_RegisterValueRead(TCommRegisterInfo *pstcCommReg, void *pbuf, int max_buf_items);
bool MenuPack_RegisterValueWrite(TCommRegisterInfo *pstcCommReg, void *pdata);
void MenuPack_DisplayFlush(void);
void MenuPack_Clear(void);
void MenuPack_CommReinit(void);
void MenuPack_DisplayModifyString(int modify_row, int modify_col, const char *str, int sel_bit);
void MenuPack_AfterDisplayMenu(const TMenuPackFileInfo *pinfo, const char *pstr_action, int menu_index);
void MenuPack_BeforeDisplayMenu(const TMenuPackFileInfo *pinfo, const char *pstr_action, int menu_index);
void MenuPack_DisplayDefaultAction(int disp_row,
int disp_col,
const TMenuPackFileInfo *pinfo,
const struct TMenuItemInfo *pmenu_info,
const char *pstr_action);
//pmenu_info may be NULL
void MenuPack_BrotherMenuEnterCallBack(const TMenuPackFileInfo *pinfo, int brother_menu_index, int key);
void MenuPack_MenuItemDisplay(const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info, int disp_line);
bool MenuPack_ActionItemModify(int modify_row, int modify_col, const TMenuPackFileInfo *pinfo, const struct TMenuItemInfo *pmenu_info);
void MenuPack_MenuActionProcess(const TMenuPackFileInfo *pinfo, const char *pstr_action, int menu_index, int *pkey);
bool MenuPack_InputPassword(const TMenuPackFileInfo *pinfo, uint16_t *pvalue_password);
bool MenuPack_CheckPasswordSuccess(const TMenuPackFileInfo *pinfo);
int COMM_ReadRegisters(uint16_t *resp, uint16_t reg_addr, uint16_t range);
bool COMM_WriteRegisters(uint16_t *recv, uint16_t reg_addr, uint16_t range);
int COMM_ReadBitRegisters(uint8_t *pbuf, uint16_t reg_addr, uint16_t range);
bool COMM_WriteBitRegisters(uint8_t *recv, uint16_t reg_addr, uint16_t range);
#endif /* _MAIN_H_ */

View File

@ -0,0 +1,42 @@
#ifndef MENU_PACK_KEY_H
#define MENU_PACK_KEY_H
typedef enum EGUIKey
{
MENU_PACK_KEY_NULL = 0,
MENU_PACK_KEY_BACKSPACE =8, /* ASCII: BACKSPACE Crtl-H */
MENU_PACK_KEY_TAB =9, /* ASCII: TAB Crtl-I */
MENU_PACK_KEY_BACKTAB =10,
MENU_PACK_KEY_ENTER =13, /* ASCII: ENTER Crtl-M */
MENU_PACK_KEY_LEFT =16,
MENU_PACK_KEY_UP =17,
MENU_PACK_KEY_RIGHT =18,
MENU_PACK_KEY_DOWN =19,
MENU_PACK_KEY_HOME =23,
MENU_PACK_KEY_END =24,
MENU_PACK_KEY_SHIFT =25,
MENU_PACK_KEY_CONTROL =26,
MENU_PACK_KEY_ESCAPE =27, /* ASCII: ESCAPE 0x1b */
MENU_PACK_KEY_INSERT =29,
MENU_PACK_KEY_DELETE =30,
MENU_PACK_KEY_SPACE =32,
MENU_PACK_KEY_PGUP =33,
MENU_PACK_KEY_PGDOWN =34,
MENU_PACK_KEY_RESET_OR_UP =35,
MENU_PACK_KEY_ENTER_OR_RIGHT =37,
MENU_PACK_KEY_DOT = '.',
MENU_PACK_KEY_0 =0x30,
MENU_PACK_KEY_1 =0x31,
MENU_PACK_KEY_2 =0x32,
MENU_PACK_KEY_3 =0x33,
MENU_PACK_KEY_4 =0x34,
MENU_PACK_KEY_5 =0x35,
MENU_PACK_KEY_6 =0x36,
MENU_PACK_KEY_7 =0x37,
MENU_PACK_KEY_8 =0x38,
MENU_PACK_KEY_9 =0x39,
} EGUIKey;
#endif

View File

@ -0,0 +1,236 @@
#ifndef _MENU_PACK_LOAD_H_
#define _MENU_PACK_LOAD_H_
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
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_ */

View File

@ -0,0 +1,71 @@
#ifndef MENU_PACK_PORT_H
#define MENU_PACK_PORT_H
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <stdint.h>
#include <stdbool.h>
#define MENU_PACK_TFT_PORT 1
#define MENU_DISPLAY_MAX_COL 2
#define MENU_TITLE_LINE -1
#define MENU_PREV_TITLE_LINE -2
#define MENU_NEXT_TITLE_LINE -3
int MenuPack_GetMaxRow(void);
int MenuPack_GetDispCount(void);
#ifndef min
#define min(a, b) ((a) < (b) ? (a) : (b))
#endif
#define MenuPack_BIG_ENDIAN(data) (((data & 0xFF) << 8) | ((data >> 8) & 0xFF))
//#define MAX_CURVE_NUMS 8
//#define CURVE_DISPLAY_WIDTH 420
//#define MAX_CURVE_BUF_SIZE 0x800
int MenuPack_WaitKey(int delay_ms);
void MenuPack_DisplayStringPos(int disp_line, int disp_col, const char *str);
void MenuPack_DisplayStringPosSelect(int disp_line, int disp_col, const char *str);
void MenuPack_DisplayStringPosModifing(int disp_line, int disp_col, const char *str, int select);
void MenuPack_GotoLine(int disp_line, int disp_col);
void MenuPack_DisplayString(const char *str);
void MenuPack_DisplayStringSelect(const char *str);
void MenuPack_DisplayStringModifing(const char *str, int select);
void MenuPack_GetDisplayString(char *buf, int scale, int value, const char *lead_str, const char *unit);
void MenuPack_DisplayTitleString(const char *str);
void MenuPack_DisplayPrevTitleString(const char *str);
void MenuPack_DisplayNextTitleString(const char *str);
void MenuPack_AddrDisplayString(unsigned short addr, const char * pstr);
void MenuPack_AddrDisplayAsciiString(int addr, const char *str);
void MenuPack_AddDecShift(int32_t v, uint8_t Len, uint8_t Shift, char**ps);
void MenuPack_DisplayVoltage(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayResistor(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayLeakUO(char *lead_str,char *pbuf, int value);
void MenuPack_DisplayLeakIO(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayCurrent(char * lead_str, char * pbuf, int circuit_id, int value);
void MenuPack_DisplaySignalCurrent(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayTemperature(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayAngle(char * lead_str, char * pbuf, int value);
void MenuPack_DisplayValue(int addr, int value, int len, int shift);
void MenuPack_DisplayValue16(int addr, short value);
void MenuPack_DisplayValueBuf(int addr, const short *pvalue, int items);
void MenuPack_DisplayBuf(int addr, void *pbuf, int size);
void MenuPack_DisplayPage(int page);
int MenuPack_GetDisplayPage(void);
void MenuPack_MenuClear(void);
#endif

75
Menu/src/menu.c Normal file
View File

@ -0,0 +1,75 @@
#include "menu_pack_port.h"
rt_uint8_t MenuPack_GetKey(void);
int MenuPack_WaitKey(int delay_ms)
{
int key = 0;
int i;
for (i = 0; i < delay_ms; i++)
{
key = MenuPack_GetKey();
if (key != 0)
{
return key;
}
rt_thread_mdelay(1);
}
return 0;
}
void MenuPack_GotoLine(int disp_line, int disp_col)
{
if (disp_line == MENU_TITLE_LINE)
{
//MenuPack_DisplayStringPos(disp_line, disp_col, DEFAULT_EMPTY_STRING);
}
else if (disp_line == MENU_PREV_TITLE_LINE)
{
//MenuPack_DisplayStringPos(disp_line, disp_col, DEFAULT_EMPTY_STRING);
}
else if (disp_line == MENU_NEXT_TITLE_LINE)
{
//MenuPack_DisplayStringPos(disp_line, disp_col, DEFAULT_EMPTY_STRING);
}
}
void MenuPack_DisplayString(const char *str)
{
MenuPack_DisplayStringPos(MENU_TITLE_LINE, MENU_PACK_TFT_PORT, str);
}
void MenuPack_DisplayStringSelect(const char *str)
{
MenuPack_DisplayStringPosSelect(MENU_TITLE_LINE, MENU_PACK_TFT_PORT, str);
}
void MenuPack_DisplayTitleString(const char *str)
{
MenuPack_DisplayStringPos(MENU_TITLE_LINE, MENU_PACK_TFT_PORT, str);
}
void MenuPack_DisplayPrevTitleString(const char *str)
{
MenuPack_DisplayStringPos(MENU_PREV_TITLE_LINE, MENU_PACK_TFT_PORT, str);
}
void MenuPack_DisplayNextTitleString(const char *str)
{
MenuPack_DisplayStringPos(MENU_NEXT_TITLE_LINE, MENU_PACK_TFT_PORT, str);
}
void MenuPack_DisplayStringPos(int disp_line, int disp_col, const char *str)
{
MenuPack_GotoLine(disp_line, disp_col);
MenuPack_DisplayString(str);
}
void MenuPack_DisplayStringPosSelect(int disp_line, int disp_col, const char *str)
{
MenuPack_GotoLine(disp_line, disp_col);
MenuPack_DisplayStringSelect(str);
}
void MenuPack_DisplayPage(int page)
{
}

0
Menu/src/menu_dat.c Normal file
View File

2041
Menu/src/menu_pack.c Normal file

File diff suppressed because it is too large Load Diff

206
Menu/src/menu_pack_load.c Normal file
View File

@ -0,0 +1,206 @@
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>
//#include "includes.h"
#include <dfs.h>
//#include <dfs_posix.h>
//#include "lfs_util.h"
#include "menu_pack_load.h"
uint8_t *App_MenuPackBuf;
TMenuPackFileInfo g_stcMenuPack;
const uint32_t crc32_tbl[256] = {
0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x076DC419L,
0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0x0EDB8832L, 0x79DCB8A4L,
0xE0D5E91EL, 0x97D2D988L, 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L,
0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L,
0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L,
0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L,
0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L,
0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL,
0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L,
0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L,
0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x06B6B51FL,
0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL,
0xE10E9818L, 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL,
0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L,
0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L,
0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL,
0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L,
0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L,
0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L,
0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L,
0x03B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L,
0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 0xF00F9344L,
0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL,
0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL,
0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L,
0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL,
0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL,
0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL,
0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L,
0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL,
0x026D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 0x92D28E9BL,
0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 0x86D3D2D4L, 0xF1D4E242L,
0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L,
0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L,
0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L,
0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L,
0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L,
0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L,
0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL,
0x2D02EF8DL
};
uint32_t file_crc32(const uint8_t *data, size_t len)
{
//uint32_t lfs_crc_value = lfs_crc(0xFFFFFFFF, data, len);
uint32_t crc = 0xFFFFFFFFL;
for (size_t i = 0; i < len; i++)
{
crc = (crc >> 8) ^ crc32_tbl[(crc & 0xFF) ^ *data++];
}
crc ^= 0xFFFFFFFFUL;
return crc;
}
void App_UpdateMenuPackPtr(const TMenuPackFileHead *pstcPackHeader)
{
const uint8_t *pdata_buf = (const uint8_t *)pstcPackHeader + sizeof(TMenuPackFileHead);
g_stcMenuPack.pstcPackHeader = pstcPackHeader;
g_stcMenuPack.pastcMenuPack = (struct TMenuPack *)(pdata_buf + pstcPackHeader->menu_pack_offset);
g_stcMenuPack.pastMenuPack2 = (struct TMenuPack2 *)(pdata_buf + pstcPackHeader->menu_pack2_offset);
g_stcMenuPack.pastcMenuDescriptionInfo = (struct TMenuDescriptionInfo *)(pdata_buf + pstcPackHeader->menu_description_offset);
g_stcMenuPack.pastcAliasPack = (struct TAliasPack *)(pdata_buf + pstcPackHeader->alias_pack_offset);
g_stcMenuPack.pastcAliasPack2 = (struct TAliasPack2 *)(pdata_buf + pstcPackHeader->alias_pack2_offset);
g_stcMenuPack.pastcUnitPack = (struct TUnitPack *)(pdata_buf + pstcPackHeader->unit_table_offset);
g_stcMenuPack.pastcFormatPack = (struct TScaleFormatPack *)(pdata_buf + pstcPackHeader->scale_format_table_offset);
g_stcMenuPack.pastcLimitPack = (struct TValueLimitTable *)(pdata_buf + pstcPackHeader->limit_table_offset);
g_stcMenuPack.pastcCommPack = (struct TCommPack *)(pdata_buf + pstcPackHeader->comm_table_offset);
g_stcMenuPack.pastcActionPack = (struct TActionPack *)(pdata_buf + pstcPackHeader->action_table_offset);
g_stcMenuPack.pastcStringPack = (struct TStringPack *)(pdata_buf + pstcPackHeader->string_table_offset);
}
bool App_LoadMenuPackInfoBuf(const uint8_t *pbuf, int buf_size)
{
int pack_offset = 0;
RT_ASSERT(((uint32_t)pbuf & 0x3) == 0);
const TMenuPackFileHead *pstcPackHeader = (const TMenuPackFileHead *)pbuf;
pack_offset += sizeof(TMenuPackFileHead);
pack_offset = RT_ALIGN(pack_offset, 4);
if (pstcPackHeader->header_size != sizeof(TMenuPackFileHead))
{
return false;
}
uint32_t crc_value = file_crc32((const uint8_t *)pstcPackHeader, sizeof(TMenuPackFileHead) - 4);
if (crc_value != pstcPackHeader->header_crc)
{
return false;
}
uint32_t data_size = buf_size - sizeof(TMenuPackFileHead);
if (data_size != pstcPackHeader->data_size)
{
return false;
}
const uint8_t *pdata_buf = (const uint8_t *)pstcPackHeader + sizeof(TMenuPackFileHead);
uint32_t data_crc_value = file_crc32(pdata_buf, data_size);
if (data_crc_value != pstcPackHeader->data_crc)
{
return false;
}
if (pstcPackHeader->menu_pack_offset % 4 != 0 || pstcPackHeader->menu_pack_offset >= data_size)
{
return false;
}
if (pstcPackHeader->menu_pack2_offset % 4 != 0 || pstcPackHeader->menu_pack2_offset >= data_size)
{
return false;
}
if (pstcPackHeader->menu_description_offset % 4 != 0 || pstcPackHeader->menu_description_offset >= data_size)
{
return false;
}
if (pstcPackHeader->alias_pack_offset % 4 != 0 || pstcPackHeader->alias_pack_offset >= data_size)
{
return false;
}
if (pstcPackHeader->alias_pack2_offset % 4 != 0 || pstcPackHeader->alias_pack2_offset >= data_size)
{
return false;
}
if (pstcPackHeader->unit_table_offset % 4 != 0 || pstcPackHeader->unit_table_offset >= data_size)
{
return false;
}
if (pstcPackHeader->scale_format_table_offset % 4 != 0 || pstcPackHeader->scale_format_table_offset >= data_size)
{
return false;
}
if (pstcPackHeader->limit_table_offset % 4 != 0 || pstcPackHeader->limit_table_offset >= data_size)
{
return false;
}
if (pstcPackHeader->comm_table_offset % 4 != 0 || pstcPackHeader->comm_table_offset >= data_size)
{
return false;
}
if (pstcPackHeader->action_table_offset % 4 != 0 || pstcPackHeader->action_table_offset >= data_size)
{
return false;
}
if (pstcPackHeader->string_table_offset % 4 != 0 || pstcPackHeader->string_table_offset >= data_size)
{
return false;
}
App_UpdateMenuPackPtr(pstcPackHeader);
return true;
}
bool App_LoadMenuPackInfo(const char *file_name)
{
struct stat st;
size_t rd_size;
int fd = open(file_name, O_RDONLY, 0);
if (fd < 0)
{
return false;
}
fstat(fd, &st);
App_MenuPackBuf = malloc(st.st_size);
rd_size = read(fd, App_MenuPackBuf, st.st_size);
close(fd);
if (rd_size == st.st_size)
{
return App_LoadMenuPackInfoBuf(App_MenuPackBuf, rd_size);
}
return false;
}