索引页面
索引页面主要功能:
- 创建26个字母按钮作为首字母索引进入交互口
- 创建页面后通过按键移动聚焦,查找对应的字符串添加到虚拟页面层2显示出来
/**
* @file GW_ItemIndex.c
*
* @date 2020/5/19
*
* @author aron566
*
* @copyright None
*
* @brief 参数列表索引展示
*
* @details 文件编码使用UTF-8 无BOM
*
* @version V1.0
*/
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "GW_ItemIndex.h"
#include "DRV_LcdPar.h"
/** Private typedef ----------------------------------------------------------*/
/** Private macros -----------------------------------------------------------*/
#define ITEMINDEX_ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ITEMINDEX_ID_TITLE_L (GUI_ID_USER + 1)
#define ITEMINDEX_ID_TITLE_M (GUI_ID_USER + 2)
#define ITEMINDEX_ID_TITLE_R (GUI_ID_USER + 3)
/*常用字段9个*/
#define ITEMINDEX_ID_ORIGIN_VA1_FIELD (GUI_ID_USER + 4)/**< 起始控件ID*/
#define ITEMINDEX_VAL_FIELD_NUM_MAX (9)/**< 最大控件数量*/
#define ITEMINDEX_ID_VAL_MAX (ITEMINDEX_ID_ORIGIN_VA1_FIELD+ITEMINDEX_VAL_FIELD_NUM_MAX-1)/**< 尾部控件ID*/
/*26个字母索引控件起始资源ID*/
#define ITEMINDEX_ID_ORIGIN_KEY_FIELD (ITEMINDEX_ID_VAL_NUM_MAX + 1)/**< 起始控件ID*/
#define ITEMINDEX_KEY_FIELD_NUM_MAX (26)/**< 最大控件数量*/
#define ITEMINDEX_ID_KEY_NUM_MAX (ITEMINDEX_ID_ORIGIN_KEY_FIELD+ITEMINDEX_KEY_FIELD_NUM_MAX-1)/**< 尾部控件ID*/
/*层级信息*/
#define ITEMINDEX_KEY_LAYER (0U)/**< 字段层*/
#define ITEMINDEX_VALUE_LAYER (ITEMINDEX_KEY_LAYER+1U)/**< 结果层*/
#define ITEMINDEX_PAGE_LAYER_MAX (2U)/**< 页面最大层级*/
/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/
/** Private variables --------------------------------------------------------*/
static WM_HWIN MAINWin = 0;
/*多层级页面信息*/
static ItemIndexPage_Typedef ItemIndexPage[ITEMINDEX_PAGE_LAYER_MAX];
/** Private function prototypes ----------------------------------------------*/
static void ItemIndexPage_Init(void);
static WM_HWIN CreateitemsChSearchWindow(void);
static void Mainwidow_Init(WM_MESSAGE *pMsg); /**< 初始化主窗口*/
static void CreateTittle(WM_MESSAGE *pMsg); /**< 建立标题控件*/
static void CreateTimer(WM_MESSAGE *pMsg); /**< 建立时间控件*/
static void CreateButton(WM_MESSAGE *pMsg); /**< 建立按钮控件*/
static void cbDialog(WM_MESSAGE *pMsg); /**< 初始化索引页面*/
static void WidgetFocusUpdate(void); /**< 更新控件聚焦*/
static uint32_t Get_FocusWidgetOffset(void); /**< 获取已聚焦控件偏移*/
static char Get_Search_Char(void); /**< 获取需索引的字段*/
static const char *Get_IndexStr(uint32_t index);
static const char *Get_WidgetStr(char ch ,uint32_t index);
static uint32_t Get_CurrentPage_Button_Num(void);
static void ItemIndexPage_ResLayerUpdate(void);
static uint32_t Calc_CurrentPage_WidgetNum(void);
static uint32_t Calc_CurrentWidgetOffsetInLayer(void);
static void ItemIndexPage_Forward(void); /**< 页面右翻页*/
static void ItemIndexPage_Back(void); /**< 页面左翻页*/
static void ItemIndexPage_Reload(void); /**< 主窗口重绘*/
static void ItemIndexPage_Down(void); /**< 下移*/
static void ItemIndexPage_Up(void); /**< 上移*/
/** Private user code --------------------------------------------------------*/
/** Private application code -------------------------------------------------*/
/*******************************************************************************
*
* Static code
*
********************************************************************************
*/
/*********************************************************************
*
* _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "WINDOW", ITEMINDEX_ID_WINDOW_0, 0, 0, UI_MAINWINDOW_WIDTH, UI_MAINWINDOW_HEIGHT, 0, 0x0, 0 }
};
/**
******************************************************************
* @brief 建立主窗口
* @param [in]None
* @retval 窗口句柄
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
static WM_HWIN CreateitemsChSearchWindow(void)
{
return GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), cbDialog, WM_HBKWIN, 0, 0);
}
/**
******************************************************************
* @brief 初始化索引页面
* @param [in]WM_MESSAGE 窗口管理消息指针
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
static void cbDialog(WM_MESSAGE * pMsg)
{
WM_EnableMemdev(pMsg->hWin);
switch (pMsg->MsgId)
{
case WM_INIT_DIALOG:
/*初始化主窗口*/
Mainwidow_Init(pMsg);
/*创建标题*/
CreateTittle(pMsg);
/*创建按钮*/
CreateButton(pMsg);
/*创建定时器*/
WM_CreateTimer(pMsg->hWin, 0, PAGE_TIMER_PERIOD, 0);
break;
case WM_NOTIFY_PARENT:
break;
case GW_WM_KEY:
case WM_KEY:
break;
case WM_TIMER:
CreateTimer(pMsg);
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
/**
******************************************************************
* @brief 初始化索引页面定时器
* @param [in]WM_MESSAGE 窗口管理消息指针
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
static void CreateTimer(WM_MESSAGE * pMsg)
{
WM_EnableMemdev(pMsg->hWin);
/*重启定时器*/
WM_RestartTimer(pMsg->Data.v, PAGE_TIMER_PERIOD);
/*显示时间*/
WM_HWIN hItem = WM_GetDialogItem(pMsg->hWin, ITEMINDEX_ID_TITLE_R);
WM_EnableMemdev(hItem);
char timeStr[10];
TEXT_SetFont(hItem,GUI_FONT_16_1);
GDT_get_current_time(timeStr);
TEXT_SetText(hItem, timeStr);
}
/**
******************************************************************
* @brief 页面信息初始化
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Init(void)
{
memset(ItemIndexPage ,0 ,ITEMINDEX_PAGE_LAYER_MAX*sizeof(ItemIndexPage_Typedef));
/*层1作为9个常用字段+26个字母索引层*/
ItemIndexPage[ITEMINDEX_KEY_LAYER].PageType = ITEMINDEX_KEY_LAYER;
ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Num = (ARRAYNUM(Key_Search_Map))+ITEMINDEX_VAL_FIELD_NUM_MAX;
ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].PageNum = (ARRAYNUM(Key_Search_Map)+ITEMINDEX_VAL_FIELD_NUM_MAX-1)/ITEM_INDEX_PAGE_BUTTON_NUM_MAX;/**<减1防止控件数量正好1页而错误的计算为2页*/
ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;/**< 默认当前层激活*/
/*层2作为索引结果层*/
ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageType = ITEMINDEX_VALUE_LAYER;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Num = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Offset = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
}
/**
******************************************************************
* @brief 初始化主窗口
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
static void Mainwidow_Init(WM_MESSAGE * pMsg)
{
WM_HWIN hItem = pMsg->hWin;
WM_EnableMemdev(hItem);
/*do something ...*/
}
/**
******************************************************************
* @brief 初始化索引页面标题
* @param [in]WM_MESSAGE 窗口管理消息指针
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void CreateTittle(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
WM_EnableMemdev(pMsg->hWin);
/*左侧标题*/
hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_DEVICE_STATE_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_DEVICE_STATE_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_L ,"");
WM_EnableMemdev(hItem);
TEXT_SetBkColor(hItem, GUI_BK_TITLE);
/*中部标题*/
hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_TITLE_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_TITLE_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_M ,"字段表");
WM_EnableMemdev(hItem);
TEXT_SetBkColor(hItem, GUI_BK_TITLE);
/*右侧标题*/
hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_CLOCK_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_CLOCK_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_R ,"");
WM_EnableMemdev(hItem);
TEXT_SetBkColor(hItem, GUI_BK_TITLE);
}
/**
******************************************************************
* @brief 初始化索引页面按钮
* @param [in]WM_MESSAGE 窗口管理消息指针
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void CreateButton(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
WM_EnableMemdev(pMsg->hWin);
/*判断当前页面可创建按钮数目*/
int ButtonNum = Get_CurrentPage_Button_Num();
/*循环创建字母索引字段按钮*/
for(int i = 0; i < ButtonNum;i++)
{
/*建立按钮*/
hItem = BUTTON_CreateEx(ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_H_X(i),ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_Y_X(i), ITEM_INDEX_PAGE_BUTTON_WIDTH, ITEM_INDEX_PAGE_BUTTON_END_Y,
pMsg->hWin, WM_CF_SHOW, 0,ITEMINDEX_ID_ORIGIN_VA1_FIELD+i);
WM_EnableMemdev(hItem);
/*取消3D色*/
BUTTON_SetSkinClassic(hItem);
/*设定背景色*/
BUTTON_SetBkColor(hItem ,BUTTON_CI_UNPRESSED ,Key_Search_Map[i%ITEMINDEX_KEY_FIELD_NUM_MAX].Color);
/*设定前景色*/
BUTTON_SetTextColor(hItem ,BUTTON_CI_UNPRESSED ,GUI_WHITE);
/*设置聚焦虚线色*/
if(Key_Search_Map[i%ITEMINDEX_KEY_FIELD_NUM_MAX].Color == GUI_RED)
{
BUTTON_SetFocusColor(hItem ,GUI_BLACK);
}
else
{
BUTTON_SetFocusColor(hItem ,GUI_RED);
}
/*设置显示内容*/
BUTTON_SetText(hItem, Get_IndexStr(i));
}
/*设定初始聚焦*/
WidgetFocusUpdate();
}
/**
******************************************************************
* @brief 更新页面控件聚焦
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-21
******************************************************************
*/
static void WidgetFocusUpdate(void)
{
/*判断主窗口已建立*/
if(MAINWin != 0)
{
WM_HWIN hItem = WM_GetDialogItem(MAINWin, ITEMINDEX_ID_ORIGIN_VA1_FIELD + Get_FocusWidgetOffset());
WM_EnableMemdev(hItem);
WM_SetFocus(hItem);
}
}
/**
******************************************************************
* @brief 获取上次聚焦的索引字段,转换为首字符
* @param [in]None
* @retval 首字符
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static char Get_Search_Char(void)
{
char ch = 'A';
uint32_t CurrentPage = ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum;
uint32_t CurrentPageWidgetOffset = ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset;
/*打开字段索引层激活状态*/
uint32_t temp = ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive;
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;
uint32_t Widget_OffsetInLayer = Calc_CurrentWidgetOffsetInLayer();
/*恢复状态*/
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = temp;
uint32_t Offset = 0;
if(Widget_OffsetInLayer >= ITEMINDEX_VAL_FIELD_NUM_MAX)
{
Offset = CurrentPageWidgetOffset+((CurrentPage-1)*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ITEM_INDEX_PAGE_BUTTON_NUM_MAX-ITEMINDEX_VAL_FIELD_NUM_MAX;
ch += Offset;
return ch;
}
return ch;
}
/**
******************************************************************
* @brief 获取当前页面,指定偏移控件所在字符串
* @param [in]ch 索引首部字段
* @param [in]index 当前页面所在偏移
* @retval 字符串所在地址
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static const char *Get_WidgetStr(char ch ,uint32_t index)
{
/*计算当前控件在全部页面的索引值*/
uint32_t IN_ALLPAGE_WidgetIndex = ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum==0?index:ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX+index;
/*获取指定字段,指定索引号的 字符串地址*/
return Get_Special_Ch_Str(ch ,IN_ALLPAGE_WidgetIndex);
}
/**
******************************************************************
* @brief 获取当前页面,指定控件的字符串
* @param [in]在当前页面的控件号
* @retval 字符串地址
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static const char *Get_IndexStr(uint32_t index)
{
uint32_t CurrentPage = 0;
/*字段层激活*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum == 0)
{
if(index < ITEMINDEX_VAL_FIELD_NUM_MAX)
{
return Get_Special_Index_Str(index+1);
}
else
{
return Key_Search_Map[index-ITEMINDEX_VAL_FIELD_NUM_MAX].Str;
}
}
else
{
CurrentPage = ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum;
return Key_Search_Map[index+((CurrentPage-1)*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ITEM_INDEX_PAGE_BUTTON_NUM_MAX-ITEMINDEX_VAL_FIELD_NUM_MAX].Str;
}
}
/*索引结果层激活*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
/*获取索引的字段*/
char ch = Get_Search_Char();
return Get_WidgetStr(ch ,index);
}
return "";
}
/**
******************************************************************
* @brief 获取当前层,当前页面,需绘制的按钮总数
* @param [in]None
* @retval 当页按钮总数
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static uint32_t Get_CurrentPage_Button_Num(void)
{
/*判断当前激活层*/
/*字段层激活*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
return Calc_CurrentPage_WidgetNum();
}
/*索引结果层激活*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
/*更新索引层*/
ItemIndexPage_ResLayerUpdate();
return Calc_CurrentPage_WidgetNum();
}
return 0;
}
/**
******************************************************************
* @brief 更新索引结果层,可创建控件数目,总页数
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_ResLayerUpdate(void)
{
static char Last_SerachCh = 0;
/*获取索引的字段*/
char ch = Get_Search_Char();
/*上次查询不一致则重置当前页面号*/
if(ch != Last_SerachCh)
{
Last_SerachCh = ch;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum = 0;
}
/*更新该字段在当前层中数目*/
ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Num = Get_Special_Ch_Num(ch);
/*更新该字段总页数*/
ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum = (Get_Special_Ch_Num(ch)-1)/ITEM_INDEX_PAGE_BUTTON_NUM_MAX;
}
/**
******************************************************************
* @brief 计算当前页可建立控件数目
* @param [in]None
* @retval 可创建数目
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static uint32_t Calc_CurrentPage_WidgetNum(void)
{
uint32_t WidgetNum = 0;
uint8_t CurrentLayer = 0;
/*获取当前激活层*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
else if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断当前页面是否是最首页*/
if(0 == ItemIndexPage[CurrentLayer].CurrentPageNum)
{
WidgetNum = ItemIndexPage[CurrentLayer].Widget_Num>ITEM_INDEX_PAGE_BUTTON_NUM_MAX?ITEM_INDEX_PAGE_BUTTON_NUM_MAX:ItemIndexPage[CurrentLayer].Widget_Num;
}
else
{
/*不是首页则判断,剩余页,剩余数目*/
/*获取剩余控件数,包含当前页*/
WidgetNum = ItemIndexPage[CurrentLayer].Widget_Num-ItemIndexPage[CurrentLayer].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX;
/*限制绘制控件数目*/
WidgetNum = WidgetNum>ITEM_INDEX_PAGE_BUTTON_NUM_MAX?ITEM_INDEX_PAGE_BUTTON_NUM_MAX:WidgetNum;
}
return WidgetNum;
}
return 0;
}
/**
******************************************************************
* @brief 计算控件在当前层中的偏移索引号
* @param [in]None
* @retval 索引号
* @author aron566
* @version V1.0
* @date 2020-5-22
******************************************************************
*/
static uint32_t Calc_CurrentWidgetOffsetInLayer(void)
{
uint32_t ret = 0;
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
else if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
else
{
return ret;
}
return (ItemIndexPage[CurrentLayer].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ItemIndexPage[CurrentLayer].Widget_Offset;
}
/**
******************************************************************
* @brief 获取当前已激活层,当前页面聚焦控件所在偏移
* @param [in]None
* @retval 聚焦控件在当前页面偏移
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static uint32_t Get_FocusWidgetOffset(void)
{
/*字段层激活*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
return ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset;
}
/*索引结果层*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
return ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Offset;
}
return 0;
}
/**
******************************************************************
* @brief 左翻页处理,或左移处理
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Back(void)
{
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
#if USE_NEXT_PAGE
/*判断是否是索引结果层*/
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断是否是首页,则不可翻页*/
if(ItemIndexPage[CurrentLayer].CurrentPageNum == 0)
{
return;
}
else
{
ItemIndexPage[CurrentLayer].CurrentPageNum -= 1;
/*主窗口重绘*/
ItemIndexPage_Reload();
}
}
#else
/*字段层或索引层激活*/
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断是否可以继续左移*/
if(ItemIndexPage[CurrentLayer].Widget_Offset >= ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)
{
ItemIndexPage[CurrentLayer].Widget_Offset -= ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX;
/*更新聚焦*/
WidgetFocusUpdate();
return;
}
else
{
/*判断是否是一页,则不可翻页*/
if(ItemIndexPage[CurrentLayer].CurrentPageNum == 0)
{
/*改为上移动*/
ItemIndexPage_Up();
/*更新聚焦*/
WidgetFocusUpdate();
return;
}
else
{
if(ItemIndexPage[CurrentLayer].CurrentPageNum > 0)
{
/*向左翻页*/
ItemIndexPage[CurrentLayer].CurrentPageNum -= 1;
/*控件聚焦到最右侧*/
ItemIndexPage[CurrentLayer].Widget_Offset += ((ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX-1)*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX);
/*限制超出可聚焦控件数*/
uint32_t temp = Get_CurrentPage_Button_Num();
ItemIndexPage[CurrentLayer].Widget_Offset = temp>ItemIndexPage[CurrentLayer].Widget_Offset?ItemIndexPage[CurrentLayer].Widget_Offset:temp;
}
}
}
/*主窗口重绘*/
ItemIndexPage_Reload();
}
#endif
}
/**
******************************************************************
* @brief 右翻页处理,或右移处理
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Forward(void)
{
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
#if USE_NEXT_PAGE
/*判断是否是索引结果层*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
/*判断是否是尾页,则不可翻页*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum == ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum)
{
return;
}
else
{
ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum += 1;
/*主窗口重绘*/
ItemIndexPage_Reload();
}
}
#else
/*字段层或索引层激活*/
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断是否可以继续右移*/
if((ItemIndexPage[CurrentLayer].Widget_Offset+ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX) <= (Get_CurrentPage_Button_Num()-1))
{
ItemIndexPage[CurrentLayer].Widget_Offset += ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX;
/*更新聚焦*/
WidgetFocusUpdate();
return;
}
else
{
/*判断是否是最后页,则不可翻页*/
if(ItemIndexPage[CurrentLayer].CurrentPageNum == ItemIndexPage[CurrentLayer].PageNum)
{
/*改为下移动*/
ItemIndexPage_Down();
/*更新聚焦*/
WidgetFocusUpdate();
return;
}
else
{
if(ItemIndexPage[CurrentLayer].CurrentPageNum < ItemIndexPage[CurrentLayer].PageNum)
{
/*向右翻页*/
ItemIndexPage[CurrentLayer].CurrentPageNum += 1;
/*控件聚焦到最左侧*/
ItemIndexPage[CurrentLayer].Widget_Offset -= ((ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX-1)*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX);
/*限制超出可聚焦控件数*/
uint32_t temp = Get_CurrentPage_Button_Num();
ItemIndexPage[CurrentLayer].Widget_Offset = temp>ItemIndexPage[CurrentLayer].Widget_Offset?ItemIndexPage[CurrentLayer].Widget_Offset:temp;
}
}
}
/*主窗口重绘*/
ItemIndexPage_Reload();
}
#endif
}
/**
******************************************************************
* @brief 上键处理,单页循环聚焦
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Up(void)
{
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
/*字段层或索引层激活*/
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断是否是当前页面首个控件,则不可移动*/
if(ItemIndexPage[CurrentLayer].Widget_Offset == 0)
{
if(ItemIndexPage[CurrentLayer].Widget_Num >= ITEM_INDEX_PAGE_BUTTON_NUM_MAX)
{
ItemIndexPage[CurrentLayer].Widget_Offset = Get_CurrentPage_Button_Num()-1;
}
else
{
ItemIndexPage[CurrentLayer].Widget_Offset = ItemIndexPage[CurrentLayer].Widget_Num-1;
}
}
else
{
ItemIndexPage[CurrentLayer].Widget_Offset--;
}
}
/*更新聚焦*/
WidgetFocusUpdate();
}
/**
******************************************************************
* @brief 下键处理,单页循环聚焦
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Down(void)
{
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
/*字段层或索引层激活*/
if(ItemIndexPage[CurrentLayer].IsActive)
{
/*判断是否是当前页面最后一个控件,则不可移动*/
if(ItemIndexPage[CurrentLayer].Widget_Offset == (ItemIndexPage[CurrentLayer].Widget_Num-1) ||
ItemIndexPage[CurrentLayer].Widget_Offset == (Get_CurrentPage_Button_Num()-1))
{
ItemIndexPage[CurrentLayer].Widget_Offset = 0;
}
else
{
ItemIndexPage[CurrentLayer].Widget_Offset++;
}
}
/*更新聚焦*/
WidgetFocusUpdate();
}
/**
******************************************************************
* @brief OK键处理
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Ok(void)
{
/*字段层激活-->进入当前字段索引结果层或选中常用字符时完成索引退出*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
if(Calc_CurrentWidgetOffsetInLayer() < ITEMINDEX_VAL_FIELD_NUM_MAX)
{
/*已选中常用字段*/
/*判断索引结果*/
ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 1;
if(ItemIndexWindowGetResult() != NULL)
{
ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 1;
}
else
{
ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 0;
}
ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
/*隐藏删除窗口*/
ItemIndexWindowHide();
}
else
{
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 1;
}
ItemIndexPage_Reload();
return;
}
/*索引结果层-->确认选择*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
/*判断索引结果*/
ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 1;
if(ItemIndexWindowGetResult() != NULL)
{
ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 1;
}
else
{
ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 0;
}
/*已完成索引-->窗口全部失效*/
ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
/*隐藏删除窗口*/
ItemIndexWindowHide();
return;
}
}
/**
******************************************************************
* @brief 返回键处理
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Return(void)
{
/*字段层激活*/
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
{
ItemIndexWindowHide();
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
ItemIndexPage_Reload();
return;
}
/*索引结果层*/
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;
ItemIndexPage_Reload();
return;
}
}
/**
******************************************************************
* @brief 主窗口重新绘制
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
static void ItemIndexPage_Reload(void)
{
/*窗口失效-->重新绘制*/
if(MAINWin != 0)
{
WM_InvalidateWindow(MAINWin);
WM_DeleteWindow(MAINWin);
MAINWin = CreateitemsChSearchWindow();
}
}
/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
* Public code
*
********************************************************************************
*/
/**
******************************************************************
* @brief 获取运行结果状态
* @param [in]None
* @retval 1 成功
* @retval 0 失败
* @author aron566
* @version V1.0
* @date 2020-5-21
******************************************************************
*/
uint32_t ItemIndexWindowGetTaskResult(void)
{
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult || ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult)
{
return 1;
}
else
{
return 0;
}
}
/**
******************************************************************
* @brief 字段索引窗口,已索引到数据获取
* @param [in]None
* @retval 索引结果字符串地址
* @author aron566
* @version V1.0
* @date 2020-5-21
******************************************************************
*/
const char *ItemIndexWindowGetResult(void)
{
uint32_t temp;
uint8_t CurrentLayer = 0;
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult)
{
CurrentLayer = ITEMINDEX_KEY_LAYER;
}
if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult)
{
CurrentLayer = ITEMINDEX_VALUE_LAYER;
}
if(ItemIndexPage[CurrentLayer].TaskResult)
{
temp = ItemIndexPage[CurrentLayer].IsActive;
/*激活当前需获取数据的层*/
ItemIndexPage[CurrentLayer].IsActive = 1;
const char *ret = Get_IndexStr(ItemIndexPage[CurrentLayer].Widget_Offset);
ItemIndexPage[CurrentLayer].IsActive = temp;
return ret;
}
return NULL;
}
/**
******************************************************************
* @brief 字段索引窗口,状态获取
* @param [in]None
* @retval 1 窗口显示中
* @retval 0 窗口已失效
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
uint8_t ItemIndexWindowGetState(void)
{
if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive || ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
{
return 1;
}
else
{
return 0;
}
}
/**
******************************************************************
* @brief 字段索引窗口按键处理
* @param [in]Key
* @retval 当前窗口状态:1显示 0关闭
* @author aron566
* @version V1.0
* @date 2020-5-20
******************************************************************
*/
uint8_t ItemIndexWindowSendKey(int key)
{
/*判断窗口是否处于激活状态则下发按键*/
if(ItemIndexWindowGetState())
{
switch(key)
{
case GUI_KEY_UP:
ItemIndexPage_Up();
break;
case GUI_KEY_DOWN:
ItemIndexPage_Down();
break;
case GUI_KEY_LEFT:
ItemIndexPage_Back();
break;
case GUI_KEY_RIGHT:
ItemIndexPage_Forward();
break;
case GUI_KEY_ENTER:
ItemIndexPage_Ok();
break;
case GUI_KEY_ESCAPE:
ItemIndexPage_Return();
break;
default:
break;
}
}
/*返回当前窗口状态*/
return ItemIndexWindowGetState();
}
/**
******************************************************************
* @brief 字段索引窗口显示
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
void ItemIndexWindowShow(void)
{
if(MAINWin == 0)
{
/*重置窗口资源*/
ItemIndexPage_Init();
MAINWin = CreateitemsChSearchWindow();
}
}
/**
******************************************************************
* @brief 字段索引窗口隐藏
* @param [in]None
* @retval None
* @author aron566
* @version V1.0
* @date 2020-5-18
******************************************************************
*/
void ItemIndexWindowHide(void)
{
if(MAINWin)
{
WM_DeleteWindow(MAINWin);
MAINWin = 0;
}
}
#ifdef __cplusplus ///<end extern c
}
#endif
索引页面头文件
/**
* @file GW_ItemIndex.h
*
* @date 2020/5/19
*
* @author aron566
*
* @brief 参数列表索引展示 文件编码使用UTF-8 无BOM
*
* @version V1.0
*/
#ifndef GW_ITEMINDEX_H
#define GW_ITEMINDEX_H
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< nedd definition of uint8_t */
#include <stddef.h> /**< need definition of NULL */
//#include <stdbool.h>/**< need definition of BOOL */
#include <stdio.h> /**< if need printf */
#include <stdlib.h>
#include <string.h>
/** Private includes ---------------------------------------------------------*/
/** Private defines ----------------------------------------------------------*//** Exported typedefines -----------------------------------------------------*/
/*索引表建立*/
typedef enum
{
GL_SEARCH_CHAR_A = 0,/**< 参数字段首字母索引*/
GL_SEARCH_CHAR_B,
GL_SEARCH_CHAR_C,
GL_SEARCH_CHAR_D,
GL_SEARCH_CHAR_E,
GL_SEARCH_CHAR_F,
GL_SEARCH_CHAR_G,
GL_SEARCH_CHAR_H,
GL_SEARCH_CHAR_I,
GL_SEARCH_CHAR_J,
GL_SEARCH_CHAR_K,
GL_SEARCH_CHAR_L,
GL_SEARCH_CHAR_M,
GL_SEARCH_CHAR_N,
GL_SEARCH_CHAR_O,
GL_SEARCH_CHAR_P,
GL_SEARCH_CHAR_Q,
GL_SEARCH_CHAR_R,
GL_SEARCH_CHAR_S,
GL_SEARCH_CHAR_T,
GL_SEARCH_CHAR_U,
GL_SEARCH_CHAR_V,
GL_SEARCH_CHAR_W,
GL_SEARCH_CHAR_X,
GL_SEARCH_CHAR_Y,
GL_SEARCH_CHAR_Z,}IndexKey_Typedef;
/** 索引页面控件属性*/
typedef struct
{
IndexKey_Typedef WidgetIndex; /**< 控件属性所在索引号*/
char Str[32]; /**< 控件对应的字符串描述*/
uint32_t Color; /**< 背景色*/
}ItemIndexWidget_Typedef;
/** 索引页面结构体*/
typedef struct
{
uint32_t PageType; /**< 该页面类型。eg:根据页面类型查找填入该写入的参数*/
uint32_t Widget_Num; /**< 该页面类型全部控件总数*/
uint32_t Widget_Offset; /**< 该页面已聚焦控件偏移数*/
uint32_t PageNum; /**< 该类型页面总数。eg:根据预设单页显示控件数宏,与页面控件总数,转换为页数*/
uint32_t CurrentPageNum; /**< 当前显示页面号*/
uint32_t IsActive; /**< 该页面是否激活状态*/
uint32_t TaskResult; /**< 该页面功能运行结果*/
}ItemIndexPage_Typedef;
/** Exported constants -------------------------------------------------------*/
ItemIndexWidget_Typedef Key_Search_Map[] =
{
{GL_SEARCH_CHAR_A, "A字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(254, 67, 101))},
{GL_SEARCH_CHAR_B, "B字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(252, 157, 154))},
{GL_SEARCH_CHAR_C, "C字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(249, 205, 173))},
{GL_SEARCH_CHAR_D, "D字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(200, 200, 169))},
{GL_SEARCH_CHAR_E, "E字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(131, 175, 155))},
{GL_SEARCH_CHAR_F, "F字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(178, 200, 187))},
{GL_SEARCH_CHAR_G, "G字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 69, 137, 148))},
{GL_SEARCH_CHAR_H, "H字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(117, 121, 74))},
{GL_SEARCH_CHAR_I, "I字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(114, 83, 52))},
{GL_SEARCH_CHAR_J, "J字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(130, 57, 53))},
{GL_SEARCH_CHAR_K, "K字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(137, 190, 178))},
{GL_SEARCH_CHAR_L, "L字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(201, 186, 131))},
{GL_SEARCH_CHAR_M, "M字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(222, 211, 140))},
{GL_SEARCH_CHAR_N, "N字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(222, 156, 83))},
{GL_SEARCH_CHAR_O, "O字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 36, 33, 28))},
{GL_SEARCH_CHAR_P, "P字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(172, 81, 24))},
{GL_SEARCH_CHAR_Q, "Q字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(159, 125, 80))},
{GL_SEARCH_CHAR_R, "R字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(160, 191, 124))},
{GL_SEARCH_CHAR_S, "S字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 3, 35, 14))},
{GL_SEARCH_CHAR_T, "T字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(224, 160, 158))},
{GL_SEARCH_CHAR_U, "U字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 0, 0, 0))},
{GL_SEARCH_CHAR_V, "V字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(117, 36, 35))},
{GL_SEARCH_CHAR_W, "W字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(161, 47, 47))},
{GL_SEARCH_CHAR_X, "X字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 30, 41, 61))},
{GL_SEARCH_CHAR_Y, "Y字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888(173, 137, 118))},
{GL_SEARCH_CHAR_Z, "Z字段" ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 38, 188, 213))},
};
/** Exported macros-----------------------------------------------------------*//** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/
void ItemIndexWindowHide(void);
void ItemIndexWindowShow(void);
void ItemIndexWindowSendKey(int key);
uint8_t ItemIndexWindowGetState(void);
const char *ItemIndexWindowGetResult(void);
uint32_t ItemIndexWindowGetTaskResult(void);
#ifdef __cplusplus ///<end extern c
}
#endif
#endif
/******************************** End of file *********************************/
通用页面布局
通用页面布局主要功能:
- 实现通过设置页面的像素自动整定各个控件的相对位置区域
- 具备通用label位置/edit位置/button位置/标题位置
- 通过设置控件行数列数,排列方式,垂直间隙,水平间隙自动计算控件大小,及每个控件的相对位置
/*
* FILE: DRV_LcdPar.c
*
* Created on: 2020/4/24
*
* Author: aron566
*
* DESCRIPTION:--
*/
#ifdef __cplusplus //use C compiler
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "DRV_LcdPar.h"
/* Private macros-------------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/*运行时间*/
static volatile uint32_t userOS_TimeMS = 0;
static volatile uint32_t OS_TimeSec = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
/* Public variables ----------------------------------------------------------*/
/*******************************************************************************
*
* Static code
*
********************************************************************************
*/
/*******************************************************************************
*
* Public code
*
********************************************************************************
*/
/* 放入1ms中断 */
void millsec_IRQ_handler(void)
{
static uint16_t cnt_ms = 0;
userOS_TimeMS++;
if (++cnt_ms >= 1000)
{
OS_TimeSec++;
cnt_ms = 0;
}
}/**
******************************************************************
* @brief 获取ms计数
* @param None
* @retval userOS_TimeMS
* @author aron566
* @version v1.0
* @date 2020/5/6
******************************************************************
*/
uint32_t get_time_ms(void)
{
return userOS_TimeMS;
}/**
******************************************************************
* @brief 获取秒计数
* @param None
* @retval OS_TimeSec
* @author aron566
* @version v1.0
* @date 2020/5/6
******************************************************************
*/
uint32_t get_time_sec(void)
{
return OS_TimeSec;
}
#ifdef __cplusplus //end extern c
}
#endif
/******************************** End of file *********************************/
/*
* FILE: DRV_LcdPar.h
*
* Created on: 2020/4/24
*
* Author: aron566
*
* DESCRIPTION:--
*/
#ifndef DRV_LCDPAR_H
#define DRV_LCDPAR_H
#ifdef __cplusplus //use C compiler
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h> /*nedd definition of uint8_t*/
#include <stddef.h> /*need definition of NULL*/
#include <stdbool.h>/*need definition of BOOL*/
#include <stdio.h> /*if need printf*/
#include <stdlib.h>
#include <string.h>
/* Private includes ----------------------------------------------------------*/
#include "ipa.h"
/* Private defines -----------------------------------------------------------*/
#define GUI_GRAY_C8 TL_CV_RGB888_SWAP(TL_GET_RGB888(157, 255, 255)) /**< 菜单按钮界面标题栏色彩设置 */
#define GUI_GRAY_E7 GUI_WHITE
#define GUI_GRAY_9A GUI_WHITE
#define EDIT_EnableInversion(item,value) do{}while(0)
#define EDIT_CI_CURSOR EDIT_CI_ENABLED
#define GUI_MAKE_COLOR(ARGB) (ARGB)
/*图形最大显示区域设定,单位:像素*/
#define UI_MAINWINDOW_WIDTH (480U)
#define UI_MAINWINDOW_HEIGHT (320U)
/*状态栏高度设定*/
#define TITLE_START_Y (0U) /*标题栏起始Y*/
#define TITLE_END_Y (UI_MAINWINDOW_HEIGHT/10) /*标题栏高度Y*/
#define BOTTOM_START_Y (UI_MAINWINDOW_HEIGHT*9/10) /*底部状态栏起始Y*/
#define BOTTOM_END_Y (UI_MAINWINDOW_HEIGHT-BOTTOM_START_Y) /*底部状态栏高度Y*/
#define TITLE2_START_Y TITLE_END_Y /*第二个标题起始Y*/
#define TITLE2_END_Y (25U) /*第二个标题栏高度Y*/
/*状态栏宽度,位置设定*/
/*upper*/
#define PAGE_DEVICE_STATE_START_X (0U) /*设备状态起始X*/
#define PAGE_DEVICE_STATE_END_X (UI_MAINWINDOW_WIDTH*2/10U) /*设备状态长度X*/
#define PAGE_TITLE_START_X PAGE_DEVICE_STATE_END_X /*页面标题起始X*/
#define PAGE_TITLE_END_X (UI_MAINWINDOW_WIDTH*6/10U) /*页面标题长度X*/
#define PAGE_CLOCK_START_X (UI_MAINWINDOW_WIDTH*8/10U) /*页面时钟起始X*/
#define PAGE_CLOCK_END_X (UI_MAINWINDOW_WIDTH-PAGE_CLOCK_START_X) /*页面时钟长度X*/
/*bottom*/
#define PAGE_TIPS_OPT_START_X (0U) /*页面操作提示起始X*/
#define PAGE_TIPS_OPT_END_X (UI_MAINWINDOW_WIDTH*9/10U) /*页面操作提示长度X*/
#define PAGE_TIPS_PAGENUM_START_X PAGE_TIPS_OPT_END_X /*页面数目提示起始X*/
#define PAGE_TIPS_PAGENUM_END_X (UI_MAINWINDOW_WIDTH-PAGE_TIPS_OPT_END_X) /*页面数目提示长度X*/
/*设定下拉框属性*/
#define PAGE_COMBO_BOX_START_X (UI_MAINWINDOW_WIDTH*6/10U) /*下拉框起始X*/
#define PAGE_COMBO_BOX_END_X (UI_MAINWINDOW_WIDTH*37/100U) /*下拉框长度X*/
#define PAGE_COMBO_BOX_NUM_MAX (8U) /*下拉框列表最大数量*/
#define PAGE_MULTI_COMBO_BOX_V_GAP (10U) /*下拉框垂直间隙*/
#define PAGE_COMBO_BOX_ORIGIN_Y TITLE_END_Y /*下拉框起始Y*/
/*通过计算下拉框允许高度Y*/
#define PAGE_COMBO_BOX_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_COMBO_BOX_V_GAP*(PAGE_COMBO_BOX_NUM_MAX+1)))/PAGE_COMBO_BOX_NUM_MAX)
/*计算多个下拉框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_COMBO_BOX_V_Y(X) (PAGE_COMBO_BOX_ORIGIN_Y+PAGE_MULTI_COMBO_BOX_V_GAP*(X+1)+PAGE_COMBO_BOX_HEIGHT*X)
/*设定通用多按钮 垂直分布 属性*/
#define PAGE_BUTTON_START_X (UI_MAINWINDOW_WIDTH*1/10U) /*按钮起始X*/
#define PAGE_BUTTON_END_X (UI_MAINWINDOW_WIDTH*8/10U) /*按钮长度X*/
#define PAGE_MULTI_BUTTON_V_GAP (5U) /*按钮垂直间隙*/
#define PAGE_BUTTON_V_NUM_MAX (8U) /*最大允许按钮数目*/
#define PAGE_BUTTON_ORIGIN_Y TITLE_END_Y /*按钮起始Y*//*通过计算按钮允许高度Y*/
#define PAGE_BUTTON_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_BUTTON_V_GAP*(PAGE_BUTTON_V_NUM_MAX+1)))/PAGE_BUTTON_V_NUM_MAX)
/*计算多个按钮Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_BUTTON_V_Y(X) (PAGE_BUTTON_ORIGIN_Y+PAGE_MULTI_BUTTON_V_GAP*(X+1)+PAGE_BUTTON_HEIGHT*X)
/*设定通用多按钮 水平分布 属性*/
#define PAGE_BUTTON_START_Y (UI_MAINWINDOW_WIDTH*1/10U) /*按钮起始Y*/
#define PAGE_BUTTON_END_Y (UI_MAINWINDOW_WIDTH*1/10U) /*按钮高度Y*/
#define PAGE_MULTI_BUTTON_X_GAP (10U) /*按钮水平间隙*/
#define PAGE_BUTTON_H_NUM_MAX (4U) /*最大允许按钮数目*/
#define PAGE_BUTTON_LEFT_INVALID_LEN (0U) /*左边不可用长度*/
#define PAGE_BUTTON_RIGHT_INVALID_LEN (0U) /*右边不可用长度*/
#define PAGE_BUTTON_ORIGIN_X PAGE_BUTTON_LEFT_INVALID_LEN /*按钮起始X*/
/*通过计算按钮允许宽度X*/
#define PAGE_BUTTON_WIDTH \
((UI_MAINWINDOW_WIDTH-PAGE_BUTTON_LEFT_INVALID_LEN-PAGE_BUTTON_RIGHT_INVALID_LEN-(PAGE_MULTI_BUTTON_X_GAP*(PAGE_BUTTON_H_NUM_MAX+1)))/PAGE_BUTTON_H_NUM_MAX)
/*计算多个按钮X坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_BUTTON_H_X(X) (PAGE_BUTTON_ORIGIN_X+PAGE_MULTI_BUTTON_X_GAP*(X+1)+PAGE_BUTTON_WIDTH*X)
/*设定显示框属性*/
#define PAGE_DISPLAY_BOX_START_X (UI_MAINWINDOW_WIDTH*6/10U) /*显示框起始X*/
#define PAGE_DISPLAY_BOX_END_X (UI_MAINWINDOW_WIDTH*37/100U) /*显示框长度X*/
#define PAGE_MULTI_DISPLAY_BOX_V_GAP (10U) /*显示框垂直间隙*/
#define PAGE_DISPLAY_BOX_V_NUM_MAX (8U) /*最大允许显示框数目*/
#define PAGE_DISPLAY_BOX_ORIGIN_Y TITLE_END_Y /*显示框起始Y*/
/*通过计算显示框允许高度Y*/
#define PAGE_DISPLAY_BOX_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_DISPLAY_BOX_V_GAP*(PAGE_DISPLAY_BOX_V_NUM_MAX+1)))/PAGE_DISPLAY_BOX_V_NUM_MAX)
/*计算多个显示框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_DISPLAY_BOX_V_Y(X) (PAGE_DISPLAY_BOX_ORIGIN_Y+PAGE_MULTI_DISPLAY_BOX_V_GAP*(X+1)+PAGE_DISPLAY_BOX_HEIGHT*X)
/*设定编辑框属性*/
#define PAGE_EDIT_BOX_START_X (UI_MAINWINDOW_WIDTH*6/10U) /*编辑框起始X*/
#define PAGE_EDIT_BOX_END_X (UI_MAINWINDOW_WIDTH*37/100U) /*编辑框长度X*/
#define PAGE_MULTI_EDIT_BOX_V_GAP (10U) /*编辑框垂直间隙*/
#define PAGE_EDIT_BOX_NUM_MAX (8U) /*最大允许编辑框数目*/
#define PAGE_EDIT_BOX_ORIGIN_Y TITLE_END_Y /*编辑框起始Y*/
/*通过计算编辑框允许高度Y*/
#define PAGE_EDIT_BOX_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_EDIT_BOX_V_GAP*(PAGE_EDIT_BOX_NUM_MAX+1)))/PAGE_EDIT_BOX_NUM_MAX)
/*计算多个编辑框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_EDIT_BOX_V_Y(X) (PAGE_EDIT_BOX_ORIGIN_Y+PAGE_MULTI_EDIT_BOX_V_GAP*(X+1)+PAGE_EDIT_BOX_HEIGHT*X)
/*设定通用标签属性*/
#define PAGE_LABEL_START_X (UI_MAINWINDOW_WIDTH*4/100U) /*标签起始X*/
#define PAGE_LABEL_END_X (UI_MAINWINDOW_WIDTH*55/100U) /*标签长度X*/
#define PAGE_MULTI_LABEL_V_GAP (10U) /*标签垂直间隙*/
#define PAGE_LABEL_NUM_MAX (8U) /*最大允许标签数目*/
#define PAGE_LABEL_ORIGIN_Y TITLE_END_Y /*标签起始Y*/
/*通过计算标签允许高度Y*/
#define PAGE_LABEL_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_LABEL_V_GAP*(PAGE_LABEL_NUM_MAX+1)))/PAGE_LABEL_NUM_MAX)
/*计算多个标签Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PAGE_MULTI_LABEL_V_Y(X) (PAGE_LABEL_ORIGIN_Y+PAGE_MULTI_LABEL_V_GAP*(X+1)+PAGE_LABEL_HEIGHT*X) /*设定对话框显示区域*/
#define PAGE_DIGLOG_BOX_START_X (UI_MAINWINDOW_WIDTH*2/10U) /*对话框起始X*/
#define PAGE_DIGLOG_BOX_END_X (UI_MAINWINDOW_WIDTH*6/10U) /*对话框长度X*/
#define PAGE_DIGLOG_BOX_START_Y (UI_MAINWINDOW_HEIGHT*3/10U) /*对话框起始Y*/
#define PAGE_DIGLOG_BOX_END_Y (UI_MAINWINDOW_HEIGHT*4/10U) /*对话框高度Y*/
#define PAGE_DIGLOG_BOX_TEXT_START_X (5U) /*对话框文本相对起始X*/
#define PAGE_DIGLOG_BOX_TEXT_END_X (PAGE_DIGLOG_BOX_END_X-5U) /*对话框文本长度X*/
#define PAGE_DIGLOG_BOX_TEXT_START_Y (10U) /*对话框文本相对起始Y*/
#define PAGE_DIGLOG_BOX_TEXT_END_Y (20U) /*对话框文本高度Y*/
#define PAGE_DIGLOG_BOX_BUTTON1_START_X (PASSWD_DIGLOG_BOX_END_X*2/10) /*对话框按钮相对起始X*/
#define PAGE_DIGLOG_BOX_BUTTON1_END_X (PASSWD_DIGLOG_BOX_END_X*3/10) /*对话框按钮长度X*/
#define PAGE_DIGLOG_BOX_BUTTON1_START_Y (PASSWD_DIGLOG_BOX_END_Y*4/10) /*对话框按钮相对起始Y*/
#define PAGE_DIGLOG_BOX_BUTTON1_END_Y (25U) /*对话框按钮高度Y*/
#define PAGE_DIGLOG_BOX_BUTTON2_START_X (PASSWD_DIGLOG_BOX_END_X*5/10) /*对话框按钮相对起始X*/
#define PAGE_DIGLOG_BOX_BUTTON2_END_X (PASSWD_DIGLOG_BOX_END_X*3/10) /*对话框按钮长度X*/
#define PAGE_DIGLOG_BOX_BUTTON2_START_Y (PASSWD_DIGLOG_BOX_END_Y*4/10) /*对话框按钮相对起始Y*/
#define PAGE_DIGLOG_BOX_BUTTON2_END_Y (25U) /*对话框按钮高度Y*/
/*===============================特殊指定坐标=================================*/
/*===寻参界面参数坐标===*/
/*设定标签属性*/
#define PARA_LABEL_START_X (UI_MAINWINDOW_WIDTH*4/100U) /*标签起始X*/
#define PARA_LABEL_END_X (UI_MAINWINDOW_WIDTH*55/100U) /*标签长度X*/
#define PARA_MULTI_LABEL_V_GAP (10U) /*标签垂直间隙*/
#define PARA_LABEL_NUM_MAX (8U) /*最大允许标签数目*/
#define PARA_LABEL_ORIGIN_Y (TITLE_END_Y+TITLE2_END_Y) /*标签起始Y*/
/*通过计算标签允许高度Y*/
#define PARA_LABEL_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-TITLE2_END_Y-BOTTOM_END_Y-(PARA_MULTI_LABEL_V_GAP*(PARA_LABEL_NUM_MAX+1)))/PARA_LABEL_NUM_MAX)
/*计算多个标签Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PARA_MULTI_LABEL_V_Y(X) (PARA_LABEL_ORIGIN_Y+PARA_MULTI_LABEL_V_GAP*(X+1)+PARA_LABEL_HEIGHT*X) /*设定显示框属性*/
#define PARA_DISPLAY_BOX_START_X (UI_MAINWINDOW_WIDTH*6/10U) /*显示框起始X*/
#define PARA_DISPLAY_BOX_END_X (UI_MAINWINDOW_WIDTH*37/100U) /*显示框长度X*/
#define PARA_MULTI_DISPLAY_BOX_V_GAP (10U) /*显示框垂直间隙*/
#define PARA_DISPLAY_BOX_V_NUM_MAX (8U) /*最大允许显示框数目*/
#define PARA_DISPLAY_BOX_ORIGIN_Y (TITLE_END_Y+TITLE2_END_Y) /*显示框起始Y*/
/*通过计算显示框允许高度Y*/
#define PARA_DISPLAY_BOX_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-TITLE2_END_Y-BOTTOM_END_Y-(PARA_MULTI_DISPLAY_BOX_V_GAP*(PARA_DISPLAY_BOX_V_NUM_MAX+1)))/PARA_DISPLAY_BOX_V_NUM_MAX)
/*计算多个显示框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define PARA_MULTI_DISPLAY_BOX_V_Y(X) (PARA_DISPLAY_BOX_ORIGIN_Y+PARA_MULTI_DISPLAY_BOX_V_GAP*(X+1)+PARA_DISPLAY_BOX_HEIGHT*X)
/*进度条属性设置*/
#define PROGBAR_START_X (0U)
#define PROGBAR_END_X UI_MAINWINDOW_WIDTH
#define PROGBAR_START_Y BOTTOM_START_Y
#define PROGBAR_END_Y BOTTOM_END_Y
/*===重置参数坐标===*/
#define PAGE_RESET_LABEL_START_X (0U) /*重置提示起始X*/
#define PAGE_RESET_LABEL_END_X UI_MAINWINDOW_WIDTH /*重置提示长度X*/
#define PAGE_RESET_LABEL_START_Y (TITLE_START_Y+TITLE_END_Y) /*重置提示起始Y*/
#define PAGE_RESET_LABEL_END_Y (UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y)
#define PAGE_RESET_BUTTON_START_X (UI_MAINWINDOW_WIDTH*2/10U) /*重置按钮起始X*/
#define PAGE_RESET_BUTTON_END_X (UI_MAINWINDOW_WIDTH*6/10U) /*重置按钮长度X*/
#define PAGE_RESET_BUTTON_START_Y BOTTOM_START_Y /*重置按钮起始Y*/
#define PAGE_RESET_BUTTON_END_Y BOTTOM_END_Y /*重置按钮高度Y*/
/*===设定实时界面坐标===*/
/*设定通道数量显示区域属性*/
#define REALTIME_CHANNEL_NUMBER_START_X (UI_MAINWINDOW_WIDTH/2U) /*实时页面通道数量起始X*/
#define REALTIME_CHANNEL_NUMBER_START_Y (UI_MAINWINDOW_WIDTH*1/100U) /*实时页面通道数量起始Y*/
/*设定时间显示区域属性*/
#define REALTIME_CLOCK_START_X (UI_MAINWINDOW_WIDTH*75/100U) /*实时页面时间起始X*/
#define REALTIME_CLOCK_END_X UI_MAINWINDOW_WIDTH /*实时页面时间终点X*/
#define REALTIME_CLOCK_START_Y (0U) /*实时页面时间起始Y*/
#define REALtime_CLOCK_END_Y TITLE_END_Y
/*设定锁屏状态区域*/
#define REALTIME_LOCK_START_X (UI_MAINWINDOW_WIDTH*7/10U) /*实时页面锁屏起始X*/
#define REALTIME_LOCK_END_X (REALTIME_LOCK_START_X+10U) /*实时页面锁屏终点X*/
#define REALTIME_LOCK_START_Y (0U) /*实时页面锁屏起始Y*/
#define REALTIME_LOCK_END_Y TITLE_END_Y /*实时页面锁屏终点Y*/
/*设定报警状态显示区域*/
#define REALTIME_ALARM_STATE_START_X (UI_MAINWINDOW_WIDTH*12/100U) /*实时页面报警状态起始X*/
#define REALTIME_ALARM_STATE_START_Y (4U) /*实时页面报警状态起始Y*/
/*报警通道号*/
#define REALTIME_ALARM_CHANNEL_NUM_START_X (UI_MAINWINDOW_WIDTH*23/100U) /*实时页面报警通道起始X*/
#define REALTIME_ALARM_CHANNEL_NUM_START_Y (UI_MAINWINDOW_WIDTH*3/100U) /*实时页面报警通道起始Y*/
/*设定链接状态显示*/
#define REALTIME_CONNECT_STATE_START_X (6U) /*实时页面链接状态起始X*/
#define REALTIME_CONNECT_STATE_START_Y (6U) /*实时页面链接状态起始Y*/
/*设定电池图标*/
#define REALTIME_BATTERY_START_X (2U) /*实时页面电池图标显示起始X*/
#define REALTIME_BATTERY_END_X (8U) /*实时页面电池图标显示起始Y*/
/*设定不支持类型信息区域*/
#define BOARD_NOSUPPORT_START_X (UI_MAINWINDOW_WIDTH/2U) /*实时页面不支持类型信息起始X*/
#define BOARD_NOSUPPORT_START_Y (UI_MAINWINDOW_HEIGHT*3/10U) /*实时页面不支持类型信息起始Y*/
/*设定支持类型信息区域*/
#define BOARD_SUPPORT_START_X (UI_MAINWINDOW_WIDTH/2U) /*实时页面支持类型信息起始X*/
#define BOARD_SUPPORT_START_Y (UI_MAINWINDOW_HEIGHT*45/100U) /*实时页面支持类型信息起始Y*/
/*----------------------通道块状显示------------------*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP (2U) /*实时页面矩形水平间隙*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP (2U) /*实时页面矩形垂直间隙*/
#define REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX (3U) /*实时页面最大允许每行矩形数目*/
#define REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX (2U) /*实时页面最大允许矩形行数目*/
#define REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN (0U) /*实时页面左边不可用长度*/
#define REALTIME_BLOCKSTYLE_RECT_RIGHT_INVALID_LEN (0U) /*实时页面右边不可用长度*/
#define REALTIME_BLOCKSTYLE_RECT_START_Y (TITLE_START_Y+TITLE_END_Y) /*实时页面矩形起始Y*/
#define REALTIME_BLOCKSTYLE_RECT_ORIGIN_X REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN /*实时页面矩形起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCKSTYLE_RECT_WIDTH \
((UI_MAINWINDOW_WIDTH-REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN-REALTIME_BLOCKSTYLE_RECT_RIGHT_INVALID_LEN-(REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCKSTYLE_RECT_END_Y \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX) /*实时页面矩形宽度Y*/
/*计算多个通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_H_X(X) (REALTIME_BLOCKSTYLE_RECT_ORIGIN_X+REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCKSTYLE_RECT_WIDTH*(X%REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX))
/*计算多个通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_Y_X(X) (REALTIME_BLOCKSTYLE_RECT_START_Y+REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCKSTYLE_RECT_END_Y*(X/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX))
/*设定块状线条*/
#define REALTIME_BLOCKSTYLE_LINE_START_X (REALTIME_UNIT_START_X+REALTIME_UNIT_END_X+5U) /*实时页面线条起始X*/
#define REALTIME_BLOCKSTYLE_LINE_END_X (UI_MAINWINDOW_WIDTH-REALTIME_LINE_START_X-REALTIME_SLIP_START_X) /*实时页面线条长度X*/
#define REALTIME_BLOCKSTYLE_LINE_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_SLIP_HEIGHT/2U) /*实时页面线条起始Y*/
#define REALTIME_BLOCKSTYLE_LINE_END_Y (0U)
/*设定块状通道编号*/
/*设定块状浓度值*/
/*设定块状单位*/
/*设定块状报警铃*/
/*设定块状报警时间*/
/*气体类型化学式*/
/*气体类型中文*/
/*----设定1通道块状高度----*/
#define REALTIME_BLOCK_1_STYLE_RECT_START_Y (TITLE_START_Y+TITLE_END_Y) /*块状1通道显示起始Y*/
#define REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP (5U) /*块状1通道水平间隙*/
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP (5U) /*块状1通道垂直间隙*/
#define REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX (1U) /*块状1通道水平数量*/
#define REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX (1U) /*块状1通道放置行数以1开始*/
#define REALTIME_BLOCK_1_STYLE_RECT_ORIGIN_X (0U) /*块状1通道显示起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCK_1_STYLE_RECT_WIDTH \
((UI_MAINWINDOW_WIDTH-(REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCK_1_STYLE_RECT_END_Y \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX) /*实时页面矩形宽度Y*/
/*计算2通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_H_X(X) (REALTIME_BLOCK_1_STYLE_RECT_ORIGIN_X+REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_1_STYLE_RECT_WIDTH*(X%REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX))
/*计算2通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_X(X) (REALTIME_BLOCK_1_STYLE_RECT_START_Y+REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_1_STYLE_RECT_END_Y*(X/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX))
/*----设定2通道块状高度----*/
#define REALTIME_BLOCK_2_STYLE_RECT_START_Y (TITLE_START_Y+TITLE_END_Y) /*块状2通道显示起始Y*/
#define REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP (5U) /*块状2通道水平间隙*/
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP (5U) /*块状2通道垂直间隙*/
#define REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX (2U) /*块状2通道水平数量*/
#define REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX (1U) /*块状2通道放置行数以1开始*/
#define REALTIME_BLOCK_2_STYLE_RECT_ORIGIN_X (0U) /*块状2通道显示起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCK_2_STYLE_RECT_WIDTH \
((UI_MAINWINDOW_WIDTH-(REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCK_2_STYLE_RECT_END_Y \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX) /*实时页面矩形宽度Y*/
/*计算2通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_H_X(X) (REALTIME_BLOCK_2_STYLE_RECT_ORIGIN_X+REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_2_STYLE_RECT_WIDTH*(X%REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX))
/*计算2通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_X(X) (REALTIME_BLOCK_2_STYLE_RECT_START_Y+REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_2_STYLE_RECT_END_Y*(X/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX))
/*-------------------------通道条状显示-------------------*/
#define REALTIME_SLIP_START_X (2U) /*实时页面通道条状起始X*/
#define REALTIME_SLIP_END_X (UI_MAINWINDOW_WIDTH-REALTIME_SLIP_START_X*2U) /*实时页面通道条状长度X*/
#define REALTIME_MULTI_SLIP_V_GAP (4U) /*实时页面通道条状垂直间隙*/
#define REALTIME_SLIP_V_NUM_MAX (4U) /*最大允许实时页面通道条状数目*/
#define REALTIME_SLIP_ORIGIN_Y TITLE_END_Y /*实时页面通道条状起始Y*/
#define REALTIME_ROUND_VALUE (6U) /*设定倒角*/
/*通过计算条状显示允许高度Y*/
#define REALTIME_SLIP_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_MULTI_SLIP_V_GAP*(REALTIME_SLIP_V_NUM_MAX+1)))/REALTIME_SLIP_V_NUM_MAX)
/*计算多个条状显示Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_MULTI_SLIP_V_Y(X) (REALTIME_SLIP_ORIGIN_Y+REALTIME_MULTI_SLIP_V_GAP*(X+1)+REALTIME_SLIP_HEIGHT*X)
/*设定通道编号显示区域*/
#define REALTIME_CHANNEL_NUM_START_X (REALTIME_SLIP_START_X+2U) /*实时页面编号显示起始X*/
#define REALTIME_CHANNEL_NUM_END_X (32U) /*实时页面编号显示长度X*/
#define REALTIME_CHANNEL_NUM_GAP_V (2U) /*实时页面编号显示垂直间隙*/
#define REALTIME_CHANNEL_NUM_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_CHANNEL_NUM_GAP_V) /*实时页面编号起始Y*/
#define REALTIME_CHANNEL_NUM_END_Y (REALTIME_SLIP_HEIGHT-REALTIME_UNIT_GAP_V*2) /*实时页面编号高度Y*/
/*设定报警铃显示区域*/
#define REALTIME_ICO_START_X (REALTIME_CHANNEL_NUM_START_X+REALTIME_CHANNEL_NUM_END_X+4U) /*实时页面图标显示起始X*/
#define REALTIME_ICO_END_X (32U) /*实时页面图标显示长度X*/
#define REALTIME_ICO_GAP_V (2U) /*实时页面图标显示垂直间隙*/
#define REALTIME_ICO_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_ICO_GAP_V) /*实时页面图标显示起始Y*/
#define REALTIME_ICO_END_Y (REALTIME_SLIP_HEIGHT-REALTIME_ICO_GAP_V*2U) /*实时页面图标显示高度Y*/
/*设定浓度显示区域*/
#define REALTIME_VALUE_START_X (REALTIME_ICO_START_X+REALTIME_ICO_END_X+4U) /*实时页面浓度值起始X*/
#define REALTIME_VALUE_END_X (160U) /*实时页面浓度值长度X*/
#define REALTIME_VALUE_GAP_V (2U) /*实时页面浓度显示垂直间隙*/
#define REALTIME_VALUE_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_VALUE_GAP_V)/*实时页面浓度值起始Y*/
#define REALTIME_VALUE_END_Y (REALTIME_SLIP_HEIGHT-REALTIME_VALUE_GAP_V*2U) /*实时页面浓度值高度Y*/
/*设定单位显示区域*/
#define REALTIME_UNIT_START_X (REALTIME_VALUE_START_X+REALTIME_VALUE_END_X+2U) /*实时页面单位显示起始X*/
#define REALTIME_UNIT_END_X (32U) /*实时页面单位显示长度X*/
#define REALTIME_UNIT_GAP_V (2U) /*实时页面单位显示垂直间隙*/
#define REALTIME_UNIT_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_UNIT_GAP_V) /*实时页面单位显示起始Y*/
#define REALTIME_UNIT_END_Y (REALTIME_SLIP_HEIGHT-REALTIME_UNIT_GAP_V*2U) /*实时页面单位显示高度Y*/
/*设定线条显示区域*/
#define REALTIME_LINE_START_X (REALTIME_UNIT_START_X+REALTIME_UNIT_END_X+5U) /*实时页面线条起始X*/
#define REALTIME_LINE_END_X (UI_MAINWINDOW_WIDTH-REALTIME_LINE_START_X-REALTIME_SLIP_START_X) /*实时页面线条长度X*/
#define REALTIME_LINE_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_SLIP_HEIGHT/2U) /*实时页面线条起始Y*/
#define REALTIME_LINE_END_Y (0U) /*实时页面线条高度Y*/
/*设定气体类型显示区域*/
#define REALTIME_GASTYPE_START_X (REALTIME_LINE_START_X+REALTIME_LINE_END_X-36*3U) /*实时页面气体类型起始X*/
#define REALTIME_GASTYPE_END_X (UI_MAINWINDOW_WIDTH-REALTIME_GASTYPE_START_X-REALTIME_SLIP_START_X)/*实时页面气体类型长度X*/
#define REALTIME_GASTYPE_GAP_V (2U) /*实时页面气体类型垂直间隙*/
#define REALTIME_GASTYPE_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_GASTYPE_GAP_V) /*实时页面气体类型显示起始Y*/
#define REALTIME_GASTYPE_END_Y (REALTIME_SLIP_HEIGHT/2U-REALTIME_GASTYPE_GAP_V*2U) /*实时页面气体类型高度Y*/
/*设定气体名称显示区域----bottom*/
#define REALTIME_GASNAME_START_X REALTIME_GASTYPE_START_X /*实时页面气体名称起始X*/
#define REALTIME_GASNAME_END_X (UI_MAINWINDOW_WIDTH-REALTIME_GASTYPE_START_X-REALTIME_SLIP_START_X)/*实时页面气体名称程度X*/
#define REALTIME_GASNAME_GAP_V (2U) /*实时页面气体名称垂直间隙*/
#define REALTIME_GASNAME_START_Y(X) (REALTIME_LINE_START_Y(X)+REALTIME_GASNAME_GAP_V) /*实时页面气体名称显示起始Y*/
#define REALTIME_GASNAME_END_Y (REALTIME_SLIP_HEIGHT/2U-REALTIME_GASNAME_GAP_V*2U) /*时页面气体名称高度Y*/
/*设定报警时间显示区域----upper*/
#define REALTIME_ALARMTIME_START_X REALTIME_LINE_START_X /*实时页面报警时间显示起始X*/
#define REALTIME_ALARMTIME_END_X (REALTIME_LINE_END_X/2U) /*实时页面报警时间显示长度X*/
#define REALTIME_ALARMTIME_GAP_V (2U) /*实时页面报警时间显示垂直间隙*/
#define REALTIME_ALARMTIME_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_ALARMTIME_GAP_V) /*实时页面报警时间显示起始Y*/
#define REALTIME_ALARMTIME_END_Y (REALTIME_SLIP_HEIGHT/2U-REALTIME_ALARMTIME_GAP_V*2U) /*实时页面报警时间显示高度Y*/
/*设定房间名称显示区域----bottom*/
#define REALTIME_ROOM_START_X REALTIME_ALARMTIME_START_X /*实时页面房间名称显示起始X*/
#define REALTIME_ROOM_END_X (REALTIME_LINE_END_X/2U) /*实时页面房间名称显示长度X*/
#define REALTIME_ROOM_GAP_V (2U) /*实时页面房间名称显示垂直间隙*/
#define REALTIME_ROOM_START_Y(X) (REALTIME_LINE_START_Y(X)+REALTIME_ROOM_GAP_V) /*实时页面房间名称显示起始Y*/
#define REALTIME_ROOM_END_Y (REALTIME_SLIP_HEIGHT/2U-REALTIME_ALARMTIME_GAP_V*2U) /*实时页面房间名称显示高度Y*/
/*===菜单 按钮最小间隙设定===*/
#define MENU_TITLE_START_Y (0U) /*菜单标题栏起始Y*/
#define MENU_TITLE_END_Y (UI_MAINWINDOW_HEIGHT*12/100) /*菜单标题栏高度Y*/
#define MENU_BOTTOM_START_Y (UI_MAINWINDOW_HEIGHT*9/10) /*菜单底部状态栏起始Y*/
#define MENU_BOTTOM_END_Y (UI_MAINWINDOW_HEIGHT-BOTTOM_START_Y) /*菜单底部状态栏高度Y*/
/*upper*/
#define MENU_DEVICE_STATE_START_X (0U) /*菜单设备状态起始X*/
#define MENU_DEVICE_STATE_END_X (UI_MAINWINDOW_WIDTH/4) /*菜单设备状态长度X*/
#define MENU_TITLE_START_X MENU_DEVICE_STATE_END_X /*菜单标题起始X*/
#define MENU_TITLE_END_X (UI_MAINWINDOW_WIDTH/2) /*菜单标题长度X*/
#define MENU_CLOCK_START_X (UI_MAINWINDOW_WIDTH*3/4) /*菜单时钟起始X*/
#define MENU_CLOCK_END_X (UI_MAINWINDOW_WIDTH-MENU_CLOCK_START_X) /*菜单时钟长度X*/
/*bottom*/
#define MENU_TIPS_OPT_START_X (0U) /*菜单操作提示起始X*/
#define MENU_TIPS_OPT_END_X (UI_MAINWINDOW_WIDTH*3/10U) /*菜单操作提示长度X*/
#define MENU_TIPS_PAGENUM_START_X MENU_TIPS_OPT_END_X /*菜单数目提示起始X*/
#define MENU_TIPS_PAGENUM_END_X (UI_MAINWINDOW_WIDTH-MENU_TIPS_OPT_END_X) /*菜单数目提示长度X*/
/*菜单 按钮属性*/
#define MENU_BUTTON_START_X (UI_MAINWINDOW_WIDTH*3/10) /*菜单按钮起始X*/
#define MENU_BUTTON_END_X (UI_MAINWINDOW_WIDTH*4/10) /*菜单按钮长度X*/
#define MENU_BUTTON_V_NUM_MAX (5U) /*菜单最大允许按钮数目*/
#define MENU_V_GAP_MIN (5U) /*菜单按钮垂直间隙*/
#define MENU_BUTTON_ORIGIN_Y MENU_TITLE_END_Y /*菜单按钮起始Y*//*通过计算菜单按钮允许高度Y*/
#define MENU_BUTTON_HEIGHT \
((UI_MAINWINDOW_HEIGHT-MENU_TITLE_END_Y-MENU_BOTTOM_END_Y-(MENU_V_GAP_MIN*(MENU_BUTTON_V_NUM_MAX+1)))/MENU_BUTTON_V_NUM_MAX)
/*计算多个菜单按钮Y坐标起点,数目从0开始则间隙X需+1,高度*x不变*/
#define MENU_MULTI_BUTTON_V_Y(X) (MENU_BUTTON_ORIGIN_Y+MENU_V_GAP_MIN*(X+1)+MENU_BUTTON_HEIGHT*X)
/*===设定产品名称区域===*/
#define LOGO_PRODUCT_MAME_START_X (UI_MAINWINDOW_WIDTH/2U) /*产品名称起始X*/
#define LOGO_PRODUCT_MAME_START_Y (UI_MAINWINDOW_HEIGHT*3/10U) /*产品名称起始Y*//*设定版本号区域*/
#define LOGO_VERSION_NUM_START_X (UI_MAINWINDOW_WIDTH/2U) /*版本号起始X*/
#define LOGO_VERSION_NUM_START_Y (UI_MAINWINDOW_HEIGHT*45/100U) /*版本号起始Y*//*产品开发进展区域*/
#define DEVELOPING_STATE_START_X (UI_MAINWINDOW_WIDTH/2U) /*开发进展起始X*/
#define DEVELOPING_STATE_START_Y (UI_MAINWINDOW_HEIGHT*3/10U) /*开发进展起始Y*/
/*===设定密码输入对话框区域===*/
#define PASSWD_DIGLOG_BOX_START_X (UI_MAINWINDOW_WIDTH*2/10U) /*密码输入框起始X*/
#define PASSWD_DIGLOG_BOX_END_X (UI_MAINWINDOW_WIDTH*6/10U) /*密码输入框长度X*/
#define PASSWD_DIGLOG_BOX_START_Y (UI_MAINWINDOW_HEIGHT*3/10U) /*密码输入框起始Y*/
#define PASSWD_DIGLOG_BOX_END_Y (UI_MAINWINDOW_HEIGHT*4/10U) /*密码输入框高度Y*/
#define PASSWD_DIGLOG_BOX_TEXT_START_X (5U) /*密码输入框文本相对起始X*/
#define PASSWD_DIGLOG_BOX_TEXT_END_X (150U) /*密码输入框文本长度X*/
#define PASSWD_DIGLOG_BOX_TEXT_START_Y (10U) /*密码输入框文本相对起始Y*/
#define PASSWD_DIGLOG_BOX_TEXT_END_Y (20U) /*密码输入框文本高度Y*/
#define PASSWD_DIGLOG_BOX_EDIT_START_X (PASSWD_DIGLOG_BOX_END_X*3/10) /*密码输入框编辑相对起始X*/
#define PASSWD_DIGLOG_BOX_EDIT_END_X (PASSWD_DIGLOG_BOX_END_X*4/10) /*密码输入框编辑长度X*/
#define PASSWD_DIGLOG_BOX_EDIT_START_Y (PASSWD_DIGLOG_BOX_END_Y*5/10) /*密码输入框编辑相对起始Y*/
#define PASSWD_DIGLOG_BOX_EDIT_END_Y (25U) /*密码输入框编辑高度Y*/
/*===设定电流环校准页面文本及按钮区域===*/
#define CURRENTLOOP_BUTTON_START_X (UI_MAINWINDOW_WIDTH*2/10U) /*校准按钮起始X*/
#define CURRENTLOOP_BUTTON_END_X (UI_MAINWINDOW_WIDTH*6/10U) /*校准按钮长度X*/
#define CURRENTLOOP_BUTTON_START_Y (BOTTOM_START_Y-2U) /*校准按钮起始Y*/
#define CURRENTLOOP_BUTTON_END_Y BOTTOM_END_Y /*校准按钮高度Y*/
#define CURRENTLOOP_TEXT_START_X (UI_MAINWINDOW_WIDTH*4/100U) /*校准文本起始X*/
#define CURRENTLOOP_TEXT_END_X (UI_MAINWINDOW_WIDTH*92/100U) /*校准按钮长度X*/
#define CURRENTLOOP_MULTI_TEXT_V_GAP (5U) /*文本垂直间隙*/
#define CURRENTLOOP_TEXT_NUM_MAX (4U) /*最大允许文本数目*/
#define CURRENTLOOP_TEXT_ORIGIN_Y TITLE_END_Y /*文本起始Y*//*通过计算校准页面文本允许高度Y*/
#define CURRENTLOOP_TEXT_HEIGHT \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-CURRENTLOOP_BUTTON_END_Y-(CURRENTLOOP_MULTI_TEXT_V_GAP*(CURRENTLOOP_TEXT_NUM_MAX+1)))/CURRENTLOOP_TEXT_NUM_MAX)
/*计算多个文本Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define CURRENTLOOP_MULTI_TEXT_V_Y(X) (CURRENTLOOP_TEXT_ORIGIN_Y+CURRENTLOOP_MULTI_TEXT_V_GAP*(X+1)+CURRENTLOOP_TEXT_HEIGHT*X)
/*===设定历史数据表格及转动圆区域===*/
#define HISTRORY_CIRCLE_START_X (UI_MAINWINDOW_WIDTH/2U) /*圆心在X的起点*/
#define HISTRORY_CIRCLE_START_Y (UI_MAINWINDOW_HEIGHT/2U) /*圆心在Y的起点*/
#define HISTRORY_CIRCLE_R_SIZE (UI_MAINWINDOW_HEIGHT/10U) /*设定圆的半径*/
#define HISTRORY_CIRCLE_ANGLE_START (0) /*设定圆的起始角度--通过增大实现转动*/
#define HISTRORY_CIRCLE_ANGLE_END (330) /*设定圆的终点角度*/
#define HISTRORY_REDRAW_RECT_START_X (HISTRORY_CIRCLE_START_X-HISTRORY_CIRCLE_R_SIZE-1) /*重绘区域起始X*/
#define HISTRORY_REDRAW_RECT_END_X (HISTRORY_REDRAW_RECT_START_X+HISTRORY_CIRCLE_R_SIZE*2+1) /*重绘区域终点X*/
#define HISTRORY_REDRAW_RECT_START_Y (HISTRORY_CIRCLE_START_Y-HISTRORY_CIRCLE_R_SIZE-1) /*重绘区域起始Y*/
#define HISTRORY_REDRAW_RECT_END_Y (HISTRORY_REDRAW_RECT_START_Y+HISTRORY_CIRCLE_R_SIZE*2+1) /*重绘区域终点Y*/
#define HISTRORY_LISTVIEW_COLUMN_1_SIZE (UI_MAINWINDOW_WIDTH*2/10U) /*表格宽度*/
#define HISTRORY_LISTVIEW_COLUMN_2_SIZE (UI_MAINWINDOW_WIDTH*4/10U) /*表格宽度*/
#define HISTRORY_LISTVIEW_COLUMN_3_SIZE (UI_MAINWINDOW_WIDTH-HISTRORY_LISTVIEW_COLUMN_1_SIZE-HISTRORY_LISTVIEW_COLUMN_2_SIZE) /*表格宽度*/
#define HISTRORY_LISTVIEW_HEAD_HEIGHT (25U) /*表格标题高度*/
#define HISTRORY_LISTVIEW_V_NUM_MAX (8U) /*表格最大允许行数目*/
#define HISTRORY_LISTVIEW_ORIGIN_Y (HISTRORY_LISTVIEW_HEAD_HEIGHT+MENU_TITLE_END_Y)/*表格内容起始Y*/
/*通过计算表格允许高度Y*/
#define HISTRORY_LISTVIEW_ROW_HEIGHT \
((UI_MAINWINDOW_HEIGHT-HISTRORY_LISTVIEW_ORIGIN_Y)/HISTRORY_LISTVIEW_V_NUM_MAX)
/*===设定通道搜索页面文本显示属性===*/
#define CHANNELSEARCH_LABEL_START_X (UI_MAINWINDOW_WIDTH*2/100U) /*通道搜索标签起始X*/
#define CHANNELSEARCH_LABEL_END_X (UI_MAINWINDOW_WIDTH*14/100U) /*通道搜索标签长度X*/
#define CHANNELSEARCH_LABEL_START_Y (UI_MAINWINDOW_HEIGHT*38/100U) /*通道搜索标签起始Y*/
#define CHANNELSEARCH_LABEL_END_Y (UI_MAINWINDOW_HEIGHT*6/100U) /*通道搜索标签高度Y*/
#define CHANNELSEARCH_TIPS_START_X (0U) /*通道搜索提示起始X*/
#define CHANNELSEARCH_TIPS_END_X (UI_MAINWINDOW_WIDTH-CHANNELSEARCH_TIPS_START_X*2U) /*通道搜索提示长度X*/
#define CHANNELSEARCH_TIPS_START_Y (CHANNELSEARCH_LABEL_START_Y+CHANNELSEARCH_LABEL_END_Y)/*通道搜索提示起始Y*/
#define CHANNELSEARCH_TIPS_END_Y (UI_MAINWINDOW_HEIGHT-CHANNELSEARCH_TIPS_START_Y) /*通道搜索提示高度Y*/
/*搜索结果 正方形属性*/
#define CHANNELSEARCH_RECT_START_Y (CHANNELSEARCH_LABEL_START_Y+CHANNELSEARCH_LABEL_END_Y+2) /*矩形起始Y*/
#define CHANNELSEARCH_MULTI_RECT_X_GAP (2U) /*矩形水平间隙*/
#define CHANNELSEARCH_MULTI_RECT_Y_GAP (2U) /*矩形垂直间隙*/
#define CHANNELSEARCH_RECT_H_NUM_MAX (12U) /*最大允许矩形数目*/
#define CHANNELSEARCH_RECT_LEFT_INVALID_LEN (0U) /*左边不可用长度*/
#define CHANNELSEARCH_RECT_RIGHT_INVALID_LEN (0U) /*右边不可用长度*/
#define CHANNELSEARCH_RECT_ORIGIN_X CHANNELSEARCH_RECT_LEFT_INVALID_LEN /*矩形起始X*/
/*通过计算矩形允许宽度X*/
#define CHANNELSEARCH_RECT_WIDTH \
((UI_MAINWINDOW_WIDTH-CHANNELSEARCH_RECT_LEFT_INVALID_LEN-CHANNELSEARCH_RECT_RIGHT_INVALID_LEN-(CHANNELSEARCH_MULTI_RECT_X_GAP*(CHANNELSEARCH_RECT_H_NUM_MAX+1)))/CHANNELSEARCH_RECT_H_NUM_MAX)
#define CHANNELSEARCH_RECT_END_Y (CHANNELSEARCH_RECT_WIDTH) /*矩形宽度Y*/
/*计算多个矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define CHANNELSEARCH_MULTI_RECT_H_X(X) (CHANNELSEARCH_RECT_ORIGIN_X+CHANNELSEARCH_MULTI_RECT_X_GAP*((X%CHANNELSEARCH_RECT_H_NUM_MAX)+1)+CHANNELSEARCH_RECT_WIDTH*(X%CHANNELSEARCH_RECT_H_NUM_MAX))
/*计算多个矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define CHANNELSEARCH_MULTI_RECT_Y_X(X) (CHANNELSEARCH_RECT_START_Y+CHANNELSEARCH_MULTI_RECT_Y_GAP*((X/CHANNELSEARCH_RECT_H_NUM_MAX)+1)+CHANNELSEARCH_RECT_END_Y*(X/CHANNELSEARCH_RECT_H_NUM_MAX))
/*通道参数设置页面按钮文字空格,用于居中文字*/
#define CHANNEL_ADDSPACE_NUM_MAX 17U /*按钮标签文本添加空格数,应 < 20 */
/*===设定气体类型索引页面显示属性===*/
#define ITEM_INDEX_PAGE_START_X (0U) /*气体类型参数索引页面起始X*/
#define ITEM_INDEX_PAGE_END_X UI_MAINWINDOW_WIDTH /*气体类型参数索引页面长度X*/
#define ITEM_INDEX_PAGE_START_Y (0U) /*气体类型参数索引页面起始Y*/
#define ITEM_INDEX_PAGE_END_Y UI_MAINWINDOW_HEIGHT /*气体类型参数索引页面长度Y*/
/*页面标题*/
#define ITEM_INDEX_PAGE_DEVICE_STATE_START_X ITEM_INDEX_PAGE_START_X /*气体类型参数索引页面设备状态起始X*/
#define ITEM_INDEX_PAGE_DEVICE_STATE_END_X (ITEM_INDEX_PAGE_END_X*2/10U) /*气体类型参数索引页面设备状态长度X*/
#define ITEM_INDEX_PAGE_TITLE_START_X (ITEM_INDEX_PAGE_DEVICE_STATE_START_X+ITEM_INDEX_PAGE_DEVICE_STATE_END_X) /*气体类型参数索引页面页面标题起始X*/
#define ITEM_INDEX_PAGE_TITLE_END_X (ITEM_INDEX_PAGE_END_X*6/10U) /*气体类型参数索引页面页面标题长度X*/
#define ITEM_INDEX_PAGE_CLOCK_START_X (ITEM_INDEX_PAGE_TITLE_START_X+ITEM_INDEX_PAGE_TITLE_END_X) /*气体类型参数索引页面页面时钟起始X*/
#define ITEM_INDEX_PAGE_CLOCK_END_X (ITEM_INDEX_PAGE_END_X-PAGE_CLOCK_START_X) /*气体类型参数索引页面时钟长度X*/
#define ITEM_INDEX_PAGE_TITLE_START_Y ITEM_INDEX_PAGE_START_Y /*气体类型参数索引页面标题栏起始Y*/
#define ITEM_INDEX_PAGE_TITLE_END_Y (ITEM_INDEX_PAGE_END_Y/10) /*气体类型参数索引页面标题栏高度Y*/
/*索引页面按钮,垂直布局*/
#define ITEM_INDEX_PAGE_BUTTON_START_Y (ITEM_INDEX_PAGE_TITLE_START_Y+ITEM_INDEX_PAGE_TITLE_END_Y) /*气体类型参数索引页面按钮显示起始Y*/
#define ITEM_INDEX_PAGE_BUTTON_X_GAP (10U) /*气体类型参数索引页面按钮水平间隙*/
#define ITEM_INDEX_PAGE_BUTTON_Y_GAP (10U) /*气体类型参数索引页面按钮垂直间隙*/
#define ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX (5U) /*气体类型参数索引页面按钮水平数量*/
#define ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX (6U) /*气体类型参数索引页面按钮放置行数以1开始*/
#define ITEM_INDEX_PAGE_BUTTON_ORIGIN_X (ITEM_INDEX_PAGE_START_X+0U) /*气体类型参数索引页面按钮显示起始X*/
/*通过计算每个页面最多按钮数目*/
#define ITEM_INDEX_PAGE_BUTTON_NUM_MAX (ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)
/*通过计算个按钮允许宽度X*/
#define ITEM_INDEX_PAGE_BUTTON_WIDTH \
((ITEM_INDEX_PAGE_END_X-ITEM_INDEX_PAGE_BUTTON_ORIGIN_X-(ITEM_INDEX_PAGE_BUTTON_X_GAP*(ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX+1)))/ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX)
/*通过计算个按钮允许高度Y*/
#define ITEM_INDEX_PAGE_BUTTON_END_Y \
((ITEM_INDEX_PAGE_END_Y-ITEM_INDEX_PAGE_TITLE_END_Y-(ITEM_INDEX_PAGE_BUTTON_Y_GAP*(ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX+1)))/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX) /*索引页面按钮宽度Y*/
/*计算按钮X坐标起点,数目从0开始,则垂直数目未到情况下X起点不变,每列满则向X增大一个宽度*/
#define ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_H_X(X) (ITEM_INDEX_PAGE_BUTTON_ORIGIN_X+ITEM_INDEX_PAGE_BUTTON_X_GAP*((X/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)+1)+ITEM_INDEX_PAGE_BUTTON_WIDTH*(X/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX))
/*计算按钮Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_Y_X(X) (ITEM_INDEX_PAGE_BUTTON_START_Y+ITEM_INDEX_PAGE_BUTTON_Y_GAP*((X%ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)+1)+ITEM_INDEX_PAGE_BUTTON_END_Y*(X%ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX))
/* Exported typedefines ------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macros------------------------------------------------------------*/
#define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name)/sizeof(*(arr_name)))
/* Exported functions prototypes ---------------------------------------------*/
void millsec_IRQ_handler(void);
uint32_t get_time_ms(void);
uint32_t get_time_sec(void);#ifdef __cplusplus //end extern c
}
#endif
#endif
/******************************** End of file *********************************/